2

私がやろうとしているのは、4 つの char 値をロードし、それらを 4 つの float のベクトルに追加することです。最初に私がしたことは次のようなものでした:

// 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_psforのようなものを利用したかった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); 

これを行うための適切で最適化された方法は何ですか?

4

1 に答える 1

2

私が知る限り、最初に uint8_t 値を uint32_t 値に拡張する必要があります。次に、それらをロードして、好きな操作を実行できます。詳細については、こちらを参照してください: SSE: short integer から float への変換

于 2013-10-06T13:51:04.623 に答える