2013-10-16 50 views
-3

我有一個N×N的整數矩陣(爲了方便起見,它以一維數組的形式存儲在設備中)。並行反對角'for'循環?

我執行這需要執行下面的算法:

有在這個廣場2N反對角線。 (反對角線是從上邊緣到左邊緣和從右邊緣到下邊緣的平行線)

我需要一個2N迭代的for循環,每次迭代計算一個反對角線,從左上角開始到右下角結束。

在每次迭代中,該對角線上的所有元素必須平行運行。

基於先前的反對角線的值計算每個反對角線。

那麼,我該如何在CUDA中使用此需求來索引這些線程?

+4

顯示您已經編寫的代碼。沒有人會爲你寫全部。 –

+0

@Tom我認爲你的解釋是正確的。我對我之前刪除的評論表示歉意。 – JackOLantern

回答

1

只要我明白了,你要像

Parallelizing the Smith-Waterman Local Alignment Algorithm using CUDA一個

在每次迭代中,內核與不同數量的線程啓動。

也許Parallel Anti diagonal 'for' loop代碼可以被修改爲

int iDivUp(const int a, const int b) { return (a % b != 0) ? (a/b + 1) : (a/b); }; 

#define BLOCKSIZE 32 

__global__ antiparallel(float* d_A, int step, int N) { 

    int i = threadIdx.x + blockIdx.x* blockDim.x; 
    int j = step-i; 

    /* do work on d_A[i*N+j] */ 

} 

for (int step = 0; step < 2*N-1; step++) { 
    dim3 dimBlock(BLOCKSIZE); 
    dim3 dimGrid(iDivUp(step,dimBlock.x)); 
    antiparallel<<<dimGrid.x,dimBlock.x>>>(d_A,step,N); 
} 

此代碼是未經測試,僅僅是一個可能的解決方案(前提是我沒有誤解你的問題)的草圖。此外,我不知道這樣的解決方案效率會如何,因爲您將使用非常少的線程啓動內核。