gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:50:07 24 4
gpt4 key购买 nike

我一直在看来自 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 网站上的官方示例,我想我一定遗漏了什么。

最佳答案

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

官方的例子是这样的:假设numThreads等于4(为简单起见,通常会大很多),考虑数组位置(都是ab):

  a or b                  x x x x x x x x
thread that works here 0 1 2 3 0 1 2 3

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

您的版本的问题是您函数的调用者 必须确保线程数与size 一样多。例如,如果您使用 1-dim 网格调用您的版本,并且 gridDim.xblockDim.x 均为 2,但在长度为 8 的向量上,则一半你的向量没有被处理!

无论调用者分配多少线程,官方示例都可以正常工作,整个 vector 都将被处理。

关于cuda - 为什么这个 CUDA 示例内核有一个 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19022544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com