Arm Neon Intrinsics против ручной сборки

https://web.archive.org/web/20170227190422/http://hilbert-space.de/?p=22

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

Так улучшена ли оптимизация компиляции для встроенных функций с использованием кросс-компилятора gnu?

 Nils Pipenbrinck22 мар. 2012 г., 21:03
Эй, мой сайт не датирован. У меня просто есть другая работа на данный момент. :-)
 Rob Napier22 мар. 2012 г., 21:12
Ваш сайт потрясающий. Я провел там много времени, когда пытался выяснить это.

Ответы на вопрос(4)

Решение Вопроса

что внутренности не стоили того, чтобы их беспокоить. Компилятору слишком просто вводить дополнительные шаги выгрузки / загрузки из регистров между вашими внутренностями. Попытка заставить его прекратить делать это сложнее, чем просто написать материал на сыром NEON. Я видел такие вещи в довольно недавних компиляторах (включая clang 3.1).

На этом уровне я считаю, что вам действительно нужно контролировать то, что происходит. Вы можете иметь все виды киосков, если вы делаете вещи только в неправильном порядке. Делать это по сути - это как операция с надетыми перчатками сварщика. Если код настолько критичен по производительности, что мне вообще нужны встроенные функции, то встроенные функции недостаточно хороши. Может быть, другие имеют опыт различий здесь.

 Paul R22 мар. 2012 г., 21:10
Один из подходов может заключаться в том, чтобы сначала кодировать внутреннюю среду, измерять производительность, а затем переходить к ассемблеру для любых подпрограмм, которые все еще нуждаются в дальнейшем повышении скорости.
 Paul R22 мар. 2012 г., 20:45
Это соответствует моему опыту с ARM / Neon. Для x86 / SSE и PowerPC / AltiVec компиляторы достаточно хороши, так что SIMD-код, написанный на встроенных функциях, довольно сложно превзойти с помощью ассемблера, но генерация кода Neon (по крайней мере, с gcc), кажется, не так хороша, и это нетрудно превзойти встроенный SIMD-код Neon в 2 раза, если вы готовы к ручному кодированию на ассемблере.
 Paul R22 мар. 2012 г., 21:00
То же самое - я заметил, что многие вещи, которые вы можете сделать в ассемблере, чтобы помочь производительности, не могут быть выражены через встроенные функции, поэтому, если компилятор не достаточно умен, чтобы делать эти вещи (например, обновления регистра адресов), тогда вам не повезло.
 Jake 'Alquimista' LEE23 мар. 2012 г., 06:20
Я полностью согласен. Встроенные функции не стоят усилий вообще. Это правда, что вы можете принудительно улучшить генерацию кода встроенных функций, если хорошо знаете, как работает Neon, но тогда вам вообще не нужны встроенные функции.
 Rob Napier22 мар. 2012 г., 20:46
2х соответствует моему опыту тоже. Мы не говорим здесь о небольших хитростях, и я даже не настолько хорош в этом.

простого кода на C, а встроенные функции обрабатываются правильно:https://godbolt.org/z/AGHupq

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

В 2016 году все намного лучше.

Многопросто код, который я переписал со сборки на встроенную, теперь оптимизирован лучше компиляторами, чем мной, потому что мне лень выполнять работу конвейера (для скольких различных конвейеров сейчас?), в то время как компиляторам просто нужно, чтобы я пропустил правильно--mtune=.

Для сложного кода, где распределение регистров может быть затруднено, GCC и Clang могут по-прежнему генерировать более медленный, чем рукописный код, с коэффициентом два ... или три (иш). В основном это касается разливов регистра, поэтому по структуре вашего кода вы должны знать, не является ли это риском.

Но у них обоих иногда случаются неутешительные происшествия. Я бы сказал, что прямо сейчас это стоит риска (хотя мне платят за риск), и если вас что-то поразит, тогда сообщите об ошибке. Таким образом, все будет становиться лучше.

 Jake 'Alquimista' LEE01 дек. 2017 г., 12:43
Обновление статуса 2017: умножение моей матрицы asm 4x4 выполняется почти в три раза быстрее, чем встроенная версия, также написанная мной. (Clang, Android Studio 3.01 встроенный, инструмент сборки версии 27.0.1, режим ARM) Все еще пустая трата времени.
 Jake 'Alquimista' LEE27 сент. 2017 г., 07:28
Может быть, вы правы, компиляторы лучше в наши дни. Но это все еще не достаточно хорошо. Такого никогда не будет. Как я уже упоминал выше, вы можете написать прилично выполняющие подпрограммы на встроенных инструментах, при условии, что вы знаете NEON, и, к сожалению, сеть наводнена неубедительными примерами NEON, написанными на встроенных функциях, особенно реализации AOSP NEON - плохая шутка. Это естественно, потому что они написали эти коды легко, не читая техническое руководство ARM.

бильности. Правда в том, что GCC не генерирует хороший код из встроенных NEON. Это не слабость использования встроенных функций, а инструментов GCC. Компилятор ARM от Microsoft создает отличный код из встроенных NEON, и в этом случае нет необходимости использовать язык ассемблера. Портативность и практичность будут диктовать, что вы должны использовать. Если вы умеете писать на ассемблере, пишите asm. Для моих личных проектов я предпочитаю писать критичный по времени код в ASM, чтобы мне не приходилось беспокоиться о том, что компилятор с ошибками / неполноценным кодом испортит мой код.

Обновить: Компилятор Apple LLVM находится между GCC (худший) и Microsoft (лучший). Это не очень хорошо с чередованием инструкций и оптимальным использованием регистров, но, по крайней мере, генерирует разумный код (в отличие от GCC в некоторых ситуациях).

Update2: Компилятор Apple LLVM для ARMv8 был значительно улучшен. Теперь он отлично работает, генерируя код ARMv8 из C и встроенных функций.

 Anoop K. Prabhu18 июн. 2012 г., 08:29
Я использую для работы с GCC и оптимизация встроенных функций довольно плохо. :( Я никогда не знал, что компилятор Microsoft так хорош в этом. Позвольте мне проверить мои коды и посмотреть, как это.
 Rob Napier29 мар. 2012 г., 04:56
Любая причина не назвать компилятор, который вы нашли, работает хорошо? RVDS? Или что-то другое?
 BitBank29 мар. 2012 г., 05:28
Другая компания - Microsoft. Их компилятор ARM на высшем уровне. Люди GNU не любят слышать, как инструменты MS превосходят, но это правда.

Ваш ответ на вопрос