7

我有以下一段 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;

直到 for 循环结束之前的一切都有效。我现在要做的是将 __m128 类型转换回浮动。由于它存储了 4 个浮点数,我想我可以轻松地将其转换回浮点数*。我究竟做错了什么?(这是一个测试代码,所以不要怀疑)。我基本上尝试了我能想到的所有可能的转换。谢谢你的帮助。

4

2 回答 2

11

你需要用_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);
于 2013-01-16T20:51:42.230 回答
3

我相信如果你施法得当,施法是有效的。我面前没有代码,但我很确定这对我有用:

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

请注意,它使用 C++ 强制转换来描述您在做什么,并将其地址转换为指针。

于 2013-10-02T11:10:12.010 回答