CUDA矩阵转置Kernel随机失效问题求助
CUDA矩阵转置Kernel随机失效问题求助
大家好,我最近在写CUDA矩阵转置的代码,碰到了一个挺头疼的问题:小尺寸的矩阵转置完全符合预期,但换成更大的尺寸(比如480),或者多次运行程序时,结果就会异常,甚至偶尔会崩溃。
我的实现思路是把整个矩阵拆分成n×n的块,每个块启动SEGMENT_SIZE个线程,每个线程负责处理自己所在块的一列。目前我假设MATRIX_SIZE是能被SEGMENT_SIZE整除的。
下面是我的调用参数和Kernel代码:
调用部分代码:
#define MATRIX_SIZE 64 #define SEGMENT_SIZE 32 int n_block = (MATRIX_SIZE % SEGMENT_SIZE) ? MATRIX_SIZE / SEGMENT_SIZE + 1 : MATRIX_SIZE / SEGMENT_SIZE; dim3 blocksPerGrid(n_block, n_block); dim3 threadsPerBlock(SEGMENT_SIZE); transposeMatrix<<<blocksPerGrid, threadsPerBlock, threadsPerBlock.x * threadsPerBlock.x * sizeof(float)>>>(d_data, MATRIX_SIZE);
Kernel实现:
__global__ void transposeMatrix(float *d_data, int mat_dim) { // 共享内存数组 extern __shared__ float sdata[]; for (int i = 0; i < blockDim.x; i++) { sdata[blockDim.x * i + threadIdx.x] = d_data[(i + blockIdx.y * blockDim.x) * mat_dim + (blockDim.x * blockIdx.x + threadIdx.x)]; } __syncthreads(); for (int i = 0; i < blockDim.x; i++) { d_data[(i + blockIdx.y * blockDim.x) + (threadIdx.x + blockIdx.x * blockDim.x) * mat_dim] = sdata[threadIdx.x + i * blockDim.x]; } }
具体的现象是:当MATRIX_SIZE=64、SEGMENT_SIZE=32时,程序每次运行都没问题,转置结果完全正确;但把MATRIX_SIZE改成480之后,就开始出现异常——有时候运行出来的矩阵转置结果不对,而且不是每次都出错,随机性很强。
有没有大佬能帮我分析下哪里出问题了?
备注:内容来源于stack exchange,提问作者BrightSoul
相关产品推荐
相关产品推荐

