嘿, 我有兩個2000的數組。我想編寫一個內核將一個數組複製到另一個數組。該陣列代表1000個粒子。索引0-999將包含一個x值和1000-1999位置的y值。CUDA - 指定<<<x,y> >> for for循環
我需要一個for循環來複制從1個數組到另一個數組的N
粒子。例如:
int halfway = 1000;
for(int i = 0; i < N; i++){
array1[i] = array2[i];
array1[halfway + i] = array[halfway + i];
}
由於N的數量始終小於2000,我可以創建2000個線程嗎?或者我必須創建幾個塊。
我在想這樣一個內核中:
int tid = threadIdx.x;
if (tid >= N) return;
array1[tid] = array2[tid];
array1[halfway + tid] = array2[halfway + tid];
,並調用它,如下所示:
kernel<<<1,2000>>>(...);
將這項工作?它會很快嗎?或者我會更好地將問題分解成塊。我不知道如何做到這一點,也許(這是正確的?)
int tid = blockDim.x*blockIdx.x + threadIdx.x;
if (tid >= N) return;
array1[tid] = array2[tid];
array1[halfway + tid] = array2[halfway + tid];
kernel<<<4,256>>>(...);
我正在嘗試的東西出來,它只是需要接近10分鐘我的程序運行。當然,我認爲'cudaMemcpy'就夠了。你是說我的多塊解決方案可以像現在這樣工作,或者我需要一個帶有'blockDim.x'增量的for循環? 4是塊數的明智選擇?乾杯 – user660414 2011-03-15 16:29:09
我還補充說,由於在主機和設備之間移動數據的速度有多慢,因此需要大量的計算才能使GPU的性價比更高。在這種情況下,如果內核比CPU上的簡單for循環更快,我會感到驚訝。 如果你正在用這些設備內存粒子陣列進行其他計算,我希望是這種情況,那麼值得的是什麼:) – tugudum 2011-03-15 16:31:10
@ user660414您需要循環以支持大於4 * 256的數組。 – tugudum 2011-03-15 16:35:23