Я пытаюсь загрузить четыре значения char и добавить их в вектор из 4 чисел с плавающей запятой. сначала я сделал что-то вроде этого:

// char b[1024] is defined somewhere else
__declspec(align(16)) float d[3];
__declspec(align(16)) float a[4];
__m128* pSrcDst1 = (__m128*) d;
__m128* pSrc2 = (__m128*) a;

a[0] = b[i  ];
a[1] = b[i+1];
a[2] = b[i+2];
a[3] = b[i+3];

*pSrcDst1 = _mm_add_ps(*pSrcDst1, *pSrc2); 

Я хотел воспользоваться чем-то вроде _mm_loadu_ps для char*, чтобы я мог:

// char b[1024] is defined somewhere else
__declspec(align(16)) float d[3];
__declspec(align(16)) float a[4];
__declspec(align(16)) char c[4];
__m128* pSrcDst1 = (__m128*) d;
__m128* pSrc2 = (__m128*) a;
__m64* pSrc3 = (__m64*) c;

*pSrc3 = _mm_loadu_ps(&b[i]);
*pSrc2 = _mm_cvtpu8_ps(*pSrc3);
*pSrcDst1 = _mm_add_ps(*pSrcDst1, *pSrc2); 

Каков правильный и оптимизированный способ сделать это?

2
zenpoy 6 Окт 2013 в 17:03
Что для вас значит добавить символ к поплавку?
 – 
John Zwinck
6 Окт 2013 в 17:36
- извините, что не пояснил - это 8-битное целое число без знака
 – 
zenpoy
6 Окт 2013 в 17:47

1 ответ

Лучший ответ

Насколько я могу судить, вам сначала нужно расширить свои значения uint8_t до значений uint32_t, затем вы можете загрузить их и выполнять любые операции, которые вам нравятся. Подробнее см. Здесь: SSE: преобразование короткого целого числа в число с плавающей запятой

2
Community 23 Май 2017 в 13:31