Cuda 元素数量大于分配的线程数量

Yih*_* Hu 2 c++ cuda

我是 CUDA 编程新手。我很好奇如果元素数量大于线程数量会发生什么?

在这个简单的 vector_add 示例中

__global__
void add(int n, float *x, float *y)
{
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i < n) 
        y[i] = x[i] + y[i];
}
Run Code Online (Sandbox Code Playgroud)

假设数组元素的数量为 10,000,000。我们使用 64 个块和每个块 256 个线程来调用此函数:

int n = 1e8;
int grid_size = 64;
int block_sie = 256;
Run Code Online (Sandbox Code Playgroud)

那么,只分配了 64*256 = 16384 个线程,其余的数组元素会发生什么情况呢?

Rob*_*lla 5

数组的其余元素会发生什么?

什么都没有。它们不会被碰触并且保持不变。当然,你的x数组元素无论如何都不会改变。所以我们这里指的是y。的值y[0..16383]将反映矢量相加的结果。的值y[16384..9999999]将保持不变。

由于这个原因(为了方便地处理独立于所选网格大小的任意数据集大小),人们有时会建议采用网格跨步循环内核设计。