2014-10-06 30 views
2

我与CUDA一个初学者,和我的同事总是设计的内核具有以下包装:我应该检查内核代码中的线程数量吗?

__global__ void myKernel(int nbThreads) 
{ 
    int threadId = blockDim.x*blockIdx.y*gridDim.x //rows preceeding current row in grid 
      + blockDim.x*blockIdx.x    //blocks preceeding current block 
      + threadIdx.x; 

    if (threadId < nbThreads) 
    { 
     statement(); 
     statement(); 
     statement(); 
    } 
} 

他们觉得有一些地方CUDA可能推出比对准/变形的缘故指定的多个线程的情况,所以我们需要每次检查一次。 但是,到目前为止,我没有看到互联网上的示例内核,他们实际上在进行此验证。

CUDA实际上是否可以启动比指定块/网格尺寸更多的线程?

回答

4

CUDA不会启动比块/网格维度指定的线程更多的线程。

但是,由于块尺寸的粒度(例如,希望块尺寸为32的倍数,并且其尺寸被限制为1024或512),通常情况是难以匹配一个线程网格在数值上等于所需的问题大小。

在这些情况下,典型行为是启动更多线程,根据块粒度有效地舍入到下一个偶数大小,并在内核中使用“线程检查”代码以确保“额外线程“,即超出问题大小的那些人,不要做任何事情。

在你的榜样,这可以通过书面形式澄清:

__global__ void myKernel(int problem_size) 


    if (threadId < problem_size) 

其传达什么意图,即只有对应于问题的规模(这可能不符合启动网格大小)的线程做任何实际工作。

作为一个非常简单的例子,假设我想对一个长度为10000个元素的矢量做矢量加法。 10000不是32的倍数,也不是小于1024的倍数,所以在典型的实现中,我会启动多个线程块来完成这项工作。

如果我想每个threadblock是32的倍数,没有数threadblocks我可以选择,这将给我到底10000线程。因此,我可以在一个线程块中选择256个线程,并启动40个线程块,总共给出10240个线程。使用线程检查,我可以防止“额外”240线程执行任何操作。

相关问题