【问题标题】:CUDA array addition and block sizeCUDA 数组加法和块大小
【发布时间】:2020-05-31 19:43:07
【问题描述】:
__global__ void add(int *a, int *b, int *c, int n) 
{
    size_t index = threadIdx. + blockId.x * blockDim.x;
    if(index < n)
    c[index] = a[index] + b[index] ;

}

您好,我想记住为什么需要进行 if 测试的原因。我记得这是关于这个内核中的块大小的东西。它只是关于数组边界吗?

索引大于 n 的线程会发生什么?

【问题讨论】:

  • 假设您正在启动 1024 个线程的块。您的数组大小为 4000,因此启动的块数为 4(4096 个线程)。在最后一个块中,如果不检查边界,最后 96 个线程将尝试写入非法内存位置。

标签: cuda


【解决方案1】:

我记得这与内核中的块大小有关。它只是关于数组边界吗?

是的。除非输入和输出数组中的元素数与启动的线程数完全匹配,否则将发生越界内存访问。在实践中,这种情况很少发生,通常会将网格大小四舍五入以确保线程数超过数组大小所需的线程数。另一种方法是运行比输入更少的线程,这会使部分输入和输出未处理,这没有多大意义。

索引大于 n 的线程会发生什么?

什么都没有。它们将围绕代码的内存访问部分进行分支并在不触及内存的情况下退出,否则会导致超出内存访问的运行时错误。

【讨论】:

    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多