所以我有这个方法需要在图像上应用很多变换。总的来说,我需要对同一数据应用几种不同的操作。在我的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。
那么您建议一次性计算所有内容还是单独执行每个内核?
答案 0 :(得分:1)
内核调用在执行时间方面非常省钱。 堆叠到单个内核调用中的操作越多,性能就越好。 我实际上会这样做:
cuda_kernel {
loop 2
loop 3
Do stuff here ...
end
end
}
这应该是执行整个事情的最快方法。我在这里用了两个循环来告诉你,即使你有嵌套循环,也要在内核中执行它们,而不是将内核调用放在循环中。 希望这会有所帮助。