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タイプをfloatにキャストして戻すことです。4つのフロートを収納できるので、簡単にフロートに戻すことができると思いました*。私は何が間違っているのですか?(これはテストコードなので、不思議に思わないでください)。私は基本的に、考えられるすべての可能な変換を試しました。あなたの助けのためのThx。

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 に答える