我一直在查看官方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);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么这里有一个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);
}
Run Code Online (Sandbox Code Playgroud)
由于这是CUDA网站上的官方示例,我想我一定会遗漏一些东西.
您的版本基本上numThreads是等于size(但仅限于此)时发生的情况.
官方示例的作用如下:假设numThreads等于4(为简单起见,通常会大得多),并考虑数组位置(for a和b):
a or b x x x x x x x x
thread that works here 0 1 2 3 0 1 2 3
Run Code Online (Sandbox Code Playgroud)
然后第一个线程将处理所有可被4整除的数组位置,等等.
你的版本的问题是你的函数的调用者必须确保有大量的线程size.例如,如果你打电话给你版采用了1调光网和双方gridDim.x和blockDim.x为2,但长度为8的载体,那么你的矢量的一半不处理!
官方示例无论如何都可以工作 - 无论调用者分配多少线程,都将处理整个矢量.
| 归档时间: |
|
| 查看次数: |
1493 次 |
| 最近记录: |