限界に達したエンベデッド・プロセッサを並列処理で補完する:SYSTEM DESIGN JOURNAL(2/4 ページ)
組み込みシステムの能力を並列処理で補完するアイデアは、身近で現実味を帯びたものとなっています。しかし、その実行に際しては手法の選択が重要な意味を持ちます。OpneMPやOpenCLなどを理解しながら、最適な手法を検討しましょう。
OpenXX
並列化という課題は、エンベデッドコンピューティングで問題になるはるか以前に、別の分野で発生しました。高性能コンピューティング分野では初期のCrayのような巨大なシングルスレッドプロセッサから多くの小型マルチコアプロセッサに移行したため、プログラマはコードを書き直さざるを得ませんでした。プログラマは参照の局所性が高い1つの巨大なスレッドから、別々のコアで実行できる可能性のある多くの半独立スレッドに移行する必要に迫られたのです。
多くの場合、本当に大きなジョブは対応できるスーパーコンピュータに移す必要があったため、プログラマはマシンに依存せずに書き換えができるフレームワークを探し求めました。そのニーズに最もよく応えたフレームワークの1つに「OpenMP」があります。
OpenMPはプログラマがコードをホモジニアスな共有メモリマルチプロセッシング環境に適応させることを支援すると考えられました(図1)。最近は機能が拡張されてアクセラレータやマルチコアクラスタでも動作するようになりましたが、共有メモリがベースであることに変わりはありません。OpenMPに適応させたコードは、OpenMPプラットフォームを持つどのシステムでも正しく動作するのが理想的ですが、当然ながらシステムによって性能は大きく異なります。
OpenMPはプラグマ(CまたはFORTRANソースに挿入したコメント)を読み込んで動作し、コードに並列領域を作成し、その領域にある複数のスレッドを分離して、別々のプロセッサに割り当てます。
極めて広範な機能をごくかいつまんで説明すると、「データ系列処理」「タスク並列処理」と2つのモデルが選択できます。データ系列処理を利用するときには、囲まれたコードがforループ(FORTRAN 用語では DO ループ)であること、OpenMPではループを展開して並列実行するスレッドを抽出する必要があることをOpenMPに指示できます。タスク並列処理の際には別々のプロセッサで実行できる独立したセクション(多くのプラグマで標識を付けたもの)の数がコードに含まれていることをOpenMPに指示することができます。
OpenMPプラットフォームは、プラグマに挿入した指令、ハードウェアの可用性、ランタイム変数に基づいて特定したスレッドをプロセッサに割り当てます。従って、プロセッサへの純粋に静的なタスク・マッピングから完全に動的なシステムまで、どのようなものでも実現できます。
OpenMPに解除指示を出すと元のプログラムが元の形式で(1つのCPU上の単一スレッドとして)実行されます。使用するCPUを増やすように指示すると、OpenMPは要求された方法で増やそうとします。スレッドの同期、変数の所有権と変数へのアクセス、並列プログラミングに必要なその他の厄介な事柄を制御するのは別の指令です。
注意するべき事は、OpenMPは「分析」ではなく「手順を処理」することです。どのタスクを並列化するか、衝突問題をどのように防ぐか、デッドロックをどのように避けるかなどは全て人間が決めます。OpenMPはタスク間通信モデルの指定もデバッグ環境の提供も行わないので、人間が選択します。OpenMPは基本的に既存ツールチェーンとOSの上位にありますが、ベアメタルOpenMPプラットフォームを作成するためのいくつかの作業がありました。
Copyright © ITmedia, Inc. All Rights Reserved.