結構的多個陣列假設有一些基元的結構體的X和Y結構的數組:CUDA複製與cudaMemcpy
typedef struct
{
int a;
Y** y;
} X;
X的實例X1在主機進行初始化,然後將其複製到實例X2的X,通過cudaMemcpy在設備內存上。
這對X中的所有原語(例如int a)都適用,但cudaMemcpy似乎將任何雙指針變爲單個指針,因此在X中存在對結構數組的訪問時導致出界限如y)。
在這種情況下,我應該使用另一個memcpy函數,如cudaMemcpy2D或cudaMemcpyArrayToArray?
建議非常感謝。謝謝!
編輯
自然的方法(如「這就是我想要做什麼,如果它只是C)對複製結構的數組將是cudaMalloc的數組,然後cudaMalloc並分別初始化每個元素如:
X** h_x;
X** d_x;
int num_x;
cudaMalloc((void**)&d_x, sizeof(X)*num_x);
int i=0;
for(;i<num_x;i++)
{
cudaMalloc((void**)d_x[i], sizeof(X));
cudaMemcpy(&d_x[i], &h_x[i], sizeof(X), cudaMemcpyHostToDevice);
}
然而,爲的cudaMalloc產生崩潰我承認我不是在CUDA函數指針的使用而舒適的,所以也許我搞砸了與cudaMalloc和cudaMemcpy參數
?
CUDA計算能力2.0及以上版本支持雙精度運算,否則編譯器會拋出雙精度浮點數,請注意編譯將無誤地執行 – TripleS
我告訴過你,double指針('**')會使這個額外的具有挑戰性的。如果你想看看如何將'**'數組從主機複製到設備,請看[這裏](http://stackoverflow.com/questions/6137218/cuda-2d-array-problem/6137517#6137517)。這不是因爲心臟不好。請注意,a.lasram首先建議在主機上展平*。我還建議你接受a.lasram給出的答案,如果你有他們,請發表新的問題。當你進行批發編輯併發布大部分已經被回答的舊問題時,它會讓這個問題變得凌亂和令人困惑,讓其他人閱讀。 –