ソースコードの変更なしで並列化を行う

You can generate a parallel computation binary without changing the source code by setting options of icc or icpc. However, parallelism performed with openMP is less efficiency than that with OpenMPI. However, it is very easy to compile in this way and it is a very big advantage. Set the options as follows.

      icc -parallel -par-threshold0 -qopt-report3 -qopt-report-phase=par -O3 main.cpp
      

-par-threshold0は並列化の閾値を最低の0に設定しています。設定可能な値は、0~100 です。0の場合、ループは、計算量にかかわらず常に自動並列化されますが、100の場合、ループはコンパイラ分析データに基づいてパフォーマンスの向上が予測される場合のみ自動並列化され、ループは並列化実行が有効であることがほぼ確実な場合のみ自動並列化されます。1から99の値は、速度が向上する可能性の比率を表し、50の場合、並列実行されたときにコードの速度が向上する可能性が50パーセントあるループのみ並列化を行います。-qopt-report3は並列化についてのレポートをレベル3の量で出力するということを指定しています。レポートの量を少なくするには2、1を設定します。コンパイルを行うと.optrpt拡張子のレポートが出力されます。以下はその例ですが、10行目から始まるループで並列化が行われていることがわかります。



Begin optimization report for: main()

    Report from: Auto-parallelization optimizations [par]


LOOP BEGIN at main.cpp(10,1)
   remark #17109: LOOP WAS AUTO-PARALLELIZED
   remark #17101: parallel loop shared={ } private={ } firstprivate={ x i } lastprivate={ } firstlastprivate={ } reduction={ sum }
LOOP END

LOOP BEGIN at main.cpp(10,1)
   remark #25460: No loop optimizations reported
LOOP END

LOOP BEGIN at main.cpp(10,1)

LOOP END
===========================================================================


Source Code of Caluclating Pi

//  pi
//  Copyright 2015 Yuki Mochizuki
#include <stdio.h>
#define num_steps 100000000
double step;
main (){
	int i;
	double x, pi, sum = 0.0;
	step = 1.0/(double)num_steps;
	for(i=1;i<= num_steps; i++){
		x = (i-0.5)*step;
		sum = sum + 4.0/(1.0+x*x);
	}
	pi = step*sum;
	printf("%f",pi);
}