3

2つの関連する質問。

これは、私のコードがかなり大量のデータを処理するために必要なことです。これは内部ループ内で行われ、パフォーマンスが重要です。

  1. __int32の配列をdoubleに変換します(または__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にすばやく解凍する方法です。

4

1 に答える 1

7

組み込み関数_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 );
    ....
}
于 2010-12-13T16:46:06.950 に答える