函数执行空间说明符表示函数是在主机上执行还是在设备上执行,以及它是可从主机调用还是从设备调用。
__global__ 执行空间说明符将函数声明为内核。 它的功能是:
__global__ 函数必须具有 void 返回类型,并且不能是类的成员。对 __global__ 函数的任何调用都必须指定其执行配置,如执行配置中所述。
对 __global__ 函数的调用是异步的,这意味着它在设备完成执行之前返回。
__device__ 执行空间说明符声明了一个函数:
__global__ 和 __device__ 执行空间说明符不能一起使用。__host__ 执行空间说明符声明了一个函数:
__host__ 执行空间说明符,或者声明它没有任何 __host__ 、__device__ 或 __global__ 执行空间说明符; 在任何一种情况下,该函数都仅为主机编译。__global__ 和 __host__ 执行空间说明符不能一起使用。
但是, __device__ 和 __host__ 执行空间说明符可以一起使用,在这种情况下,该函数是为主机和设备编译的。 Application Compatibility 中引入的 __CUDA_ARCH__ 宏可用于区分主机和设备之间的代码路径:
__host__ __device__ func()
{
#if __CUDA_ARCH__ >= 800
// Device code path for compute capability 8.x
#elif __CUDA_ARCH__ >= 700
// Device code path for compute capability 7.x
#elif __CUDA_ARCH__ >= 600
// Device code path for compute capability 6.x
#elif __CUDA_ARCH__ >= 500
// Device code path for compute capability 5.x
#elif __CUDA_ARCH__ >= 300
// Device code path for compute capability 3.x
#elif !defined(__CUDA_ARCH__)
// Host code path
#endif
}