为什么这个CUDA示例内核有一个for循环?

为什么这个CUDA示例内核有一个for循环?,cuda,Cuda,我一直在看CUDA官方网站上的以下示例: 请在此下载: 它包含以下内核: // Complex pointwise multiplication static __global__ void ComplexPointwiseMulAndScale(Complex *a, const Complex *b, int size, float scale) { const int numThreads = blockDim.x * gridDim.x; const int threa

我一直在看CUDA官方网站上的以下示例:

请在此下载:

它包含以下内核:

// Complex pointwise multiplication
static __global__ void ComplexPointwiseMulAndScale(Complex *a, const Complex *b, int size, float scale)
{
    const int numThreads = blockDim.x * gridDim.x;
    const int threadID = blockIdx.x * blockDim.x + threadIdx.x;

    for (int i = threadID; i < size; i += numThreads)
    {
        a[i] = ComplexScale(ComplexMul(a[i], b[i]), scale);
    }
}

由于这是CUDA网站上的一个官方示例,我想我一定遗漏了什么。

您的版本基本上就是
numThreads
等于
size
时发生的情况(但只有在那时)

官方例子如下:假设代码> NothOxth/Cuth>等于4(为简单起见,通常会大得多),并考虑数组位置(对于<代码> A<代码>和<代码> B<代码>):

然后第一个线程将处理所有可被4整除的数组位置,等等

您的版本存在的问题是,函数的调用者必须确保
size
越大,线程就越多。例如,如果使用1-dim网格调用版本,并且
gridDim.x
blockDim.x
均为2,但在长度为8的向量上,则不处理向量的一半

不管调用方为其分配多少线程,官方示例都可以工作,整个向量都将被处理

// Complex pointwise multiplication
static __global__ void ComplexPointwiseMulAndScale(Complex *a, const Complex *b, int size, float scale)
{
    const int threadID = blockIdx.x * blockDim.x + threadIdx.x;

    a[threadID] = ComplexScale(ComplexMul(a[threadID], b[threadID]), scale);
}
  a or b                  x x x x x x x x
  thread that works here  0 1 2 3 0 1 2 3