APU例如 apple m1 mac上的内存复制是否使用 GPU 特定的宽向量指令?

问题描述

我正在阅读这篇文章 Why mmap is faster than system calls,其中的主要区别似乎是 mmap 能够使用像 AVX-2 这样的向量指令,而系统调用则不能。

我知道 GPU 使用的 SIMD 指令往往要宽得多。大小为 32 的 Nvidia 扭曲在 float32 = 1024 位 (?) 与 256 位 AVX-2 上运行。所以可能加速 4 倍。我想这不会用于传统的离散 GPU 设置,因为主机到设备(和反向)复制将超过宽寄存器带来的任何好处。

然而,在 APU 中,GPU 与 cpu 共享内存,从而无需这些昂贵的副本。我想知道这些 GPU 指令是否可以用于进一步加速像向量操作这样的 mmap(numpy 是另一个例子)。是否已经完成(在 M1 mac 或任何带有集成显卡的 cpu 中)?或者您能否详细说明阻止这种情况的架构问题?

解决方法

您是在问两个不同的问题:操作系统(或用户空间标准库?)是否可以使用 GPGPU 来加速从页面缓存(通过读取系统调用进入用户空间内存,或从映射区域)。另外,正常分配的进程内存(和/或页面缓存)上的 GPGPU 是否可以避免复制到专用于 GPU 的内存。

对于第二部分,Apple 表示 M1 上的 MacOS 的答案是肯定的,这要归功于集成 GPU 的内存访问与 CPU 缓存一致。我认为 AMD 提出了类似的建议,即可以避免在其 APU 上的图形或 GPGPU 驱动程序中进行复制(Fusion IIRC?),但如果软件充分利用了 IDK。


第一部分;疑。大内存副本的瓶颈是 DRAM 带宽,而不是 CPU 核心 L1d 缓存带宽(随 SIMD 寄存器宽度缩放)。在 x86 上,单核上的 AVX2 循环非常接近于最大化英特尔“客户端”芯片(四核或类似芯片,而不是具有更高延迟互连的大型至强)的 DRAM 带宽。单核带宽(到 L3 或 DRAM)往往受核心可以跟踪的未完成缓存未命中数的限制,而不是通过使用较少的指令进行复制。这主要有助于在相同大小的乱序执行窗口中看得更远,更快地开始跨页面边界的页面遍历等等。有关 SSE(16 字节)与 AVX(32 字节)向量的信息,请参阅 Why is std::fill(0) slower than std::fill(1)?

GPU 卸载因此对大副本没有帮助。它可能只对小副本有帮助,然后它不会将复制结果留在 CPU 的 L1d 缓存中。和/或无法利用处理数据的 CPU 的 L1d 缓存中已经很热的源或目标。

此外,设置开销(与 GPU 通信,在当前内核之外)将支配任何更快的小副本复制。