【问题标题】:Nested loops to CUDA嵌套循环到 CUDA
【发布时间】:2011-09-22 17:02:34
【问题描述】:

我想将我的 c 代码移植到 CUDA。主要计算部分包含3个for嵌套循环:

for (int i=0; i< Nx;i++){
  for (int j=0;j<Ncontains[i];j++){
    for (int k=0;k< totalVoxels;k++){
          .......
   }
  }
}

如何将其转换为我的 CUDA 内核?使用两个 for 循环,我可以执行以下操作:

int n= blockIdy.y * blockDim.y + threadIdx.y;
int i= blockIdx.x * blockDim.x + threadIdx.x;

但是我如何才能开始运行呢?

【问题讨论】:

    标签: c loops indexing cuda


    【解决方案1】:

    有很多方法可以做到,其中之一是:

    for (int i=blockIdx.x; i< Nx; i += gridDim.x){
      for (int j=threadIdx.y; j<Ncontains[i]; j+= blockDim.y){
        for (int k=threadIdx.x; k< totalVoxels; k += blockDim.x){
              .......
       }
      }
    }
    

    上面你会调用:

    // nx,ny block dimensions
    kernel <<< dim3(nBlocks), dim3(nx, ny) >>> (...);
    

    【讨论】:

    • 这样的话,我就必须这样调用内核?-> kernel >> 例如,我可以说 kernel> >?有没有一种更清洁、更有效的方式来调用该内核?抱歉,我是新手……感谢 Anycorn。
    • @Man 查看更新。另请注意,并行化强取决于您的特定情况。以上是只是示例
    • 我知道它一开始并不能真正改进,但我的首要目标是让它在 GPU 上正确运行。优化将在第二阶段进行。我将首先尝试理解您的答案,然后我将尝试提高速度。你知道我在哪里可以学到所有这些“技巧”吗?我已经阅读了几乎所有的 NVIDIA 手册和书籍,但它总是与矩阵有关,而不是与循环或算法...
    • 如果最后一个 for 循环正确,我在徘徊:for (int k=threadIdx.x; k
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2019-01-27
    相关资源
    最近更新 更多