2013-07-22 42 views
0

結構的多個陣列假設有一些基元的結構體的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參數

+0

CUDA計算能力2.0及以上版本支持雙精度運算,否則編譯器會拋出雙精度浮點數,請注意編譯將無誤地執行 – TripleS

+0

我告訴過你,double指針('**')會使這個額外的具有挑戰性的。如果你想看看如何將'**'數組從主機複製到設備,請看[這裏](http://stackoverflow.com/questions/6137218/cuda-2d-array-problem/6137517#6137517)。這不是因爲心臟不好。請注意,a.lasram首先建議在主機上展平*。我還建議你接受a.lasram給出的答案,如果你有他們,請發表新的問題。當你進行批發編輯併發布大部分已經被回答的舊問題時,它會讓這個問題變得凌亂和令人困惑,讓其他人閱讀。 –

回答

4

cudaMemcpy,cudaMemcpy2DcudaMemcpyArrayToArray都從主機中的連續存儲區域複製到設備上的連續存儲區域。

您必須將所有數據複製到您發送到設備的中間連續緩衝區中。

+0

有關其他討論,您可能會對我的答案感興趣[此處](http://stackoverflow.com/questions/15431365/cudamemcpy-segmentation-fault/15435592#15435592)。雙指針(**)更具挑戰性。建議您將數據平鋪到連續區域,正如a.lasram所暗示的那樣。 –

+0

感謝您的回答。通過扁平數據,你的意思是將整個結構序列化成一個字節數組嗎? – brito

+0

@brito是的,將整個結構序列化爲一個連續的字節數組 –