CUDA待处理元素数超过分配线程数时会产生什么运行结果?
CUDA核函数线程总数小于待处理元素数的运行结果说明
你提供的现有代码的执行表现
你给出的核函数逻辑是每个线程仅处理1个对应索引的元素,仅当线程计算得到的索引i小于元素总数n时才会执行加法操作,结合你给出的调用参数:
- 总分配线程数 = 网格大小 * 块大小 = 64 * 256 = 16384
- 只有索引值在0~16383区间内的元素会被正确执行加法计算
- 剩余索引≥16384的元素完全不会被任何线程处理,
y数组对应位置的值会保留核函数调用前的原始值 - 补充说明:你提供的调用代码存在笔误,
block_sie应为block_size
少量线程处理大量元素的正确写法
如果要在总线程数小于元素总数的场景下完成全量元素计算,需要使用**网格跨步循环(Grid Stride Loop)**修改核函数逻辑:
__global__ void add(int n, float *x, float *y) { // 每次跨步为总线程数,遍历所有小于n的索引 for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; i += blockDim.x * gridDim.x) { y[i] = x[i] + y[i]; } }
这种写法的优势:
- 不管总线程数比元素总数小多少,所有元素都会被覆盖处理
- 自动适配不同算力的GPU硬件,无需每次根据元素总数动态调整网格、块参数
- 天然满足内存访问合并规则,不会损失执行性能
内容的提问来源于stack exchange,提问作者Yihan Hu
相关产品推荐
相关产品推荐

