仅pycuda区块(N、1、1)工程

仅pycuda区块(N、1、1)工程,cuda,pycuda,Cuda,Pycuda,我不明白为什么下面的程序对block=N,1,1运行正常,但对1,1,N(结果为无效值)或1,N,1(结果为0,1,0…..0)运行不正常 或10,50,1(结果为0,1,0..0)(N=500) 将pycuda.gpuarray导入为gpuarray 将pycuda.driver导入为cuda 导入pycuda.autoinit 从pycuda.compiler导入SourceModule 将numpy作为np导入 随机输入 从pycuda.curandom进口兰特 导入cmath 将pycu

我不明白为什么下面的程序对block=N,1,1运行正常,但对1,1,N(结果为无效值)或1,N,1(结果为0,1,0…..0)运行不正常 或10,50,1(结果为0,1,0..0)(N=500)

将pycuda.gpuarray导入为gpuarray
将pycuda.driver导入为cuda
导入pycuda.autoinit
从pycuda.compiler导入SourceModule
将numpy作为np导入
随机输入
从pycuda.curandom进口兰特
导入cmath
将pycuda.driver作为drv导入
N=500
a_gpu=gpuarray.to_gpu(np.zeros(N).astype(np.int32))
mod=SourceModule(“”)
#包括
外部“C”{
__全局无效myfunc(int*a,int N)
{
int idx=threadIdx.x;//+blockIdx.x*blockDim.x;

if(idx如果我记得的话,第三个值被限制为一个小数字,比如2或3


您应该能够使用(1,N,1)。

第一个维度对应threadIdx.x,第二个维度对应threadIdx.y,第三个维度对应threadIdx.z

启动block(N,1,1)时,threadIdx.x从0变为N,而threadIdx.y和threadIdx.z始终为零

启动块(1,N,1)时,threadIdx.x始终为零,threadIdx.y从0变为N

因此,与其

idx = threadIdx.x;
换成

idx = blockDim.x * threadIdx.y + threadIdx.x;
或者更准确地说(仅当使用Z>1的块(X、Y、Z)时)


块的第三维限制为64个线程,根据您的gpu,块的第三维限制为64个线程,块中的线程总数为512或1024个。如果您愿意阅读,请参阅所有文档。我已经编辑了我的帖子(从20分钟前开始):)。我不明白的是,我必须始终使用(N,1,1)安排?谢谢!你的最后一个例子不正确。我发现idx=threadIdx.x+threadIdx.yblockDim.x+threadIdx.zblockDim.x*blockDim.y;这工作正常。谢谢,我现在意识到它应该如何工作。也许你可以帮我做这个?@george,谢谢你指出。我用blockIdx代替了blockDim。现在修复了代码。
idx = blockDim.x * threadIdx.y + threadIdx.x;
idx = (blockDim.y * threadIdx.z +  threadIdx.y) * blockDim.x + threadIdx.x;