SSE: конвертировать __m128 в плавающее

У меня есть следующий кусок кода C:

__m128 pSrc1 = _mm_set1_ps(4.0f);
__m128 pDest;
int i;
for (i=0;i<100;i++) {
m1 = _mm_mul_ps(pSrc1, pSrc1);
m2 = _mm_mul_ps(pSrc1, pSrc1);
m3 = _mm_add_ps(m1, m2);
pDest = _mm_add_ps(m3, m3);
}

float *arrq = (float*) pDest;

Все до конца для цикла работает. Сейчас я пытаюсь привести тип __m128 обратно к float. Так как он хранит 4 числа с плавающей точкой, я подумал, что легко могу привести его обратно к числу с плавающей точкой *. Что я делаю неправильно? (Это тестовый код, так что не удивляйтесь). Я в основном перепробовал все возможные преобразования, которые мог придумать. Спасибо за вашу помощь.

5

Решение

Вам нужно будет использовать _mm_store_ps чтобы вернуть его в поплавок. Код:

// result must be 16-byte aligned
float result [4];
_mm_store_ps (result, pDest);

// If result is not 16-byte aligned, use _mm_storeu_ps
// On modern CPUs this is just as fast as _mm_store_ps if
// result is 16-byte aligned, but works in all other cases as well
_mm_storeu_ps (result, pDest);
10

Другие решения

Я считаю, что кастинг работает, если вы правильно кастуете. У меня нет кода передо мной, но я уверен, что это сработало для меня:

float *arrq = reinterpret_cast<float*>(&pDest);

Обратите внимание, что он использует приведение C ++, описывающее, что вы делаете, и конвертирует адрес об этом в указатель.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector