自動並列化ツールとは、既存の逐次処理(シングルスレッド)コードを並列処理(マルチスレッドまたはベクトル化)コードに自動的に変換するコンピュータプログラムです。その目的は、既に作成されたソフトウェアを並列化によるパフォーマンス向上効果を享受しながら再利用しやすくし、ソフトウェアの書き換え量を削減し、最終的にはソフトウェア全体を書き換える必要性をなくすことです。
従来、並列ハードウェアはハイエンドマシンや分散コンピューティングによってのみ実装されていましたが、グラフィックス処理ユニット(GPU)やマルチコアCPUが民生機器に搭載されるようになったことで、ローエンドコンピュータにも広く普及するようになりました。そのため、古いシングルスレッドアプリケーションを並列ハードウェアに対応させるプロセスを自動化することが望ましいとされています。さらに、自動並列化ツールを使用すれば、並列化のメリットを享受しながらも、アプリケーションをシングルスレッドで記述することに集中できます。ただし、変換には、シングルスレッドコンピューティングでは発生しない同期やデッドロック回避といった問題への対処など、いくつかの注意点があります。
過去の手法ではFortranやCなどの言語に対する解決策が提供されていましたが、それだけでは不十分でした。これらの手法は、ループや特定のコードセクションなど、特定のシステムのセクションを並列化することのみを扱っていました。マルチスレッドアプリケーションを生成する際には、並列化の機会を特定することが重要なステップとなります。アプリケーションを並列化する必要性は、コードを分析して並列性を活用するツールによって部分的に満たされています。これらのツールは、コンパイル時または実行時のいずれかの手法を使用します。これらの手法は一部の並列化コンパイラに組み込まれていますが、ユーザーは並列化コードを識別し、特別な言語構造でコードをマークする必要があります。コンパイラはこれらの言語構造を識別し、マークされたコードを分析して並列化します。一部のツールは、ループなどの特定の形式のコードのみを並列化します。したがって、逐次コードを並列コードに変換する完全自動ツールが必要です。[ 1 ]
1. このプロセスは、並列処理の可能性のあるコード部分を特定することから始まります。多くの場合、この作業は困難です。なぜなら、コードの並列化に取り組むプログラマーは、対象となるコードを最初に書いたわけではないか、あるいはそのアプリケーション領域に不慣れだからです。したがって、並列化プロセスのこの最初の段階は簡単そうに見えますが、実際にはそうではないかもしれません。
2. 次の段階は、特定されたコードセクションの中から、実際に並列化可能なセクションを絞り込むことです。この段階は、特にポインタが関係し分析が難しいC言語やC++言語のコードを扱う場合、多くの分析が必要となるため、最も重要かつ困難な段階です。コードセクションが他のコードに依存しているかどうかを判断するには、ポインタエイリアス分析や関数副作用分析など、多くの特殊な手法が必要です。特定されたコードセクションに存在する依存関係が多いほど、並列化の可能性は低くなります。
3. コードを変更することで依存関係が解消される場合があり、これが並列化の次の段階です。コードは、関数、ひいては出力は変更されないものの、他のコードセクションや他の命令への依存関係(存在する場合)が解消されるように変換されます。
4. 並列化の最終段階は、並列コードの生成です。このコードは、機能的には元の逐次コードと似ていますが、実行時に複数のスレッドまたはプロセスを作成する構造またはコードセクションが追加されています。
自動並列化に関するメイン記事も参照してください。
これは、スキャナが入力ソースファイルを読み込み、すべての静的および外部使用箇所を識別する最初の段階です。ファイル内の各行は、定義済みのパターンと照合され、トークンに分割されます。これらのトークンはファイルに保存され、後で文法エンジンによって使用されます。文法エンジンは、定義済みのルールに一致するトークンのパターンをチェックし、コード内の変数、ループ、制御文、関数などを識別します。
アナライザーは、並行して実行可能なコードセクションを特定するために使用されます。アナライザーは、スキャナ・パーサによって提供される静的データ情報を使用します。アナライザーはまず、互いに独立したすべての関数を見つけ出し、それらを個別のタスクとしてマークします。次に、アナライザーは依存関係のあるタスクを特定します。
スケジューラは、すべてのタスクとその実行時刻および開始時刻に関する相互依存関係を一覧表示します。スケジューラは、使用するプロセッサ数またはアプリケーションの総実行時間に関して最適なスケジュールを作成します。
スケジューラは、すべてのタスクのリストと、それらが実行されるコアの詳細、および実行時間を生成します。コードジェネレータは、スケジューラが実行時に読み取る特殊な構造をコードに挿入します。これらの構造は、特定のタスクがどのコアで実行されるか、および開始時刻と終了時刻をスケジューラに指示します。
Fortran、C、C++、その他多くの言語には、自動並列化ツールが多数存在する。
YUCCAは、 KPIT Technologies Ltd.(プネ)が開発した、逐次処理から並列処理への自動コード変換ツールです。入力として、複数のソースファイルとヘッダーファイルを含むC言語のソースコードを受け取ります。出力は、POSIXスレッド(pthreads)関数とOpenMP構造を用いた、変換されたマルチスレッド並列コードです。YUCCAツールは、タスクレベルおよびループレベルの並列化に対応しています。
Par4Allは、C言語およびFortran言語の逐次プログラム向けに、並列化と最適化を自動的に行うコンパイラ(ワークベンチ)です。このソースコード変換コンパイラは、既存のアプリケーションをマルチコアシステム、高性能コンピュータ、GPUなどの様々なハードウェア環境に適合させます。新しいソースコードを生成するため、アプリケーションの元のソースコードは変更する必要がありません。
Cetusは、C言語で書かれたソフトウェアプログラムのソースコード変換を行うためのコンパイラインフラストラクチャです。このプロジェクトはパデュー大学によって開発されました。CetusはJavaで記述されています。自動並列化ツールやコンパイラを作成するための基本的なインフラストラクチャを提供します。実装されている基本的な並列化手法は、プライベート化、縮約変数認識、および誘導変数置換です。
2013年2月に新しいグラフィカルユーザーインターフェース(GUI)が追加されました。2013年5月には、計算の高速化とグラフ表示機能が追加されました。2013年5月には、クライアント/サーバーモデルのCetusリモートサーバーが追加され、ユーザーはサーバー経由でCコードを変換できるようになりました。これは、CetusがLinux以外のプラットフォームで動作する場合に非常に便利です。2013年5月には、実験的なHubzero版Cetusが実装され、Webブラウザ経由でもCetusを実行できるようになりました。
Pluto(PLUTOと表記されることもある)は、多面体モデルに基づいた自動並列化ツールです。このモデルは、コンパイラ最適化において、ループネストの最適化やループの並列化といった高レベルの変換を容易に実行できるプログラムの表現形式です。Plutoは、粗粒度並列性とデータ局所性を同時に実現するために、Cプログラムをソースコードからソースコードへと変換します。コアとなる変換フレームワークは、主に効率的なタイリングと融合のためのアフィン変換を見つけることで機能しますが、これらに限定されるものではありません。連続するCプログラムセクションから、マルチコア向けのOpenMP並列コードを自動的に生成できます。
Polarisコンパイラは、Fortran 77プログラムを入力として受け取り、並列コンピュータ上で効率的に実行できるようにプログラムを変換し、複数の並列Fortran方言のいずれかでこのプログラムバージョンを出力します。Polarisは、複数のコンパイルパスで変換を実行します。Polarisには、よく知られている多くのパスに加えて、配列のプライベート化、データ依存性テスト、誘導変数認識、プロシージャ間解析、記号プログラム解析などの高度な機能が含まれています。
Intel C++ コンパイラの自動並列化機能は、入力プログラムの逐次処理部分を意味的に同等のマルチスレッドコードに自動的に変換します。自動並列化機能は、作業共有に適したループを特定し、データフロー解析を実行して正しい並列実行を検証し、 OpenMPディレクティブを使用したプログラミングで必要となるように、スレッドコード生成のためにデータを分割します。OpenMPと自動並列化アプリケーションは、マルチプロセッサシステムにおける共有メモリによるパフォーマンス向上を実現します。
Intel Advisor 2017は、ベクトル化最適化およびスレッドプロトタイピングツールです。並列処理箇所の検索、ベクトル化およびスレッド化対象ループのマーク付け、マークされたループの依存関係およびメモリアクセスパターンのチェック、ベクトル化およびスレッド化のためのプラグマの挿入など、複数のステップをワークフローに統合しています。
AutoParは、入力されたシリアルC/C++コードにOpenMPプラグマを自動的に挿入できるツールです。入力プログラムにOpenMPディレクティブが既に含まれている場合、適切なオプションが有効になっていると、ツールは正当性を二重にチェックします。従来のツールと比較して、AutoParはユーザーの知識(セマンティクス)を取り込むことで、より多くの並列化の機会を発見できます。
このツールは、逐次プログラムの OpenMP 並列化に必要な支援をユーザーに提供します。このツールは、Emacs エディタ上の関数セットとして実装されています。プログラムの並列化に関連するすべてのアクティビティ、例えば、プログラムの対象部分の選択、支援コマンドの呼び出し、ツールによって表示される支援情報に基づくプログラムの変更などは、ソース プログラム エディタ環境で処理できます。[ 2 ]
Vienna Fortran Compilerは、 High Performance Fortran (HPF+、最適化されたHPFバージョン)向けの新しいソース間並列化システムであり、不規則なアプリケーションのニーズに対応します。
SUIF(Stanford University Intermediate Format)は、コンパイラの最適化と並列化に関する共同研究を支援するために設計された無料のインフラストラクチャです。SUIFは、FortranとCの両方を入力言語として受け取るフル機能のコンパイラです。並列化されたコードは、さまざまなアーキテクチャ上のネイティブCコンパイラでコンパイルできる、単一プログラム、複数データ(SPMD)の並列Cバージョンとして出力されます。[ 3 ]
Omni OpenMPコンパイラは、OpenMPプラグマを含むCおよびFortranプログラムを、Omni OpenMPランタイムライブラリにリンクされたネイティブコンパイラでコンパイル可能なCコードに変換します。また、forループの並列化も行います。
Timing-Architects Optimizerは、シミュレーションベースのアプローチを用いて、マルチコアへのタスク割り当てとタスク並列化を改善します。シミュレーションベースのパフォーマンスとリアルタイム分析により、さまざまなタスク割り当て方式を相互にベンチマークします。依存関係やプロセッサプラットフォーム固有の影響も考慮されます。TA Optimizerは、組み込みシステムエンジニアリングで使用されています。
TRACOは、反復空間スライシングとフリースケジュールフレームワークを使用します。コアは、プレスバーガー算術と推移閉包演算に基づいています。ループの依存関係は関係で表現されます。TRACOは、Omega Calculator、CLOOGおよびISLライブラリ、およびPetit依存性アナライザーを使用します。コンパイラは、C/C++アプリケーションに対して、細粒度および粗粒度の並列処理でより優れた局所性を抽出します。このツールは、西ポメラニア工科大学のチーム(Bielecki、Palkowski、Klimek、その他の著者)によって開発されました。http ://traco.sourceforge.net
SequenceLは、汎用的な関数型プログラミング言語および自動並列化ツールセットであり、主な設計目標は、マルチコアプロセッサハードウェア上でのパフォーマンス、プログラミングの容易さ、プラットフォームの移植性/最適化、そしてコードの明瞭性と可読性です。その最大の利点は、プログラマが並列処理の特定、ベクトル化の指定、競合状態の回避、OpenMPなどの手動ディレクティブベースのプログラミング手法に伴うその他の課題を考慮する必要なく、利用可能なすべての処理能力を自動的に活用する簡潔なコードを記述できることです。
SequenceLで記述されたプログラムは、プログラマーが並列化の方法や対象を明示的に指定することなく、並列実行されるマルチスレッドコードにコンパイルできます。2015年現在、SequenceLコンパイラはC++とOpenCLで並列コードを生成し、C、C++、C#、Fortran、Java、Pythonなど、主要なプログラミング言語のほとんどに対応しています。プラットフォーム固有のランタイムがスレッドを安全に管理し、利用可能なコア数に応じて自動的に並列パフォーマンスを提供します。
OMP2MPI [ 4 ] OpenMPからMPIソースコードを自動的に生成します。これにより、プログラムがクラスタやネットワークオンチップ (NoC) ベースのマルチプロセッサシステムオンチップ (MPSoC) などの非共有メモリアーキテクチャを活用できるようになります。OMP2MPI は、より良い結果を達成したい専門家によるさらなる最適化を可能にするソリューションを提供します。
OMP2HMPP [ 5 ]は、高レベルの C ソースコード ( OpenMP ) を HMPP に自動的に変換するツールです。生成されたバージョンは、手作業でコーディングされた HMPP バージョンとほとんど違いがなく、約 113% の大幅な高速化を実現し、手作業でコーディングされたCUDAによって後でさらに改善することができます。
emmtrix Parallel Studioは、emmtrix Technologies GmbHが開発した、ソースコードからソースコードへの並列化ツールであり、対話型GUIを備えています。C、MATLAB、Simulink、Scilab 、またはXcosのソースコードを入力として受け取り、並列Cコードを生成します。並列プログラムには、静的スケジュールとメッセージパッシングAPI (アプリケーションプログラミングインターフェース)を使用します。並列化プロセス全体は対話型GUIで制御および視覚化され、エンドユーザーが並列化の決定を行うことができます。GPUおよびFPGA(フィールドプログラマブルゲートアレイ)アクセラレータと組み合わせた組み込みマルチコアアーキテクチャを対象としています。
CLAWコンパイラは、CLAWプラグマを含むFortranプログラムを、OpenMPまたはOpenACCプラグマで拡張された特定のスーパーコンピュータターゲットに適したFortranコードに変換します。