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

在Cuda上处理大型算法的最佳方法,cuda,kernel,Cuda,Kernel,所以我有这个方法,它需要对图像应用很多变换。总之,我需要对同一数据应用几个不同的操作。在我的CPU代码中,我在同一个循环中进行所有这些转换,但我想知道在cuda中应用它的最佳方法 所以在CPU中我有 loop 1 loop 2 loop 3 DO A LOT OF SMALL BUT INDEPENDENT OPERATIONS end end end 我在openmp的最外层循环上使用线程,该算法的加速速度几乎是线程数的两倍,因此非常并行。尽管如此,对于非

所以我有这个方法,它需要对图像应用很多变换。总之,我需要对同一数据应用几个不同的操作。在我的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线程替换每个循环,但现在我不确定什么是更好的设计

例如,我尝试过这样做

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


那么,您建议如何一次计算所有内容或单独执行每个内核呢?

内核调用在执行时间方面非常昂贵。 在单个内核调用中堆叠的操作越多,性能改进就越好。 我会:

cuda_kernel {
 loop 2
   loop 3
    Do stuff here ...
   end
 end
}
这应该是执行整个过程的最快方式。我在这里使用了两个循环来向您展示,即使您有嵌套的循环,也要在内核中执行它们,而不是将内核调用放在一个循环中。
希望这能有所帮助。

内核调用在执行时间方面非常昂贵。 在单个内核调用中堆叠的操作越多,性能改进就越好。 我会:

cuda_kernel {
 loop 2
   loop 3
    Do stuff here ...
   end
 end
}
这应该是执行整个过程的最快方式。我在这里使用了两个循环来向您展示,即使您有嵌套的循环,也要在内核中执行它们,而不是将内核调用放在一个循环中。
希望这能有所帮助。

“内核调用在执行时间方面非常昂贵”?在我使用的平台上,它大约是10-15微秒。伙计,10-15微秒仍然是巨大的(尽管我对这个数字很有信心)。如果你考虑一个800MHz的核心时钟,10us就相当于8000个时钟周期。太多了。特别是,如果你的内核执行不花那么多时间,你会被内核调用所支配,这不应该是这样。实际上每个内核只会被调用一次,所以我不太担心,会有32个不同的内核,我可以完全摆脱循环2。但是如果我使用大内核,内核中的循环3将被多次执行,而不是只执行一次。因此我的问题是,你认为哪一个更有效率。我明白了。我相信有一个叫做once的大内核会更有效。您始终可以尝试这两种方法并比较结果。此外,一个大内核将是有益的,因为如果需要,它可能允许您在整个算法中使用共享内存(CUDA中的快速缓存)。与每次内核启动时调用主卡内存相比,它们可能会给您带来显著的提升。谢谢。我不得不选择多内核路径,因为我意识到,对于大内核,我需要大量内存,我认为大多数cuda设备都无法处理它……“内核调用在执行时间方面非常昂贵”?在我使用的平台上,它大约是10-15微秒。伙计,10-15微秒仍然是巨大的(尽管我对这个数字很有信心)。如果你考虑一个800MHz的核心时钟,10us就相当于8000个时钟周期。太多了。特别是,如果你的内核执行不花那么多时间,你会被内核调用所支配,这不应该是这样。实际上每个内核只会被调用一次,所以我不太担心,会有32个不同的内核,我可以完全摆脱循环2。但是如果我使用大内核,内核中的循环3将被多次执行,而不是只执行一次。因此我的问题是,你认为哪一个更有效率。我明白了。我相信有一个叫做once的大内核会更有效。您始终可以尝试这两种方法并比较结果。此外,一个大内核将是有益的,因为如果需要,它可能允许您在整个算法中使用共享内存(CUDA中的快速缓存)。与每次内核启动时调用主卡内存相比,它们可能会给您带来显著的提升。谢谢。我不得不走多内核路线,因为我意识到,使用大内核我需要大量内存,我认为大多数cuda设备无法处理它。。。