インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス
このトピックは、インテル® Xeon Phi™ コプロセッサー x100 製品ファミリー (開発コード名 Knights Corner) をターゲットとするインテル® 64 アーキテクチャーにのみ適用されます。
次のサンプルプログラム sample.cpp は、F32vec16 クラスを使用して 80 の要素から成る浮動小数点配列のすべての要素の平均値を計算します。
インテル® MIC アーキテクチャーでのみ実行可能なオブジェクト・ファイル a.out を生成するには、以下のコマンドを使用してコードをコンパイルします。
icpc -mmic sample.cpp
// ベクトルクラス定義をインクルード
#include <micvec.h>
#include <stdio.h>
#define SIZE 80
// グローバル変数
float result;
__declspec(align(64)) float array[SIZE];
//*****************************************************
// 関数: Add80ArrayElements
// 80 の要素からなる配列のすべてを加算する
//*****************************************************
void Add80ArrayElements (F32vec16 *array, float *result)
{
//****************************************************
// 配列の最初の 16 の float をロードする
//*****************************************************
F32vec16 vec0((float*)array);
//*****************************************************
// 一度に 16 要素ずつ、配列のすべての要素を加算する
//******************************************************
vec0 += array[1]; // 要素 16-31 の加算する
vec0 += array[2]; // 要素 32-47 の加算する
vec0 += array[3]; // 要素 48-63 の加算する
vec0 += array[4]; // 要素 64-79 の加算する
//*****************************************************
// 結果ベクトルのすべての要素を加算する
//******************************************************
*result = vec0.reduce_add();
}
int main(int argc, char *argv[])
{
int i;
// 配列を初期化する
for (i=0; i < SIZE; i++) {
array[i] = (float) i;
}
// 配列のすべての要素を加算する関数を呼び出す
Add80ArrayElements ((F32vec16*)array, &result);
// 配列要素の平均値を出力する
printf ("Average of all array values = %f\n", result/80.);
printf ("The correct answer is %f\n\n\n", 39.5);
return 0;
}