Comments 24
"… Для простоты будем считать, что длина массивов len делится на 4.." и "… невыровненного 64-битного числа r по адресу p процессору необходимо..."
А чем кроме непроизносимого названия отличаются интринсики от обычных инлайн-функций?
Интринсики — это компиляторная магия. Зачастую вызов функции-интринсика может быть преобразован в единственную инструкцию. Иногда без интринсиков невозможно достичь желаемого (если не юзать хардкорный асм): https://gcc.gnu.org/onlinedocs/gcc/x86-transactional-memory-intrinsics.html#x86-transactional-memory-intrinsics
Compilers that implement intrinsic functions generally enable them only when a program requests optimization, otherwise falling back to a default implementation provided by the language runtime system (environment).
Если не включить оптимизацию при компилляции, то будет обычный вызов функции; если оптимизацию включить, то будет инлайн-функция?
Почему не пропатчить компилятор с++, под вашу платформу? Чтобы он сам занимался оптимизациями.
Несколько замечаний.
1) результаты, похожие на ваш, (но не в 7 раз), получаются при опциях
-fforce-vect -fvect-verbose
2) неоднократно замечал, что unroll у МЦСТ коряво работает даже в простых случаях…
3)Запустил с оптимизацией O3 (да да, у МЦСТ очень даже рабочая), и все ваши оптимизации коту под хвост.
t0-t1 45.814001 (первый случай, мкс.) время на обработку 256 массивов по 256.
t0-t1 369.018002(второй случай)
t0-t1 382.902000l(3-й случай.)
4) вместо радости рекомендую еще prefetch сделать.
И вообще есть отдельный компилятор с языка ассемблера?
Это же секрет государственной важности. Эти процы используются в военке. Вы что, а вдруг враг использует в своих целях?
Полноценная только у МЦСТ после подписания НДА.
А так в интернете (включая хабр) кое какая инфа валяется, навскидку:
http://alexanius-blog.blogspot.com/2016/05/hello-world.html#elbrus
https://www.youtube.com/watch?v=AVOMnkvyO2g
https://www.youtube.com/watch?v=1zWUN6y2WbI
И вообще есть отдельный компилятор с языка ассемблера?
Сишный компилятор есть под интел с поддержкой флагов gcc/clang т.е. выхлоп в ассемблер через -s ну и наверное из ассемблера в бинарий.
Вот тут в описании к pdk пишут что входит кросскомпилятор. Качай, пробуй.
Я со старой версией игрался. какой он код генерирует наблюдать прикольно, я много знаний из этого подчерпнул, но без железки скучно быстро надоедает.
Низкоуровневая оптимизация кода на платформе Эльбрус: векторное сложение uint16_t с помощью интринсиков