Есть ли инструкция в SSE/SSE2
, которая может найти max/min в 4 целых числах 32-бит? Я искал что-то, но нашел только инструкции для 16/8 бит. Спасибо заранее.Найти max среди 32-битных целых чисел
ответ
Лучший способ без SSE4.1, по-видимому, иметь 32-битное сравнение, а затем использовать эту маску для смешивания: AND(mask, x) OR ANDN(mask, y)
.
Agner Fog's vector class library имеет a function for it:
// function max: a > b ? a : b
static inline Vec4i max(Vec4i const & a, Vec4i const & b) {
#if INSTRSET >= 5 // SSE4.1 supported
return _mm_max_epi32(a,b);
#else
__m128i greater = _mm_cmpgt_epi32(a,b);
return selectb(greater,a,b);
#endif
}
У меня есть в основном, непроверенных и пока еще не слившиеся изменения для этой библиотеки on github. Большинство моих изменений значительно улучшают некоторые функции, на которые у меня было время, чтобы посмотреть (целые горизонтальные суммы, квадратичный арифметический сдвиг вправо, умножение на квадрат). (Тестирование/обратная связь приветствуется!)
Но много существующего кода неплохое, поэтому я определенно рекомендую использовать эти классы-оболочки. Они не добавляют накладные расходы при создании с включенными оптимизациями, и они делают синтаксис намного проще. например a+b
вместо _mm_add_epi32(a,b)
.
Возможно, горизонтальные операции - это плохие плоды. Я имею в виду, что они не являются операциями, которые вы обычно хотели бы в критической петле, поэтому их оптимизация не так важна. Были ли вы найдены какие-либо критические функции в VCL, которые нуждаются в оптимизации g? Самая сложная часть VCL, я думаю, это перестановки и смеси. См. Например [this] (http://agner.org/optimize/vectorclass/r ead.php? я = 120). Я считаю, что это самая сложная область для реализации с общим классом. –
@ Zboson: да, оказывается, что все VCL всегда использует 'vpblendvb' (2 uops и нуждается в маске из памяти), даже для компиляции-постоянных смесей. Далее в моем списке нужно исправить шаблоны, чтобы использовать более быстрые 'vpblendd' или' pblendw', когда это возможно.Я также нажал ускорение для 'operator >> (Vec2q)' (эмуляция отсутствующего «psarq»), где я сделал значительно лучше для версии 128b, чем просто изменение переменной-смеси для немедленной замены. –
[Здесь] (https://stackoverflow.com/questions/34122605/how-to-optimize-simd-transpose-function-8x4-4x8/34207876#34207876) - еще один интересный пример. Я понял это правильно, но проблема в том, что мне пришлось попробовать несколько вариантов, прежде чем VCL выпустит идеальный код вместо плохого кода. –
Может PMAXSD
делает трюк?
Сравнивает накопленные подписанные целые числа dword в операнде-адресате (первый операнд) и исходный операнд (второй операнд) и возвращает максимум для каждого упакованного значения в операнде-адресате.
Однако для этого требуется поддержка SSE 4.1 и/или AVX.
- 1. Найти минимальные значения среди 5 целых чисел?
- 2. Как найти max из списка целых чисел
- 3. Найти max int среди 1000 целых чисел, использовать сортировку пузырьков или сортировку слияния?
- 4. Найти коэффициенты целых чисел
- 5. найти наименьшее число n целых чисел
- 6. Как найти повторяющуюся последовательность целых чисел в массиве целых чисел?
- 7. Найти наименьшее среди 3 чисел в C++
- 8. прочитать последнюю запись и найти значение MAX в строке целых
- 9. Как получить min/max двух целых чисел в Postgres/SQL?
- 10. подсчет целых целых чисел
- 11. Сумма нечетных целых чисел
- 12. Массив целых чисел Сравнение целых чисел VB.NET
- 13. найти kth неповторяющийся элемент среди символов и целых чисел (большой размер)
- 14. Сериализация среди чисел
- 15. найти список целых чисел для контрольной суммы
- 16. Как найти список целых чисел в Haskell
- 17. Найти дубликаты в массиве/списке целых чисел
- 18. Найти смещение в массиве целых чисел
- 19. Найти максимальный элемент в потоке целых чисел
- 20. Найти сумму цифр последовательности целых чисел
- 21. Найти максимальное подмножество огромного набора целых чисел
- 22. Найти число целых чисел в диапазоне
- 23. Нахождение n-го числа среди трех чисел
- 24. Максимальная сумма целых чисел
- 25. Как реализовать массив целых чисел для больших целых чисел?
- 26. Алгоритм для max integer в массиве целых чисел
- 27. Чтение целых чисел из текстового файла, получение min/max - Java
- 28. Выберите max 5 целых чисел из набора 20
- 29. Быстрое разветвление max для целых чисел без знака
- 30. max двух целых чисел с использованием тернарного оператора в C
Вы ищете горизонтальную операцию? Или 4 упакованных максимальных операций параллельно, например 'pmaxsd'? Если вам нужен горизонтальный макс с SSE2, просто сохраните его в памяти и используйте скаляр. С SSE4.1, тогда, возможно, перетасовка, как для горизонтальной суммы, будет самой быстрой. Горизонтальные операции медленны. Если вашему алгоритму нужно много, вы неправильно используете SIMD. См. Раздел [SSE tag wiki] (http://stackoverflow.com/tags/sse/info) для руководств. –
«Вы ищете горизонтальную операцию?» Я ищу операции параллельно. Хорошо, вы предлагаете хранить в памяти и использовать скалярные операции. (в случае горизонтального). Но почему вы предлагаете это делать? В конце концов, нет преимущества от использования SIMD. Вы имеете в виду, что горизонтальная операция выполняется так же быстро, как «хранить в памяти и сравнивать« нормальный »(скалярный) способ? – Gilgamesz
Если у вас ровно 4 цифры, а не 1000 номеров, SIMD не имеет особого значения (если ваши номера являются unsigned 16bit, поэтому вы можете использовать специальный ['PHMINPOSUW'] (http://www.felixcloutier.com/x86/PHMINPOSUW.html)). Горизонтальное означает« внутри одного вектора », в отличие от того, что SIMD (например, добавьте [0] к b [0], a [1] в b [1] и т. д.). Если вам нужно найти горизонтальный максимум из 4 элементов без SSE4.1, то вы, вероятно, не может бить скаляр –