使用gcc 4.6.1使用mex启用AVX指令

时间:2013-04-22 20:22:57

标签: c++ matlab optimization gcc avx

我想搞砸一些AVX内在函数。我希望gcc在Visual Studio中尽可能使用AVX,类似于/arch:AVX。有没有办法在使用mex的gcc中执行此操作?

我尝试使用类似的东西:

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指令(查看程序集输出我看到一些mulsd)但我不想将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寄存器很奇怪。

1 个答案:

答案 0 :(得分:2)

我发现mex使用这种格式:

  

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

你应该尝试删除第一个$符号。 -mtune = corei7-avx应该是正确的。