2012-08-31 132 views
3

我正在編寫代碼並使用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並考慮解決問題感到不舒服。

+0

嘗試用包含符號名稱的字符串替換'cudaMemcpyToSymbol'調用的第一個參數(所以'cudaMemcpyToSymbol(「rad_gpu」,......)') – talonmies

+0

不幸的是,您的建議沒有任何影響我的情況 – user1639133

回答

2

可能是因爲字體大小不匹配:cudaPitchedPtr有幾個size_t類型的字段。所以如果在你的主機端sizeof(size_t)是8字節,而在設備上這是4字節,你可能會遇到問題。這也可以解釋爲什麼定義另一個pitchedPtr解決了這個問題,因爲分配了更多的內存。

+0

工程就像一個魅力。我猜cudaPitchedPtrs應該始終作爲內核參數傳遞。 – user1639133