LLORは、C/C++およびFortranで記述されたOpenMPプログラムのデータ競合エラーを修正するためのツールである。LLORは、並列領域へのバリアの配置や、並列forループ内のordered領域への文の配置を提案することで、データ競合エラーを修正する。また、プログラムの正当性を維持しながら、既存のバリアやordered領域の削除を試みる。LLORは、LLVMコンパイラインフラストラクチャ上に構築された静的データ競合検出ツールであるLLOVを活用している。
LLORのアーキテクチャは、計測器と修復の2つのコンポーネントで構成されている。計測器コンポーネントは、並列領域の場合にバリアの可能な位置を示すメタデータをプログラムに追加する。並列forループの場合、このメタデータは、ordered領域の一部でなければならない可能性のある文をマークする。修復コンポーネントは、修復候補を使用してLLOVを呼び出し、プログラムにエラーがないかどうかをチェックする反復的なアプローチを取る。LLOVがデータ競合を特定した場合、後続の反復でそれらを回避するために、これらのエラーから制約が生成される。これらの制約を使用してソルバーが呼び出され、次の修復候補を生成する際に、どの同期構造を有効または無効にするかを決定するソリューションが得られる。
LLORは、エラーのない修復候補を見つけることができれば、修復されたプログラムのLLVM中間表現(LLVM IR)とサマリーファイルを生成する。サマリーファイルには、プログラムを修復するために必要な変更と、元のC/C++またはFortran入力プログラムのソースコードの位置の詳細が含まれている。
LLORは、データ競合エラーのみを修正しようとするため、並列領域に新しいバリアを追加するか、並列forループ内の命令のサブセットに対してordered領域を作成することで解決策を提案する。また、不要なバリアやordered領域を削除しようと試みる。データ競合は、複数のスレッドが同じ共有変数に同時にアクセスし、それらのアクセスの少なくとも1つが書き込みである場合にのみ発生する可能性がある。これを考慮して、計測器コンポーネントは、共有変数を読み書きしているすべての命令を識別する。
これらの命令が並列領域にある場合、LLORは、これらの命令の前にバリアを挿入することにより、可能な修復候補を生成する。これらの命令が並列forループ内にある場合、LLORは、ordered領域内に配置する必要がある命令の最小のサブセットを選択することにより、可能な修復候補を生成する。プログラム内の既存のバリアやordered領域は、実際にプログラムの正当性に必要かどうかを確認するために削除される。この手法を用いることで、共有変数を扱う命令の数は、通常、プログラム内の命令の総数よりもはるかに少ないため、修復候補の探索空間を大幅に削減することができる。
LLORは、OpenMP APIを使用して記述されたC/C++およびFortranプログラムのデータ競合エラーを修正できる唯一のツールである。
他の言語に翻訳
原文コンテンツから
arxiv.org
深掘り質問