CUDA中的线程层次结构设计,用于我的代码

时间:2015-04-22 12:31:07

标签: cuda

我想将以前的c ++代码转换为CUDA

for(int x=0 ; x < 100; x++)
{
    for(int y=0 ; y < 100; y++)
    {
        for(int w=0 ; w < 100; w++)
        {
            for(int z=0 ; z < 100; z++)
            {
              ........
            }
        }
    }
}

这些循环组合起来创建一个新的int值。

如果我想使用CUDA,我必须在构建之前设计线程层次结构 内核代码。

那么如何设计层次结构呢?

取决于每个循环,我认为它会是这样的:

100 * 100 * 100 * 100 = 100000000个线程。

你能帮助我吗

由于

我的CUDA规范:

  

CUDA设备#0

     

主要修订号:1

     

次要修订号:1

     

名称:GeForce G 105M

     

全球总记忆:536870912

     

每个块的共享内存总量:16384

     

每块总寄存器数:8192

     

翘曲尺寸:32

     

最大内存间距:2147483647

     

每个块的最大线程数:512

     

块的最大尺寸1:512

     

块的最大尺寸2:512

     

块的最大尺寸3:64

     

网格的最大尺寸1:65535

     

网格的最大尺寸2:65535

     

网格的最大尺寸3:1

     

时钟频率:1600000

     

总常数内存:65536

     

纹理对齐:256

     

并发复制和执行:否

     

多处理器数量:1

     

内核执行超时:是

1 个答案:

答案 0 :(得分:1)

GPU的100000000个线程(或块)并不算太多。

您的GPU具有1.1的计算能力,因此在前两个网格维度(x和y)的每一个中限制为65535个块。由于100 * 100 = 10000,我们可以在前两个网格维度中的每一个中启动10000个块,以覆盖整个for循环范围。这将为每个for循环迭代启动一个块(xyzw的唯一组合)并假设您将使用块中的线程满足您的for循环计算代码的需求:

__global__ void mykernel(...){

  int idx = blockIdx.x;
  int idy = blockIdx.y;

  int w = idx/100;
  int z = idx%100;
  int x = idy/100;
  int y = idy%100;

  int tx = threadIdx.x;

 // (the body of your for-loop code here...

}

发射:

dim3 blocks(10000, 10000);
dim3 threads(...); // can use any number here up to 512 for your device
mykernel<<<blocks, threads>>>(...);

相反,如果您希望为for循环的每个内部z迭代分配一个线程(可能有用/更高性能,具体取决于您正在执行的操作和数据组织),您可以执行某些操作像这样:

__global__ void mykernel(...){

  int idx = blockIdx.x;
  int idy = blockIdx.y;

  int w = idx/100;
  int x = idx%100;
  int y = idy;

  int z = threadIdx.x;

 // (the body of your for-loop code here...

}

发射:

dim3 blocks(10000, 100);
dim3 threads(100); 
mykernel<<<blocks, threads>>>(...);

以上所有假设您的for循环迭代都是独立的。如果你的for循环迭代相互依赖(取决于执行的顺序),那么这些简单的答案将不起作用,并且你没有在你的问题中提供足够的信息来讨论合理的策略。