在多大程度上可以预测/计算CUDA内核的性能?
与CUDA合作过后,这似乎是微不足道的。
但我的一位不参与CUDA工作的同事告诉我,如果你有内存带宽,处理器数量和速度,那就不难了?
他所说的似乎与我所读的内容不一致。这是我能想象的可行的。你觉得怎么样?
Memory processed
------------------ = runtime for memory bound kernels ?
Memory bandwidth
或
Flops
------------ = runtime for computation bound kernels?
Max GFlops
答案 0 :(得分:2)
这样的计算几乎不会给出好的预测。有许多因素会影响性能。这些因素以极其复杂的方式相互影响。因此,您的计算将给出性能的上限,远离实际性能(在大多数情况下)。
例如,对于内存绑定内核,具有大量缓存未命中的内核将与具有命中率的内核不同。或者那些有分歧的人,那些有障碍的人......
我建议你阅读本文,这可能会给你更多关于这个问题的想法:"An Analytical Model for a GPU Architecture with Memory-level and Thread-level Parallelism Awareness"。
希望它有所帮助。
答案 1 :(得分:1)
我认为您可以通过一些工作来预测最佳案例。就像你说的那样,有指令数,内存带宽,输入大小等等。
但是,预测实际或最坏情况要复杂得多。
首先,存在内存访问模式等因素。例如:对于较旧的支持CUDA的卡,您必须注意分配全局内存访问,以便它们不会争用单个内存库。 (较新的CUDA卡使用逻辑和物理地址之间的散列来解决此问题。)
其次,存在非确定性因素,例如:PCI总线有多忙?主机内核有多忙?等
我怀疑接近实际运行时间的最简单方法是在输入的子集上运行内核,看看实际需要多长时间。