![CPU 和 GPU 之间传输数据时 PCI-E 瓶颈](https://linux22.com/image/1273773/CPU%20%E5%92%8C%20GPU%20%E4%B9%8B%E9%97%B4%E4%BC%A0%E8%BE%93%E6%95%B0%E6%8D%AE%E6%97%B6%20PCI-E%20%E7%93%B6%E9%A2%88.png)
我读到过,CPU 和 GPU 之间的传输开销是 GPU/CPU 应用程序实现高性能的一大瓶颈。为什么会这样?
根据 Nvidia 的带宽测试程序,我的 CPU/GPU 带宽约为 4 到 5 GBps。这是峰值性能吗?实际性能可能要低得多?当性能测量中包含数据传输时,我的应用程序只能达到约 17 Gbps,与仅测量 GPU 计算而不测量数据传输时的 100+ Gbps 速率相比大幅下降。
答案1
我读到过,CPU 和 GPU 之间的传输开销很大瓶颈在 GPU/CPU 应用方面实现高性能。为什么会这样?
你的问题有两种含义:
- 为什么这个(转移)是瓶颈?
- 其物理原因是什么?
从第一个意义上讲,这是因为你的机器上的其他所有东西都运行得非常快:
虽然此图表适用于 CPU 和内存,但类似的图表也适用于 GPU。结论是,如果您想获得良好的性能,您需要尽可能多地利用每个内存负载。
您可以使用屋顶线模型绘制该图:
x 轴表示从内存加载时每个字节的使用次数。y 轴表示每秒操作数的性能。左侧的对角线是内存速度限制计算的区域。
在该区域,您可以通过使用更快的内存(如 GPU 的本地内存或 CPU 的 L3、L2 或 L1 缓存)来实现更高的性能,这样更高的对角线会限制您,或者通过增加算术强度,这样您就可以向右移动。一旦内存加载,顶部的平线就是对原始计算速度的限制。可以有一条线用于直接浮点运算、SSE2、AVX 等。在这种情况下,该图显示一些深度学习内核会重用其数据很多并且可以充分利用 GPU 中所有特殊的数学运算符,因此让它们更快的唯一方法是构建一个新设备:TPU。
你的第二个问题是:为什么总线是瓶颈?有很多技术原因,但请忽略这些。英特尔芯片的晶体管间距接近 8nm。GPU 也处于这个范围。另一方面,总线很容易以英寸为单位测量:这是 2500 万倍的距离。
假设一个3GHz的处理器,完成一个操作大约需要0.3ns。
一个比特在 3 英寸总线上移动需要 0.25 纳秒。由于每个比特在总线上至少需要 1 个发送周期和 1 个接收周期,因此完整的比特传输大约需要 0.9 纳秒。(这忽略了消息上的相当多额外开销,这些开销由以下模型捕获:对数函数。)将此乘以 1MB,您将得到数据传输大约需要 1ms。在进行该传输的同时,您还可以进行一百万次其他操作。因此,物理学表明总线是性能的根本限制因素。
答案2
因为这是 PCI-e 带宽,请参见http://en.wikipedia.org/wiki/PCI_Express
5GB/秒似乎是合理的,因为在实际系统中您无法始终进行完全背对背的传输,您必须不时地释放总线以供其他外围设备使用。
GPU 带宽是仅有的转到 DRAM,甚至可能不是那样(GPU 内的缓存命中),因此要高得多。
您的下一个问题“为什么 PCIe 没有更多带宽”的答案基本上取决于成本/功率/尺寸/延迟权衡。PCIe 通道比 10G 以太网慢,但总线收发器更便宜;更高带宽的系统将推高所有扩展卡的成本。