2011-05-16 126 views
0

我有一些內存已分配在設備上,它只是一個大小爲H * W * sizeof(float)的單一malloc。cudaMemcpy2D共享內存拷貝

這是表示H * W矩陣。

我有一個代碼,我需要交換矩陣的象限。我可以使用cudaMemcpy2D來完成此操作嗎?我是否需要將spitch和dpitch指定爲W * sizeof(float),並僅使用指向矩陣每個象限的指針來完成此操作?

此外,當這些cudaMemcpy談論的內存區域不重疊 - 是否意味着src和dst根本不能重疊?如果我有一個10字節寬的陣列,我想向左移一次 - 它會失敗嗎?

由於

回答

2

可以使用cudaMemcpy2D周邊的子塊,其是較大的投線性內存分配的一部分移動。這樣做沒有問題。不重疊的要求是不可談判的,如果你嘗試它,它會失敗。源和目標可以來自相同的分配,但源和目標的地址範圍不能重疊。如果需要在存在重疊的地方進行一些「原位」複製,則可能會更好地編寫內核來執行此操作(請參閱SDK中的矩陣轉置示例,這是執行此類操作的一種合理方法)。

1

我建議編寫一個簡單的內核來完成這個矩陣操作。我認爲編寫它比使用cudaMemcpy(2D)更容易,而且假設你編寫它以獲得良好的內存一致性,它幾乎肯定會更快。

爲避免破壞輸入矩陣,可能最容易進行不適當的轉換(即不同的輸入和輸出數組)。每個線程將簡單地從其輸入偏移量讀取並寫入轉換的偏移量。

它將類似於矩陣轉置。 CUDA SDK中有a matrix transpose example