CUDA编程:变量类型限定符

版权声明:本文为博主原创文章,未经作者允许请勿转载。 https://blog.csdn.net/heiheiya https://blog.csdn.net/heiheiya/article/details/82018662

变量类型限定符指定变量在设备上的存储位置。
在设备代码中声明的自动变量,如果不带 __device__ 、 __shared__ 和 __constant__ 限定符中的任何一个时通常位于寄存器中。但在某些情况下,编译器可能选择将其置于本地存储器中,这将带来性能损耗。

一、__device__

__device__ 限定符声明位于设备上的变量。
在接下来的三节中介绍的其他类型限定符中,最多只能有一种可与 __device__限定符一起使用,具体地指定变量属于哪个存储器空间。如果未出现任何限定符,则变量具有以下特征:

  • 位于全局存储器空间中;
  • 与应用程序具有相同的生命周期;
  • 网格内的所有线程都可访问,主机也可通过运行时库访问(运行时API中的cudaGetSymbolAddress() / cudaGetSymbolSize() / cudaMemcpyToSymbol() / cudaMemcpyFromSymbol()函数和驱动API中的cuModuleGetGlobal()函数)。

二、__constant__

__constant__ 限定符可与 __device__ 限定符一起使用,此时 __device__ 是可选的,所声明的变量具有以下特征:

  • 位于常量存储器空间中;
  • 与应用程序具有相同的生命周期;
  • 网格内的所有线程都可访问,主机也可通过运行时库访问(运行时API中的cudaGetSymbolAddress() / cudaGetSymbolSize() / cudaMemcpyToSymbol() / cudaMemcpyFromSymbol()函数和驱动API中的cuModuleGetGlobal()函数)。

三、__shared__

__shared__ 限定符可与 __device__ 限定符一起使用,此时 __device__ 是可选的,所声明的变量具有以下特征:

  • 位于线程块的共享存储器空间中;
  • 与块具有相同的生命周期;
  • 只可通过块内的所有线程访问。

 四、__restrict__

nvcc通过 __restrict__ 关键字支持受限的(restricted)指针。
C99中引入受限的指针是为了缓解C风格代码中的指针别名问题,别名阻碍了从代码重组到子表达式删除等各种优化。

猜你喜欢

转载自blog.csdn.net/heiheiya/article/details/82018662
今日推荐