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

时间:2013-09-26 08:00:37

标签: cuda

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

http://docs.nvidia.com/cuda/cuda-samples/index.html#simple-cufft

在此处下载:http://developer.download.nvidia.com/compute/DevZone/C/Projects/x64/simpleCUFFT.zip

它包含以下内核:

// 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);
    }
}

我的问题是,为什么这里有for循环? CUDA不会同时调用一个线程数组吗?我删除了线程,用以下代码替换它,它产生了相同的输出。

// 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);
}

由于这是CUDA网站上的官方示例,我想我必须遗漏一些东西。

1 个答案:

答案 0 :(得分:5)

您的版本基本上是numThreads等于size时的情况(但)。

官方示例的作用如下:假设numThreads等于4(为简单起见,通常会更大),并考虑数组位置(a和{{} 1}}):

b

然后第一个线程将对所有可被4整除的数组位置起作用,等等。

您的版本存在的问题是,您的函数的调用者必须确保 a or b x x x x x x x x thread that works here 0 1 2 3 0 1 2 3 的线程数量很大。例如,如果您使用1-dim网格调用版本并且sizegridDim.x都为2,但是在长度为8的向量上,则不会处理一半的向量!

官方示例无论如何 - 无论调用者分配多少线程,都将处理整个矢量。