Intel プロセッサーの SIMD プレフィックス合計
概要
プレフィックス合計アルゴリズムは累積合計を計算します指定された配列の。この操作はさまざまな計算問題で発生し、効率的に処理するには高いパフォーマンスが必要です。この記事では、Intel CPU の SIMD 命令がプレフィックス合計アルゴリズムのパフォーマンスを向上できるかどうかについて説明します。
SIMD による並列プレフィックス合計
1 つの並列プレフィックス合計アルゴリズム2 つのパスで操作を実行する必要があります。最初のパスでは、部分和が並行して計算され、続いて各部分和の合計が累積されます。 2 番目のパスでは、各部分和の合計を次の部分和に加算します。 OpenMP による並列処理と 2 番目のパスの SIMD 命令による複数のスレッドを使用すると、効率が向上します。
SIMD Prefix Sum のコード
次は、その上アルゴリズム:
__m128 scan_SSE(__m128 x) { x = _mm_add_ps(x, _mm_castsi128_ps(_mm_slli_si128(_mm_castps_si128(x), 4))); x = _mm_add_ps(x, _mm_shuffle_ps(_mm_setzero_ps(), x, 0x40)); return x; } void pass1_SSE(float *a, float *s, const int n) { __m128 offset = _mm_setzero_ps(); #pragma omp for schedule(static) nowait for (int i = 0; i < n / 4; i++) { __m128 x = _mm_load_ps(&a[4 * i]); __m128 out = scan_SSE(x); out = _mm_add_ps(out, offset); _mm_store_ps(&s[4 * i], out); offset = _mm_shuffle_ps(out, out, _MM_SHUFFLE(3, 3, 3, 3)); } float tmp[4]; _mm_store_ps(tmp, offset); return tmp[3]; } void pass2_SSE(float *s, __m128 offset, const int n) { #pragma omp for schedule(static) for (int i = 0; i<n/4; i++) { __m128 tmp1 = _mm_load_ps(&s[4 * i]); tmp1 = _mm_add_ps(tmp1, offset); _mm_store_ps(&s[4 * i], tmp1); } }
ディスカッション
これらの最適化により、大規模な配列でのプレフィックス合計演算のパフォーマンスが大幅に向上します。両方のパスに SIMD を使用すると、効率がさらに向上し、計算時間が短縮されます。提供されたコードは 2 番目のパスに SIMD を利用し、クアッドコア システムで約 7 倍のパフォーマンス向上を達成します。
以上がIntel CPU 上の SIMD 命令はプレフィックスサムアルゴリズムのパフォーマンスを大幅に向上させることができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。