在并行编程中,特别是对于CUDA,是从主机复制存储器< - >设备是串行还是并行完成的?
答案 0 :(得分:2)
GPGPU操作的“最佳”操作是那些可以大规模并行完成的操作(与上一步没有数据相关性),理想情况下GPU必须多次传递相同的数据(模糊图像,例如)。
最糟糕的是对单个数据项进行非常小,简单的单一操作。
如果GPU可以轻松访问数据,则可以在GPU上更快地完成向量添加(将两个向量相加,即单遍操作)。我在日常工作中使用的GPU使用与CPU相同的内存,因此传输数据的成本相对较低。但是,如果传输数据的开销很大,那么可能会消除在GPU上进行数学计算的任何好处。
究竟如何复制数据(如果有的话)是一个系统架构决策,并且有很多不同的变体,从窄到非常宽的总线,当然,就像我上面提到的那样,数据是共享的系统在相同的物理内存中,因此根本不需要复制。
与几乎任何性能问题一样,答案是尝试不同的解决方案,看看哪个更好。对于不同的系统架构,答案会有所不同。
当然,还有一个问题:如果我们让GPU做X,我们可以在CPU上做一些有用的东西 - 如果CPU忙于做X,它显然不能同时执行任务Y时间[除非有未使用的核心]。
答案 1 :(得分:1)
我只熟悉CUDA,不了解非NVIDIA架构。
是的,对于离散的GPU,内存缓冲区通过PCI发送,并受到PCI吞吐量的限制。请注意,此操作并不总是需要CPU参与,并且有一些硬件功能可以加快这一速度。
某些GPU可以与CPU共享RAM。在这种情况下"零拷贝"执行 - 内存页面只是映射到GPU。我希望这是现有游戏机的工作方式(他们有AMD芯片组)。
您可以重叠内存传输和计算。例如,对于非常大的向量添加,您可以将向量拆分为分区 - 然后您可以在计算发生时复制后续分区。
我相信,当我们引入“统一记忆”的概念时,就是CUDA6。 - 当您声明CPU和GPU都可用的内存区域时。然后驱动程序将根据需要传输数据。它主要是一个方便的功能(我希望性能实际上会降低内存绑定负载,如矢量添加),但是当设备上不需要所有数据时,它可能对任务有益。
< / LI> 醇>有时您可能希望将任务卸载到GPU,因此CPU可用于其他负载。