Cuda 共享内存组织线程和块

Cuda 共享内存组织线程和块,cuda,Cuda,我在程序中使用共享内存,问题是当我更改线程和块的数量时,结果也在更改。我可能会对某些配置使用正确的结果,但对另一个配置使用错误的结果 我正在尝试处理一个80x64=5120图像。这就是为什么我要创建: const int NUM_THREADS = 16; dim3 dimGrid( ColsNum / NUM_THREADS , RowsNum / NUM_THREADS ); dim3 dimBlock( NUM_THREADS ,NUM_THREADS ); 因此,取4x5=20个块

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

我正在尝试处理一个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个元素

现在,瓷砖宽度的使用出现了问题。我不知道如何选择这个宽度。我应该考虑什么

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

但是当使用共享内存并改变分幅宽度和线程大小时,我得到了各种各样的结果。其中一个错误是“未指定的启动失败”,所以这是内存问题

如果我运行ptxas(我所有的内核):

因此,共享和恒定的内存大小是可以的

__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];

如果块大小超过TILE_宽度,则肯定会出现“大小的共享写入无效”错误,否则应该没有错误。

未指定的启动失败通常与内存边界冲突有关。使用cuda memcheck检查内存访问。您没有提供完全可编译和可执行的代码。修改J、磁贴大小和线程网格大小之间的关系。@JackOLantern:我注意到,当我给出相同的块和磁贴宽度尺寸时,它给出了正确的结果。否则,它会给出“大小的共享写入无效”“地址超出范围”,但我无法理解…@JackOLantern:嗯,首先,请告诉我,瓷砖宽度应始终与块大小相同?因为这样,为什么我们称之为瓷砖宽度而不将其保留为块大小。谢谢。
__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];