根据Linus的建议(以及跨平台性能),我希望不使用avx512。我是否可以向编译器( gcc和msvc)指定一个标志,以便如果我正在使用的库试图从内部优化或编译器优化中使用avx512,那么所有avx2指令都会被拆分成成对的avx2指令吗?
发布于 2021-03-20 14:22:05
不,首先编译代码不要使用AVX-512,方法是告诉编译器不能使用;您只需使用需要AVX-512的内部代码来处理任何代码。
但是,如果您正在为支持AVX-512的CPU进行编译,那么它通常是值得使用的,特别是与256位向量一起使用,以避免turbo-frequency and other penalties that come with 512-bit vectors。GCC的默认调优已经是用于-mprefer-vector-width=256等CPU的。
如果您想要创建一个可以在没有AVX-512的CPU上运行的二进制文件,那么很明显,您需要确保它永远不会执行,并且确保没有它就会出错的指令。比如gcc -O3 -march=znver2或者-march=skylake或者其他什么。这两个目标都不包括AVX-512。或-march=native,如果编译为任何您的CPU。
但是,如果您确实有一个支持AVX-512的CPU,并且不想使用它,您可以使用类似于-march=native -mno-avx512f的东西(所有其他的AVX-512扩展都依赖于"Foundation“AVX-512 F,因此禁用它也可以防止对128位和256位向量的AVX-512 so )。
( -march=native和禁用的部分好处是还可以设置调优选项。如果您想要在Skylake和Zen2上运行良好的二进制文件,我不知道该推荐什么;可能-march=skylake或-march=znver2都可以;默认的"tune=generic“,但是它太关心那些甚至不支持AVX2的旧CPU,比如Sandybridge:Why doesn't gcc resolve _mm256_loadu_pd as single vmovupd?)
本质
即使有了本质,GCC也只会发出目标选项支持的指令,所以-mno-avx512f可以让你确信你没有错过任何东西。您将得到编译时错误,而不是EVEX指令滑过裂缝。
(MSVC是不同的,它是围绕一个二进制模型设计的,其中使用新指令集的函数只在CPU支持时调用,所以它不会阻止您使用AVX-512。AFAIK,MSVC仍然没有一个选择,自动矢量化与AVX-512,只有/arch:AVX2.但是无论如何,如果你不告诉它,如果你不使用像/arch:AVX512这样的选项,如果存在这样的东西,它就不会单独发出AVX-512指令;AFAIK不幸没有一个/arch:native。使用MSVC时,您确实必须确保捕捉到了所有的本质用法,尽管使用GCC进行编译可以帮助确保代码库不会这样做。)
如果您仍然希望编译使用_mm512_add_epi32或_mm256_ternlog_epi32之类的代码,那么您将需要一个immintrin.h版本,该版本将__m512i定义为带有两个__m256i成员的结构/类,并模拟所有的本质。的一些AVX512本质将是不便宜的模仿,特别是蒙面操作,和整个概念的比较掩码,以获得一个整数而不是向量。因此,尝试完全透明地实现这一点可能是个坏主意;相反,只要让GCC阻止您使用任何AVX-512指令就可以了,而您可以在没有AVX2版本的任何内部代码中只使用AVX 2版本。
上一次出现这种情况时,Coding on insufficient hardware,我找到了一个avxintrin-emu.h,它允许您为AVX开发,而只为SSE4进行编译。但我没找到相当于AVX-512的。(通常您会编译一个AVX-512二进制文件,并在像SDE这样的模拟器上测试它,它在运行时进行仿真,而不是编译时。)
Agner的VectorClass包装器库(https://www.agner.org/optimize/#vectorclass)支持+-* /、洗牌和混合等基本操作,并有用一对AVX2向量模拟的512位向量。(并且VCL类型可以隐式转换为__m256i或__m512i等等,因此对于操作,它没有自己的功能,您可以使用intrinsics。但是,您又回到了需要一个只使用__m256_ternlog_epi32指令模拟AVX2的库的同一条船上。
这不会阻止libc在像strcmp或log/exp这样的函数中使用手写的AVX-512指令,因为动态CPU调度发生在运行时,并且不能阻止CPU报告它支持AVX-512。(除非使用VM,或者告诉内核在引导时不启用AVX-512,如果Linux有此选项的话)。
https://stackoverflow.com/questions/66722275
复制相似问题