インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス
次のサンプルプログラムは、F32vec4 クラスを使用して 20 の要素から成る浮動小数点配列のすべての要素の平均値を計算します。
// インテル® ストリーミング SIMD 拡張命令 (インテル® SSE) のクラス定義をインクルードする
#include <fvec.h>
// a の 2 つの SP FP をデスティネーションの
// 2 つの下位 SP FP 要素にシャッフルして、b の 2 つの SP FP 要素を
// デスティネーションの 2 つの上位 SP FP 要素にシャッフルする
#define SHUFFLE(a,b,i) (F32vec4)_mm_shuffle_ps(a,b,i)
#include <stdio.h>
#define SIZE 20
// グローバル変数
float result;
_MM_ALIGN16 float array[SIZE];
//*****************************************************
// 関数: Add20ArrayElements
// 20 の要素から成る配列のすべての要素を加算する
//*****************************************************
void Add20ArrayElements (F32vec4 *array, float *result) {
F32vec4 vec0, vec1;
vec0 = _mm_load_ps ((float *) array); // 配列の最初の 4 つの float をロードする
//*****************************************************
// 一度に 4 要素ずつ、配列のすべての要素を加算する
//******************************************************
vec0 += array[1]; // 要素 5-8 を加算する
vec0 += array[2]; // 要素 9-12 を加算する
vec0 += array[3]; // 要素 13-16 を加算する
vec0 += array[4]; // 要素 17-20 を加算する
//*****************************************************
// 4 つの部分和が得られる
// 下位 2 つを上位 2 つと加算し
// それぞれの結果を加算する
//*****************************************************
vec1 = SHUFFLE(vec1, vec0, 0x40);
vec0 += vec1;
vec1 = SHUFFLE(vec1, vec0, 0x30);
vec0 += vec1;
vec0 = SHUFFLE(vec0, vec0, 2);
_mm_store_ss (result, vec0); // 最終値を格納する
}
void main(int argc, char *argv[]) {
int i;
// 配列を初期化する
for (i=0; i < SIZE; i++) { array[i] = (float) i; }
// すべての配列要素を加算する関数を呼び出す
Add20ArrayElements (array, &result);
// 配列要素の平均値を出力する
printf ("Average of all array values = %f\n", result/20.);
printf ("The correct answer is %f\n\n\n", 9.5);
}