为了提高并行运算速度,开始接触cuda编程,cuda 在安装的时候提供了很多示例,一般位于Home目录下,可以作为学习的参考,同时官网提供的入门教程,就是很好的学习资料。
cuda编程首先要转换与cpu 下编程的思想,在cpu 下,我们一般都是按照顺序进行执行,或者开几个线程处理几个任务,而在gpu 下,是分block 和 thread的,gpu由多个block(x,y ,z )组成,每个block 下由多了thread组成,都是根据ID进行区分操作,这样可以把一个任务拆分成很多个线程去执行。
作为学习,我新建了cuda 文件项目,cmake 进行文件管理,目录结构如下:
入门的项目为helloWorld,主程序在main.cu中
本例子对两个整数求和。
最外层的CMakeLists.txt 管理用到的包和头文件
project("cuda")
cmake_minimum_required(VERSION 2.8)
# 查找cuda 文件
find_package(CUDA REQUIRED)
include_directories(${CUDA_INCLUDE_DIRS})
#add_subdirectory(addVector)
add_subdirectory(helloWorld)
helloWorld 文件中的CMakeLists.txt
project(helloWorld)
cuda_add_executable(helloWorld main.cu)
main.cu 中的代码:
#include <stdio.h>
// CUDA runtime
#include <cuda_runtime.h>
// __global__ 声明 gpu 线程调用
__global__ void sum(int *a, int *b, int *c ){
c[0] = a[0] + b[0];
}
int main(int argc, char **argv)
{
// 声明 Host 变量
int a[1]={1},b[1] ={2},c[1]={0};
// 声明 device 变量
int *gpu_a, *gpu_b, *gpu_c;
// 开辟空间
cudaMalloc((void **)&gpu_a, sizeof(int));
cudaMalloc((void **)&gpu_b, sizeof(int));
cudaMalloc((void **)&gpu_c, sizeof(int));
// 讲Host 数据上载到gpu上
cudaMemcpy(gpu_a, a, sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(gpu_b, b, sizeof(int), cudaMemcpyHostToDevice);
// 执行
sum<<<1, 1>>>(gpu_a, gpu_b, gpu_c);
// 将执行结果 下载到Host 变量 c中
cudaMemcpy(c, gpu_c, sizeof(int), cudaMemcpyDeviceToHost);
// 释放空间
cudaFree(gpu_a);
cudaFree(gpu_b);
cudaFree(gpu_c);
// 打印
printf(" %d + %d = %d \n", a[0], b[0], c[0]);
return 0;
}
最后 CMake Make 运行结果: