HPC/並列プログラミングポータル

  • Showing Page History #63601

Show page source of インテル_Parallel_Composerの新機能――並列プログラムを容易に実装できる「インテル_Cilk_Plus」入門_p1 #63644

[[PageNavi(NavigationList)]]

== インテル Parallel Composerの新機能――並列プログラムを容易に実装できる「インテル Cilk Plus」入門

[[Thumb(icon.png)]]

[//magazine.sourceforge.jp/developer/article.pl?sid=10/09/24/0425233&tid=81 ] 並列プログラミング向けのコンパイラやデバッガ、各種ライブラリを提供するインテル Parallel Compsoserには、並列プログラミング向けの言語拡張「インテル Cilk Plus」が含まれている。これを利用することで既存のプログラムを容易に並列化したり、より簡潔にアルゴリズムを記述できる。本記事では、このCilk Plusについて機能や使い方を説明する。


=== Parallel Composerの強力な新機能「インテル Cilk Plus」 ===

 インテル Parallel Studio 2011にはさまざまな新機能が搭載されているが、そのなかでも注目したいのがインテル Parallel Composerに含まれるインテル Cilk Plusだ。Cilk Plusは、次のような特徴を持つ言語拡張だ。

 * ループや連続した処理をキーワード指定だけで容易に並列化できる(cilk_spawn/cilk_sync/cilk_forキーワード)
 * 配列に対する処理の記法が拡張され、「[:]」という表記で複数の配列要素に渡る処理を容易に記述できる
 * 配列を引数に取る関数を容易に並列化できる(elemental function)
 * 最小限のオーバーヘッドで排他制御を行える(reducer)
 * 実装時に生成するスレッド数を考慮する必要がなく、容易にスケーラブルなプログラムを記述できる
 * 覚えるべきキーワードや機能が少ないため習得が容易

 たとえば'''リスト1'''はクイックソートをシンプルに実装したものだが、これをCilk Plusで並列化する場合、後半の「my_qsort」関数を再帰呼び出ししている部分に「cilk_spawn」キーワードを付け、最後に「cilk_sync」キーワードを追加するだけで並列化が完了する('''リスト2''')。

====== リスト1 クイックソートの例 ======



{{{
void my_qsort(int* begin, int* end) {
	int* left = begin;
	int* right = end;
	int n;

	while (1) {
		while (*left  *begin)
			left++;
		while (*begin  *right)
			right--;

		if (left = right)
			break;

		n = *left;
		*left = *right;
		*right = n;
		left++;
		right--;
	}

	if (begin  left-1)
		my_qsort(begin, left-1);
	if (right+1  end)
		my_qsort(right+1, end);
}
}}}

====== リスト2 リスト1をCilk Plusを用いて並列化する ======



{{{
	if (begin  left-1)
		cilk_spawn my_qsort(begin, left-1);  ←「cilk_spawn」を追加
	if (right+1  end)
		my_qsort(right+1, end);
	cilk_sync;  ←「cilk_sync;」を追加
}}}

 ごく簡単な修正であるが、筆者の環境(Core 2 Duo E6550/2.33GHz・2コア、メモリ2GB)で1億個の要素を持つint型配列をソートするのに必要な時間を計測・比較したところ、これだけで3割ほどの実行時間短縮が確認できた('''表1''')。

{{{ html
<h6>表1 Cilk Plusによる並列化の結果(ソート実行時間比較)</h6>
<table class="wikitable" border="1">

<tr><th>並列化前</th><th>並列化後</th></tr>
<tr><td>10611ミリ秒</td><td>7662ミリ秒</td></tr>

</table>
}}}

 また、配列に対する演算を次のように簡潔に記述することも可能となる。

{{{
	double A[6];
	double B[] = { 1.0, 4.2, 4.2, 5.3, 7.4, 3.2 };
	double C[] = { 3.1, 8.9, 1.4, 2.2, 1.0, 2.4 };
	double d;

	A[:] = 0.0;  ←配列Aの要素をすべて0.0に初期化
	d = __sec_reduce_add(A[:] * B[:]);  ←BとCの内積を計算
	A[:] = B[:] + C[:];  ←A[0] = B[0] + C[0]、 A[1] = B[1] + C[1]、……に相当
}}}

 Cilk Plusはこのように非常に簡単に導入でき、また並列化によるパフォーマンスの向上だけでなくコードをより簡潔に記述できるというメリットがある。以下ではこのCilk Plusについて、基本的な機能や文法などのポイントを紹介していく。

{{{ html
<div class="column">
}}}


==== Cilk Plusの歴史 ====

 Cilk Plusは元々はMITの「[http://supertech.csail.mit.edu/cilk/ The Cilk Project]」により、ANSI Cベースの並列プログラミング言語「Cilk」として開発されていた。Cilkは当初High Performance Computing(HPC)と呼ばれる、スーパーコンピュータなどの高性能コンピュータ向けに開発されていたが、Leiserson教授らが起こしたベンチャー企業Cilk Artsが商用化、C++対応やさまざまな新機能を追加した「Cilk++」としてリリースされた。その後Cilk ArtsはIntelに買収され、仕様変更とともに名称もCilk Plusに変更、Parallel Studioの一部となった。

 なお、CilkはGCCをコンパイラとして利用しており、現在でもGPLでリリースされている。CilkとCilk Plusではspawn/syncキーワードなど共通している部分が多いため、Cilkを利用したことのあるユーザーであればCilk Plusも容易に扱えるだろう。ただし、C++対応やarray extensionsなどClik PlusにはCilkには含まれていない独自の拡張機能も多くあるので、ドキュメントなどで詳細を確認していただきたい。

{{{ html
</div>
}}}

[[PageNavi(NavigationList)]]