Получение максимального значения в векторе __m128i с SSE?

Я только начал использовать SSE, и я смущен, как получить максимальное целочисленное значение ( max ) __m128i . Например:

 __m128i t = _mm_setr_ps(0,1,2,3); // max(t) = 3; 

Поиск вокруг привел меня к инструкции MAXPS но я не могу найти, как использовать это с помощью "xmmintrin.h" .

Кроме того, есть ли какая-либо документация для "xmmintrin.h" которую вы бы рекомендовали, вместо того, чтобы искать в самом файле заголовка?

Если вам нужно выполнять горизонтальные операции над векторами, особенно если он находится внутри внутреннего цикла, это обычно является признаком того, что вы приближаетесь к своей реализации SIMD неправильно. SIMD любит управлять элементами по векторам – «вертикально», если хотите, а не горизонтально.

Что касается документации, есть очень полезная ссылка на intel.com, которая содержит все коды операций и встроенные функции для всего, начиная от MMX и заканчивая различными вариантами SSE вплоть до AVX и AVX-512.

В случае, если кто-то заботится, и поскольку intrinsics, кажется, путь, чтобы идти в эти дни, здесь есть решение с точки зрения внутренности.

 int horizontal_max_Vec4i(__m128i x) { __m128i max1 = _mm_shuffle_epi32(x, _MM_SHUFFLE(0,0,3,2)); __m128i max2 = _mm_max_epi32(x,max1); __m128i max3 = _mm_shuffle_epi32(max2, _MM_SHUFFLE(0,0,0,1)); __m128i max4 = _mm_max_epi32(max2,max3); return _mm_cvtsi128_si32(max4); } 

Я не знаю, лучше ли это:

 int horizontal_max_Vec4i(__m128i x) { int result[4] __attribute__((aligned(16))) = {0}; _mm_store_si128((__m128i *) result, x); return max(max(max(result[0], result[1]), result[2]), result[3]); } 

Согласно этой странице нет горизонтального максимума, и вам нужно проверить элементы по вертикали:

 movhlps xmm1,xmm0 ; Move top two floats to lower part of xmm1 maxps xmm0,xmm1 ; Get maximum of the two sets of floats pshufd xmm1,xmm0,$55 ; Move second float to lower part of xmm1 maxps xmm0,xmm1 ; Get minimum of the two remaining floats 

И наоборот, получение минимума:

 movhlps xmm1,xmm0 minps xmm0,xmm1 pshufd xmm1,xmm0,$55 minps xmm0,xmm1 

В SSE нет кода горизонтальной максимальной операции (по крайней мере, до момента, когда я остановился, отслеживать новые инструкции SSE).

Таким образом, вы застряли, делая несколько перетасовки. Что вы в итоге …

 movhlps %xmm0, %xmm1 # Move top two floats to lower part of %xmm1 maxps %xmm1, %xmm0 # Get minimum of sets of two floats pshufd $0x55, %xmm0, %xmm1 # Move second float to lower part of %xmm1 maxps %xmm1, %xmm0 # Get minimum of all four floats originally in %xmm0 

http://locklessinc.com/articles/instruction_wishlist/

MSDN имеет встроенные и макрофункции, задокументированные

http://msdn.microsoft.com/en-us/library/t467de55.aspx

  • Почему нет регистра, который содержит более высокие байты EAX?
  • x86 Расчет AX с учетом AH и AL?
  • Самый быстрый способ вычисления абсолютного значения с помощью SSE
  • Какие целые операции с дополнением 2 можно использовать без обнуления высоких бит в входах, если требуется только низкая часть результата?
  • Почему этот код SSE в 6 раз медленнее без VZEROUPPER на Skylake?
  • Наблюдение за устаревшей инструкцией по x86 с самомодифицируемым кодом
  • Какая технология сопоставления кеша используется в процессоре Intel Core i7?
  • Ошибка Weird MSC 8.0: «Значение ESP не было должным образом сохранено в вызове функции ...»
  • Почему SSE скалярный sqrt (x) медленнее, чем rsqrt (x) * x?
  • Является x86 CMPXCHG атомом?
  • Ассемблер ADC (добавить с переносом) в C ++
  • Interesting Posts

    Показывать только поисковые предложения в Омнибаре для поиска

    В этом конкретном случае существует ли разница между использованием списка инициализаторов членов и назначением значений в конструкторе?

    Глобальная перегрузка операторов в F #

    Почему я не могу копировать 7 ГБ файл на внешний USB-накопитель с разрешением 120 ГБ?

    Как я могу использовать символ Unicode для сравнения символов?

    Как использовать мою собственную базу данных sqlite?

    Java – экранирование метасимволов в Regex

    Как правильно использовать Google Plus для входа в систему с несколькими действиями?

    Контекстное меню Windows 7 для папок – * IF * папка содержит определенные типы файлов

    Выход U-SQL в Azure Data Lake

    Как получить соответствующие изображения в соответствующем Android-устройстве в Android Studio

    Applescript; открытие приложения в пробеле N

    Как отключить поиск в адресной строке Google Chrome?

    «Const» означает только чтение или что-то еще?

    Как реализовать виртуальные статические свойства?

    Давайте будем гением компьютера.