Я скомпилировал фрагмент кода с опцией -xSSE4.1 с использованием компилятора Intel. Когда я посмотрел на сгенерированный файл сборки, я увидел, что были добавлены инструкции AVX, такие как «vpmovzxbw». Но исполняемый файл по-прежнему работает на машинах, которые не поддерживают набор инструкций AVX. Что объясняет это?Инструкции AVX, созданные при указании -xSSE4.1
Вот конкретный фрагмент кода -
C -> src0_8x16b = _mm_cvtepu8_epi16 (src0_8x16b);
Assembly -> vpmovzxbw xmm4, QWORD PTR [rcx]
Binary -> 00066 c4 62 79 30 29
Вот еще один отрывок, где инструкции по сборке использует 3 операнды -
C -> src0_8x16b = _mm_sub_epi16 (src0_8x16b, src1_8x16b);
Assembly -> vpsubw xmm1, xmm13, xmm11
Binary -> 000bc c4 c1 11 f9 cb
Для сравнения, вот разборки генерируется ICC для «Foo» функция (Единственное различие между функцией foo и фрагментом кода выше состоит в том, что фрагмент кода был закодирован с использованием встроенных функций) -
Compiler commands used -
icc -S -xSSE4.1 -axavx -O3 foo.c
Function foo -
void foo(float *x, int n)
{
int i;
for(i=0; i<n; i++) x[i] *= 2.0;
}
Autodispatch code -
testl $-131072, __intel_cpu_indicator(%rip) #1.27
jne foo.R #1.27
testl $-1, __intel_cpu_indicator(%rip) #1.27
jne foo.A
Loop in foo.R (AVX variant) -
vmulps (%rdi,%rcx,4), %ymm0, %ymm1 #3.24
vmulps 32(%rdi,%rcx,4), %ymm0, %ymm2 #3.24
vmovups %ymm1, (%rdi,%rcx,4) #3.24
vmovups %ymm2, 32(%rdi,%rcx,4) #3.24
addq $16, %rcx #3.5
cmpq %rdx, %rcx #3.5
jb ..B2.12 # Prob 82% #3.5
Loop in foo.A (SSE variant) -
movaps (%rdi,%r8,4), %xmm1 #3.24
movaps 16(%rdi,%r8,4), %xmm2 #3.24
mulps %xmm0, %xmm1 #3.24
mulps %xmm0, %xmm2 #3.24
movaps %xmm1, (%rdi,%r8,4) #3.24
movaps %xmm2, 16(%rdi,%r8,4) #3.24
addq $8, %r8 #3.5
cmpq %rsi, %r8 #3.5
jb ..B3.12 # Prob 82% #3.5
http://www.felixcloutier.com/x86/PMOVZX.html Возможно, вы смутитесь с VPMOVZXBW –
pmovzx is sse41. vpmovzxbw - avx. Проверьте [link] (https://software.intel.com/en-us/node/524007) – ashwin
Возможно, он генерирует версию AVX для некоторых вещей, но работает только после выполнения проверки времени выполнения, что система поддерживает AVX ? Опубликуйте отрезанную разборку, включая двоичный машинный код, чтобы мы могли убедиться, что это действительно VEX-кодировка. В идеале, установите контрольную точку в этой инструкции и убедитесь, что она действительно запускается, если у вас есть отладчик на машине перед AVX. –