Pull to refresh

Comments 24

В первом цикле инкремент или по индексу, или по указателям, но не и то и другое.
Спасибо, исправили. По ошибке скопипастили при выкладывании.
Вы серьезно?
"… Для простоты будем считать, что длина массивов len делится на 4.." и "… невыровненного 64-битного числа r по адресу p процессору необходимо..."
По первому замечанию: Вам действительно интересен код, замусоренный обработкой «хвостика» массива? На производительность это не влияет. Код — элементарный. А тема поста — производительность. Маловероятно, что среди читателей есть разработчики на Эльбрусе, мечтающие именно о 16-битном сложении и надеющиеся на готовую копипасту. Поэтому мы выкинули то, что ухудшило бы подачу материала. Напротив, невыровненность начала массива — это ключевая проблема. Отдельной обработкой «начала» она не лечится. Что же касается второго замечания, то, простите, не ясно, что именно вызывает раздражение. Не уточните?
Было бы гораздо интересней увидеть прирост производительности на более реальной задаче. А то бывает оптимизируешь, оптимизируешь, а узкое место в другом месте
В задаче распознавания паспорта РФ использование EML и интринсиков (для реализации функций, которых пока нет в EML) ускоряет вычисления где-то в 2 раза на Эльбрус-401PC. Сейчас научная статья, включающая эти результаты, находится в печати.

А чем кроме непроизносимого названия отличаются интринсики от обычных инлайн-функций?

Интринсики — это компиляторная магия. Зачастую вызов функции-интринсика может быть преобразован в единственную инструкцию. Иногда без интринсиков невозможно достичь желаемого (если не юзать хардкорный асм): 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).

Если не включить оптимизацию при компилляции, то будет обычный вызов функции; если оптимизацию включить, то будет инлайн-функция?
Интринсики предоставляют доступ к инструкциям процессора, которые недоступны в С.
Асм-вставки нельзя делать, что ли? Которые можно обернуть в инлайн-функции.
Интринсики позволяют не думать о соглашениях о вызове и т.п., компилятор сам делает выделение регистров.
Асм вставки мешают оптимизатору и вообще являются жутким костылём.
Поэтому некоторые компиляторы их не поддерживают.
А почему сразу не писать на асме?

Почему не пропатчить компилятор с++, под вашу платформу? Чтобы он сам занимался оптимизациями.
На каком асме то — nasm fasm yasm wasm?
Скомпилировал все примеры под Эльбрусом. (переделав на си)
Несколько замечаний.
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 пишут что входит кросскомпилятор. Качай, пробуй.


Я со старой версией игрался. какой он код генерирует наблюдать прикольно, я много знаний из этого подчерпнул, но без железки скучно быстро надоедает.

Sign up to leave a comment.