-4

前の説明的な質問でごめんなさい。もう一度質問を言い換えさせてください。

セットアップ:

SSEを使用して、ADDと4つの配列からの4つの32ビット値のビット単位の操作を同時に実行する必要があります。これらの4つの配列のすべての要素は整数サイズ(32ビット)です。結果は5番目の配列に送られます。

だから私の質問は:

  1. Cを使用してSSEを実行できるように、どのヘッダーファイルとコンパイラフラグを含める必要がありますか?
  2. Paulが提供するサンプルコードはまだ機能しますか?

別の質問ですが、整数Aから最後のビットを読み取り、整数Bから最初のビットを読み取り、整数Cの最後のビットと最初のビットを今読み取った値に置き換える必要がある場合、ここでSSEを使用できますか?またはそれを行うための速い方法はありますか?通常の場合の3アクセスの代わりに?

繰り返しになりますが、前回の投稿についてお詫び申し上げます。ご意見をお寄せいただきありがとうございます... ^ _ ^

4

1 に答える 1

3

仮定して:

  • 4つの入力配列から対応するintを追加し、その合計を5番目の(出力)配列に格納します。
  • intsは32ビットです
  • 配列サイズ(N)は4の倍数です
  • すべての配列は16バイト整列されています

その後、これはそれを行う必要があります:

#include <stdint.h>
#include <emmintrin.h>

const size_t N = 4096;  // size of input/output arrays

int32_t array0[N];      // 4 x input arrays
int32_t array1[N];
int32_t array2[N];
int32_t array3[N];
int32_t array_sum[N];   // output array

for (size_t i = 0; i < N; i += 4)
{
    __m128i v0 = _mm_load_si128(&array0[i]); // load 4 x vectors of 4 x int
    __m128i v1 = _mm_load_si128(&array1[i]);
    __m128i v2 = _mm_load_si128(&array2[i]);
    __m128i v3 = _mm_load_si128(&array3[i]);
    __m128i vsum = _mm_add_epi32(v0, v1);    // sum vectors
    __m128i vsum = _mm_add_epi32(vsum, v2);
    __m128i vsum = _mm_add_epi32(vsum, v3);
    _mm_store_si128(&array_out[i], vsum);    // store sum
}
于 2012-11-23T12:26:33.263 に答える