#optimization #gcc #double #sse2
#оптимизация #gcc #двойной #sse2
Вопрос:
Как я могу использовать SSE2 в GCC? Я хочу работать с двойными значениями.
Я ищу s.th . вот так: http://vrm-vrm.blogspot.com/2009/10/gcc-intrinsics.html только для двойных значений.
Комментарии:
1. Вы могли бы просто скомпилировать с
-msse
etc. или с-march=native
…2. Это все? Я слышал, что это будет сложно, и нужно будет использовать встроенные функции.
3. Вы должны использовать встроенные функции, если хотите использовать явные конструкции. С помощью флагов компилятора вы просто сообщаете компилятору, что можно использовать оборудование, когда оно доступно, и когда оптимизатор определяет, что это хороший выбор. Использовать в сочетании с некоторым
-O
уровнем. Гарантии нет, но попробуйте и сравните сборку.4. Если вы используете относительно новый процессор (возрастом менее 5 лет), то вы можете не увидеть большой пользы от SSE с двойной точностью, поскольку большинство современных процессоров x86 теперь имеют два FPU, а на SSE вы получаете только двусторонний SIMD с двойной точностью.
Ответ №1:
Если вы хотите использовать SSE2 double
в NSNS, вам придется скомпилировать с gcc -mfpmath=sse -msse2
.
Эта опция -msse2
сама по себе позволит вам использовать встроенные функции SSE2, -mfpmath=sse
заставит GCC выдавать SSE2 insns для всех операций FP.
Также обратите внимание, что векторизация включена в -O3
.
Преимущества векторизованного SSE2-4 insn очевидны, процессоры Sandy Bridge могут выполнять до трех 256-битных операций за цикл (например, 4 двойных умножения, 4 двойных сложения и некоторая перетасовка поверх этого)
Однако руководство Intel по оптимизации рекомендует использовать SSE даже для скалярных операций по причинам, включающим модель плоского регистра и меньшие задержки по сравнению с устаревшими x87 insns.
Редактировать:
Забыл упомянуть, что для 32-разрядного кода вы также можете добавить -msseregparm
, что приведет к передаче аргументов FP и возвращаемых значений через регистры SSE. По умолчанию они передаются в память и в %st0
, соответственно. Естественно, это изменяет ABI, поэтому все взаимодействующие модули должны быть скомпилированы с этой опцией.
Комментарии:
1. Если память работает правильно, x87 вообще не используется в 64-битном ABI.
2. @phkahler, да, за исключением
long double
операций, когда используется x87, естественно.