gpt4 book ai didi

cuda - __device__ 限定符的范围

转载 作者:行者123 更新时间:2023-12-01 02:00:32 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com