我是cuda新手,所以我希望我的问题不完全脱离基础。 我想在全局设备内存上创建一个数组,但我只知道它在我的主要功能中间有多大(但在我访问设备之前)。从主CUDA声明设备变量
因为我不知道大小我无法将代码之前声明: 设备 myArr,该[]
所以我想创造主,d_myArr指针,然后使用cudaMalloc d_myArr的( ,arrSize)在设备上分配内存,但我从来没有真正在设备上声明变量。
我没有看到将d_Arr发送到我的内核的原因,因为它只会存在于该内核中(我认为?),我只是希望变量作为全局变量存在于我的设备中,并可以被不同的内核访问。
我可以在main声明一个设备变量吗?如在:
int main(){
.
.
__device__ myArr[size];
.
.
}
如果是这样,它由于某种原因泄露(因为我找不到任何人这样做)。如果这是不允许的,我能做些什么呢?我看到有人提到cudaMemcpyToSymbol,但我无法弄清楚它是否与我想要的完全相同,如果是的话,我会很高兴如果有人能够准确解释如何使用它来实现我所需要的。
在侧面的问题,我也有一个常数变量,我想在我的设备和主机上都存在。现在我只是宣布了两次,一次用设备,一次没有,有没有更好的方法来做到这一点?
感谢您的回应! 就这样,我可以确保我正确理解,因为我在设备中分配了内存,它不会丢失,即使我不使用cudaMemcpy来回信息,我的第二个内核中的s_sata将与我的第一个内核的结束,对吧?所以只要我重新发送指向我所有内核的指针,它们都可以引用该变量,否则,如果我不重新发送该变量,它仍然存在于分配的内存中,但我没有引用来访问它。 –
是的,一旦你用'cudaMalloc'分配了设备内存,它就是** persistent **,直到你对它调用一个'cudaFree'操作(或者直到你的应用程序终止)为止。它的行为与其他任何内存一样。一旦你写了一些东西,后续的操作可以看到写了什么,不管是后续的内核还是后续的'cudaMemcpy'操作。 –