2013-06-06 74 views
0

我有下面顯示的代碼片段。這兩個對「cudaMemcpyToSymbol」的調用基本相同(對dev_a,dev_b的所有操作也是相同的),但是當我運行代碼時,僅在第二次調用「cudaMemcpyToSymbol」時報告了「無效設備符號」錯誤。如果我刪除它,那麼代碼運行沒有任何問題。有誰知道可能是什麼原因?謝謝。針對結構字段指針的「無效設備符號」

struct aStruct { 
    double *a; 
    double *b; 
}; 

__device__ struct aStruct as; 

int main(void) { 

double *dev_a, *dev_b; 
HANDLE_ERROR(cudaMalloc((void**)&dev_a, N * sizeof(double))); 
HANDLE_ERROR(cudaMalloc((void**)&dev_b, N * sizeof(double))); 
... 
HANDLE_ERROR(cudaMemcpyToSymbol(as.a, &dev_a, sizeof(double *))); 
HANDLE_ERROR(cudaMemcpyToSymbol(as.b, &dev_b, sizeof(double *))); 
.... 
} 

回答

2

完全一樣的錯誤說,as.aas.b無效設備的符號。 as設備符號,但結構本身的成員沒有符號表條目,您不能直接在其上應用cudaMemcpyToSymbol

爲了解決這個問題,這樣做如下:

struct aStruct _as; 

HANDLE_ERROR(cudaMalloc((void**)&_as.a, N * sizeof(double))); 
HANDLE_ERROR(cudaMalloc((void**)&_as.b, N * sizeof(double))); 

HANDLE_ERROR(cudaMemcpyToSymbol(as, &_as, sizeof(struct aStruct))); 

[免責聲明寫在瀏覽器中,沒有編譯或測試,使用風險自擔]

即。只複製一個完全初始化的struct aStruct符號,而不是試圖通過成員複製成員。

+0

太棒了,它的工作原理!非常感謝。只是有一個後續問題,如果我稍後想要將as.a傳遞給內核啓動,該怎麼辦?我是否必須使用「cudaMemcpyFromSymbol」整個結構來主持並傳遞第一個字段?如果「as」也是另一個結構中的字段呢?我必須一個接一個地做這個嗎?我從以前的帖子中讀到,不建議使用多級間接尋址,但我需要爲我的應用程序。有沒有簡單的方法來解決這個問題?謝謝。 – roger

+0

如果'as'在編譯單元範圍內被聲明爲'__device__'變量,則不需要將其作爲內核傳遞,它可以直接從內部代碼中訪問。如果您確實需要將主機中的結構傳遞給內核,請按照我的示例代碼中所示的'_as'值。另外,如果此答案解決了您的問題,則可以考慮接受該問題,將其從未答覆的隊列中移除。 – talonmies

+0

感謝您的快速響應。我是新來的stackoverflow,並不知道「規則」。我已經接受了答案。關於後續問題,我想我現在找到了解決方法,這要感謝你的建議。 – roger