斑竹您好: 我写了一段代码实现如下功能:有一个242242的矩阵,我需要将其中全部的55的小矩阵块取出来,然后将小块拉成一列,共238238=56644个小块,所以我开辟了一个(55)行*(238*238)列的空间,代码如下:
其中:d_wave1存放242*242的矩阵,wave_rows和wave_cols分别为大矩阵的行数和列数,d_block存放拉成列向量的所有小块,每一列为一个小块,串行的讲,是从左上到右下,依次取块,相互间有重叠,col_num位全部小块数56644,row_num位25;
nsight调试时会在代码中here行自动停止,并提示如图:
[attach]3117[/attach]
cuda info如图:
[attach]3118[/attach]
可以看出是出现了访问冲突,由于矩阵中所有的5*5的块必然有重叠的元素,所以必然会有访问冲突,那么我该如何解决呢,这里我也不知道我有没有讲清楚,希望斑竹给分析一下;
dim3 threads(512,1);
dim3 blocks(111,25);
__global__ void Sub_block_680(myparameter par,float *d_wave1,int wav_rows,int wav_cols,float *d_block,int Col_num,int Row_num)
{
int y_id=blockIdx.y*blockDim.y+threadIdx.y;
int x_id=blockIdx.x*blockDim.x+threadIdx.x;
if (y_id<Row_num&&x_id<Col_num)
{
int a=x_id/cols1;
int b=x_id%cols1;
int c=y_id/par.win_size;
int d=y_id%par.win_size;
d_block[x_id+y_id*Col_num]=d_wave1[(a+c)*wav_cols+(b+d)];
}
__syncthreads();
}