【发布时间】:2020-11-25 13:55:24
【问题描述】:
最近遇到一个问题,我的avx2优化程序在2010 mac等不支持avx2指令集的老机器上可能会崩溃。同时,我可以确保我所有的avx2代码都被动态检测指令包围,不会在没有avx2的机器上运行。 所以我深入研究了这个问题,发现崩溃是由 llvm 本身进行的自动矢量化引起的。我尝试了 -fno-vectorize 和 -fno-slp-vectorize 但发现一旦设置了 -mavx2 ,程序将自动矢量化。 有没有办法在设置了 -mavx2 的情况下禁用 llvm 中的自动矢量化?因为没有-mavx2,我手写的avx2代码可能编译不成功。
【问题讨论】:
-
在分支到 AVX2 之前,您是否尝试在代码运行时进行自我防御和自动检测 AVX2 的存在?
-
你能把AVX2代码放在一个单独的编译单元吗?
-
是的,我手写的avx2被自动检测条件包围了。
-
我写了一些内联汇编代码,与普通的 c/c++ 代码混合,我必须使用 -mavx2 来编译它们。在任何情况下都需要的普通 c/c++ 代码将被自动矢量化,在某些旧机器上仍然可能导致崩溃
-
avx2 内联汇编在编译中不需要 -mavx2 标志,已检查。看来我必须避免编写需要 -mavx2 标志的 avx2 内在代码
标签: c++ optimization vectorization hpc