我已經寫了一些代碼來嘗試交換用於FFT目的的2D矩陣的象限,它存儲在一個平面陣列中。CUDA設備到設備轉移昂貴
int leftover = W-dcW;
T *temp;
T *topHalf;
cudaMalloc((void **)&temp, dcW * sizeof(T));
//swap every row, left and right
for(int i = 0; i < H; i++)
{
cudaMemcpy(temp, &data[i*W], dcW*sizeof(T),cudaMemcpyDeviceToDevice);
cudaMemcpy(&data[i*W],&data[i*W+dcW], leftover*sizeof(T), cudaMemcpyDeviceToDevice);
cudaMemcpy(&data[i*W+leftover], temp, dcW*sizeof(T), cudaMemcpyDeviceToDevice);
}
cudaMalloc((void **)&topHalf, dcH*W* sizeof(T));
leftover = H-dcH;
cudaMemcpy(topHalf, data, dcH*W*sizeof(T), cudaMemcpyDeviceToDevice);
cudaMemcpy(data, &data[dcH*W], leftover*W*sizeof(T), cudaMemcpyDeviceToDevice);
cudaMemcpy(&data[leftover*W], topHalf, dcH*W*sizeof(T), cudaMemcpyDeviceToDevice);
請注意,此代碼需要設備指針,並且DeviceToDevice傳輸。
爲什麼這似乎運行如此緩慢?這可以優化嗎?我使用普通的memcpy對主機進行了相同的操作,並且速度慢了約2倍。
任何想法?
啓動cudaMemcpy代價高昂。您最好編寫一個從輸入讀取的內核,交換和寫入適當的位置,而不是將cudaMemcpy放在for循環中。 – 2011-05-20 01:20:27
hrmmm..bummer。做一個主機memcpy和轉移到設備的比較呢? – Derek 2011-05-20 15:05:37