我正在编写一个使用 vfmadd231ph (来自 avx512_fp16)和 vpbroadcastw (来自 avx512bw)的程序。该程序在运行时检测 CPU 功能并分派到代码路径(包括需要 avx512_fp16 和 avx512bw 的代码路径)。 我的问题:在avx512_fp16存在的情况下是否能保证avx512bw?看到这个帖子后: 此处指的是英特尔文档“AVX512_FP16* ISA 扩展要求实现 AVX512BW 功能...”
因此,对于英特尔机器,假设这一点似乎没问题。
AMD 机器怎么样?我找不到有关此问题的任何信息?一般来说,与 Intel 相比,AMD 关于 Avx512 的文档比较缺乏。
Clang 似乎假设这对于所有 avx512_fp16 都是如此,无论供应商如何。我想这样做是安全的。
我问的原因是我正在使用内联汇编,如果不能保证这一点,那么当 avx512bw 存在或不存在时,我将必须有单独的 2x 代码路径,这是我想避免的。
谢谢
我期待 AMD 的规范。
编辑1:另外,据我所知,没有AMD CPU 存在avx512_fp16。所以,我宁愿要求未来的CPU,如果有这样的CPU的话。
编辑 2:更具体地说,我询问其他人是否有更多信息以及我错过的在线文档。
任何供应商都不太可能制造具有任何 AVX-512 功能但省略 AVX-512BW 的 CPU(Xeon Phi 除外)。
-march=x86-64-v4
的一部分,因为除了带有 AVX-512F 的 Xeon Phi 之外,每个 CPU 都有 AVX-512BW,从 Skylake-Xeon 开始。 它也是 AVX10.1 的一部分
对于实现 AVX-512FP16 的 CPU 来说更是如此,正如您所指出的,AVX-512FP16 没有自己的广播指令,并且是围绕带有它的 CPU 也将具有 AVX-512BW 的假设而设计的。 或者至少是 AVX-512BW 的 16 位元素大小部分。
您可以编写 CPU 功能检测代码来检查 FP16 和 BW,以防万一有人在启用了奇怪的功能组合的模拟器或虚拟机中运行它。 但在这种情况下,您可以完全不使用 FP16,因为它不是任何旨在取得商业成功的现实世界 CPU 所具备的功能组合。
CPU 供应商可以做很多事情,但我们不必对其进行优化,因为它们会使 CPU 使用起来很痛苦,或者与某些现有的商业重要软件存在问题。 在 x86 世界中尤其如此,其中与现有二进制文件的向后兼容性始终是一个卖点,并且只有 Xeon Phi 真正尝试过销售基于 x86 的 CPU,但该 CPU 并非旨在有效运行现有二进制文件。 例如,请参阅所有支持 AVX2 的 CPU 是否也支持 SSE4.2 和 AVX? - 假设您可能拥有一个不支持向量指令的旧版 SSE 编码的 CPU,但实际上并不值得担心。
在极不可能的情况下,未来确实会出现一些你想要支持的奇怪的 CPU,它可能需要自己的调整选择,并支持奇怪的功能组合。 因此,您可以等到那时再为其开发函数版本。 现在不太可能需要花时间写任何东西了。