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

Intel C Compiler (icc)、C++ Compiler (icpc)のコンパイルオプションを適切に設定することにより、ソースコードを変更することなく並列計算向けの実行バイナリを生成することができます。ただし、この方法で行える並列化は、粒度の小さい並列化と言われるもので、OpenMP、OpenMPIなどでソースコードに手を加えることで可能な粒度の大きい並列化と比べると計算の効率は低いものとなります。ただ、この方法の非常に簡単に実行できる点は非常に大きなメリットです。以下のようにオプションを設定します。最後に今回用いた円周率計算用のC言語ソースコードを掲載しています。

      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
===========================================================================


円周率計算のソースコード

//  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);
}