【问题标题】:Enable AVX instructions with mex using gcc 4.6.1使用 gcc 4.6.1 使用 mex 启用 AVX 指令
【发布时间】:2013-04-15 21:10:22
【问题描述】:

我想弄乱一些 AVX 内在函数。如果可能的话,我希望 gcc 专门使用 AVX,类似于 Visual Studio 中的/arch:AVX。有没有办法在 gcc 和 mex 中做到这一点?

我尝试使用类似的东西:

mex -g -O $CFLAGS='$CFLAGS -march=corei7-avx' ncorr_alg_rgdic.cpp standard_datatypes.o ncorr_datatypes.o

但是编译器说eval: 1: = -march=corei7-avx: not found。有谁知道我应该使用哪个标志以及如何让 mex 接受它?默认情况下,它似乎使用 SSE 指令(查看程序集输出,我看到了一些 mulsds),但我不想将 SSE 与 AVX 混合,因为我读过 here 会导致问题。

EDIT1:

我正在使用 ubuntu 11.04 和 gcc 4.6.1。

EDIT2:

编译: mex CXXOPTIMFLAGS='-mtune=corei7-avx -S' ncorr_alg_rgdic.cpp standard_datatypes.o ncorr_datatypes.o

产量:

movsd   -304(%rbp), %xmm1
movsd   .LC16(%rip), %xmm0
mulsd   %xmm0, %xmm1

编译: mex CXXOPTIMFLAGS='-mavx -S' ncorr_alg_rgdic.cpp standard_datatypes.o ncorr_datatypes.omex CXXOPTIMFLAGS='-march=corei7-avx -S' ncorr_alg_rgdic.cpp standard_datatypes.o ncorr_datatypes.o 两者都产生:

vmovsd  -304(%rbp), %xmm1
vmovsd  .LC16(%rip), %xmm0
vmulsd  %xmm0, %xmm1, %xmm1

现在我很确定 mulsd 是一个 sse 指令。 vmulsd 是 AVX 指令吗(奇怪的是谷歌搜索它没有产生任何结果)?我也没有看到正在使用的 ymm 寄存器,这很奇怪。

【问题讨论】:

  • 应该是-mavx
  • @Mysticial 如果我使用$CFLAGS='$CFLAGS -mavx',matlab 终端会显示eval: 1: = -mavx: not found... 这可能是因为我没有将编译器标志正确传递给mex。
  • 您的目标平台是什么?在 Windows 上,CFLAGS 应替换为 COMPFLAGS。此外,-g 选项禁用优化,因此与-O 选项不兼容。除非您在启用最低优化级别的情况下进行编译,否则 GCC 可能不会发出 AVX 指令。删除-g,添加-v,让mex打印出编译器调用命令行。仔细检查,确保启用了适当的优化级别。
  • 嗯,也许不是。文档令人困惑。 -g 描述:创建...用于调试的附加符号信息。此选项禁用优化构建目标代码的 mex 默认行为-O 描述:优化目标代码。 ...如果 -g 选项出现时没有 -O 选项,则优化被禁用。您应该能够通过将-S 开关传递给 GCC 来查看程序集(一旦您找出您的 CFLAGS 问题:-) )
  • @jucestain 是的。这很正常。当您只进行标量操作时,无需使用完整的 ymm 寄存器。

标签: c++ matlab optimization gcc avx


【解决方案1】:

我发现 mex 使用这种格式:

mex -v CFLAGS='$CFLAGS -Wall' LDFLAGS='$LDFLAGS -w' yprime.c

您应该尝试删除第一个 $ 符号。不过 -mtune=corei7-avx 应该是对的。

【讨论】:

  • +1 这解决了部分问题。我现在只需要弄清楚现在是否真的在使用 AVX 指令。
  • 它可能会。根据维基百科,AVX 引入了一种 3 操作数形式的指令(vmulsd %xmm0、%xmm1、%xmm1)。新的 AVX 寄存器 ymmX 只是 xmmX 从 128 位到 256 位的扩展。如果您的代码不需要那么高的精度,则编译器不在乎。顺便说一句:可能是,在您的第二次编辑之后,其他一些优化被删除了吗? (如-O3)
  • 看来,如果我使用CXXOPTIMFLAGS='$CXXOPTIMFLAGS',它会删除-O 编译器标志。我的理解是$CXXOPTIMFLAGS 应该附加已经在CXXOPTIMAFLAGS 中定义的标志,即-O -DNDEBUG
  • 最后一点,我通过mex 文档意识到您需要执行mex CXXOPTIMFLAGS="\$CXXOPTIMFLAGS -mavx" ncorr_alg_rgdic.cpp standard_datatypes.o ncorr_datatypes.o。通过 matlab 终端编译 mex 文件时,需要反斜杠和 " 以便将 -mavx 附加到默认设置。
猜你喜欢
  • 2014-08-10
  • 2013-09-22
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2017-05-08
相关资源
最近更新 更多