1

所以我有这个方法需要在图像上应用很多变换。总的来说,我需要对相同数据应用几个不同的操作。在我的 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。

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

4

1 回答 1

1

内核调用在执行时间方面非常昂贵。堆叠到单个内核调用中的操作越多,获得的性能提升就越大。我实际上会这样做:

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

这应该是执行整个事情的最快方式。我在这里使用了两个循环来向您展示,即使您有嵌套循环,也要在内核中执行它们,而不是将内核调用放在循环中。希望这可以帮助。

于 2013-05-26T02:00:54.387 回答