2014-04-10 169 views
-1

我在我的程序中使用共享內存,問題是當我更改線程和塊的數量時,結果也在變化。我可能爲某些配置採用正確的結果,但對於另一個。共享內存組織線程和塊

我想處理一個80x64 = 5120 image.That。這就是爲什麼我創建:

const int NUM_THREADS = 16; 
dim3 dimGrid( ColsNum/NUM_THREADS , RowsNum/NUM_THREADS); 
dim3 dimBlock(NUM_THREADS ,NUM_THREADS); 

所以,服用4×5 = 20個每個16×16 = 256個線程= 5120元塊。

現在,問題出現在使用TILE寬度。我不知道如何選擇這個寬度。我應該記住什麼?

上述配置(不使用共享內存)工作正常。

但是,當使用共享內存和改變TILE寬度和線程大小的大小時,我得到了這些不同的結果。其中一個也是一個錯誤「未指定的啓動失敗」,所以這是一個內存問題?

如果我運行ptxas(所有我的內核):

78027 bytes gmem, 72 bytes cmem[3] 
Used 8 registers, 368 bytes cmem[0] 
Used 32 registers, 5408 bytes smem, 376 bytes cmem[0], 4 bytes cmem[2] 
Used 30 registers, 3328 bytes smem, 416 bytes cmem[0], 32 bytes cmem[2] 
Used 13 registers, 368 bytes cmem[0] 
Used 16 registers, 416 bytes cmem[0] 
Used 32 registers, 5408 bytes smem, 376 bytes cmem[0], 4 bytes cmem[2] 
Used 26 registers, 392 bytes cmem[0], 32 bytes cmem[2] 
Used 24 registers, 5408 bytes smem, 368 bytes cmem[0], 24 bytes cmem[2] 
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads 

所以,共享和常量內存大小確定。

__shared__ float sharedMa[TILE_WIDTH][TILE_WIDTH]; 

int bx = blockIdx.x , by = blockIdx.y; 
int tx = threadIdx.x , ty = threadIdx.y; 
int RowIdx = ty + by * TILE_WIDTH; 
int ColIdx = tx + bx * TILE_WIDTH; 


if (RowIdx >= RowsNum || ColIdx >= ColsNum) return; 

int J = RowIdx * ColsNum + ColIdx; 


sharedMa[ty][tx] = *(devMa + J);//devMa is a float * argument 

__syncthreads(); 

.../calculations 

__syncthreads(); 

*(devMa + J) = sharedMa[ty][tx]; 
+0

未指定的啓動失敗通常與內存邊界衝突有關。使用cuda memcheck檢查內存訪問。您沒有提供完整的可編譯和可執行代碼。修改J,瓦片大小和線程網格大小之間的關係。 – JackOLantern

回答

1

你一定會得到的是「大小的無效共享寫」錯誤,如果塊大小超過TILE_WIDTH,否則應該沒有錯誤。