c++ - char * 的 _mm_loadu_ps 是否有等效项?

标签 c++ sse

我想要做的是加载四个 char 值并将它们添加到 4 个 float 的 vector 中。起初我做的是这样的:

// 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); 

执行此操作的正确且优化的方法是什么?

最佳答案

据我所知,您首先需要将 uint8_t 值扩展为 uint32_t 值,然后您可以加载它们并执行您喜欢的任何操作。详情请看这里:SSE: convert short integer to float

关于c++ - char * 的 _mm_loadu_ps 是否有等效项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19209149/

相关文章:

c++ - 算法中令人费解的行为应该根据列表的项目创建 4 个列表

c - 快速计算 __m128i 寄存器中设置位的数量

c - 使用 SSE (x*x*x) 的乘法

c++ - 我在哪里可以找到列出 SSE 内在函数操作的官方引用资料?

c++ - Cimg 随机抛出 CImgIOException

c++ - 在没有 X 的 Linux 上编译 Qt 应用程序

c++ - 将成员模板 typedef 与 using 别名会使编译器认为它不是类模板

c++ - SSE2 : Double precision log function

c - 确保编译器始终使用 SSE sqrt 指令

c++ - `public` 访问限定符和 `const` ness。 `-Wuninitialized`