【问题标题】:compiling AVX2 program编译AVX2程序
【发布时间】:2015-02-22 15:59:03
【问题描述】:

我用 AVX 内部函数编写了一个程序,该程序在 Ubuntu 12.4 LTS 和 GCC 4.6 上运行良好,编译行如下:g++ -g -Wall -mavx ProgramName.cc -o ProgramName

问题开始当我将编译器更新到 4.7 和 4.8.1 版本以支持 16 位 AVX2 内在函数时,gcc 4.6 不支持该函数

目前,更新的 gcc 版本可以正确编译 AVX 和 AVX2 程序。但是,当我运行程序时,它给了我以下错误:非法指令(核心转储),虽然它在 gcc 4.6 上工作

我的问题是:编译和运行 AVX 和 AVX2 内在函数的完美方法是什么

【问题讨论】:

  • 我使用 -mavx2 而不是 -mavx 编译 AVX2 程序
  • 你确定你的处理器支持AVX2吗?目前只有 Haswell 芯片可以做
  • @MaratDukhan Broadwell 你也知道了
  • AVX2 不在该列表中。
  • 基本上有两种解决方案:1)不要使用AVX2,或者2)买一台新电脑。作为潜在的 3rd,让其他人运行它,但这会使调试变得困难,性能调整变得更加困难。

标签: c gcc avx avx2


【解决方案1】:

升级到 gcc 4.8 可能会引入 AVX512,因此您需要将生成的 instr mix 限制为仅适用于您的机器的 AVX2。

【讨论】:

  • OP 使用的是-mavx2,而不是-mavx512f。默认情况下,x86-64 的 gcc 仅针对基线 x86-64,甚至不假设 cmpxchg16b、SAHF/LAHF 或 SSE3。只有使用-m 选项,如-march=skylake-avx512-march=knl,或-mavx512f,gcc 才会发出AVX512 指令。
【解决方案2】:

如果你告诉 gcc 使用 AVX2,不管你的 CPU 是否支持它们,它都会这样做。这对于交叉编译或检查 gcc 的代码生成很有用,但对于运行程序并不是特别有用。如果您的程序因非法指令异常而崩溃,很可能是您的 CPU 不支持 AVX2 扩展。

在 i386 和 x86-64 平台上(以及在某些其他情况下),您可以指定 gcc 选项 -march=native 来为主机指令代码生成代码。编译后的代码可能无法在其他功能较少的机器上运行,但它应该允许您使用机器的所有功能。

虽然-march=native 是生成可执行文件的好解决方案,但它实际上对编写代码没有多大帮助;你仍然需要为目标的架构定制内在函数,并且编写可以利用 CPU 特性而不依赖它们的代码变得复杂。我不知道有什么好的 C 解决方案,但是有几个 C++ 模板框架可用。

【讨论】:

  • 请注意,当我将 gcc 更新到 4.8 以支持 AVX2 时,它停止运行 AVX,并出现上述错误。虽然,它使用 gcc 4.6 运行。直观地说,更新后的编译器应该支持以前版本支持的技术。正确吗??
  • @MROF:如果您使用-mavx2 编译并且您的 CPU 不支持 AVX2,则不保证可以正常工作。命令行选项不仅控制允许哪些内在函数;它授予优化器使用 AVX2 操作的权限。 gcc 4.8 很有可能有更多的优化,如果可用的话使用 AVX2 操作码。
  • 代码目前在另一个硬件上运行,问题出在之前的设备上。
猜你喜欢
  • 1970-01-01
  • 2019-03-15
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多