char *有_mm_loadu_ps的等价物吗?

时间:2013-10-06 13:03:58

标签: c++ sse

我要做的是加载四个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); 

什么是正确的&优化的方式吗?

1 个答案:

答案 0 :(得分:2)

据我所知,您首先需要将uint8_t值扩展为uint32_t值,然后您可以加载它们并执行您喜欢的任何操作。有关详细信息,请参阅此处:SSE: convert short integer to float