2009-09-07 2 views

ответ

38

Во-первых, я не рекомендую использовать встроенные функции - они не переносимы (через компиляторы той же арки).

Используйте 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 действительно мощный и, на мой взгляд, довольно легко узнать.

+0

Знаете ли вы, что горячий, чтобы сделать точечный продукт двух массивов элементов int32 каждый? – psihodelia

+6

Задайте вопрос, и я обязательно помогу :) – LiraNuna

32

Поскольку вы просили ресурсы:

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 по-прежнему является довольно новой технологией, и очень возможно, что в некоторых случаях компилятор может ошибиться.

4

Я нахожу исследование доктора Агнера Фога & руководство по оптимизации очень ценно! У него также есть несколько библиотек & инструментов тестирования, которые я еще не пробовал. http://www.agner.org/optimize/