共享内存组织线程和块

时间:2014-04-10 15:49:54

标签: cuda

我在我的程序中使用共享内存,问题是当我更改线程和块的数量时,结果也会发生变化。我可能会对某些配置采取正确的结果,但对另一个采用错误。

我正在尝试处理80x64 = 5120的图像。这就是我创作的原因:

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

因此,采用4x5 = 20个块,每个16x16 = 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];

1 个答案:

答案 0 :(得分:1)

如果块大小超过TILE_WIDTH,您肯定会得到“无效的共享写入大小”错误,否则应该没有错误。