【问题标题】:Is there a way to enable avx2 intruction set without auto-vectorization by LLVM有没有办法在没有 LLVM 自动矢量化的情况下启用 avx2 指令集
【发布时间】: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


【解决方案1】:

指定-mavx2 标志的替代方法通常是在相关函数上使用指定avx2 的函数属性。

void __attribute__ ((__target__ ("avx2"))) function_with_avx2(...) {
  ...
}

void function_without_avx2(...) {
  ...
}

【讨论】:

  • 这是一个解决方案。但是在组织我的代码时有点不便。最后,我决定避免使用 avx2 内在函数,并用手写的汇编代码替换所有 avx2 内在函数
猜你喜欢
  • 2013-11-22
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 2016-01-19
相关资源
最近更新 更多