(57)【要約】【課題】プログラム・ループの並列実行を可能にする、ソース・コード内の代入ステートメントのリダクション変数を検出する方法、システム、およびプログラム製品を提供すること。【解決手段】本明細書に記載の本発明を使用して理解されるリダクション変数は、各変数のそれぞれの結合演算子に関する情報と共に、それぞれのループにタグ付けし、リダクション演算を並列化するためのコンパイラ・ディレクティブを介して、コンパイラに渡すことができる。【選択図】図４
2004288163.tif 000002
【特許請求の範囲】
【請求項１】
実行並列化を可能にするためにソース・コード・プログラム・ループ内のリダクション変数を検出する方法であって、
ａ．前記ソース・コード・プログラム・ループの各代入ステートメントの右辺（ＲＨＳ）の式を正規形に再計算するステップと、
ｂ．前記代入ステートメントごとにその対応する左辺（ＬＨＳ）変数を決定し、再計算された式の係数として前記ＬＨＳ変数の検索を可能にするために前記ＬＨＳ変数に関する対応する変数検索列を作成するステップと、
ｃ．再計算された式の係数として前記ＬＨＳ変数の逆数の検索を可能にするために、前記ＬＨＳ変数の前記逆数に関する対応する逆数変数検索列を作成するステップと、
ｄ．前記ＬＨＳ変数に対応する変数検索列について各前記代入ステートメントの前記再計算されたＲＨＳ式内を検索するステップと、
ｅ．前記ＬＨＳ変数の逆数に対応する前記逆数変数検索列について各前記代入ステートメントの前記再計算されたＲＨＳ式内を検索するステップと、
ｆ．所定の条件に基づいて前記ＬＨＳ変数への参照およびその対応する前記代入ステートメントへの参照をリダクション・テーブルに挿入するステップと、
ｇ．所定の条件に基づいて前記ＬＨＳ変数への参照およびその対応する前記代入ステートメントへの参照を前記リダクション・テーブルから削除するステップと、
ｈ．前記リダクション・テーブル内で参照される代入ステートメントごとに、それに対応する結合演算子および結合オペランドを決定するステップと
を含む方法。
【請求項２】
ステップ（ａ）の前記正規形での前記式再計算が、すべての括弧を除去された展開された形で表され、
前記再計算された式は、各除算演算を、関連する変数または定数の逆数に適用される乗算演算によって置き換え、
前記再計算された式は、各定数を、浮動小数点フォーマットを使用する一定の長さの文字列として表し、
前記再計算された式は、各項が単項「＋」演算子または単項「−」演算子から始まり、定数オペランドが続き、変数オペランドがあればそれが続き項内の２つのオペランドの間に乗算演算子があり、項自体を、所与の変数オペランドの項についてそれ以上単純化することができず、
前記再計算された式は、すべての変数オペランドを、非降順ＡＳＣＩＩ値の順序で左から右にソートされたシーケンスで項内に現し、
前記再計算された式は、互いに定数オペランドだけが異なるすべての項を、単一の項に合併し、
前記再計算された式は、すべての項を、事前定義のソートされたシーケンスで右から左に式に現す
請求項１に記載の方法。
【請求項３】
恒等式を表す代入ステートメントが、前記ソース・コード・プログラム・ループから除去される、請求項１に記載の方法。
【請求項４】
前記代入ステートメントのＲＨＳが、単一の項だけを含み、その項が、前記代入ステートメントの対応するＬＨＳ変数に対応する前記変数検索列の１つのインスタンスだけを含み、前記代入ステートメントが恒等式でない時に、前記代入ステートメントへの参照および前記対応するＬＨＳ変数への参照が、前記リダクション・テーブルに挿入される、請求項１に記載の方法。
【請求項５】
前記代入ステートメントのＲＨＳが、複数の項を含み、前記項の１つだけが、前記代入ステートメントの対応するＬＨＳ変数に対応する前記変数検索列の１つのインスタンスだけを含み、その項が、プラス算術演算子が先行するＬＨＳ変数だけを含む時に、前記代入ステートメントへの参照および前記対応するＬＨＳ変数への参照が、前記リダクション・テーブルに挿入される、請求項１に記載の方法。
【請求項６】
前記代入ステートメントのＲＨＳが、複数の項を含み、前記項のそれぞれが、前記代入ステートメントの対応するＬＨＳ変数に対応する前記変数検索列の１つのインスタンスだけを含む時に、前記代入ステートメントへの参照および前記対応するＬＨＳ変数への参照が、前記リダクション・テーブルに挿入される、請求項１に記載の方法。
【請求項７】
前記ＬＨＳ変数に対応する前記変数検索列が、前記ループの本体内で前記リダクション・テーブルにリストされた前記ＬＨＳ変数の対応する代入ステートメント以外の代入ステートメントのＲＨＳに現れた時に、前記ＬＨＳ変数へのすべての参照および前記対応する代入ステートメントが前記リダクション・テーブルから削除される、請求項１に記載の方法。
【請求項８】
前記ＬＨＳ変数の前記逆数に対応する前記逆数変数検索列が、前記ループの本体内の代入ステートメントに現れた時に、前記ＬＨＳ変数へのすべての参照およびその対応する代入ステートメントへのすべての参照が、前記リダクション・テーブルから削除される、請求項１に記載の方法。
【請求項９】
前記代入ステートメントのＲＨＳが、１つの項だけを含み、その項が、前記代入ステートメントのＬＨＳ変数に対応する前記変数検索列の１つのインスタンスだけを含む時に、前記リダクション・テーブルにリストされる前記代入ステートメントの前記結合演算子が、算術乗算演算子（＊）である、請求項１に記載の方法。
【請求項１０】
前記結合オペランドが、前記ＬＨＳ変数によって除算された前記項である、請求項９に記載の方法。
【請求項１１】
前記代入ステートメントのＲＨＳが、複数の項を含み、前記項の１つだけが、前記代入ステートメントのＬＨＳ変数に対応する前記変数検索列を含み、この項が、前記算術プラス演算子が先行するＬＨＳ変数だけを含む時に、前記リダクション・テーブルにリストされる前記代入ステートメントの前記結合演算子が、算術プラス演算子（＋）である、請求項１に記載の方法。
【請求項１２】
前記結合オペランドが、括弧の対によって囲まれたすべての残りの項の集合である、請求項１１に記載の方法。
【請求項１３】
前記代入ステートメントのＲＨＳが、複数の項を含み、前記項のそれぞれが、前記代入ステートメントのＬＨＳ変数に対応する前記変数検索列の１つのインスタンスだけを含む時に、前記リダクション・テーブルにリストされる前記代入ステートメントの前記結合演算子が、算術乗算演算子（＊）である、請求項１に記載の方法。
【請求項１４】
前記結合演算子が、項のそれぞれから前記ＬＨＳ変数が除算された、すべての項の集合である、請求項１３に記載の方法。
【請求項１５】
共通の結合演算子を共用しない、前記リダクション・テーブルにリストされた複数のインスタンスを有するリダクション変数への参照が、前記テーブルから削除される、請求項１に記載の方法。
【請求項１６】
実行並列化を可能にするためにソース・コード・プログラム・ループ内のリダクション変数を検出するシステムであって、
少なくとも１つの中央処理装置と、
少なくとも１つのシステム・バスと、
前記システム・バスに接続された少なくとも１つの通信ユニットと、
前記システム・バスに接続された少なくとも１つのメモリ・ユニットであって、
前記ソース・コード・プログラム・ループの各代入ステートメントの右辺（ＲＨＳ）の式を正規形に再計算する再計算手段と、
代入ステートメントの左辺（ＬＨＳ）の前記変数を決定する手段と、
再計算された式の係数としてＬＨＳ変数の検索を可能にするために、代入ステートメントの前記ＬＨＳ変数に関する対応する変数検索列を作成する検索列作成手段と、
再計算された式の係数として前記ＬＨＳ変数の逆数の検索を可能にするために、前記代入ステートメントのＬＨＳ変数の前記逆数に関する対応する逆数変数検索列を作成する検索列作成手段と、
前記代入ステートメントのＲＨＳ内で前記代入ステートメントのＬＨＳ変数に対応する前記変数検索列を検出する列検索手段と、
前記代入ステートメントのＲＨＳ内で前記代入ステートメントのＬＨＳ変数の逆数に対応する前記逆数変数検索列を検出する列検索手段と、
所定の条件に基づいて、潜在的なリダクション変数への参照およびその対応する代入ステートメントへの参照を保存するリダクション・テーブルを作成するリダクション・テーブル作成手段と、
前記潜在的なリダクション変数を検出する検出手段と、
前記潜在的なリダクション変数への参照およびその対応する代入ステートメントへの参照を前記リダクション・テーブルに保存する保存手段と、
所定の条件に基づいて、前記代入ステートメントのＬＨＳ変数への参照およびその対応する代入ステートメントへの参照を前記リダクション・テーブルから除去する削除手段と、
前記リダクション・テーブルにリストされた各代入ステートメントの結合演算子を確認する結合演算子決定手段と、
前記リダクション・テーブルにリストされた各代入ステートメントの結合オペランドを確認する結合オペランンド決定手段と
を含む少なくとも１つのメモリ・ユニットと
を含むシステム。
【請求項１７】
実行並列化を可能にするためにソース・コード・プログラム・ループ内のリダクション変数を検出するためにその中で実施される、コンピュータ可読記憶媒体に保管されたコンピュータ可読プログラム・コードを含むコンピュータ・プログラム製品であって、
前記ソース・コード・プログラム・ループの各代入ステートメントの右辺（ＲＨＳ）の式を正規形に再計算するように構成されたコンピュータ可読プログラム・コード手段と、
前記代入ステートメントの左辺（ＬＨＳ）の変数を決定し、前記ＬＨＳ変数に対応する変数検索列および逆数変数検索列を作成するように構成されたコンピュータ可読プログラム・コード手段と、
前記代入ステートメントのＲＨＳ内でＬＨＳ変数に対応する前記変数検索列を検索するように構成されたコンピュータ可読プログラム・コード手段と、
前記代入ステートメントのＲＨＳ内でＬＨＳ変数に対応する前記逆数変数検索列を検索するように構成されたコンピュータ可読プログラム・コード手段と、
所定の条件に基づいて、潜在的なリダクション変数として識別される前記ＬＨＳ変数への参照およびその対応する前記代入ステートメントへの参照を保存するリダクション・テーブルを作成するように構成されたコンピュータ可読プログラム・コード手段と、
潜在的なリダクション変数を検出するように構成されたコンピュータ可読プログラム・コード手段と、
前記潜在的なリダクション変数への参照およびその対応する前記代入ステートメントへの参照を前記リダクション・テーブルに保存するように構成されたコンピュータ可読プログラム・コード手段と、
所定の条件に基づいて、前記リダクション変数への参照およびその対応する前記代入ステートメントへの参照を前記リダクション・テーブルから削除するように構成されたコンピュータ可読プログラム・コード手段と、
前記リダクション・テーブルにリストされた各代入ステートメントの結合演算子を決定するように構成されたコンピュータ可読プログラム・コード手段と、
前記リダクション・テーブルにリストされた各代入ステートメントの結合オペランドを決定するように構成されたコンピュータ可読プログラム・コード手段と
を含む、コンピュータ・プログラム製品。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム・ループの並列実行を可能にするための、ソース・コード内の代入ステートメント内のリダクション変数（reduction variable）の検出に関する。
【背景技術】
【０００２】
コンピュータ・プログラム内のループは、ループからの出力が、異なる反復からのデータ・アクセスの実行順序に一切依存しない場合に、完全に並列に実行することができる。コンパイラ製作者は、しばしば、そのようなループをドゥーオール（doall）・ループと称する。しかし、ループが、ドゥーオール・ループでない場合に、反復を複数のグループに配置し、実行を完了したグループと次に実行が開始されるグループとの間である種の同期化条件が満たされるならば、各グループの反復を完全に並列の形で実行することができる。部分的に並列化できるループの極端な例が、グループの数が反復の回数と正確に同一である完全に順次式のループである。
【０００３】
ループが、完全に並列化可能であるか否かは、ループ本体のステートメントの間のデータ依存関係を分析することによって判定することができる。同一のメモリ位置にアクセスする２つのステートメント間の依存性には、フロー（書込とその後の読取）、アンチ（anti、読取とその後の書込）、および出力（書込とその後の書込）という３つの可能なタイプがある。最も単純な状況が発生するのは、フロー、アンチ、および出力依存性が存在しない時であり、この場合には、ループのすべての反復が独立であり、並列に実行することができる。
【０００４】
フロー依存性：下のコード断片を考えてみる。
do i = 1, n
A(k(i)) = A(k(i)) + A(k(i - 1))
if (A(k(i)) .eq. .true.) then
...... ... ... ... ...
endif
enddo
フロー依存性は、ループの異なる反復のアクセスの間に存在するので、そのセマンティックスは、ループがドゥーオール・ループとして実行される場合には保証できない。たとえば、上のコード断片では、２≦ｉ≦ｎであるものとして、反復ｉ＋１が、反復ｉで作られる値を必要とするので、反復番号の順序で反復を実行しなければならない。
【０００５】
フロー依存性なしのアンチ依存性または出力依存性：この場合には、ループを並列に実行できるようになる前に、ループを修正して、これらの依存性を除去しなければならない。残念ながら、すべての状況を効率的に処理することはできない。しかし、２つの重要な変換すなわち、（１）プライベート化（privatization）および（２）リダクション並列化をループに適用することができる。
【０００６】
プライベート化によって、可能な時には必ず、ループを実行する参加プロセッサごとに、アンチ依存性または出力依存性を生じるプログラム変数のプライベート・コピーを作成することによって、あるタイプのアンチ依存性および出力依存性を除去することができる。下の例に、プライベート化によって並列に実行できるループを示す。
do i = 1, n/2
S1: tmp = A(2*i)
A(2*i) = A(2*i - 1)
S2: A(2*i - 1) = tmp
enddo
反復ｉのステートメントＳ１と反復ｉ＋１のステートメントＳ２の間のアンチ依存性（１≦ｉ＜ｎ／２）を、一時変数ｔｍｐをプライベート化することによって除去することができる。
【０００７】
リダクション並列化では、リダクション変数が、その値が
【０００８】
【数１】
2004288163.tif 000003
の形の結合演算で使用される変数として定義され、ここで、
【０００９】
【数２】
2004288163.tif 000004
は、結合演算子であり、ｘは、ｅｘｐｒｎまたはループの他の場所に現れない。オペランドｅｘｐｒｎを、結合オペランドと称する。その性質によって、リダクション変数は、特定のパターンでアクセスされる。リダクションの単純で頻繁に現れる例を、次の例のステートメントＳ１によって示す。
do i = 1, n
do j = 1, m
S1:A(j) = A(j) + exprn
enddo
enddo
ここで、演算子
【００１０】
【数３】
2004288163.tif 000005
は、この例では＋演算子である。配列Ａ（）のアクセス・パターンは、読取、修正、書込であり、このループによって実行される機能は、各反復で計算される値を、Ａ（）に保管される値に加算することである。この形のリダクションを、しばしば、更新と呼ぶ。
【００１１】
リダクション並列化は、２ステップを必要とするすなわち、リダクション変数の認識およびリダクション演算の並列化である。
【００１２】
並列化は、ある範囲までは実行時に実行することができるが、可能な時には必ず、コンパイル時に並列化を実行することが好ましい。というのは、それによって、並列化の利益を少なくする可能性がある実行時オーバーヘッドが最小になるからである。実行時並列化の技法は、エル・ロイヒベルガ（Rauchwerger, L.）、「実行時並列化：その時が来た（Run-Time Parallelization: It's TimeHas Come）」、並列計算会報（Journal of Parallel Computing）、言語およびコンパイラ特集号（Special Issue onLanguage and Compilers）、第２４巻、第３号および４号、１９９８年、５２７ページから５５６ページに記載されている。
【００１３】
コンパイラが直面する、リダクション並列化の困難な部分が、リダクション・ステートメントの認識である。これまでは、この問題は、ループ・ステートメントを包括的なリダクションのテンプレートと構文的にパターン・マッチングし、その後、ループ内でリダクション・ステートメント以外のどこにも現れないことが保証される状況の下で変数のデータ依存性分析を実行することによって、コンパイル時に、制限付きで処理されてきた。この方法は、テンプレートより多数のパターンがあるので、不適切である。
【００１４】
米国特許第５４８１７２３号に、入れ子になったｄｏループという特定の場合に関するコンパイル時並列化を可能にするシステムおよび方法が記載されている。しかし、これは、入れ子になっていないループに適さない。
【００１５】
本発明によって、コンパイルの前の前処理としてソース・コード内のリダクション変数を検出する新規の方法が説明される。この処理は、米国特許出願第２００１／０００３２１１  Ａ１号に記載の方法による、ソース・コード式の再計算を必要とする。
【００１６】
完全を期して、スケーラブルな形でのリダクション方法の並列化は、リダクション変数が、変換されたドゥーオールでプライベート化されること、および、リダクション演算の最終結果が、ドゥーオールに続くプロセッサ内リダクション・フェーズで計算されることすなわち、プロセッサにまたがるリダクション演算（同一の演算子を有する）のオペランドとして、スカラが、各プロセッサで計算される部分結果を使用して作られることを必要とすることに留意されたい。リダクション演算が可換である場合には、クロスプロセッサ・マージ・フェーズを任意の順序で行うことができるが、そうでない場合には、マージ・フェーズを、秩序だった形で行わなければならない。
【特許文献１】米国特許第５４８１７２３号
【特許文献２】米国特許出願第２００１／０００３２１１  Ａ１号
【非特許文献１】エル・ロイヒベルガ（Rauchwerger, L.）、「実行時並列化：その時が来た（Run-TimeParallelization: It's Time Has Come）」、並列計算会報（Journal of Parallel Computing）、言語およびコンパイラ特集号（SpecialIssue on Language and Compilers）、第２４巻、第３号および４号、１９９８年、５２７ページから５５６ページ
【発明の開示】
【発明が解決しようとする課題】
【００１７】
本発明の目的は、テンプレート・マッチングを使用せず、コンパイルを行う前に、プログラム・ループ並列化を容易にするためにソース・コード・レベルでリダクション変数を検出することである。
【００１８】
この目的を達成するために、本発明では、コンパイラによって作成される中間構造ではなくソース・コードに適用される、ループ内のリダクション変数を検出する方法、システム、およびコンピュータ・プログラム製品を説明する。
【課題を解決するための手段】
【００１９】
前述の方法の第１ステップとして、ループ本体の各代入ステートメントの右辺（ＲＨＳ）を、正規形に再計算する。再計算される代入ステートメントごとに、左辺（ＬＨＳ）の変数を決定し、それに対応する検索列を作成する。ループ本体の各再計算される代入ステートメントのＲＨＳを、その対応する検索列についてスキャンし、ある所定の条件が満たされることに基づいて、潜在的リダクション・テーブルに取り込む。潜在的リダクション・テーブルには、潜在的なリダクション変数への参照とそれに対応する代入ステートメントへの参照が含まれる。リダクション・テーブルを完成した後に、所定の条件に基づいて無効であることがわかった潜在的なリダクション変数に関連するすべての項目が、テーブルから削除される。その後、リダクション・テーブルの残りの代入ステートメントのそれぞれの結合演算子を決定する。リダクション・テーブルについて、もう１つの所定の条件に基づいて無効であることがわかった項目を再度切りつめる。リダクション・テーブルに残っている潜在的なリダクション変数が、所望のリダクション変数である。
【００２０】
本発明の方法を実施する時に、ループ本体を単純ブロックとして扱うことができる、すなわち、ループ本体に、分岐がなく、分岐ターゲットまたはラベルがない、０個以上の命令のシーケンスが含まれると仮定する。各単純ブロックは、ステートメントの線形シーケンス、単一のステートメント、または個別の命令に対応する可能性がある。単純ブロックでは、すべてのステートメントまたは演算が実行される（例外を除いて）。ループ本体の代入ステートメントに関数呼出しが含まれる場合には、ステートメント内の関数呼出しのうちで、呼び出される関数が関数呼出しのパラメータ・リストに現れるＬＨＳ変数を有するものだけが、インライン展開される。関数のインライン展開の処理の後に、ループ本体が単純ブロックでなくなる場合には、本発明の方法を適用することはできない。
【００２１】
これから、添付図面に関して本発明を説明する。
【発明を実施するための最良の形態】
【００２２】
図１、２、および３からわかるように、ループの各代入ステートメントの式を、正規形に再計算（１．１）して、下で指定されるフォーマットに従って、ある文字列検索動作を容易にする。式は、
・すべての括弧を除去して展開された形で表され、
・関連する変数または定数の逆数に適用される乗算演算によって除算演算のそれぞれを置換し、
・定数６２．１７０２を「．６２１７０２ｅ＋０２」と表すなど、定数を、浮動小数点フォーマットを使用する一定の長さの文字列として表し、
・各項が、単項の「＋」または「−」演算子から始まり、定数オペランドがそれに続き、変数オペランドがあればそれが続き、ある項の２つのオペランドの間は、乗算演算子であり、項自体を所与の変数オペランドに関してそれ以上単純化できず、
・すべての変数オペランドが、ＡＳＣＩＩ値の非降順で左から右にソートされたシーケンスである項に現れ、
・互いに定数オペランドだけが異なるすべての項が、単一の項に合併され、
・すべての項が、左から右へ事前定義のソートされたシーケンスで式に現れる。
【００２３】
このアルゴリズムの第１フェーズでは、代入ステートメントごとに、代入ステートメントの左辺（ＬＨＳ）の変数「ｖ」を決定し、それに関する、それぞれ変数検索列および逆数変数検索列と称する文字列「＊ｖ」および「＊ｖ＿」を作成する（１．２）。検索列では、「＊」が、乗算演算子を表し、「ｖ」が、変数オペランドを表し、「ｖ＿」が、変数「ｖ」の逆数を示す。その後、ステートメントの右辺（ＲＨＳ）に対する、検索列「＊ｖ」に関する検索を実行する（１．３）。代入ステートメントのＲＨＳを検査して（１．４）、ＲＨＳに１つの項だけが含まれ、その項が「＋ｖ」と同等であるかどうかを判定する。そうである場合には、このステートメントは恒等式なので、代入ステートメントをループ本体から削除する（１．５）。列「＊ｖ」の検索が、「ｖ」が現れる項の係数としての「ｖ」の検索を意味することに留意されたい。
【００２４】
さらに、次の条件
１．ＲＨＳに単一の項だけが含まれ（１．６）、その項に検索列「＊ｖ」の１つのインスタンスだけが含まれ、その項が「＋ｖ」と同等でないか、
２．ＲＨＳに複数の項が含まれ（１．７）、そのうちの１つの項だけに検索列「＊ｖ」の１つのインスタンスだけが含まれ、その項が「＋ｖ」と同等であるか、
３．ＲＨＳに複数の項が含まれ（１．８）、そのそれぞれに検索列「＊ｖ」の１つのインスタンスだけが含まれる
のどれかに出会う場合に、変数「ｖ」が、潜在的なリダクション変数であり、それに対応する代入ステートメントが、潜在的なリダクション・ステートメントである。潜在的なリダクション変数への参照および潜在的なリダクション・ステートメントへの参照を、リダクション・テーブルに挿入する（１．９）。上で言及した第１フェーズのステップを、ループのすべての代入ステートメントについて繰り返す（１．１０）。
【００２５】
その後、リダクション・テーブルを検査して、空であるか否かを判定する（１．１１）。リダクション・テーブルが空である場合には、このアルゴリズムの第１フェーズでリダクション変数が検出されなかったことが暗示され、検索処理が打ち切られる。しかし、この表が空でない場合には、検索処理が第２フェーズに進む。
【００２６】
このアルゴリズムの第２フェーズでは、リダクション・テーブルの変数「ｖ」ごとに、検索列「＊ｖ」についてループ本体全体を検索し（１．１２）、列「＊ｖ＿」（「ｖ＿」は「ｖ」の逆数である）についても検索し（１．１３）て、無効なリダクション変数をリダクション・テーブルから除去する。検索列「＊ｖ」が、潜在的なリダクション・テーブルでリンクされている代入ステートメント以外のステートメントに現れる場合（１．１２）に、そのリダクション・テーブル内の変数「ｖ」に関連するすべての項目が、削除される。さらに、列「＊ｖ＿」（１．１３）がループ本体のどこかに現れる場合には、この場合にもリダクション・テーブル内の変数「ｖ」のすべての項目が除去される。
【００２７】
リダクション・テーブルを、もう一度検査し（１．１４）、空であるとわかった場合には、このアルゴリズムが打ち切られ、リダイレクション変数がループ本体に見つからなかったことが示される。しかし、テーブルが空でない場合には、このアルゴリズムは、最終フェーズに進む。
【００２８】
このアルゴリズムの最終フェーズでは、リダクション・テーブル内の各潜在的リダクション・ステートメントの結合演算子を決定する（１．１５）。さらに、リダクション・テーブル内に複数のインスタンスを有し、共通の結合演算子を共用しない潜在的リダクション変数を（１．１６）テーブルから除去する（１．１７）。これによって、リダクション・テーブル内の項目の形でのリダクション変数の識別が完了する。リダクション・テーブルに残っている変数が、所望のリダクション変数である。
【００２９】
図４に、リダクション・テーブル内で参照されるリダクション・ステートメントの結合演算子を決定する方法を示す。リダクション・ステートメントでは、リダクション変数「ｖ」が、結局、
【００３０】
【数４】
2004288163.tif 000006
の形の結合演算子で値が使用される変数として定義され、ここで、
【００３１】
【数５】
2004288163.tif 000007
が、結合演算子であり、ｖは、結合オペランドｅｘｐｒｎに現れないことに留意されたい。行われるステップを下に示す。
１．ＲＨＳに、１つの項だけが含まれる（２．１）場合に、結合演算子
【００３２】
【数６】
2004288163.tif 000008
は、乗算演算子「＊」であり（２．２）、結合オペランドｅｘｐｒｎに、列「＊ｖ」を除去された項が含まれる。
２．ＲＨＳに、複数の項が含まれ（２．３）、そのうちの１つだけに変数検索列「＊ｖ」（この項は「＋ｖ」と等しい）場合には、結合演算子は、プラス記号「＋」（２．４）であり、結合オペランドｅｘｐｒｎに、括弧の対で囲まれた、すべての残りの項が含まれる。
３．ＲＨＳに、複数の項が含まれ（２．５）、そのそれぞれに変数検索列「＊ｖ」が含まれる場合には、結合演算子が、乗算演算子「＊」（２．６）であり、結合オペランドｅｘｐｒｎに、項のそれぞれから列「＊ｖ」を除去された、集合的に括弧の対で囲まれたすべての項が集合的に含まれる。
【００３３】
図５に、ループの実行での並列化を容易にするためにソース・コード・レベルでリダクション変数を検出することができるコンピューティング・システムを示す。コンピューティング・システム（３．１）は、システム・バス（３．２）の助けを借りて相互接続されたさまざまなサブシステムからなる。コンピューティング・システム（３．１）には、リダクション変数を検出する手段および並列化されるループを含むソース・コードが保管される記憶装置（３．５）が組み込まれる。ループに関するソース・コードは、入出力インターフェース（３．９）を介してコンピュータ・システムに接続された、キーボード（３．１０）、マウス（３．１１）、および他の入力装置を介して入力される。コンピューティング・システム（３．１）を、ネットワーク・インターフェース（３．８）を介してＬＡＮ、ＷＡＮ、またはインターネット（３．１２）などのさまざまなネットワークに接続することができる。
【００３４】
リダクション変数を検出する手段およびループを含むソース・コードは、システム・バス（３．２）を介してコンピューティング・システム（３．１）のメモリ（３．４）にロードされる。メモリ（３．４）によって、プロセッサ（３．３）によって実行される現在の命令が、その結果と共に保持される。プロセッサ（３．３）によって、再計算手段にエンコードされた命令が実行されて、ソース・コード・プログラム・ループの各代入ステートメントの右辺（ＲＨＳ）の式が、本明細書で前に説明した正規形に再計算される。その後、検索列作成手段によって、各再計算されたステートメントのＬＨＳの変数が決定され、この変数の対応する変数検索列が作成される。これに続いて、列検索手段によって、正規化された式のＲＨＳで変数検索列が検索される。
【００３５】
その後、リダクション・テーブル作成手段の命令が、実行されて、リダクション・テーブルが作成され、ある条件に基づいてソース・コード・ループ内の潜在的なリダクション変数が検出され、有効な潜在的なリダクション変数への参照およびそれに対応する代入ステートメントへの参照がリダクション・テーブルに挿入される。削除手段によって、所定の条件に基づいて、無効なリダクション変数が、リダクション・テーブルから除去される。最終ステップとして、プロセッサ（３．３）によって、結合演算子決定手段にエンコードされた命令が実行されて、リダクション・テーブルに残っているリダクション・ステートメントの結合演算子が確認される。これらの手段の実行に使用されるプロセッサ（３．３）は、ＰＣの場合のマイクロプロセッサ、専用半導体チップ、またはデジタル・コンピュータとして機能することができる他の装置とすることができる。
【００３６】
当業者なら、前述の手段がコンピューティング・システムでの動作の命令であることを理解するであろう。これらの手段は、コンピューティング・システムのハードウェア内に組み込まれた形で存在することができ、あるいは、さまざまなコンピュータ可読媒体で実施することができる。コンピュータ可読媒体は、特定の情報処理システムでの実際の使用のためにデコードされる、コーディングされたフォーマットの形をとることができる。本明細書の文脈でのコンピュータ・プログラム手段またはコンピュータ・プログラムは、情報処理機能を有するシステムに
ａ）任意の言語、コード、または表記への変換
ｂ）異なる材料形態での複製
の一方または両方を実行した後にまたは直接にのいずれかで、特定の機能を実行させることを意図された命令の組の、任意の言語、コード、または表記でのどのような表現をも意味する。
【００３７】
図５に示された例は、アーキテクチャ的制限を暗示するように意図されたものではなく、手段の組み込まれるコンピューティグ・システムの構成は、実施形態に応じて変更することができる。本明細書に記載の手段を実行するように適合されたあらゆる種類のコンピュータ・システムまたは他の装置を、本発明の実践に使用することができる。ハードウェアおよびソフトウェアの典型的な組み合わせは、ロードされ実行される時に本明細書に記載の手段を実行するようにコンピュータ・システムを制御するコンピュータ・プログラムを有する汎用コンピュータ・システムとすることができる。使用することができる組み込まれるコンピュータ・システムの他の例は、ＰＤＡ、ウェブ・キオスク、またはウェブ家電の形をとるほかに、ノートブック・コンピュータまたはハンド・ヘルド・コンピュータである。
【００３８】
例：
本発明を、下記の例に関して説明する。
例１
1: do i = 1, n
2:x = c*d
3:ai = ai + 2.0
4:bi = 2.0*bi + (c - d)*bi - bi
5:y = c*y + d*y - 3.0*y
6:z = 2*a + z - a - a
7:w = w*w / u
8:u = u / w
9: enddo
【００３９】
ループの各代入ステートメントの式を正規形に再計算した後に、下記が得られる。
1: do i = 1, n
2:x = +.100000e+01*c*d
3:ai = +.200000e+01 + .100000e+01*ai
4:bi = +.100000e+01*bi + .100000e+01*bi*c - .100000e+01*bi*d
5:y = +.100000e+01*c*y + .100000e+01*d*y - .300000e+01*y
6:z = +.100000e+01*z
7:w = +.100000e+01*u_*w*w
8:u = +.100000e+01*u*w_
9: enddo
【００４０】
アルゴリズムの第１フェーズを適用した後に、下記に注目した。
ｘは、右辺に現れないので、リダクション変数ではない。
ａｉは、１つの項だけに現れ、その項が「＋．１０００００ｅ＋０１＊ａｉ」なので、潜在的なリダクション変数である。
ｂｉは、すべての項に現れ、各項が「＊ｂｉ」の１つのインスタンスだけを有するので、潜在的なリダクション変数である。
ｙは、すべての項に現れ、各項が「＊ｙ」の１つのインスタンスだけを有するので、潜在的なリダクション変数である。
ｚは、右辺が、「＋  ．１０００００ｅ＋０１＊ｚ」である項だけを有するので（このステートメントが恒等式を表し、削除されることを示す）、リダクション変数ではない。
ｗは、右辺の唯一の項に「＊ｗ」の複数のインスタンスがあるので、リダクション変数ではない。
ｕは、右辺の１つの項だけが、「＊ｕ」の１つのインスタンスだけを有するので、潜在的なリダクション変数である。
【００４１】
【表１】
2004288163.tif 000009
【００４２】
アルゴリズムの第２フェーズを適用した後に、下記が得られる。
1: do i = 1, n
2:x = +.100000e+01*c*d
3:ai = +.200000e+01 + .100000e+01*ai
4:bi = +.100000e+01*bi + .100000e+01*bi*c -.100000e+01*bi*d
5:y = +.100000e+01*c*y + .100000e+01*d*y - .300000e+01*y
6:-- 削除された --
7:w = +.100000e+01*u_*w*w
8:u = +.100000e+01*u*w_
9: enddo
上記から、次のように結論することができる。
ｕは、ステートメント７に「ｕ＿」としても現れるので、もはやリダクション変数ではない。
【００４３】
【表２】
2004288163.tif 000010
【００４４】
アルゴリズムの最終フェーズの後に、下に示されているように、リダクション変数とその結合演算子のリストが得られる。
【００４５】
【表３】
2004288163.tif 000011
【００４６】
例２
1: do i = 1, n
2:y = c*y + d*y - 3.0*y
3:y = (e*f + g)*y
4:z = z + 2
5:z = z*a - b*z
6: enddo
ループの各代入ステートメントを正規形に再計算した後に、下記が得られる。
1: do i = 1, n
2:y = +.100000e+01*c*y + .100000e+01*d*y - .300000e+01*y
3:y = +.100000e+01*e*f*y + .100000e+01*g*y
4:z = +.200000e+01 + .100000e+01*z
5:z = +.100000e+01*a*z - .100000e+01*b*z
6: enddo
【００４７】
アルゴリズムの第１フェーズを適用した後に、下記に注目した。
ｙは、すべての項に現れ、各項がステートメント２の「＊ｙ」の１つのインスタンスだけを有するので、潜在的なリダクション変数である。
ｙは、すべての項に現れ、各項がステートメント３の「＊ｙ」の１つのインスタンスだけを有するので、潜在的なリダクション変数である。
ｚは、「＊ｚ」が１つの項だけに現れ、その項がステートメント４の「＋．１０００００ｅ＋０１＊ｚ」なので、潜在的なリダクション変数である。
ｚは、すべての項に現れ、各項がステートメント５の「＊ｚ」の１つのインスタンスだけを有するので、潜在的なリダクション変数である。
【００４８】
【表４】
2004288163.tif 000012
【００４９】
アルゴリズムの第２フェーズの後に、下記に注目した。
1: do i = 1, n
2:y = +.100000e+01*c*y + .100000e+01*d*y - .300000e+01*y
3:y = +.100000e+01*e*f*y + .100000e+01*g*y
4:z = +.100000e+01*z + .200000e+01
5:z = +.100000e+01*a*z - .100000e+01*b*z
6: enddo
上記から、リダクション・テーブル内の変更なしに、ｙおよびｚが潜在的なリダクション変数のままであることは明白である。
【００５０】
アルゴリズムの最終フェーズの後に、下記に注目した。
【００５１】
【表５】
2004288163.tif 000013
【００５２】
上記から、次のように結論した。
ｙは、ｙのすべてのインスタンスが、同一の結合演算子に関連付けられているので、リダクション変数として存続する。
ｚは、ｚの異なるインスタンスが、異なる結合演算子に関連付けられているので、リダクション変数ではなくなる。
【００５３】
したがって、結合演算子を含むリダクション・テーブルは、下記になる。
【００５４】
【表６】
2004288163.tif 000014
【００５５】
前述が、例示的なものにすぎず、網羅する、または制限するように意図されたものではなく、例としてのみ提示され、本発明の範囲内でさまざまな修正を行うことができることを、当業者には明らかであろう。
【００５６】
したがって、本発明は、開示のために選択された特定の例に制限されると考えるべきでなく、むしろ、本発明の許容可能な範囲から逸脱しないすべての変更および修正が含まれると考えるべきである。したがって、本発明は、本明細書に含まれる説明または図面によって制限されず、特許請求の範囲によってのみ制限される。
【００５７】
まとめとして、本発明の構成に関して以下の事項を開示する。
【００５８】
（１）実行並列化を可能にするためにソース・コード・プログラム・ループ内のリダクション変数を検出する方法であって、
ａ．前記ソース・コード・プログラム・ループの各代入ステートメントの右辺（ＲＨＳ）の式を正規形に再計算するステップと、
ｂ．前記代入ステートメントごとにその対応する左辺（ＬＨＳ）変数を決定し、再計算された式の係数として前記ＬＨＳ変数の検索を可能にするために前記ＬＨＳ変数に関する対応する変数検索列を作成するステップと、
ｃ．再計算された式の係数として前記ＬＨＳ変数の逆数の検索を可能にするために、前記ＬＨＳ変数の前記逆数に関する対応する逆数変数検索列を作成するステップと、
ｄ．前記ＬＨＳ変数に対応する変数検索列について各前記代入ステートメントの前記再計算されたＲＨＳ式内を検索するステップと、
ｅ．前記ＬＨＳ変数の逆数に対応する前記逆数変数検索列について各前記代入ステートメントの前記再計算されたＲＨＳ式内を検索するステップと、
ｆ．所定の条件に基づいて前記ＬＨＳ変数への参照およびその対応する前記代入ステートメントへの参照をリダクション・テーブルに挿入するステップと、
ｇ．所定の条件に基づいて前記ＬＨＳ変数への参照およびその対応する前記代入ステートメントへの参照を前記リダクション・テーブルから削除するステップと、
ｈ．前記リダクション・テーブル内で参照される代入ステートメントごとに、それに対応する結合演算子および結合オペランドを決定するステップと
を含む方法。
（２）ステップ（ａ）の前記正規形での前記式再計算が、すべての括弧を除去された展開された形で表され、
前記再計算された式は、各除算演算を、関連する変数または定数の逆数に適用される乗算演算によって置き換え、
前記再計算された式は、各定数を、浮動小数点フォーマットを使用する一定の長さの文字列として表し、
前記再計算された式は、各項が単項「＋」演算子または単項「−」演算子から始まり、定数オペランドが続き、変数オペランドがあればそれが続き項内の２つのオペランドの間に乗算演算子があり、項自体を、所与の変数オペランドの項についてそれ以上単純化することができず、
前記再計算された式は、すべての変数オペランドを、非降順ＡＳＣＩＩ値の順序で左から右にソートされたシーケンスで項内に現し、
前記再計算された式は、互いに定数オペランドだけが異なるすべての項を、単一の項に合併し、
前記再計算された式は、すべての項を、事前定義のソートされたシーケンスで右から左に式に現す
上記（１）に記載の方法。
（３）恒等式を表す代入ステートメントが、前記ソース・コード・プログラム・ループから除去される、上記（１）に記載の方法。
（４）前記代入ステートメントのＲＨＳが、単一の項だけを含み、その項が、前記代入ステートメントの対応するＬＨＳ変数に対応する前記変数検索列の１つのインスタンスだけを含み、前記代入ステートメントが恒等式でない時に、前記代入ステートメントへの参照および前記対応するＬＨＳ変数への参照が、前記リダクション・テーブルに挿入される、上記（１）に記載の方法。
（５）前記代入ステートメントのＲＨＳが、複数の項を含み、前記項の１つだけが、前記代入ステートメントの対応するＬＨＳ変数に対応する前記変数検索列の１つのインスタンスだけを含み、その項が、プラス算術演算子が先行するＬＨＳ変数だけを含む時に、前記代入ステートメントへの参照および前記対応するＬＨＳ変数への参照が、前記リダクション・テーブルに挿入される、上記（１）に記載の方法。
（６）前記代入ステートメントのＲＨＳが、複数の項を含み、前記項のそれぞれが、前記代入ステートメントの対応するＬＨＳ変数に対応する前記変数検索列の１つのインスタンスだけを含む時に、前記代入ステートメントへの参照および前記対応するＬＨＳ変数への参照が、前記リダクション・テーブルに挿入される、上記（１）に記載の方法。
（７）前記ＬＨＳ変数に対応する前記変数検索列が、前記ループの本体内で前記リダクション・テーブルにリストされた前記ＬＨＳ変数の対応する代入ステートメント以外の代入ステートメントのＲＨＳに現れた時に、前記ＬＨＳ変数へのすべての参照および前記対応する代入ステートメントが前記リダクション・テーブルから削除される、上記（１）に記載の方法。
（８）前記ＬＨＳ変数の前記逆数に対応する前記逆数変数検索列が、前記ループの本体内の代入ステートメントに現れた時に、前記ＬＨＳ変数へのすべての参照およびその対応する代入ステートメントへのすべての参照が、前記リダクション・テーブルから削除される、上記（１）に記載の方法。
（９）前記代入ステートメントのＲＨＳが、１つの項だけを含み、その項が、前記代入ステートメントのＬＨＳ変数に対応する前記変数検索列の１つのインスタンスだけを含む時に、前記リダクション・テーブルにリストされる前記代入ステートメントの前記結合演算子が、算術乗算演算子（＊）である、上記（１）に記載の方法。
（１０）前記結合オペランドが、前記ＬＨＳ変数によって除算された前記項である、上記（９）に記載の方法。
（１１）前記代入ステートメントのＲＨＳが、複数の項を含み、前記項の１つだけが、前記代入ステートメントのＬＨＳ変数に対応する前記変数検索列を含み、この項が、前記算術プラス演算子が先行するＬＨＳ変数だけを含む時に、前記リダクション・テーブルにリストされる前記代入ステートメントの前記結合演算子が、算術プラス演算子（＋）である、上記（１）に記載の方法。
（１２）前記結合オペランドが、括弧の対によって囲まれたすべての残りの項の集合である、上記（１１）に記載の方法。
（１３）前記代入ステートメントのＲＨＳが、複数の項を含み、前記項のそれぞれが、前記代入ステートメントのＬＨＳ変数に対応する前記変数検索列の１つのインスタンスだけを含む時に、前記リダクション・テーブルにリストされる前記代入ステートメントの前記結合演算子が、算術乗算演算子（＊）である、上記（１）に記載の方法。
（１４）前記結合演算子が、項のそれぞれから前記ＬＨＳ変数が除算された、すべての項の集合である、上記（１３）に記載の方法。
（１５）共通の結合演算子を共用しない、前記リダクション・テーブルにリストされた複数のインスタンスを有するリダクション変数への参照が、前記テーブルから削除される、上記（１）に記載の方法。
（１６）実行並列化を可能にするためにソース・コード・プログラム・ループ内のリダクション変数を検出するシステムであって、
少なくとも１つの中央処理装置と、
少なくとも１つのシステム・バスと、
前記システム・バスに接続された少なくとも１つの通信ユニットと、
前記システム・バスに接続された少なくとも１つのメモリ・ユニットであって、
前記ソース・コード・プログラム・ループの各代入ステートメントの右辺（ＲＨＳ）の式を正規形に再計算する再計算手段と、
代入ステートメントの左辺（ＬＨＳ）の前記変数を決定する手段と、
再計算された式の係数としてＬＨＳ変数の検索を可能にするために、代入ステートメントの前記ＬＨＳ変数に関する対応する変数検索列を作成する検索列作成手段と、
再計算された式の係数として前記ＬＨＳ変数の逆数の検索を可能にするために、前記代入ステートメントのＬＨＳ変数の前記逆数に関する対応する逆数変数検索列を作成する検索列作成手段と、
前記代入ステートメントのＲＨＳ内で前記代入ステートメントのＬＨＳ変数に対応する前記変数検索列を検出する列検索手段と、
前記代入ステートメントのＲＨＳ内で前記代入ステートメントのＬＨＳ変数の逆数に対応する前記逆数変数検索列を検出する列検索手段と、
所定の条件に基づいて、潜在的なリダクション変数への参照およびその対応する代入ステートメントへの参照を保存するリダクション・テーブルを作成するリダクション・テーブル作成手段と、
前記潜在的なリダクション変数を検出する検出手段と、
前記潜在的なリダクション変数への参照およびその対応する代入ステートメントへの参照を前記リダクション・テーブルに保存する保存手段と、
所定の条件に基づいて、前記代入ステートメントのＬＨＳ変数への参照およびその対応する代入ステートメントへの参照を前記リダクション・テーブルから除去する削除手段と、
前記リダクション・テーブルにリストされた各代入ステートメントの結合演算子を確認する結合演算子決定手段と、
前記リダクション・テーブルにリストされた各代入ステートメントの結合オペランドを確認する結合オペランンド決定手段と
を含む少なくとも１つのメモリ・ユニットと
を含むシステム。
（１７）実行並列化を可能にするためにソース・コード・プログラム・ループ内のリダクション変数を検出するためにその中で実施される、コンピュータ可読記憶媒体に保管されたコンピュータ可読プログラム・コードを含むコンピュータ・プログラム製品であって、
前記ソース・コード・プログラム・ループの各代入ステートメントの右辺（ＲＨＳ）の式を正規形に再計算するように構成されたコンピュータ可読プログラム・コード手段と、
前記代入ステートメントの左辺（ＬＨＳ）の変数を決定し、前記ＬＨＳ変数に対応する変数検索列および逆数変数検索列を作成するように構成されたコンピュータ可読プログラム・コード手段と、
前記代入ステートメントのＲＨＳ内でＬＨＳ変数に対応する前記変数検索列を検索するように構成されたコンピュータ可読プログラム・コード手段と、
前記代入ステートメントのＲＨＳ内でＬＨＳ変数に対応する前記逆数変数検索列を検索するように構成されたコンピュータ可読プログラム・コード手段と、
所定の条件に基づいて、潜在的なリダクション変数として識別される前記ＬＨＳ変数への参照およびその対応する前記代入ステートメントへの参照を保存するリダクション・テーブルを作成するように構成されたコンピュータ可読プログラム・コード手段と、
潜在的なリダクション変数を検出するように構成されたコンピュータ可読プログラム・コード手段と、
前記潜在的なリダクション変数への参照およびその対応する前記代入ステートメントへの参照を前記リダクション・テーブルに保存するように構成されたコンピュータ可読プログラム・コード手段と、
所定の条件に基づいて、前記リダクション変数への参照およびその対応する前記代入ステートメントへの参照を前記リダクション・テーブルから削除するように構成されたコンピュータ可読プログラム・コード手段と、
前記リダクション・テーブルにリストされた各代入ステートメントの結合演算子を決定するように構成されたコンピュータ可読プログラム・コード手段と、
前記リダクション・テーブルにリストされた各代入ステートメントの結合オペランドを決定するように構成されたコンピュータ可読プログラム・コード手段と
を含む、コンピュータ・プログラム製品。
【図面の簡単な説明】
【００５９】
【図１】リダクション変数の決定を示す流れ図の一部である。
【図２】リダクション変数の決定を示す流れ図の一部である。
【図３】リダクション変数の決定を示す流れ図の一部である。
【図４】リダクション・ステートメントの結合演算子の決定を示す流れ図である。
【図５】本発明によるシステムを示す図である。
【符号の説明】
【００６０】
３．１  コンピューティング・システム
３．２  システム・バス
３．３  プロセッサ
３．４  メモリ
３．５  記憶装置
３．８  ネットワーク・インターフェース
３．９  入出力インターフェース
３．１０  キーボード
３．１１  マウス
３．１２  インターネット
【図１】
2004288163.tif 000015
【図２】
2004288163.tif 000016
【図３】
2004288163.tif 000017
【図４】
2004288163.tif 000018
【図５】
2004288163.tif 000019
【外国語明細書】
2004288163000001.pdf