我是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'操作。 –