LINUX.ORG.RU

История изменений

Исправление 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. Возможно, что то, что ты счел неоптимальным, по каким-то причинам оптимальнее ожидаемого тобой варианта – или, по крайней мере, его считает более оптимальным компилятор.