在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/