Pepe 🐸
но я не эксперт в этом
Vsevolod
и где же примеры пользы от такого ускорения
Vsevolod
с современными конвеерами это все тлен
Vsevolod
там у тебя спекулятивно успеет выполниться все, из-за чего вся эта мышиная возня
Vsevolod
возможно, в эмбедщине есть какой-то профiт
Pepe 🐸
на обычном процессоре, я уже забыл каком
Vsevolod
https://devblogs.nvidia.com/cuda-pro-tip-optimize-pointer-aliasing/ ,
Vsevolod
?
Pepe 🐸
Pepe 🐸
Vsevolod
ща затестим
✙ Fatum ✙
Ioann_
да
Так рестрикт это кудовое же. И да, он помогает, но скорее всего потому, что компиляторы под цуду так себе оптимизируют. Если даже многолетние цхх компили не во все умеют. Далеко не во все.
Ioann_
А так, еще можно register сюда вставить. В стандарте оно убралось, а ускоряет тем не менее.
Ioann_
Хотя я досканальных тестов такого поведения не проводил, но вроде ускоряло дык точно.
Pepe 🐸
Vsevolod
thinkpad% ./a.out
example2b: 3134241098 total, 3134241 avg
example2a: 3176701688 total, 3176701 avg
Ioann_
Vsevolod
% ./a.out
example2a: 3288153556 total, 3288153 avg
example2b: 3266144368 total, 3266144 avg
Vsevolod
перепутал a и b
Pepe 🐸
Vsevolod
https://dpaste.de/qHOm
Vsevolod
gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3)
-O3
Vsevolod
% ./a.out
example2a: 13334621960 total, 13334621 avg
example2b: 13000839870 total, 13000839 avg
Vsevolod
вот с -O0
Vsevolod
clang вообще эту функцию выкинул, бгг
Ioann_
Я думаю, что твой код можно ускорить еще
Vsevolod
я взял пример из блога нжидии
Vsevolod
ничего не менял там, кроме rdtsc
Pepe 🐸
хм... любопытно. надо перечитать что там написано
Ioann_
Ну пусть. Видимо это кой то специфик пример, для указания конкретного случая.
Vsevolod
% ./a.out
example2a: 381534136 total, 381534 avg
example2b: 381805094 total, 381805 avg
Vsevolod
-ffast-math
Vsevolod
ровно в 10 раз быстрее
Vsevolod
да, про это
Vsevolod
а вот рестрикт этот ни хера не дает
Ioann_
Ну он если что и ieee стандарт нарушает
Vsevolod
кто нарушает?
Ioann_
Фаст мас
Vsevolod
fast-math?
Ioann_
Да
Vsevolod
да и плевать на него
Vsevolod
мы ж ПЕРФОРМАНС меряем
Ioann_
Я бы так не стал говорить, громко.
Pepe 🐸
Ioann_
Как бы можно тогда весь код вырезать и сказать что он под нолик работает
Vsevolod
https://godbolt.org/g/gpVwtD
Vsevolod
clang так и сделал, кстати
Berkus
шланг не дурак
Vsevolod
зацените, кстати, портянку с fast-math и example2b
Vsevolod
а скорость одинаковая
Vsevolod
еще и rep ret зачем-то вмазал без fast-math
Vsevolod
это же какие-то преданья старины далекой
Berkus
еще и rep ret зачем-то вмазал без fast-math
Basically, there was an issue in the AMD's branch predictor when a single-byte ret immediately followed a conditional jump as in the code you quoted (and a few other situations), and the workaround was to add the rep prefix, which is ignored by CPU but fixes the predictor penalty.
Vsevolod
да
Vsevolod
это я в курсе
Vsevolod
но почему это сейчас делается
Vsevolod
и почему этого нет в -ffast-math
Ioann_
Если нужен быстрый код - vTune тебе в руки. Но оптимизировать - уметь надо. Пояииать intel optimisation guide точно стоит
Ioann_
Там в идеале, под каждую новую микроархитектуру - свой, отдельный "дубляж" кода будет.
Ioann_
Учитывающий те или иные специфики микроархитектуры.
Vsevolod
чиво?
Vsevolod
при чем тут rep ret и -ffast-math
Ioann_
Vsevolod
о, а я понял, почему у меня -ffast-math такой резвый
Vsevolod
а на годболте он таким не будет
Ioann_
А почему ?
Vsevolod
8,42 │ add $0x4,%rax ▒
25,65 │ vaddss %xmm0,%xmm2,%xmm2 ▒
0,60 │ vfmadd %xmm0,%xmm0,%xmm1
это без fast-math
18,95 │ vaddps %ymm4,%ymm0,%ymm0
3,63 │ vfmadd %ymm4,%ymm4,%ymm2
а это с
Vsevolod
с fast-math он врубил avx2
Vsevolod
а без него чо-то не стал
Ioann_
8,42 │ add $0x4,%rax ▒
25,65 │ vaddss %xmm0,%xmm2,%xmm2 ▒
0,60 │ vfmadd %xmm0,%xmm0,%xmm1
это без fast-math
18,95 │ vaddps %ymm4,%ymm0,%ymm0
3,63 │ vfmadd %ymm4,%ymm4,%ymm2
а это с
Так ты там -march=native
Vsevolod
и там, и там
Ioann_
Поставь. У тебя avx2
Vsevolod
что поставить?
Ioann_
Код в одном месте, а в другом что то типа SSE