CUDA索引块dim.y始终为1

CUDA索引块dim.y始终为1,cuda,Cuda,我想用共享内存来解二维拉普拉斯方程。但奇怪的是,blockDim.y值总是1。有人能帮我吗 主机代码 checkCudaErrors(cudamaloc((void**)和d_A,h*h*sizeof(float)); 检查CUDAERRORS(cudaMalloc((无效**)和d_out,h*h*sizeof(浮动)); 检查CUDAERRORS(cudaMemcpy(d_A,A,h*h*sizeof(float),cudaMemcpyHostToDevice)); dim3块大小=(块大小

我想用共享内存来解二维拉普拉斯方程。但奇怪的是,blockDim.y值总是1。有人能帮我吗

主机代码
checkCudaErrors(cudamaloc((void**)和d_A,h*h*sizeof(float));
检查CUDAERRORS(cudaMalloc((无效**)和d_out,h*h*sizeof(浮动));
检查CUDAERRORS(cudaMemcpy(d_A,A,h*h*sizeof(float),cudaMemcpyHostToDevice));
dim3块大小=(块大小,块大小);
dim3网格大小=((h+块大小-1)/块大小,(h+块大小-1)/块大小);
LaplaceDifference>(d_A,h,d_out);
检查CUDAERRORS(cudaMemcpy(B,d_out,h*h*sizeof(float),cudaMemcpyDeviceToHost));
内核代码
intidx=blockIdx.x*blockDim.x+threadIdx.x;
intidy=blockIdx.y*blockDim.y+threadIdx.y;
__共享浮点数[BLOCK_SIZE+2][BLOCK_SIZE+2];
int n=1;
//在共享内存中加载数据
int halo_index_left=(blockIdx.x-1)*blockDim.x+threadIdx.x;
int halo_index_right=(blockIdx.x+1)*blockDim.x+threadIdx.x;
int halo_index_up=(blockIdx.y-1)*blockDim.y+threadIdx.y;
int halo_index_down=(blockIdx.y+1)*blockDim.y+threadIdx.y;
A_ds[n+threadIdx.y][n+threadIdx.x]=A[idy*h+idx];
如果(threadIdx.x>=blockDim.x-n){
A_ds[threadIdx.y+n][threadIdx.x-(blockDim.x-n)]=(光晕指数左<0)?0:A[idy*h+光晕指数左];
}
if(螺纹IDX.x=h)?0:A[idy*h+光环索引右];
}
if(threadIdx.y>=blockDim.y-n){
A_ds[threadIdx.y-(blockDim.y-n)][threadIdx.x+n]=(光晕指数向上<0)?0:A[thread指数向上*h+idx];
}
如果(螺纹IDX.y=h)?0:A[halo指数向下*h+idx];
}
__同步线程();
P[idy*h+idx]=0.25*(A_-ds[threadIdx.y+n-1][threadIdx.x+n]+A_-ds[threadIdx.y+n+1][threadIdx.x+n]+A_-ds[threadIdx.y+n][threadIdx.x+n-1];
此行:

dim3 blockSize = (BLOCK_SIZE, BLOCK_SIZE);
初始化1D块大小。你想要的是:

dim3 blockSize(BLOCK_SIZE, BLOCK_SIZE);
(我花了很长时间寻找一个傻瓜,但没有找到。)

A是CUDA头文件
vector\u types.h
中定义的特定数据类型

它提供了几个构造函数。以下是此变量构造函数的几个有效用法:

dim3 grid(gx, gy, gz);

dim3 grid = dim3(gx, gy, gz);
dim3 blockSize = BLOCK_SIZE;
你所展示的:

dim3 blockSize = (BLOCK_SIZE, BLOCK_SIZE);
不会按你期望的方式工作

由于等号右侧没有
dim3
用法,编译器将使用其他方法来处理存在的内容。它不是语法错误,因为无论是使用括号还是逗号,都是合法的,从C++语言的角度来看。 希望你能理解括号在C++中的工作原理。我不打算试图描述逗号运算符,您可以阅读有关它的内容,然后。最终的效果是编译器将计算两个表达式中的每一个(一个在逗号的左边,一个在右边),并且它将计算整个表达式的值,作为计算右边表达式所产生的值。因此:

(BLOCK_SIZE, BLOCK_SIZE)
变成这样:

BLOCK_SIZE
很明显这是一个标量,不是多维的

将标量指定给dim3变量时:

dim3 grid(gx, gy, gz);

dim3 grid = dim3(gx, gy, gz);
dim3 blockSize = BLOCK_SIZE;
最终得到的dim3变量具有以下尺寸:

(BLOCK_SIZE, 1, 1)
修复现有问题的一种方法如下:

dim3 blockSize = dim3(BLOCK_SIZE, BLOCK_SIZE);
                 ^^^^

您仅初始化blockSize的一个维度。您认为会发生什么?您是指块大小和网格大小的初始化吗?
dim3块大小(块大小,块大小)
;我认为任何半体面的答案都可能重复,需要解释为什么初始化不起作用,而不仅仅是将一些评论反刍到回答中,强调一些。对问题的评论已经提供了比你复制粘贴时的“答案”更好的回答。我没有从评论中复制粘贴,我只是回答了问题。如果你不喜欢我的答案,发表你自己的