kgg124 Ответов: 1

Я хочу использовать '_mm_cmpgt_epi8', чтобы получить значение сравнения.


Всем привет.

Я действовал в следующем порядке.

1. Определите a,b, c следующим образом.
__m128i a = _mm_set_epi8(136,135,134,133,132,131,130,129,128,127,126,125,124,123,122,121);
__m128i b = _mm_set1_epi8(125);
__m128i c = _mm_setzero_si128();

2. Используйте '_mm_cmpgt_epi8', чтобы получить 'c'.
c = _mm_cmpgt_epi8(a, b);

Поэтому я ожидал такого результата.
255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0

Но я получил такой результат.
0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0

Итак, я пришел к следующим выводам.
1. Если значение "а" находится в диапазоне от 0 до 127, то выводится нормальное значение сравнения.
2. Если значение 'a' больше 128, то это значение всегда выводится в 0.

Что за проблема?

Я хочу сравнить значение от 0 до 255.

Есть ли решение?

Что я уже пробовал:

Я получил результат, изменив значение " а " с 0 на 255.

1 Ответов

Рейтинг:
9

Jochen Arndt

Из описания внутреннего:

Цитата:
Сравнивает 16 подписанных 8-битных целых чисел в a и 16 подписанных 8-битных целых чисел в b для большего, чем.

Он сравнивает подписанный 8-битные значения. Таким образом, все значения >= 128 являются отрицательными (вычтите 256 в уме). Например, значение 136 трактуется как -119, что, очевидно, меньше 125.

Этот поток SO предоставляет решение для сравнения неподписанных значений: c++ - встроенные функции SSE2-сравнение целых чисел без знака - переполнение стека[^]


kgg124

Спасибо!
Совет, который вы мне дали, был очень полезен.

Проблема была решена путем обращения к ссылкам.
http://stackoverflow.com/questions/32945410/sse2-intrinsics-comparing-unsigned-integers

Спасибо!