В каком-то коде, который я преобразовал в SSE, я предварительно формирую трассировку лучей, отслеживая 4 луча за раз, используя типы данных __m128.
В методе, где я определяю, какие объекты попадают первыми, я перебираю все объекты, проверяю их на пересечение и создаю маску, представляющую, какие лучи имели пересечение раньше, чем было найдено ранее.
Мне также нужно сохранить данные об идентификаторах объектов, которые соответствуют лучшим временам попадания. Я делаю это, поддерживая тип данных __m128 с именем objectNo, и использую маску, определенную по времени пересечения, для обновления objectNo следующим образом:
objectNo = _mm_blendv_ps(objectNo,_mm_set1_ps((float)pobj->getID()),mask);
Где pobj-> getID () вернет целое число, представляющее идентификатор текущего объекта. Создание этого приведения и использование наложения, казалось, было наиболее эффективным способом обновления objectNo для всех 4 лучей.
После того, как все пересечения проверены, я пытаюсь извлечь objectNo's индивидуально и использовать их для доступа к массиву, чтобы зарегистрировать пересечение. Чаще всего я пробовал это:
int o0 = _mm_extract_ps(objectNo, 0);
prv_noHits[o0]++;
Однако это приводит к аварийному завершению с EXC_BAD_ACCESS, поскольку извлечение числа с плавающей запятой со значением 1.0 преобразуется в int со значением 1065353216.
Как правильно распаковать __m128 в слоты, которые можно использовать для индексации массива?