Я хочу узнать больше об использовании SSE.Начало работы с SSE
Какие способы узнать, помимо очевидного чтения Intel® 64 and IA-32 Architectures Software Developer's Manuals?
Главным образом я заинтересован в работе с GCC X86 Built-in Functions.
Я хочу узнать больше об использовании SSE.Начало работы с SSE
Какие способы узнать, помимо очевидного чтения Intel® 64 and IA-32 Architectures Software Developer's Manuals?
Главным образом я заинтересован в работе с GCC X86 Built-in Functions.
Во-первых, я не рекомендую использовать встроенные функции - они не переносимы (через компиляторы той же арки).
Используйте intrinsics, GCC does a wonderful job, оптимизируя встроенные функции SSE в еще более оптимизированный код. Вы всегда можете заглянуть в сборку и посмотреть, как использовать SSE для ее полного потенциала.
Intrinsics легко - так же, как обычные вызовы функций:
#include <xmmintrin.h>
__m128 vector1 = _mm_set1_ps(4, 3, 2, 1); // Little endian, stored in 'reverse'
__m128 vector2 = _mm_set1_ps(7, 8, 9, 0);
// Addition
__m128 result = _mm_add_ps(vector1, vector2); // result = vector1 + vector 2
// A more advanced function, called shuffle
vector1 = _mm_shuf_ps(vector1, vector1, _MM_SHUFFLE(0,1,2,3));
// vector1 is now (1, 2, 3, 4) (above shuffle reversed it)
Конечно, есть способ больше вариантов, SSE действительно мощный и, на мой взгляд, довольно легко узнать.
Поскольку вы просили ресурсы:
A practical guide to using SSE with C++: Хороший обзор концепций о том, как эффективно использовать SSE, с примерами.
MSDN Listing of Compiler Intrinsics: Комплексная ссылка для всех ваших внутренних потребностей. Это MSDN, но в значительной степени все встроенные функции, перечисленные здесь, также поддерживаются GCC и ICC.
Christopher Wright's SSE Page: Краткая ссылка на значения кодов операций SSE. Я думаю, что Intel Manuals может выполнять одну и ту же функцию, но это быстрее.
Возможно, лучше всего написать большую часть своего кода в intrinsics, но проверьте objdump вывода вашего компилятора, чтобы убедиться, что он создает эффективный код. Генерация кода SIMD по-прежнему является довольно новой технологией, и очень возможно, что в некоторых случаях компилятор может ошибиться.
Я нахожу исследование доктора Агнера Фога & руководство по оптимизации очень ценно! У него также есть несколько библиотек & инструментов тестирования, которые я еще не пробовал. http://www.agner.org/optimize/
Знаете ли вы, что горячий, чтобы сделать точечный продукт двух массивов элементов int32 каждый? – psihodelia
Задайте вопрос, и я обязательно помогу :) – LiraNuna