Cuda 设备限定符的范围

Cuda 设备限定符的范围,cuda,Cuda,上面写着一个uuu设备uu限定符变量具有“应用程序的生存期”。这是指内核吗?如果有几个内核,CUDA如何知道哪个变量属于哪个内核 如果我像这样声明一个_设备u变量: void someHOSTfunction() { __device__ int var; // Launch kernel etc... } 从某种意义上说,“var”仍然是全局的吗?从另一个函数启动的内核仍然可以访问它,即使它在someHOSTfunction()的堆栈上是“本地的”,并且在someHOSTfunc

上面写着一个uuu设备uu限定符变量具有“应用程序的生存期”。这是指内核吗?如果有几个内核,CUDA如何知道哪个变量属于哪个内核

如果我像这样声明一个_设备u变量:

void someHOSTfunction() {
   __device__ int var;
   // Launch kernel etc...
}
从某种意义上说,“var”仍然是全局的吗?从另一个函数启动的内核仍然可以访问它,即使它在someHOSTfunction()的堆栈上是“本地的”,并且在someHOSTfunction()返回时得到作用域(?)?这样写有什么区别吗

__device__ int var;
void someHOSTfunction() {
   // Launch kernel etc...
}
现在var是一个全局变量。但这意味着它也可以从其他翻译单位访问。这可能无法防止:

static __device__ int var;
void someHOSTfunction() {
   // Launch kernel etc...
}
正确的做法是什么?

如下:

void someHOSTfunction() {
   __device__ int var;
   // Launch kernel etc...
}
在CUDA是非法的。函数体中不允许使用
\uuu设备\uuu
变量声明,如果您尝试这样做,编译器将发出错误。必须在转换单元范围内声明它们。该限制适用于任何功能,无论是
\uuuuuuu主机\uuuuuuuu
还是
\uuuuuu设备\uuuuuuuu


如果您需要为不同的内核使用不同的静态声明的
\uuuu设备\uuu
变量,那么请为每个内核使用不同的变量名。或者使用运行时分配的变量并将其作为参数传递给内核,或者使用模板参数变量,或者其他。但是你所描述的在CUDA中是不可能的,因为它现在已经存在。

这是真的吗?功能在设备上:即_uuuuuuuuuuuuvoidfun(){}?如果函数被声明为
\uu设备\uuu
,那么可以通过这种方式声明一个uuu共享\uuuu变量,它将只能从设备代码中访问(即,从内核或任何其他
\uu设备\uu
函数中)<代码>\uuuu共享\uuuuu仅指变量,表示它们将存储在线程共享内存中(一个块中的所有线程都可以访问该变量)。查看链接了解更多信息:我有点不具体。我的意思是,如果我在一个uuu设备uuu函数中声明一个uuu设备uuu变量,那可以吗?@Bwawhwmopoloin:不,这也是非法的。涉及哪种类型的功能体并不重要。