关于访问冲突:

斑竹您好: 我写了一段代码实现如下功能:有一个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();
}

Access Violation是访问越界。而不是冲突的访问。(实际上该词语一般被翻译为非法访问)。

debugger为您指出了你是在写入global memory的时候越界的,而您的代码中只有这里是写入:
d_block[x_id+y_id*Col_num] = …;

请您确定您的d_block指向的缓冲区有足够的空间。
您出错的时候,x_id = 56384, y_id = 25
以及参数col_num未知。
请您确定
d_block[26 * col_num + 56384]是有效的。
(d_block至少需要有26 * col_num + 56384个元素!)
(例如,假设col_num是200, 您至少需要有61584个float在d_block指向的缓冲区里)

如果您不能确保这一点,请仔细考虑下您的实现是否符合您原来算法的本意。

谢谢斑竹详尽的回答,问题已经解决!功能实现没问题;