@PeterCordes Должен ли я превратить этот ответ в вики сообщества, чтобы вы могли вставить свой ответ здесь? К сожалению, я не могу не принять мой ответ.

у некоторыеAVX код и мне нужно загрузить из потенциально невыровненной памяти. Я сейчас загружаю 4двойникиследовательно, я бы использовал внутреннюю инструкцию_mm256, _loadu_pd; код, который я написал:

__m256d d1 = _mm256_loadu_pd(vInOut + i*4);

Затем я скомпилировал с параметрами-O3 -mavx -g и впоследствии использовалobjdump чтобы получить код ассемблера плюс аннотированный код и строку (objdump -S -M intel -l avx.obj).
Когда я смотрю на основной ассемблерный код, я нахожу следующее:

vmovupd xmm0,XMMWORD PTR [rsi+rax*1]
vinsertf128 ymm0,ymm0,XMMWORD PTR [rsi+rax*1+0x10],0x1

Я ожидал увидеть это:

vmovupd ymm0,XMMWORD PTR [rsi+rax*1]

и полностью использовать 256-битный регистр (ymm0) вместо этого выглядитНКУ решил заполнить 128 битную часть (XMM0), а затем снова загрузите вторую половинуvinsertf128.

Кто-то может объяснить это?
Эквивалентный код компилируется с однимvmovupd в MSVC VS 2012.

я бегуgcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 наUbuntu 18.04 x86-64.

Ответы на вопрос(1)

Ваш ответ на вопрос