【发布时间】: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.o
和mex 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