Ошибка SSE в моем процессоре?

Я очень озадачен.

Когда я запускаю этот код в Visual C++ 2008:

__m128i a, b;
a.m128i_u64[0] = 1;
b.m128i_u64[0] = 0;
a.m128i_u64[1] = 0;
b.m128i_u64[1] = 0;
printf("%d\n", _mm_testc_si128(a, b));

он печатает 1. Что противоречит тому, что я ожидаю, потому что это должно быть 1, только если a и b одинаковы.

Как это возможно? Есть ли ошибка в моем процессоре, в Visual C++ 2008 или в чем-то еще?


person user541686    schedule 07.11.2011    source источник
comment
Инструкция, которую вы пытаетесь использовать, - это SSE4 (!) - вы уверены, что ваш процессор поддерживает это? ЕСЛИ да, что произойдет, если вы переместите вызов int res = _mm_testc_si128(a, b); перед printf и вместо этого используете res в printf?   -  person Yahia    schedule 07.11.2011
comment
@Yahia: Да, мой процессор поддерживает SSE4, вплоть до SSE4.2. То же самое происходит, когда я использую временную переменную.   -  person user541686    schedule 07.11.2011


Ответы (1)


Я точно знаю, что многие встроенные функции SSE4.1 не работают в VS2008. Они исправили их для VS2010. В VS2010 (без SP) некоторые встроенные функции AVX не работают. Они исправили их в VS2010 SP1.

Я никогда не использовал встроенную функцию _mm_testc_si128, поэтому я не знаю, является ли это другой встроенной функцией, которая не работает в VS2008. Но я видел множество случаев, когда встроенные функции вставки/извлечения были нарушены.

EDIT: я только что проверил это в VS2010 SP1, он также дает 1.

Теперь, когда я просматриваю документацию, мне кажется, что она "должна" возвращаться 1.

Возвращаемое значение

1, если все биты, установленные в b, установлены в a; иначе 0.

Так что я не думаю, что это ошибка в этом случае.

person Mysticial    schedule 07.11.2011
comment
OMFG черт возьми ... Я рвал на себе волосы и использовал локальную библиотеку MSDN для VS 2008 вместо онлайн-библиотеки, и она говорит, что возвращаемое значение равно 1 if a and b are bitwise identical; 0 otherwise. Вау. Спасибо. +1 (см. здесь). - person user541686; 07.11.2011
comment
лол, похоже, они действительно испортили свою документацию по VS2008... :P - person Mysticial; 07.11.2011