「メニーコア時代の並列化プログラミング初級入門」開催報告
去る平成21年9月25日(金)、CSAJ会議室にて、「メニーコア時代の並列化プログラミング初級入門セミナー」が開催されました。
シングルコア時代のCPUは動作クロック数の増加に伴いプログラムの処理速度が向上していきましたが、その代償として消費電力の増大、そして排熱問題といった代償を抱えることとなりました。その結果、単にCPUの動作クロックを上げるといったアプローチは止め、代わりにCPUのコア数を増やすマルチコア/メニーコア化がCPUのトレンドとなっています。しかしマルチコア、メニーコア化したCPUのパフォーマンスを引き出すには、並列化(マルチスレッド)プログラミングが必須となります。つまりこのことは、CPUクロック数増大に伴ってプログラムのパフォーマンスが自動的に向上する(フリーランチ)の終焉を意味し、これからはプログラムのパフォーマンス向上させるため明示的に並列化プログラミングを心掛けなければいけない時代に突入していることになります。
このセミナーではインテル株式会社から技術者を招き、並列化の概念や用語の解説、そして具体的にどのAPIを使用するのか、またケースによってどのAPIを使用したら良いのかなど、並列化プログラミングを行う上での注意点などを講演していただきました。
重要な並列化の概念や用語について解説
インテル株式会社 技術本部ソフトウェア&サービス統括部 部長 池井 満氏より、「プログラム並列化に向けて」と題して、CPUのロードマップや並列化の概念について解説していただきました。池井氏は「ムーアの法則は依然として健在」とするものの、これまでのアーキテクチャではシングルスレッドのパフォーマンスは減少し、消費電力は増大してきており、それに対する解として登場したのが電力に最適化したアーキテクチャで、消費電力と演算パフォーマンスのバランスが良いコアを複数個搭載したマルチコアCPUであるといった並列化への経緯の説明をされました。また、並列処理における重要な概念および用語についても丁寧に解説され、「競合(レースコンディション)」、「相互排他(ミューテックス)」、「デッドロック」など並列化において重要且つ問題点として認識しなければいけない事項は、並列化プログラミングの難しさを実感させるものでした。並列化に最適化された手法および言語というものは研究されつつも、まだ決定版が登場しておらず、現状では支援ツールなどの力を借りる必要があるようです。例えばコンパイラの自動並列化機能やOpenMP(共有メモリ並列プログラミングの標準API)を使用する、「インテル Parallel Studio」といったデバッガやアナライザといった開発スイートを活用するといったもので、特に並列化は効果のある個所に適用しないと逆にパフォーマンスが悪化することもあり得るため、開発の各フェーズごとにツールによる検証は重要のようです。
並列化をWin32 APIとOpenMPで実装するには
インテル株式会社 技術本部ソフトウェア&サービス統括部 アプリケーション・エンジニア 竹内 康人氏より、「プログラム最適化と並列化入門」と題して具体的な実装方法について解説していただきました。まずはじめにWin32 API群の中からThreading APIを使った実装について、スレッドの生成からスレッドプールを使ったスレッドの再利用、データ競合を回避するMutexやCritical Sectionの比較、メモリーアロケーションの方法など、各APIの使いやすさ、制御できる度合いなどを交えてレクチャーされました。また、Win32 APIと比べて実装し易いOpenMPのライブラリ関数の説明からプラグマを使った記述方法などについても解説、Windows APIほど細かい制御はできないものの、OpenMPは取りかかり易いとのことでした。
最後に
各講義90分で非常に中身の濃い内容でしたが、並列化についての重要な概念と具体的な実装に向けの解説は並列化プログラミング入門として大変優れた内容でした。今後ますます重要となる並列化プログラミングについて、事例紹介などを企画中です。企画がまとまり次第ご案内申し上げます。