目录
关键字/标识符
__global__
__global__ 执行空间说明符将函数声明为内核。
- 在设备上执行;
- 可从主机调用,可在计算能力为 3.2 或更高的设备调用;
- __global__ 函数必须具有 void 返回类型,并且不能是类的成员;
- 对 __global__ 函数的任何调用都必须指定其执行配置,如执行配置中所述;
- 对 __global__ 函数的调用是异步的,这意味着它在设备完成执行之前返回。
__device__
__device__ 执行空间说明符声明了一个函数。
- 在设备上执行,
- 只能从设备调用。
- __global__ 和 __device__ 执行空间说明符不能一起使用。
__host__
- __host__ 执行空间说明符声明了一个函数:
- 在主机上执行,
- 只能从主机调用。
- 相当于声明一个函数只带有 __host__ 执行空间说明符,或者声明它没有任何 __host__ 、__device__ 或 __global__ 执行空间说明符; 在任何一种情况下,该函数都仅为主机编译。
__global__ 和 __host__ 执行空间说明符不能一起使用;
__device__和__host__可以一起使用。
核函数
函数定义:
__global__ void hello_cuda() { }
函数调用:
hello_cuda<<<BlockPerGrid,ThreadPerBlock>>>();
BlockPerGrid:每个grid中含有的block数
计算公式:BlockPerGrid= (N + ThreadPerBlock- 1) / ThreadPerBlock N为数据个数?
ThreadPerBlock:每个block中含有thread数,推荐128.
编程步骤
1、赋初值:分配空间(维度、字节数)
2、初始化设备
3、分配主机cpu内存:malloc();
4、分配设备gpu内存:cudaMalloc(float(**)&addr,n*sizeof(float))
5、启动核函数:主机拷贝到设备,完成后设备拷贝到主机
cudaError_t cudaMemcpy(void *dist, const void* src,size_t count,CudaMemcpyKind kind)
6、释放资源:free();cudafree();
编译方法
nvcc hello_gpu.cu -o hello_gpu
性能检测工具
工具:nvprof
sudo /usr/local/cuda/bin/nvprof --print-api-trace ./a.out