我在我的程序中使用共享内存,问题是当我更改线程和块的数量时,结果也会发生变化。我可能会对某些配置采取正确的结果,但对另一个采用错误。
我正在尝试处理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];
答案 0 :(得分:1)
如果块大小超过TILE_WIDTH,您肯定会得到“无效的共享写入大小”错误,否则应该没有错误。