CUDA文件组织和限定符

CUDA项目的文件组织

  1. CUDA项目中可以有.cu 和 .cpp的文件

  2. 在.cu文件中,可以用#include “cuda_x.cuh”来相互调用.cu里的函数,也可以 #include “cpp_x.h”.

  3. 在.cpp文件中,可以使用.cu文件中的声明为extern“C”的函数。在.cpp文件调用前,需要用extern “C” 函数声明再声明一次。即.cu中,函数定义时需要用extern “C” 修饰。在.cpp调用时,也需要用extern“C” 来修饰。而.cpp中是不能直接调用__global__函数的,因为编译器是无法解析符号<<<……>>>以及blockIdx、 threadIdx等内建变量的,因此__global__函数只能放在.cu函数里面定义和调用。

CUDA C的扩展

限定符

限定符 特征
__device__ 在设备端使用,仅可通过设备调用
__global__ 在设备端执行,仅可通过主机调用
__host__ 在主机上执行,仅可通过主机调用

缺省限定符的情况下则是__host__,并且__host__和__device__可以一起使用,此时函数将为主机和设备进行编译。

限定符使用的一些限制

  1. __device__和__global__不支持递归,其实思考下如果是支持递归的则对任务的并行性也没有任何帮助,毕竟递归程序的执行是需要靠函数栈的,这东西的执行是一层一层的,层与层之间有关系,显然无法并行

  2. __device__ 、__global__函数体内部无法声明静态变量

  3. __device__、__global__函数体内不能含有数量可变的参数

  4. __device__ 函数的地址无法获取,但支持 __global__ 函数的函数指针

  5. __global__ 和 __host__ 限定符无法一起使用。

  6. __global__ 函数的返回类型必须为空。

  7. __global__ 函数的调用是异步的,也就是说它会在设备执行完成之前返回。

  8. __global__ 函数参数将同时通过共享存储器传递给设备,且限制为 256 字节。