我正在編寫代碼並使用cudaMemcpyToSymbol
將一些cudaPitchedPtrs
複製到(每個進程的多個GPU)設備,以便我可以方便地訪問某些主機複製的內存。但是,我發現了一個非常奇怪的錯誤(我毫不猶豫地稱之爲,但我沒有其他解釋),我不知道如何有效解決問題。這裏是我的代碼的一部分負責:需要幫助診斷cudaMemcpyToSymbol錯誤
因此,從main.c main.c中調用init_gpu()在gpu_kernels.cu(init_gpu有通常的extern "C"
框架,但我刪除了這一點,它並沒有影響下面的問題)。 gpu_utilities.cu是唯一包含gpu_decs.h的文件(我將所有CUDA源代碼內聯到gpu_kernels.cu中)。
現在,這裏gpu_decs.h的一個片段:
__constant__ struct cudaPitchedPtr rad_gpu;
//__constant__ struct cudaPitchedPtr test_pptr;
當第二行註釋掉,下面cudaMemcpyToSymbol操作失敗,錯誤代碼11:
cudaErrorCheck(cudaMemcpyToSymbol(rad_gpu,
&((*gpu_rad_parms)[n].dstPtr), sizeof(struct cudaPitchedPtr),
cudaMemcpyHostToDevice), "init_gpu - rad_gpu - symbol");
然而,當我取消註釋test_pptr(從未在代碼中的任何位置定義或使用)此行不會引發錯誤。 test_pptr的類型似乎並不重要,只要它比char大,我認爲(這可能不是真的;我沒有完全描述這個問題)。
可能有趣的是,沒有這條線,rad_gpu是gpu_decs.h中的最後一個__constant__聲明。但是,這個錯誤對我來說依然沒有意義。有沒有人看過或聽過這個問題的故事,並有一個可靠的方法來解決它?我對宣佈test_pptr並考慮解決問題感到不舒服。
嘗試用包含符號名稱的字符串替換'cudaMemcpyToSymbol'調用的第一個參數(所以'cudaMemcpyToSymbol(「rad_gpu」,......)') – talonmies
不幸的是,您的建議沒有任何影響我的情況 – user1639133