История изменений
Исправление Siborgium, (текущая версия) :
-msse4.2 -march=native -mtune=generic -Ofast
Что за камень читателю предлагается угадать самостоятельно.
Для начала аргументы лучше принимать по значению. Хотя бы для того, чтобы избежать проблем с потенциальным оверлапом ссылок, и чтобы избавиться от лишних лоадов.
Просто переписав ее в
floatv func(floatv a, floatv b, floatv c, floatv d) {
return a * b + c * d;
}
я получаю красивые
g++ -c -std=c++2b -Ofast -ffast-math -march=nehalem simd.cxx
0000000000000000 <_Z4funcNSt12experimental14parallelism_v24simdIfNS0_8simd_abi11_VecBuiltinILi16EEEEES5_S5_S5_>:
0: 0f 59 c1 mulps %xmm1,%xmm0
3: 0f 59 d3 mulps %xmm3,%xmm2
6: 0f 58 c2 addps %xmm2,%xmm0
9: c3 ret
и
g++ -c -std=c++2b -Ofast -ffast-math -march=haswell simd.cxx
0000000000000000 <_Z4funcNSt12experimental14parallelism_v24simdIfNS0_8simd_abi11_VecBuiltinILi32EEEEES5_S5_S5_>:
0: c5 fc 59 c1 vmulps %ymm1,%ymm0,%ymm0
4: c4 e2 6d b8 c3 vfmadd231ps %ymm3,%ymm2,%ymm0
9: c3 ret
С шлангом аналогично. Никакие std::simd здесь не нужны, но предположим что они данность. Касательно того, почему принимаются такие решения – есть intel vtune и llvm-mca. Возможно, что то, что ты счел неоптимальным, по каким-то причинам оптимальнее ожидаемого тобой варианта – или, по крайней мере, его считает более оптимальным компилятор.
Исходная версия Siborgium, :
-msse4.2 -march=native -mtune=generic -Ofast
Что за камень читателю предлагается угадать самостоятельно.
Для начала аргументы лучше принимать по значению. Хотя бы для того, чтобы избежать проблем с потенциальным оверлапом ссылок, и чтобы избавиться от лишних лоадов.
Просто переписав ее в
floatv func(floatv a, floatv b, floatv c, floatv d) {
return a * b + c * d;
}
я получаю красивые
g++ -c -std=c++2b -Ofast -march=nehalem simd.cxx
0000000000000000 <_Z4funcNSt12experimental14parallelism_v24simdIfNS0_8simd_abi11_VecBuiltinILi16EEEEES5_S5_S5_>:
0: 0f 59 c1 mulps %xmm1,%xmm0
3: 0f 59 d3 mulps %xmm3,%xmm2
6: 0f 58 c2 addps %xmm2,%xmm0
9: c3 ret
и
g++ -c -std=c++2b -Ofast -ffast-math -march=haswell simd.cxx
0000000000000000 <_Z4funcNSt12experimental14parallelism_v24simdIfNS0_8simd_abi11_VecBuiltinILi32EEEEES5_S5_S5_>:
0: c5 fc 59 c1 vmulps %ymm1,%ymm0,%ymm0
4: c4 e2 6d b8 c3 vfmadd231ps %ymm3,%ymm2,%ymm0
9: c3 ret
С шлангом аналогично. Никакие std::simd здесь не нужны, но предположим что они данность. Касательно того, почему принимаются такие решения – есть intel vtune и llvm-mca. Возможно, что то, что ты счел неоптимальным, по каким-то причинам оптимальнее ожидаемого тобой варианта – или, по крайней мере, его считает более оптимальным компилятор.