You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:14:51