http://docs.nvidia.com/cuda/cuda-c-programming-guide/#device-variable-qualifier上,它表示__device_限定符变量具有“应用程序的生存期”。这是否意味着内核?如果有多个内核,CUDA如何知道哪个变量属于哪个内核?

如果我像这样声明__device_变量:

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中是非法的。函数体内不允许使用__device__变量声明,如果尝试这样做,编译器将发出错误。您必须在翻译单位范围内声明它们。该限制适用于任何功能,无论是__host__还是__device__

如果对于不同的内核需要不同的静态声明的__device__变量,请为每个内核使用不同的变量名。或使用运行时分配的变量并将其作为参数传递给内核,或使用模板参数变量或其他。但是您描述的内容在CUDA中是不可能的,因为它已经存在。

关于cuda - __device__限定词的范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36836737/

10-17 01:42