2010-12-13 10 views
3

2つの関連する質問があります。SSE:__m128と__m128iを2つの__m128dに変換します。

これは私のコードがかなり大量のデータで行う必要があるものです。それは内部のループの内部で行われ、パフォーマンスは重要です。

  1. __int32をダブルに変換(または__m128iを2つの__m128dに変換)します。
  2. floatをdouble型に変換(または__m128を2つの__m128dに変換)します。

基本的に、私は次のシグネチャを持つ関数が必要になります。

void convert_int_to_double(__int32 const * input, double * output); 
void convert_float_to_double(float const * input, double * output); 

入出力ポインタが整列し、要素数が4の倍数であるされている主な問題は、迅速に__m128を解凍する方法です2つの__m128d。

+0

なぜ、正確に?つまり、intとfloatの二重バージョンを事前に計算することにはどんな利点があるのか​​分かりません。最終的には、移動するデータが増えているため、FPUの浮動小数点数は浮動小数点数または整数倍よりも遅くなります。 – Skizz

+0

なぜ内部ループの内部でコンバージョンを行っていますか?すべてのデータを線形時間の前に 'double 'に変換し、ネストされたループ内で' double'だけを使用し(変換は必要ありません)、再び線形時間で結果の型に変換します。 –

答えて

6

intrinsics _mm_cvtepi32_pdおよび_mm_cvtps_pdは、値をdoubleに変換します。

これがループする必要があります:

__m128i* base_addr = ...; 
for(int i = 0; i < cnt; ++i) 
{ 
    __m128i epi32 = _mm_load_si128(base_addr + i); 
    __m128d v0 = _mm_cvtepi32_pd(epi32); 
    epi32 = _mm_srli_si128(epi32, 8); 
    __m128d v1 = _mm_cvtepi32_pd(epi32); 
    .... 
} 
+0

_mm_cvtps_pdへのリンクが壊れています。http://msdn.microsoft.com/en-us/library/40x763ty.aspx – user9876

+0

正しいキャストの後に8ビットシフトが__m128であっても動作すると推測します。 – watson1180

+0

_mm_srli_si128はビットではなくバイト単位でシフトします。はい、すべてのレジスタタイプをシフトします。 – Christopher

関連する問題