PyCUDA中设置多线程后threadIdx.x为何始终为0?
问题原因及解决方法
你搞反了grid和block参数的含义:
grid=(10,2)表示网格在x方向有10个块,y方向有2个块,总共有10×2=20个线程块,每个块的线程数由block参数决定。block=(1,1,1)表示每个线程块只有1个x方向的线程,所以threadIdx.x自然始终是0,你以为的“第二个线程”其实是y方向的块,对应blockIdx.y的值为1。
如果要实现10个块,每个块包含2个线程,需要调整参数:
- 将
grid设为(10,1,1)(x方向10个块,y/z方向各1个) - 将
block设为(2,1,1)(每个块x方向2个线程)
修正后的代码:
import pycuda.driver as cuda import pycuda.autoinit from pycuda.compiler import SourceModule mod = SourceModule(""" #include <stdio.h> __global__ void myfirst_kernel() { printf("I am in block no: %d thread no: %d \\n", blockIdx.x, threadIdx.x); } """) function = mod.get_function("myfirst_kernel") function(grid=(10,1,1), block=(2,1,1))
运行后每个block的threadIdx.x就会出现0和1的结果。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

