在支持CUDA的设备上运行什么?
确定应用程序的哪些部分在设备上运行时应考虑以下问题:
- 该设备非常适合可同时并行运行在多个数据元素上的计算。 这通常涉及大数据集(例如矩阵)的算术,其中可以同时在数千甚至数百万个元素上执行相同的操作。 这是CUDA良好性能的要求:软件必须使用大量(通常为数千或数万)并发线程。 并行运行大量线程的支持来自CUDA使用上述轻量级线程模型。
- 为了获得最佳性能,设备上运行的相邻线程应该在内存访问方面保持一致。 某些内存访问模式使硬件能够将多个数据项的读取或写入组合成一个操作。 无法合理布局的数据或者没有足够的位置来有效使用L1或纹理缓存的数据在CUDA计算中使用时会看到较小的加速比。
-
要使用CUDA,必须将数据值从主机传输到PCI Express(PCIe)总线上的设备。 这些传输在性能方面成本很高,应该尽量减少。 (请参阅主机和设备之间的数据传输)此成本有几个影响:
- 操作的复杂性应该证明将数据移入和移出设备的成本。 传输数据以供少量线程短暂使用的代码将很少或没有性能优势。 理想的情况是许多线程执行大量工作。
例如,将两个矩阵转移到器件以执行矩阵加法,然后将结果传回主机将不会获得太多的性能好处。这里的问题是每个传输的数据元素执行的操作次数。对于前面的程序,假定大小为N×N的矩阵,有N2个操作(加法)和3N2个元素被传送,所以操作与传送元素的比率为1:3或O(1)。当这个比例更高时,可以更容易实现性能优势。例如,相同矩阵的矩阵乘法需要N2运算(乘加),因此运算元素与传输元素的比值为O(N),在这种情况下,矩阵越大,性能优势越大。操作类型是一个附加因素,因为添加具有不同的复杂度配置文件,例如三角函数。在确定是在主机上还是在设备上执行操作时,包括向设备传输数据和从设备传输数据的开销很重要。 - 数据应尽可能长时间保存在设备上。 因为传输应该尽可能小,所以在同一数据上运行多个内核的程序应该倾向于在内核调用之间将数据留在设备上,而不是将中间结果传输到主机,然后将它们发送回设备进行后续计算。 因此,在前面的例子中,如果以前的计算结果已经将两个矩阵添加到设备上,或者如果在一些后续计算中将使用相加结果,则矩阵相加应该在本地执行 装置。 即使计算序列中的某个步骤可以在主机上更快地执行,也应该使用此方法。 如果避免一个或多个PCIe传输,即使是相对较慢的内核也可能是有利的。 主机和设备之间的数据传输提供了更多细节,包括主机和设备之间以及设备本身内的带宽的测量。
- 操作的复杂性应该证明将数据移入和移出设备的成本。 传输数据以供少量线程短暂使用的代码将很少或没有性能优势。 理想的情况是许多线程执行大量工作。