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

Enable AVX instructions with mex using gcc 4.6.1

本文关键字:启用 AVX 指令 mex gcc 使用      更新时间:2023-10-16

我想弄乱一些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。有谁知道我应该使用哪面旗帜,以及如何让我接受它?默认情况下,它似乎使用SSE指令(查看汇编输出,我看到一些mulsd s),但我不想将SSE与AVX混合,因为我在这里读到它可能会导致问题。

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寄存器,这很奇怪。

我发现mex使用这种格式:

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

你应该试着去掉第一个$符号。-mtune=corei7-avx应该是正确的。