Show page source of 並列アプリケーションを作ってみよう_p6 #49564

[[PageNavi(NavigationList)]]



==== コンパイラの自動並列化による並列化 ====
 コンパイラによっては、ループを並列に実行するなどの並列化を自動的に行う「自動並列化」機能を備えているものがある。自動並列化を備えたコンパイラとして代表的なのが、Parallel Composerに含まれているほか、単体製品としても販売されている「インテル C++ コンパイラー」だ。

 自動並列化を利用することで、ユーザーがコードを変更することなしに、プログラムを並列化することができる。ただし、自動並列化機能ではあらかじめ実行する回数が決まっているループしか並列化できず、OpenMPやTBBを使って人力で並列化を行ったコードと比べるとパフォーマンスはやはり劣ることが多い。とはいえ、何も手間をかけずにコードを並列化できるため、使わない手はない。OpenMPやTBBと併用し、自動並列化機能では並列化できないようなループについてはOpenMPやTBBを利用する、といった使い方が効果的だろう。

 また、インテル コンパイラーはループをCPUがより高速に実行できる形に置き換える機能や、CPUが備えるSSEなどの高速演算機能をより活用するようなコードを出力する機能も備えている。これにより、Visual C++でコンパイルするよりも高速なプログラムを作成することが可能だ。

 たとえば先で紹介してきたメディアンフィルタプログラムについて、Visual C++でコンパイルしたものとParallel Composerに含まれるインテル C++ コンパイラーでコンパイルしたもの、そしてインテル C++ コンパイラーで自動並列化を有効にしてコンパイルしたものを比較したのが'''表7'''である。この結果からも、単純にインテル C++ コンパイラーを利用するだけでパフォーマンスが向上していることが分かる。

{{{ html
<h6>表7 コンパイラによる実行速度比較:インテル C++ コンパイラー対Visual C++</h6>
<table class="wikitable" border="1">

<tr><th rowspan="2">並列化手法</th><th colspan="3">所要時間</th></tr>
<tr><th>Visual C++ 2008</th><th>インテル C++ コンパイラー 11.1(Parallel Composer)</th><th>C++ コンパイラー 11.1+自動並列化</th></tr>
<tr><td>シングルスレッド版(med_serial.c)</td><td>5598</td><td>3882</td><td>3802</td></tr>
<tr><td>マルチスレッド版(med_thread.c)</td><td>2926</td><td>2064</td><td>2008</td></tr>
<tr><td>OpenMP版(med_omp.c)</td><td>3033</td><td>2037</td><td>2017</td></tr>
<tr><td>TBB版(med_tbb.cpp)</td><td>3186</td><td>2210</td><td>2099</td></tr>

</table>
}}}

※単位はすべてミリ秒
==== 状況に応じて適切な並列化技術を使い分けよう ====
 以上、マルチスレッド、OpenMP、TBBを使用した並列処理の実装について紹介してきたが、それぞれに特徴があることが理解いただけただろうか。マルチスレッドによる実装はもっとも柔軟ではあるものの、実装の手間やスケーラビリティに欠ける一方、OpenMPによる実装は手軽で、かつスケーラビリティも確保できる。また、TBBはOpenMPよりも柔軟だが、マルチスレッドの場合ほどは実装が複雑にならない、ちょうど中間に位置するものとも言えるだろう。

 今回は多数繰り返し実行されるループを並列化する、という形で並列処理を実装しているが、もちろんアプリケーションによってどのように並列化を実装すべきか、というのは異なる。そのため、状況に応じて、適切な並列化技術を使い分けると良いだろう。



[[PageNavi(NavigationList)]]