Я не получаю ошибки в моем коде. Я пытаюсь сравнить буфер беззнаковых значений char с константой. Затем я хочу сохранить 1 или 0 в зависимости от сравнения. Вот мой код (в структуре):
void operator()(const uint8* src, int32 swidth, int32 sheight, uint8* dst, uint8 value) {
uint8 t[16];
__m128i v_one = _mm_set1_epi8((uint8)1);
__m128i v_value = _mm_set1_epi8(value);
printf("value = %d\n", value);
SHOW(t, v_one);
SHOW(t, v_value);
std::cout << "****" << std::endl;
for (int32 i = 0; i < sheight; ++i) {
const uint8* sdata = src + i * swidth;
uint8* ddata = dst + i * swidth;
int32 j = 0;
for ( ; j <= swidth - 16; j += 16) {
__m128i s = _mm_load_si128((const __m128i*)(sdata + j));
__m128i mask = _mm_cmpgt_epi8(s, v_value);
SHOW(t, s);
SHOW(t, mask);
std::cout << std::endl;
}
}
}
Моя первая строка - это то, что я ожидал:
value = 100
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
Но тогда мои сравнения ошибочны:
214 100 199 203 232 50 85 195 70 141 121 160 93 130 242 233
0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0
И я действительно не понимаю, в чем заключаются ошибки.
Макрос SHOW:
#define SHOW(t, r) \
_mm_storeu_si128((__m128i*)t, r); \
printf("%3d", (int32)t[0]); \
for (int32 k = 1; k < 16; ++k) \
printf(" %3d", (int32)t[k]); \
printf("\n")
См. Как создать минимальный, полный и проверяемый пример





Вы сравниваете элементы в вашем массиве s с вашим массивом value.
Все значения в массиве value равны 100.
У вас есть набор значений в вашем массиве s.
Однако _mm_cmpgt_epi8 работает со значениями подписанный и, поскольку это байты, он рассматривает значения от -128 до +127.
Таким образом, единственными возможными значениями, превышающими 100, являются значения в диапазоне от 101 до 127.
Поскольку у вас есть только 1 значение в этом диапазоне (121), это единственное, для которого установлена маска.
Чтобы в этом убедиться, замените uint8 t[16]; на int8 t[16];, и вы должны получить более ожидаемый результат.
Верно. Я нашел этот вопрос, объясняющий, как сравнить unsigned char для заинтересованных. Спасибо ! stackoverflow.com/questions/33824300/…
мне; наиболее очевидная ошибка заключается в том, что вы не используете std :: vector (или std :: array), потому что это означает, что вы не можете; глядя на функцию; знать, действительна ли переданная ему память.