在Cuda上处理大算法的最佳方法

时间:2013-05-25 22:42:19

标签: cuda kernel

所以我有这个方法需要在图像上应用很多变换。总的来说,我需要对同一数据应用几种不同的操作。在我的CPU代码上,我在同一个循环中进行所有这些转换,但我想知道在cuda中应用它的最佳方法。

所以在CPU中我有

loop 1
  loop 2
    loop 3
      DO A LOT OF SMALL BUT INDEPENDENT OPERATIONS
    end
  end
end

我使用openmp在最外层循环上使用线程,算法加速了线程数的几乎所以它是非常可并行的。尽管如此,对于非常大的图像,它仍然需要花费很多时间,所以我认为我可以使用Cuda。

所以我设法摆脱了最外层的循环:循环1和循环2并用一个cuda线程替换每个cicle,但现在我不确定什么是更好的设计

例如,我尝试过这样做

cuda_kernel{

   loop 3
      DO A LOT OF SMALL BUT INDEPENDENT OPERATIONS
   end
}

其中一些业务也有分支,而其他业务则没有。我的问题是,如果你认为Cuda最好这样做

cuda_kernel 1{

   loop 3
      DO JUST FIRST OPERATION
   end
}

cuda_kernel 2{

   loop 3
      DO JUST SECOND OPERATION
   end
}


ETC

在这种情况下,每个内核都将大大简化,但是一个内核将在另一个内核之后被调用,并且每个操作将重复循环3。

那么您建议一次性计算所有内容还是单独执行每个内核?

1 个答案:

答案 0 :(得分:1)

内核调用在执行时间方面非常省钱。 堆叠到单个内核调用中的操作越多,性能就越好。 我实际上会这样做:

cuda_kernel {
 loop 2
   loop 3
    Do stuff here ...
   end
 end
}

这应该是执行整个事情的最快方法。我在这里用了两个循环来告诉你,即使你有嵌套循环,也要在内核中执行它们,而不是将内核调用放在循环中。 希望这会有所帮助。