2013-09-26 87 views
2

我一直在看下面的例子來自官方CUDA網站:爲什麼這個CUDA示例內核有for循環?

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網站上的官方示例,我想我必須缺少一些東西。

回答

5

你的版本基本上是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的矢量上,則不會處理一半的矢量!

官方示例無論 - 無論調用者分配給它多少個線程,整個矢量都將被處理。