Я хотел бы возиться с некоторыми встроенными функциями AVX. Я хотел бы, чтобы gcc использовал AVX исключительно, если возможно, аналогично /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.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 (как ни странно, поиск в Google не дал результатов)? Я тоже не вижу ymm
используемые регистры, что странно.
я обнаружил, что mex использует этот формат:
mex -v CFLAGS = ‘$ CFLAGS -Wall’ LDFLAGS = ‘$ LDFLAGS -w’ yprime.c
Вы должны попытаться удалить первый знак $. -mtune = corei7-avx должен быть прав.
Других решений пока нет …