CUDA学习(三十四)

简介:

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())访问。
    timg
目录
相关文章
|
并行计算 程序员
|
并行计算 算法
|
并行计算 API
|
并行计算 API
|
存储 并行计算 API
|
缓存 并行计算 异构计算
|
并行计算 API 索引
|
并行计算 索引