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 *)));
....
}
太棒了,它的工作原理!非常感謝。只是有一個後續問題,如果我稍後想要將as.a傳遞給內核啓動,該怎麼辦?我是否必須使用「cudaMemcpyFromSymbol」整個結構來主持並傳遞第一個字段?如果「as」也是另一個結構中的字段呢?我必須一個接一個地做這個嗎?我從以前的帖子中讀到,不建議使用多級間接尋址,但我需要爲我的應用程序。有沒有簡單的方法來解決這個問題?謝謝。 – roger
如果'as'在編譯單元範圍內被聲明爲'__device__'變量,則不需要將其作爲內核傳遞,它可以直接從內部代碼中訪問。如果您確實需要將主機中的結構傳遞給內核,請按照我的示例代碼中所示的'_as'值。另外,如果此答案解決了您的問題,則可以考慮接受該問題,將其從未答覆的隊列中移除。 – talonmies
感謝您的快速響應。我是新來的stackoverflow,並不知道「規則」。我已經接受了答案。關於後續問題,我想我現在找到了解決方法,這要感謝你的建議。 – roger