Опитвате се да добавите __m128 с помощта на и маска в SSE програмиране

Опитвам се да използвам резултата от операция за сравнение, за да добавя към SSE променлива. Току-що разбрах, че когато използвам операцията _mm_cmplt_ps, ако резултатът е верен, той връща NAN, защото 0xffffffff не може да бъде представен, което не ми е от полза:

__m128 va;
__m128 vb;
__m128 result =_mm_set1_ps(0.0f);
vb = _mm_cmplt_ps(va,vb);
result = _mm_add_ps(result,vb);  // problem is that I would like to convert vb to 1.0's and 0.0's

person user1850254    schedule 04.04.2013    source източник
comment
Искате ли за всеки компонент да завършите с 1,0, ако va е по-малко от vb?   -  person fun4jimmy    schedule 04.04.2013
comment
@fun4jimmy Да, това е, което искам.   -  person user1850254    schedule 04.04.2013


Отговори (1)


Можете просто да приложите маската за сравнение към вектор със стойности 1.0, напр.

__m128  va, vb;
__m128  vcmp = _mm_cmplt_ps(va, vb);
__m128  vresult = _mm_and_ps(_mm_set1_ps(1.0f), vcmp);
person Paul R    schedule 04.04.2013
comment
Бих искал резултатът да е смес от 1.0 и 0.0 въз основа на стойността на сравнението? - person user1850254; 04.04.2013
comment
temp е смес от 1.0s и 0.0s след като е бил маскиран, така че ако това е всичко, от което се нуждаете, пропуснете последното добавяне. Сега актуализирах кода по-горе, за да отрази това. - person Paul R; 04.04.2013