SSE2 для двойных вычислений с помощью GCC

#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, естественно.