2011-01-29 43 views
1

我正在編寫一個CUDA內核來爲行* cols主矩陣中的每個位置創建一個3x3協方差矩陣。因此,3D矩陣的行* cols * 9的大小,我分配在一個單一的malloc相應。我需要在單個索引值中訪問它將偏移索引計算爲3D數組時遇到的麻煩

3x3協方差矩陣的9個值根據來自某些其他二維數組的適當的行r和列c設置它們的值。

換句話說 - 我需要計算合適的索引來訪問3x3協方差矩陣的9個元素,以及作爲輸入值的2D矩陣的行和列偏移量,以及適當的存儲陣列的索引。

我試圖簡化它歸結爲下列:

//I am calling this kernel with 1D blocks who are 512 cols x 1row. TILE_WIDTH=512 
    int bx = blockIdx.x; 
    int by = blockIdx.y; 
    int tx = threadIdx.x; 
    int ty = threadIdx.y; 
    int r = by + ty; 
    int c = bx*TILE_WIDTH + tx; 
    int offset = r*cols+c; 
    int ndx = r*cols*rows + c*cols; 


    if((r < rows) && (c < cols)){ //this IF statement is trying to avoid the case where a threadblock went bigger than my original array..not sure if correct 

     d_cov[ndx + 0] = otherArray[offset];//otherArray just contains a value that I might do some operations on to set each of the ndx0-ndx9 values in d_cov 
     d_cov[ndx + 1] = otherArray[offset]; 
     d_cov[ndx + 2] = otherArray[offset]; 
     d_cov[ndx + 3] = otherArray[offset]; 
     d_cov[ndx + 4] = otherArray[offset]; 
     d_cov[ndx + 5] = otherArray[offset]; 
     d_cov[ndx + 6] = otherArray[offset]; 
     d_cov[ndx + 7] = otherArray[offset]; 
     d_cov[ndx + 8] = otherArray[offset]; 
    } 

當我檢查此陣列在CPU上的計算值,其循環對i =行,J = COLS,K = 1。 .9

結果不匹配。

換句話說d_cov [我*行*的cols + J *的cols + K]!= correctAnswer [i] [j] [k]的

誰能給我如何來解答這個問題的任何提示?這是索引問題還是其他邏輯錯誤?

回答

1

,而不是答案(我還沒有盯着夠難找到),這裏的技術,我通常在調試時使用這些類型的問題。首先,將目標數組中的所有值設置爲NaN。 (你可以通過cudaMemset做到這一點 - 設置每個字節爲0xFF。)然後嘗試統一設置每個位置到該行的值,然後檢查結果。理論上,它應該看起來像這樣:

0 0 0 ... 0 
1 1 1 ... 1 
. . . . . 
. . . . . 
. . . . . 
n n n ... n 

如果您看到NaNs,則無法寫入元素;如果你發現行元素不合適,有些事情是錯誤的,並且他們通常會以暗示模式出現。用列值和飛機做類似的事情。通常,這個技巧幫助我發現索引計算的一部分是錯誤的,這是大部分的爭鬥。希望有所幫助。

0

我可能只是愚蠢的,但這一行的邏輯是什麼?

int ndx = r*cols*rows + c*cols; 

你不應該有

int ndx = offset*9; 

如果說,你的協方差矩陣的尺寸是行*的cols * 9,以後就不會偏移* 9帶你在同一位置3D協方差數組作爲您在輸入數組中的位置。所以偏移* 9 + 0將是偏移處元素的3×3協方差矩陣的位置(0,0),偏移* 9 + 1將是(0,1),偏移* 9 + 2將是(0, 2),偏移量* 9 + 3將是(1,0),依此類推直到偏移量* 9 + 8。

+0

我認爲這是不正確的。它不適用於空間中的下一個「飛機」 – Derek 2011-01-30 02:11:16