C语言扩展:
函数执行空间说明符:
函数执行空间说明符表示函数是在主机上还是在设备上执行,以及函数是从主机还是从设备中调用。__device__
: __device__
执行空间说明符声明一个函数:
- 在设备上执行
- 只能从设备调用
__global__
和__device__
执行空间说明符不能一起使用。__global__
空间说明符将一个函数声明为一个内核。 这样的功能是:
- 在设备上执行
- 在主机上调用
- 对于计算能力为3.2或更高的设备可从设备中调用(有关更多详细信息,请参阅CUDA Dynamic Parallelism)
__global__
函数必须具有void返回类型,并且不能是类的成员
任何对__global__
函数的调用都必须指定其执行配置,如执行配置中所述
对__global__
函数的调用是异步的,这意味着它在设备完成执行之前返回 __host__
:__host__
执行空间说明符声明了一个函数:
- 在主机上执行
- 只在主机上调用
它相当于声明一个只有__host__
执行空间说明符的函数,或者声明它没有任何__host__
,__device__
或__global__
执行空间说明符; 在这两种情况下,该功能都是仅为主机编译的
__global__
和__host__
执行空间说明符不能一起使用。__device__
和__host__
执行空间说明符能一起使用。
然而,在这种情况下,该功能是为主机和设备编译的。 应用程序兼容性中引入的__CUDA_ARCH__
宏可用于区分主机和设备之间的代码路径:
__host__ __device__ func()
{
#if __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 __CUDA_ARCH__ >= 200
// Device code path for compute capability 2.x
#elif !defined(__CUDA_ARCH__)
// Host code path
#endif
}
__noinline__
和__forceinline__
:
编译器在适当的时候内联任何__device__
函数;
如果可能的话,__noinline__
函数限定符可以作为编译器不提示内联函数的提示。__forceinline__
函数限定符可用于强制编译器内联函数__noinline__
和__forceinline__
函数限定符不能一起使用,也不能将函数限定符应用于内联函数。
可量内存空间说明符:
变量存储空间说明符表示变量的设备上的内存位置。
在设备代码中声明的自动变量不包含本节中描述的__device__
,__shared__
和__constant__
内存空间说明符,通常驻留在寄存器中。 但是,在某些情况下,编译器可能会选择将其放置在本地内存中,这可能会产生不良的性能影响,详见设备内存访问。__device__
:__device__
内存空间说明符声明驻留在设备上的变量。
在接下来的两节中定义的其他内存空间说明符中至多有一个可以与·__device__·一起用来进一步表示该变量属于哪个内存空间。 如果它们都不存在,则变量:
- 驻留在全局内存空间中,
- 具有创建它的CUDA上下文的生命周期,
- 每个设备都有一个独特的对象,
- 可以从网格中的所有线程和主机通过运行时库(cudaGetSymbolAddress()/ cudaGetSymbolSize()/ cudaMemcpyToSymbol()/ cudaMemcpyFromSymbol())访问。