Я думаю, есть тонкая разница между использованием _mm_loadu_ps
и _mm_load_ps
даже на «Intel Nehalem и более поздних версиях (включая Silvermont и более поздние версии) и AMD Bulldozer и более поздних версиях», которая может повлиять на производительность.
Операции, которые сворачивают загрузку и другую операцию, такую как умножение, в одну инструкцию, могут выполняться только с load
, а не loadu
встроенными функциями, если только вы не компилируете с включенным AVX, чтобы разрешить невыровненные операнды памяти.
Рассмотрим следующий код
#include <x86intrin.h>
__m128 foo(float *x, float *y) {
__m128 vx = _mm_loadu_ps(x);
__m128 vy = _mm_loadu_ps(y);
return vx*vy;
}
Это будет преобразовано в
movups xmm0, XMMWORD PTR [rdi]
movups xmm1, XMMWORD PTR [rsi]
mulps xmm0, xmm1
однако, если используются встроенные функции выровненной нагрузки (_mm_load_ps
), они компилируются в
movaps xmm0, XMMWORD PTR [rdi]
mulps xmm0, XMMWORD PTR [rsi]
что экономит одну инструкцию. Но если компилятор может использовать загрузки в кодировке VEX, это также только две инструкции для невыровненных данных.
vmovups xmm0, XMMWORD PTR [rsi]
vmulps xmm0, xmm0, XMMWORD PTR [rdi]
Это обеспечивает согласованный доступ, хотя нет разницы в производительности при использовании инструкций movaps
и movups
в Intel Nehalem и более поздних версиях, Silvermont и более поздних версиях, или AMD Bulldozer и более поздних версиях.
Но может быть разница в производительности при использовании _mm_loadu_ps
и _mm_load_ps
встроенных функций при компиляции без включенного AVX, в тех случаях, когда компромисс компилятора не movaps
против movups
, он находится между movups
или сворачивание нагрузки в инструкцию ALU. (Что происходит, когда вектор используется только как вход для одного объекта, иначе компилятор будет использовать mov*
загрузку, чтобы получить результат в регистре для повторного использования.)
person
Z boson
schedule
18.09.2018
lock
? Не понимаю как. Почему бы вам официально не спросить здесь, на ТАК? Это интересно! - person Margaret Bloom   schedule 27.09.2018