(57)【特許請求の範囲】
【請求項１】
疎行列の自動並べ替えのためのコンピューティング装置であって：
プログラム・コードのコード領域において定義された表現の分配性を判定する分配性解析モジュールであって、前記表現は、前記表現の意味内容が前記表現にはいる時点での並べ替えか前記表現から出る時点での並べ替えかによって影響されない場合に分配性であると判定される、分配性解析モジュールと；
配列を含む表現に対して相互依存配列解析を実行して、その表現の相互依存する配列の一つまたは複数のクラスターを決定する相互依存配列解析モジュールであって、前記一つまたは複数のクラスターのうちのクラスターの各配列は、そのクラスターの他のそれぞれの配列と相互依存している、相互依存配列解析モジュールと；
前記相互依存する配列の前記一つまたは複数のクラスターに基づく前記コード領域内の諸表現を通じた並べ替え可能な配列の逐次反復的な逆方向伝搬および順方向伝搬により、前記コード領域に対して双方向データ・フロー解析を実行する並べ替え可能配列発見モジュールであって、前記逆方向伝搬は逆方向伝達関数に基づき、前記順方向伝搬は順方向伝達関数に基づく、並べ替え可能配列発見モジュールとを有する、
コンピューティング装置。
【請求項２】
前記プログラム・コードの前記コード領域を同定する領域同定モジュールをさらに有する、請求項１記載のコンピューティング装置。
【請求項３】
前記コード領域を同定することが、ループの本体内にコードを含み、フロー制御文を含まない、前記プログラム・コードの線形ループ領域を同定することを含む、請求項２記載のコンピューティング装置。
【請求項４】
前記コード領域を同定することが、前記コンピューティング装置のコンパイラーによって前記コード領域を同定することを含む、請求項２記載のコンピューティング装置。
【請求項５】
前記コード領域を同定することが、少なくともある閾値時間期間にわたって前記コンピューティング装置によって実行されるコード領域を同定することを含む、請求項２記載のコンピューティング装置。
【請求項６】
前記領域同定モジュールがさらに、前記コンピューティング装置のコンパイラーにより前記プログラム・コードを受領する、請求項２記載のコンピューティング装置。
【請求項７】
前記表現の分配性を判定することが、前記コード領域において定義されている各表現の分配性を判定することを含む、請求項１記載のコンピューティング装置。
【請求項８】
前記相互依存配列解析を実行することが、各表現が分配性であるとの判定に応答して前記相互依存配列解析を実行することを含む、請求項７記載のコンピューティング装置。
【請求項９】
前記表現の分配性を判定することが、陳述R(ε(i1,…,n))＝ε(R(i1),…,R(in))であることを判別することを含み、
εは前記表現であり、
Rは前記表現に対する並べ替えであり、
i1,…,nは前記表現にはいる時点での変数および／または配列の集合である、請求項１ないし７のうちいずれか一項記載のコンピューティング装置。
【請求項１０】
前記表現の分配性を判定することが、（ｉ）前記表現が特定の形をもつ入力または出力を要求する、（ｉｉ）前記表現が前記プログラム・コードの入出力機能を定義する、（ｉｉｉ）前記表現がビット毎の再現性を要求する、あるいは（ｉｖ）前記表現が前記コンピューティング装置のコンパイラーにとって未知の関数を含む、のうちの少なくとも一つであるとの判定に応答して、前記表現を非分配性であると判定することを含む、請求項１ないし８のうちいずれか一項記載のコンピューティング装置。
【請求項１１】
前記一つまたは複数のクラスターのうちのクラスターの各配列がそのクラスターの他のそれぞれの配列と相互依存していることにより、前記一つまたは複数のクラスターのうちの特定のクラスター内のある配列の並べ替えは、その特定のクラスターのそれぞれの他の配列に影響する、請求項１ないし８のうちいずれか一項記載のコンピューティング装置。
【請求項１２】
前記相互依存配列解析を実行することが：
前記コード領域における演算を表わす表現についての表現木を生成する段階であって、前記表現木の各内部ノードは前記表現の演算を示し、前記表現木の各端末ノードは配列またはスカラーを示す、段階と；
前記表現木を、配列の相互依存性に基づいて表現部分木の集合に分解する段階と；
各表現部分木についての相互依存配列の対応するクラスターを、その表現部分木に含まれる配列に基づいて決定する段階とを実行することを含む、
請求項１記載のコンピューティング装置。
【請求項１３】
前記表現木を、表現部分木の集合に分解することが、前記表現木の各内部ノードの結果型を判別することを含む、請求項１２記載のコンピューティング装置。
【請求項１４】
前記双方向データ・フロー解析を実行することが：
入力集合および出力集合をもつ表現の前記入力集合および前記出力集合を初期化し；
前記順方向伝達関数を並べ替えるべき第一の配列に適用することによって、前記表現の前記入力集合および前記出力集合を事前調整し；
前記入力集合および前記出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む、
請求項１記載のコンピューティング装置。
【請求項１５】
前記並べ替え可能配列発見モジュールがさらに、前記並べ替えるべき第一の配列を、前記コンピューティング装置のユーザーから受領する、請求項１４記載のコンピューティング装置。
【請求項１６】
前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することが、各表現の入力集合および出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む、
請求項１４記載のコンピューティング装置。
【請求項１７】
少なくとも一つの配列を並べ替えるよう前記双方向データ・フロー解析に基づいて前記プログラム・コードを変換するコード変換モジュールをさらに有する、請求項１ないし８のうちいずれか一項記載のコンピューティング装置。
【請求項１８】
疎行列の自動並べ替えの方法であって：
コンピューティング装置によって、プログラム・コードのコード領域において定義された表現の分配性を判定する段階であって、前記表現は、前記表現の意味内容が前記表現にはいる時点での並べ替えか前記表現から出る時点での並べ替えかによって影響されない場合に分配性であると判定される、段階と；
前記コンピューティング装置によって、配列を含む表現に対して相互依存配列解析を実行して、その表現の相互依存する配列の一つまたは複数のクラスターを決定する段階であって、前記一つまたは複数のクラスターのうちのクラスターの各配列は、そのクラスターの他のそれぞれの配列と相互依存している、段階と；
前記コンピューティング装置によって、前記相互依存する配列の前記一つまたは複数のクラスターに基づく前記コード領域内の諸表現を通じた並べ替え可能な配列の逐次反復的な逆方向伝搬および順方向伝搬により、前記コード領域に対して双方向データ・フロー解析を実行する段階であって、前記逆方向伝搬は逆方向伝達関数に基づき、前記順方向伝搬は順方向伝達関数に基づく、段階とを含む、
方法。
【請求項１９】
前記表現の分配性を判定することが、前記コード領域において定義されている各表現の分配性を判定することを含み、
前記相互依存配列解析を実行することが、各表現が分配性であると判定することに応答して前記相互依存配列解析を実行することを含む、
請求項１８記載の方法。
【請求項２０】
前記表現の分配性を判定することが、陳述R(ε(i1,…,n))＝ε(R(i1),…,R(in))であることを判別することを含み、
εは前記表現であり、
Rは前記表現に対する並べ替えであり、
i1,…,nは前記表現にはいる時点での変数および／または配列の集合である、
請求項１８記載の方法。
【請求項２１】
前記一つまたは複数のクラスターのうちのクラスターの各配列がそのクラスターの他のそれぞれの配列と相互依存していることにより、前記一つまたは複数のクラスターのうちの特定のクラスター内のある配列の並べ替えは、その特定のクラスターのそれぞれの他の配列に影響する、請求項１８記載の方法。
【請求項２２】
前記相互依存配列解析を実行することが：
前記コード領域における演算を表わす表現についての表現木を生成する段階であって、前記表現木の各内部ノードは前記表現の演算を示し、前記表現木の各端末ノードは配列またはスカラーを示す、段階と；
前記表現木を、配列の相互依存性に基づいて表現部分木の集合に分解する段階と；
各表現部分木についての相互依存配列の対応するクラスターを、その表現部分木に含まれる配列に基づいて決定する段階とを含む、
請求項１８記載の方法。
【請求項２３】
前記双方向データ・フロー解析を実行することが：
入力集合および出力集合をもつ表現の前記入力集合および前記出力集合を初期化し；
前記順方向伝達関数を並べ替えるべき第一の配列に適用することによって、前記表現の前記入力集合および前記出力集合を事前調整し；
前記入力集合および前記出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む、
請求項１８記載の方法。
【請求項２４】
前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することが、各表現の入力集合および出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む、
請求項２３の方法。
【請求項２５】
請求項１８ないし２４のうちいずれか一項記載の方法をコンピューティング装置に実行させるためのコンピュータ・プログラム。
【請求項２６】
請求項２５記載のコンピュータ・プログラムを記憶している一つまたは複数のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【背景技術】
【０００１】
グラフおよび疎行列のような疎なデータ構造に対する超高性能コンピューティング（HPC:  high  performance  computing）は、たとえば機械学習、計算科学、物理モデル・シミュレーション、ウェブ検索および知識発見を含む幅広い分野においてますます重要になりつつある。伝統的な超高性能コンピューティング・アプリケーションは概して、規則的で密なデータ構造に関わるが、疎計算（sparse  computation）はいくつかの独特な課題がある。たとえば、疎計算は典型的には、密な計算よりもかなり低い計算集約性をもち、よってその性能はしばしばメモリ帯域幅によって制限される。さらに、メモリ・アクセス・パターンおよび並列度はたとえば入力データの個別の疎パターンに依存して大きく変わり、このことはある種の最適化情報がしばしば先験的には未知なので、最適化を複雑にする。
【０００２】
システムは、これらの課題に対処するために、高いデータ局在性（locality）を得るために入力データセットを修正することがある。たとえば、システムは、0でない項目を互いの近くにまとめるために行列の行および／または列を置換する並べ替えを用いてもよい。たとえば、システムは、図１のＡおよびＢに示されるように、疎行列１００を並べ替えて、0でない項目１０４が互いの近くに集まっているバンド化した（banded）行列１０２を生成してもよい。そうすることにより、システムは、特定のメモリ読み出しが、並べ替えなしの場合より、より多くの0でない項目に関わる可能性を高め（すなわち、空間的局在性）、キャッシュからのより多くの再利用につながりうる（すなわち、時間的局在性）。さまざまな並べ替えアルゴリズムが開発され、実装されており、たとえば幅優先検索（BFS:  Breadth  First  Search）、逆カットヒル・マッキー（RCM:  Reverse  Cuthill-McKee）、自己回避歩行（SAW:  Self-Avoiding  Walk）、METIS分割器（METIS  Partitioner）およびキングのアルゴリズムを含む。特に、BFSおよびそのより洗練されたバージョンであるRCMは、より低い複雑さおよびより高い効率のため、疎行列ベクトル乗算（SpMV:  sparse  matrix  vector  multiplication）におけるキャッシュ局在性について最適化するために頻繁に使われる。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
本稿に記載される概念は、限定ではなく例として、付属の図面に示される。図解の簡明のため、図面に示される要素は必ずしも縮尺通りに描かれていない。適切と思われる場合には、対応するまたは類似の要素を示すために、参照符号は複数の図面の間で繰り返されている。
【図面の簡単な説明】
【０００４】
【図１】Ａは、疎行列の少なくとも一つの実施形態の簡略化された図であり、Ｂは並べ替えられた疎行列の少なくとも一つの実施形態の簡略化された図である。
【図２】疎行列の自動並べ替えのためのコンピューティング装置の少なくとも一つの実施形態の簡略化されたブロック図である。
【図３】図２のコンピューティング装置の環境の少なくとも一つの実施形態の簡略化されたブロック図である。
【図４】Ａは、プログラム・コードのセクションの少なくとも一つの実施形態であり、Ｂ〜ＣはＡのプログラム・コードのセクションの並べ替えされたバージョンの実施形態である。
【図５】図２のコンピューティング装置によって実行されうる疎行列の自動並べ替えのための方法の少なくとも一つの実施形態の簡略化された流れ図である。
【図６】図２のコンピューティング装置によって実行されうる相互依存配列解析を実行する方法の少なくとも一つの実施形態の簡略化された流れ図である。
【図７】Ａは、表現木の少なくとも一つの実施形態の簡略化された図であり、Ｂは、Ａの表現木から生成される表現部分木の集合の少なくとも一つの実施形態の簡略化された図である。
【図８】図２のコンピューティング装置によって実行されうる双方向データ・フロー解析を実行する方法の少なくとも一つの実施形態の簡略化された流れ図である。
【図９】並べ替え可能な配列の発見のための双方向解析の適用からの結果の少なくとも一つの実施形態の部分的な表である。
【図１０】コード領域におけるプログラム・コードの簡略化されたブロック図である。
【図１１】最適化なしの図１０のプログラム・コードへの双方向解析の適用からの結果の少なくとも一つの実施形態の部分的な表である。
【図１２】図１１の最適化なしの双方向解析の結果に基づく図１０のプログラム・コードの並べ替えられたバージョンの簡略化されたブロック図である。
【図１３】ライブ性に基づく最適化を用いた図１０のプログラム・コードへの双方向解析の適用からの結果の少なくとも一つの実施形態の部分的な表である。
【図１４】図１３のライブ性に基づく最適化を用いた双方向解析の結果に基づく図１０のプログラム・コードの並べ替えられたバージョンの簡略化されたブロック図である。
【図１５】実行頻度に基づく最適化を用いた図１０のプログラム・コードへの双方向解析の適用からの結果の少なくとも一つの実施形態の部分的な表である。
【図１６】図１５の実行頻度に基づく最適化を用いた双方向解析の結果に基づく図１０のプログラム・コードの並べ替えられたバージョンの簡略化されたブロック図である。
【発明を実施するための形態】
【０００５】
本開示の概念は、さまざまな修正および代替形を受けることができるものの、例としてその個別的な実施形態が図面において示されており、本稿において詳細に記載される。しかしながら、本開示の概念を開示される特定の形に限定する意図はなく、逆に、意図は、本開示および付属の請求項と整合するあらゆる修正、等価物および代替をカバーすることである。
【０００６】
本明細書における「一つの実施形態」、「ある実施形態」、「例示的な実施形態」などへの言及は、記載されるその実施形態が特定の特徴、構造または特性を含みうることを示すが、すべての実施形態がその特定の特徴、構造または特性を含むこともあれば、必ずしも含まないこともある。さらに、そのような句は必ずしも同じ実施形態を指しているのではない。さらに、特定の特徴、構造または特性がある実施形態との関連で記述されるとき、そのような特徴、構造または特性を他の実施形態との関連で実施することは、明示されているか否かによらず、当業者の知識の範囲内であることを述べておく。さらに、「少なくとも一つのA、BおよびC」は（A）；（B）；（C）；（AおよびB）；（BおよびC）；（AおよびC）；または（A、BおよびC）を意味することができる。同様に、「A、BまたはCの少なくとも一つ」の形で挙げられた項目は（A）；（B）；（C）；（AおよびB）；（BおよびC）；（AおよびC）；または（A、BおよびC）を意味することができる。
【０００７】
開示される実施形態は、場合によっては、ハードウェア、ファームウェアもしくはソフトウェアまたはそれらの任意の組み合わせによって実装されうる。開示される実施形態は、一つまたは複数の一時的または非一時的な機械可読（たとえばコンピュータ可読）記憶媒体に搬送されるまたは記憶される命令として実装されてもよく、該命令は一つまたは複数のプロセッサによって読まれ、実行されてもよい。機械可読記憶媒体は、機械によって読み取り可能な形で情報を記憶または伝送するための任意の記憶装置、機構または他の物理的構造（たとえば、揮発性または不揮発性メモリ、メディア・ディスクまたは他のメディア・デバイス）として具現されうる。
【０００８】
図面において、いくつかの構造的または方法の特徴が特定の配置および／または順序において示されることがあるが、そのような特定の配置および／または順序は必須ではないことがあることは理解しておくべきである。むしろ、いくつかの実施形態では、そのような特徴は、例示的な図に示したのとは異なる仕方および／または順序で配列されてもよい。さらに、構造的または方法の特徴が特定の図に含まれることは、そのような特徴がすべての実施形態において必要とされることを含意することは意図されていない。いくつかの実施形態では、含まれなくてもよく、あるいは他の特徴と組み合わされてもよい。
【０００９】
ここで図２を参照するに、疎行列の自動並べ替えのためのコンピューティング装置２００が示されている。下記でより詳細に述べるように、コンピューティング装置２００は、本稿に記載されるアルゴリズム（単数または複数）を（たとえば疎カーネルの実行を高速化するために）任意の並べ替え関数に自動的に適用して、該任意の関数に並べ替えが適用可能である／許容できるかどうかを自動的に判定し、もしそうであれば、根底にある表現（単数または複数）の意味内容（semantics）を変えることなく、該アルゴリズム（単数または複数）を適用するよう構成される。そのような自動的並べ替え技法が、たとえばしばしば誤りを起こしやすく時間がかかる工程いである手動の並べ替え最適化の必要性をなくすまたは減らすことにより、熟練したプログラマーの能力および／または効率をも改善しうることは理解されるはずである。例示的な実施形態では、コンピューティング装置２００は、関心のある特定のコード領域における文が分配性である（distributive）ことを確認することによって、並べ替えの実現可能性を判別し、もしそうであれば、そのコード領域の外のコードが並べ替えによって影響されないよう、そのコード領域の前、後および／または中において並べ替えるおよび／または逆並べ替えをするべき配列（単数または複数）（たとえば、多次元行列および／または一次元ベクトル）を同定する。
【００１０】
コンピューティング装置２００は、本稿に記載される機能を実行できるいかなる型のコンピューティング装置またはシステムとして具現されてもよい。たとえば、いくつかの実施形態では、コンピューティング装置２００はデスクトップ・コンピュータ、ラップトップ・コンピュータ、タブレット・コンピュータ、ノートブック、ネットブック、ウルトラブック（商標）、スマートフォン、携帯電話、ウェアラブル・コンピューティング装置、携帯情報端末、モバイル・インターネット装置、スマート装置、サーバー、ルーター、スイッチ、ハイブリッド装置および／または他の任意のコンピューティング／通信装置として具現されうる。図２に示されるように、例示的なコンピューティング装置２００は、プロセッサ２１０と、入出力（「I/O」）サブシステム２１２と、メモリ２１４と、データ記憶部２１６と、通信回路２１８と、一つまたは複数の周辺装置２２０とを含んでいる。むろん、コンピューティング装置２００は、他の実施形態では、典型的なコンピューティング装置に普通に見出されるもののような他のまたは追加的なコンポーネント（たとえばさまざまな入出力装置および／または他のコンポーネント）を含んでいてもよい。さらに、いくつかの実施形態では、これらの例示的なコンポーネントの一つまたは複数が、別のコンポーネントに組み込まれたり、あるいは他の仕方で別のコンポーネントの一部分をなしたりしていてもよい。たとえば、いくつかの実施形態では、メモリ２１４またはその一部はプロセッサ２１０に組み込まれていてもよい。
【００１１】
プロセッサ２１０は、本稿に記載される機能を実行することのできるいかなる型のプロセッサとして具現されてもよい。たとえば、プロセッサ２１０は、単一コアまたは複数コア・プロセッサ（単数または複数）、デジタル信号プロセッサ、マイクロコントローラまたは他のプロセッサもしくは処理／制御回路として具現されてもよい。同様に、メモリ２１４は、本稿に記載される機能を実行することができる任意の型の揮発性もしくは不揮発性メモリまたはデータ記憶として具現されてもよい。動作では、メモリ２１４は、オペレーティング・システム、アプリケーション、プログラム、ライブラリおよびドライバのようなコンピューティング装置２００の動作の間に使用されるさまざまなデータおよびソフトウェアを記憶してもよい。メモリ２１４はI/Oサブシステム２１２を介してプロセッサ２１０に通信上結合されている。I/Oサブシステム２１２は、プロセッサ２１０、メモリ２１４およびコンピューティング装置２００の他のコンポーネントとの入出力動作を容易にするための回路および／またはコンポーネントとして具現されてもよい。たとえば、I/Oサブシステム２１２は、メモリ・コントローラ・ハブ、入出力コントロール・ハブ、ファームウェア・デバイス、通信リンク（すなわちポイントツーポイント・リンク、バス・リンク、ワイヤ、ケーブル、光導波路、プリント回路基板トレースなど）および／または入出力動作を容易にするための他のコンポーネントおよびサブシステムとして具現されてもよく、あるいは他の仕方でそれらを含んでいてもよい。いくつかの実施形態では、I/Oサブシステム２１２は、システム・オン・チップ（SoC）の一部をなし、プロセッサ２１０、メモリ２１４およびコンピューティング装置２００の他のコンポーネントとともに単一の集積回路チップに組み込まれていてもよい。
【００１２】
データ記憶部２１６は、たとえばメモリ・デバイスおよび回路、メモリ・カード、ハードディスクドライブ、半導体ドライブまたは他のデータ記憶デバイスといった、データの短期または長期の記憶のために構成された任意の型のデバイス（単数または複数）として具現されてもよい。データ記憶部２１６および／またはメモリ２１４は、本稿に記載されるコンピューティング装置２００の動作の間にさまざまなデータを記憶しうる。
【００１３】
通信回路２１８は、コンピューティング装置２００と他のリモート装置との間のネットワークを通じた通信を可能にすることができる任意の通信回路、装置またはそれらの集まりとして具現されてもよい。たとえば、いくつかの実施形態では、コンピューティング装置２００は、ユーザー・プログラム、並べ替えるべき第一の配列（FAR:  a  first  array  to  reorder）の特定情報および／または本稿に記載される機能を実行するための他の有用なデータをリモート・コンピューティング装置から受領してもよい。通信回路２１８は、そのような通信を実施するために任意の一つまたは複数の通信技術（たとえば、無線または有線の通信）および関連するプロトコル（たとえばイーサネット（登録商標）、ブルートゥース（登録商標）、WiMAX、LTE、5Gなど）を使うよう構成されていてもよい。
【００１４】
周辺装置２２０は、任意の数の追加的な周辺装置またはインターフェース装置、たとえばスピーカー、マイクロフォン、追加的な記憶デバイスなどを含みうる。周辺装置２２０に含まれる具体的な装置は、たとえば、コンピューティング装置２００の型および／または意図される使用に依存しうる。
【００１５】
ここで図３を参照するに、使用において、コンピューティング装置２００は、疎行列の自動並べ替えのための環境３００を確立する。例示的な環境３００は、領域同定モジュール３０２、分配性解析モジュール３０４、ライブ性解析モジュール３０６、相互依存配列解析モジュール３０８、並べ替え可能配列発見モジュール３１０およびコード変換モジュール３１２を含む。環境３００のさまざまなモジュールは、ハードウェア、ソフトウェア、ファームウェアまたはそれらの組み合わせとして具現されうる。たとえば、環境３００のさまざまなモジュール、論理および他のコンポーネントは、プロセッサ２１０またはコンピューティング装置２００の他のハードウェア・コンポーネントの一部をなしてもよいし、あるいはそれによって確立されてもよい。よって、いくつかの実施形態では、環境３００のモジュールの一つまたは複数は、回路または電気デバイスの集まり（たとえば、領域同定回路３０２、分配性解析回路３０４、ライブ性解析回路３０６、相互依存配列解析回路３０８、並べ替え可能配列発見回路３１０および／またはコード変換回路３１２）として具現されてもよい。そのような実施形態では領域同定回路３０２、分配性解析回路３０４、ライブ性解析回路３０６、相互依存配列解析回路３０８、並べ替え可能配列発見回路３１０および／またはコード変換回路３１２の一つまたは複数はプロセッサ２１０、I/Oサブシステム２１２、メモリ２１４、データ記憶部２１６、通信回路２１８および／または周辺装置２２０の一つまたは複数の一部をなしてもよいことは理解されるはずである。さらに、いくつかの実施形態では、例示的なモジュールの一つまたは複数が別のモジュールの一部をなしてもよく、および／または例示的なモジュールの一つまたは複数が互いと独立であってもよい。図３に示されるように、いくつかの実施形態では、環境３００のさまざまなモジュールの一つまたは複数が、コンピューティング装置２００のコンパイラー３１４の一部をなしてもよく、あるいはそれによって実行されてもよい。
【００１６】
本稿で記載されるところでは、コンピューティング装置２００は、たとえばプログラムの実行時間を改善するために、プログラムのコード領域に並べ替え変換を適用するよう構成されている。領域同定モジュール３０２は、並べ替えのために解析するべきコード領域を同定するよう構成されている。コード領域は、プログラムの任意の表現、ブロック、文、文／命令の集合／シーケンスおよび／または他の部分でありうる。たとえば、いくつかの実施形態では、コード領域は、逐次的ないくつかの文、ループ文（たとえば「for」「repeat…until」「while」など）、フロー制御文（たとえば、「if…else」「goto」「break」「exit」など）および／または他の文を含みうる。より特定的には、いくつかの実施形態では、領域同定モジュール３０２はフロー文を含まない線形なループ領域をコード領域として選択する。さらに、いくつかの実施形態では、領域同定モジュール３０２は、プログラムがかなりの実行時間（たとえば、少なくとも閾値時間期間、少なくとも閾値クロック・サイクル数および／または他の仕方で決定される時間）を費やすところのコード領域を選択してもよい。議論の簡単のため、「表現（expression）」、「ブロック（block）」および／または「文（statement）」は、具体的な文脈に依存して本記述を通じて交換可能に使われることがある。
【００１７】
並べ替え変換が、コード領域内において使用に先立って、いくつかの配列を並べ替えることによってコード領域に影響しうることは理解しておくべきである。さらに、コード領域の外のプログラム・コードが影響されないことを保証するために、コード領域後に使用されうる配列が逆並べ替えされてもよい（すなわち、並べ替えの逆操作が適用されて、並べ替えられた配列をその初期状態に戻してもよい）。さらに、コード領域がフロー制御文を含む場合、そのような文を考慮に入れるために、一つまたは複数の配列が、コード領域においてさまざまな経路に沿って順序付けられ、適宜逆並べ替えされてもよい。コード領域が線形なループ領域であるいくつかの実施形態では、並べ替えはコード領域の外でのみ生起してもよい。
【００１８】
プログラム・コード４００のセクションの例示的実施形態が図４のＡに示されている。図のように、一般的なコード領域４００は、領域同定モジュール３０２によって同定されたコード領域４０２と、同定されたコード領域４０２の外にある「print(x)」文とを含む。コード領域４０２が外側ループ文と、該外側ループ文の中のさまざまな動作文とを含むことは理解されるはずである。本稿で記載されるところでは、コード領域内で使われる変数／配列の一つまたは複数が並べ替えられてもよく、それによりプログラム・コード４００内に存在する文／命令が影響される。たとえば、いくつかの実施形態では、並べ替えは、図４のＢに示されるように、プログラム・コード４００の修正版を生成するための、コード領域４０２内における「reorder()」文および／または「reverse_reorder()」文の挿入に関わってもよい（たとえば、コード領域４０２の外でのそのような文の挿入に加えて）。他の実施形態では、並べ替えは、図４Ｃに示されるように、プログラム・コード４００の修正版を生成するための、コード領域４０２（たとえば線形ループ領域）の外側での（たとえばコード領域４０２の直前および直後での）そのような並べ替え文の挿入に関わるのみであってもよい。
【００１９】
分配性解析モジュール３０４は、同定されたコード領域において定義されている表現の一つまたは複数（たとえば各表現）の分配性を判別するよう構成されている。すなわち、分配性解析モジュール３０４は、コード領域内の表現のすべてをスキャンし、並べ替えが、それらの表現のそれぞれに対して分配性であるかどうかを判定してもよい。図示した実施形態では、並べ替えRは、xが行列であればR(x)＝P'*x*Pに（すなわち相似変換）、xがベクトルであればR(x)＝P'*xに、あるいはxがスカラー数であればR(x)＝xに従って定義されてもよい。ここで、Pは置換行列であり、P'はPの転置／逆である。さらに、図示した実施形態において、表現εに対する並べ替えRは、その出力が並べ替えられるおよび／またはその入力が並べ替えられるかどうかに関わりなくその意味内容が同じままである場合に、分配性である。換言すれば、R(ε(i1,…,n))＝ε(R(i1),…,R(in))ということであり、ここでi1,…,nは入力の集合である。
【００２０】
いくつかの実施形態では、フロー制御文のないコード領域は、まとめて単一の表現であると解釈されてもよい。並べ替えが特定のコード領域内の全表現に対して分配性である場合、並べ替えは、例示的実施形態における集団表現としての領域全体に対しても分配性であることは理解されるはずである。よって、コード領域の結果を並べ替えるために、コンピューティング装置２００は、領域内のコードを修正することなくコード領域への諸入力を並べ替えてもよい。コード領域がフロー制御文を含んでいる実施形態では、入力の一つまたは複数が条件付きであることがあり、よってそれらの入力の並べ替えも条件付きであることがある（たとえば図４のＢ参照）。
【００２１】
いくつかの普通に見られる配列関係の表現はしばしば分配性であることは理解されるはずである。たとえば、表現M*N、M＋N、M−N、M*v、M-1v、v・w、v＋w、v−w、n*Mおよびn*vは一般に分配性である。ここで、MおよびNは行列、vおよびwはベクトル、nはスカラー数である。さらに、並べ替えは一般に、入力および出力のない表現（たとえば条件文「if(n)」および「goto」文）に対して、およびスカラーの入力および出力をもつ表現に対しては分配性である。対照的に、いくつかの他の普通に見られる配列関係の表現は分配性ではない。たとえば、入力および／または出力が特定の「形」であることを要求する表現（たとえば、入力が上半または下半三角行列であることを想定する三角行列ソルバー）、入出力表現（たとえばプリント・コマンド）、ビット毎の再現性を要求する表現および／またはコンパイラー３１４にとって未知の関数は一般に非分配性であると見なされうる。特定のユーザー定義関数についてのソース・コードが利用可能であれば、本稿に記載される技法と整合して、その分配性を判別するためにソース・コードが解析されてもよいことは理解されるはずである。コード領域形成／同定と分配性解析は本稿では別個に記載されているが、いくつかの実施形態では、コード領域形成および分配性は同時並行して解析されてもよい。たとえば、いくつかの実施形態では、コンピューティング装置２００は空の領域で始まり、分配性であると確認された文を加えることによって徐々に領域を「成長」させてもよい。
【００２２】
ライブ性解析モジュール３０６は、コード領域内の一つまたは複数の位置における一つまたは複数の（たとえばそれぞれの）変数／配列のライブ性（liveness）（すなわち、変数／配列がライブ（live）であるかデッド（dead）であるか）を判別するよう構成される。たとえば、いくつかの実施形態では、ライブ性解析モジュール３０６は、コード領域内の各文／表現の前および／または後の各変数のライブ性を判別してもよい。例示的実施形態では、変数／配列はプログラム・コードにおけるある特定のプログラミング点において、その変数が将来（すなわち、そのプログラミング点より後に）使われる可能性がある場合には、ライブであると考えられる。コンピューティング装置２００（たとえばコンパイラー３１４）は、変数のライブ性を判別するための任意の好適な技法、アルゴリズムおよび／または機構を利用しうることは理解されるはずである。
【００２３】
相互依存配列解析モジュール３０８は、特定の表現を解析して、該表現の相互依存している配列／変数のクラスターを構築するまたは他の仕方で決定するよう構成されている。例示的実施形態では、一組の配列が互いに相互依存していると考えられるのは、それらの配列のいずれかの並べ替えが他の配列の並べ替えを必要とする場合である。たとえば表現x＝A*yにおける疎行列Aが並べ替えられる（たとえばいくつかの列および／または行が交換される）場合、ベクトルxおよびyは並べ替えられる必要がある。同様に、xまたはyが並べ替えられる場合には、Aがしかるべく並べ替えられる必要がある。一般に、一つまたは複数の配列に関わる表現の、別の配列への代入文は、それらの配列のそれぞれの間の相互依存性を示す。たとえば、コード領域が文array1＝ε(array2,array3)を含み、ここで、εは配列array2およびarray3の表現である場合、配列array1、array2およびarray3は相互依存する配列である。のちにより詳細に述べるように、いくつかの実施形態では、相互依存配列解析モジュール３０８は、表現のどの変数／配列が互いに相互依存するかを判別し、それによりクラスターを生成するために、特定の文について表現木（expression  tree）を生成してもよい。むろん、いくつかの実施形態では、文は、表現木の明示的な生成なしに暗黙的に表現木である3アドレス・フォーマット（結果、演算子および二つのオペランド）で表現されてもよい。
【００２４】
並べ替え可能配列発見モジュール３１０は、コード領域における並べ替え可能な配列を発見するために、同定されたコード領域に対して双方向データ・フロー解析を実行するよう構成される。後述するように、いくつかの実施形態では、並べ替え可能配列発見モジュール３１０は、コード領域における表現（単数または複数）を通じた並べ替え可能配列の、逆方向伝達関数に基づく逆方向伝搬（backward  propagation）と、順方向伝達関数に基づく順方向伝搬（forward  propagation）とを逐次反復的に実行してもよい。たとえば、いくつかの実施形態では、並べ替え可能配列発見モジュール３１０は、並べ替え変換によって改善されうるデータ局在性をもつ疎配列を同定し、（並べ替えるべき他の配列を判別するために）その配列を双方向フロー解析を用いて解析する／伝搬させることをしてもよい。いくつかの実施形態では、そのような配列は、コード領域にとって重要であると知られているいくつかの動作（単数または複数）（たとえば疎行列ベクトル乗算（SpMV））に関係した最初の一つまたは若干数の疎配列であってもよい。別の実施形態では、並べ替え可能配列発見モジュール３１０は、並べ替えるべき第一の配列（FAR）をユーザーから（たとえばコンパイラー３１４による解析のためのコード領域のユーザー注釈を介して）受領してもよい。
【００２５】
コード変換モジュール３１２は、コード領域内またはプログラム・コード内におけるコード領域の近傍内（たとえばコード領域の直前または直後）で一つまたは複数の配列を並べ替えるおよび／または逆並べ替えをするよう構成されている。例示的実施形態では、コード変換モジュール３１２は、並べ替え可能配列発見モジュール３１０の双方向フロー解析に基づいて、並べ替えおよび／または逆並べ替えすべき具体的な配列およびそのような動作を実行すべきプログラム・コード内の具体的な位置を決定することは理解されるはずである。さらに、コード変換モジュール３１２は、具体的な実施形態に依存して、いかなる好適な並べ替えアルゴリズムを用いてもよく、プログラム・コードの変換を実際に実施するためにいかなる好適なアルゴリズム、技法および／または機構を利用してもよいことは理解されるはずである。
【００２６】
ここで図５を参照するに、コンピューティング装置２００は、（たとえばユーザー指令および／または介入のない）疎行列の自動並べ替えのための方法５００を実行してもよい。例示的な方法５００はブロック５０２で始まる。ここで、コンピューティング装置２００は、並べ替えされうる一つまたは複数の疎行列を含むプログラム（たとえばプログラム・コード）を受領する。より特定的には、いくつかの実施形態では、プログラム・コードは、コンピューティング装置２００のコンパイラー３１４によって取り出されてもよい。ブロック５０４では、コンピューティング装置２００は、配列の並べ替えのために解析するべき前記プログラム・コードのコード領域を同定する。上記のように、コード領域は、プログラム・コードの任意の部分でありうるが、いくつかの実施形態では、同定される／選択されるコード領域は、かなりの実行時間がある前記プログラム・コードの線形ループ領域または別の部分である。
【００２７】
ブロック５０６では、コンピューティング装置２００は、同定されたコード領域において定義されている表現の一つまたは複数（たとえば各表現）の分配性を判別するために、プログラム・コードのコード領域の分配性解析を実行する。よって、ブロック５０８では、コンピューティング装置２００は、コード領域内の具体的な諸表現を同定してもよく、ブロック５１０では、それらの表現に対する、並べ替えアルゴリズムの分配性を判別してもよい。たとえば、コンピューティング装置２００は、コード領域内の表現のすべてをスキャンし、並べ替えが、それらの表現のそれぞれに対して分配性であるかどうかを判定してもよい。上記のように、図示した実施形態では、表現εに対する並べ替えRは、その出力が並べ替えられるおよび／またはその入力が並べ替えられるかどうかに関わりなくその意味内容が同じままである場合に、分配性である。つまり、R(ε(i1,…,n))＝ε(R(i1),…,R(in))であれば、並べ替えRは表現εに対して分配性である。ここでi1,…,nは入力の集合である。いくつかの実施形態では、表現は、分配性または非分配性であることがわかっている、普通に使われる配列関係の表現を含みうる。よって、いくつかの実施形態では、コンピューティング装置２００は、所与の表現における特定の配列に対して実行される演算の型を判別してもよい。分配性解析はコード領域同定の後であるものとして記述されているが、いくつかの実施形態では、分配性解析とコード領域同定は同時並行して行なわれてもよい。たとえば、いくつかの実施形態では、コンピューティング装置２００は空の領域で始まり、分配性であると識別された／知られている文を追加することによって徐々にコード領域を「成長」させてもよい。
【００２８】
ブロック５１２においてコンピューティング装置２００がコード領域内の表現の一つまたは複数が非分配性であると判別する場合には、方法５００は終了する。しかしながら、コンピューティング装置２００が、並べ替えがコード領域内の表現のそれぞれに対して分配性であり、よって全体としてのコード領域に対して分配性であると判別する場合、コンピューティング装置２００はブロック５１４においてコード領域に対してライブ性解析を実行して、コード領域内のさまざまなプログラミング点における配列の一つまたは複数（たとえば各配列）のライブ性を判別する。たとえば、いくつかの実施形態では、コンピューティング装置２００は、コード領域の各文／表現の前および後で配列が「ライブ」か「デッド」かを判定する。上記のように、コンピューティング装置２００（たとえばコンパイラー３１４）は、変数のライブ性を判定するためにいかなる好適な技法、アルゴリズムおよび／または機構を用いてもよい。さらに、ライブ性解析は図５では分配性解析の後であるものとして示されているが、いくつかの実施形態では、ライブ性解析は、分配性解析より前に実行されてもよい。
【００２９】
ブロック５１６では、コンピューティング装置２００は、コード領域における一つまたは複数の（たとえばそれぞれの）表現に対して相互依存配列解析を実行して、それらの表現のそれぞれについて、表現のどの配列／変数が互いに相互依存するかを判別し、その判別に基づいて適切なクラスターを生成する。換言すれば、コンピューティング装置２００は、表現のある配列の並べ替えが、その表現の他の配列の並べ替えを必要とさせるかどうかを判定する。たとえば、上記のように、コード領域が文array1＝ε(array2,array3)を含み、ここで、εは配列array2およびarray3の表現である場合、配列array1、array2およびarray3は相互依存する配列である。いくつかの実施形態では、コンピューティング装置２００は、表現のどの配列／変数が互いに相互依存するかを判別し、それによりクラスターを生成するために、方法６００を実行して、図６に示されるような表現木を生成して解析してもよい。むろん、いくつかの実施形態では、文は、表現木の明示的な生成なしに暗黙的に表現木である3アドレス・フォーマット（結果、演算子および二つのオペランド）で表現されてもよい。
【００３０】
ここで図６を参照するに、例示的方法６００は、コンピューティング装置２００が解析のためにコード領域の文／表現を同定し、選択するブロック６０２をもって始まる。例として、コード領域は、コンピューティング装置２００によって選択される表現v1＝v2＋v3*dot(M*v4,v5)を含んでいてもよい。ここで、v1、v2、v3、v4およびv5はベクトルであり、Mは行列であり、dot()はドット積関数である。ブロック６０４では、コンピューティング装置２００は、選択された文／表現について表現木を生成する。特に、コンピューティング装置２００は図７のＡに示されるような表現木を生成してもよい。図のように、表現木７００は、複数の内部ノードおよび端末ノードを含む。特に、例示的実施形態では、表現木７００は、演算（＝、＋、*およびdot()）を示す内部ノードを含み、対応する演算のオペランドを示す子ノードを含む。さらに、表現木７００は、変数／配列および／またはスカラー定数（v1、v2、v3、v4、v5およびM）を示す端末ノードを含む。例示的な表現v1＝v2＋v3*dot(M*v4,v5)、よって表現木７００は二項演算のみを含んでいるが、他の実施形態では、いかなる具体的な表現および表現木も、（たとえば表現における三項演算子のため）異なる数のオペランドをもつ演算を含みうることは理解されるはずである。よって、表現木の特定の演算ノードは、他の実施形態では、二つより多いまたは少ない子ノードを含むことがある。
【００３１】
ブロック６０６では、コンピューティング装置２００は、表現木を、可能であれば複数の部分木に分解する。そうすることにおいて、ブロック６０８において、コンピューティング装置２００は、表現木の内部ノードの結果型を判別してもよい。例示的実施形態では、内部ノードの結果型が数であれば、そのノードとその親との間のエッジは切断され、表現木は二つの部分木に分解される。いくつかの実施形態において、内部ノードが関数であれば、その結果型を判別するために、その関数のソース・コードが解析されてもよい。他の実施形態では、コンピューティング装置２００は、相互依存配列解析のために結果型を判別するために、関数のメタデータ（たとえばコンピューティング装置２００のユーザーから受領される）に頼ってもよい。例示的実施形態では、表現木および／または部分木は、もとの表現木がより小さな部分木に分解できなくなるまで分解される。表現木７００に関わる例示的実施形態では、dot(M*v4,v5)演算はスカラー値を生成する。よって、表現木７００は、図７のＢに示されるように、dot()ノードとその親との間のリンクを断ち切ることによって二つの部分木７０２に分解される。
【００３２】
図６のブロック６１０では、コンピューティング装置２００は、生成された表現部分木のそれぞれについて相互依存する配列の集合／クラスターを生成または決定する。具体的には、例示的実施形態では、特定の部分木における各配列／変数が、その特定の部分木に関連付けられた集合／クラスター内に含まれる。たとえば、図７のＡ〜Ｂの例示的実施形態では、第一の部分木７０２の配列／変数v1、v2およびv3が第一のクラスターに含められ、第二の部分木のMが第二のクラスターに含められる。図６のブロック６１２では、コンピューティング装置２００は、別の文／表現を解析するかどうかを判定する。たとえば、例示的実施形態では、コンピューティング装置２００は、表現の配列の相互依存性について解析されていない他の表現があるかどうかを判定する。コンピューティング装置２００が別の表現を解析することを決定する場合、方法６００はブロック６０２に戻り、そこでコンピューティング装置２００は別の表現を解析のために同定し、選択する。
【００３３】
図５の参照に戻ると、ブロック５１８において、コンピューティング装置２００は、コード領域における並べ替え可能な配列を発見するために、同定されたコード領域に対して双方向データ・フロー解析を実行する。後述するように、コンピューティング装置２００は、たとえば提供された並べ替えるべき第一の配列（FAR）に基づいて並べ替え可能な配列を発見するために、順方向および逆方向伝搬関数、順方向および逆方向伝達関数および／または他の関数を利用してもよい。たとえば、順方向相互依存配列伝搬関数は
【００３４】
【数１】
0006377699.tif 000002
に従って定義されてもよい。ここで、←付きのIA()は順方向伝搬関数、Bは表現、Xは通過すべき入力配列の集合、Cはクラスター、C.RHSはクラスターの右辺（すなわち、対応する表現によって使われる配列を示す）である。さらに、逆方向相互依存配列伝搬関数は
【００３５】
【数２】
0006377699.tif 000003
に従って定義されてもよい。ここで、→付きのIA()は逆方向伝搬関数、C.LHSはクラスターの左辺（すなわち、対応する表現によって定義される配列を示す）である。
【００３６】
たとえば、上記の例示的な表現v1＝v2＋v3*dot(M*v4,v5)に基づくと、相互依存配列解析は、（たとえば二つの部分木７０２に基づく）二つのクラスターを与える：第一のクラスター{v1|v2,v3}および第二のクラスター{  |M,v4,v5}である。ここで、|は定義される配列／変数（すなわち左辺のもの）を使用される配列／変数（すなわち右辺のもの）から分離する。
【００３７】
例として、そのような実施形態では、次のことが理解されるはずである。すなわち、
【００３８】
【数３】
0006377699.tif 000004
これはv1が第一のクラスターの右辺にも第二のクラスターの右辺にも含まれないため。
【００３９】
【数４】
0006377699.tif 000005
これはv2が第一のクラスターの右辺にあるため。
【００４０】
【数５】
0006377699.tif 000006
これはv2が第一のクラスターの右辺にあり、どのクラスターの右辺にもないuは結果に影響しないため。
【００４１】
【数６】
0006377699.tif 000007
これはv2が第一のクラスターの右辺にあり、v4が第二のクラスターの右辺にあるため。
【００４２】
【数７】
0006377699.tif 000008
これはv1が第一のクラスターの左辺にあるため。
【００４３】
【数８】
0006377699.tif 000009
これはv1が第一のクラスターの左辺にあり、どのクラスターの左辺にもないv4は結果に影響しないためである。
【００４４】
例示的実施形態では、順方向伝達関数は
【００４５】
【数９】
0006377699.tif 000010
に従って定義されてもよい。ここで、←付きのIA()は順方向伝搬関数であり、Bは表現であり、Xは通過すべき並べ替え可能な配列の集合であり、def(B)は文Bにおける定義される配列の集合であり、use(B)は文Bにおける使用される配列の集合である。順方向伝達関数は文Bの前からその後へ、その文の右辺および左辺を順に通って通過することを示すことは理解されるはずである。また、順方向伝達関数による文Bを通った伝搬の間に起こりうる、さらなる「成長」が起こりうる二つの場合があることも理解されるはずである。すなわち、第一項
【００４６】
【数１０】
0006377699.tif 000011
を満たす配列と、第二項
【００４７】
【数１１】
0006377699.tif 000012
を満たす配列である。よって、Xにおける入力配列が文Bによって使われる場合、並べ替え可能な配列の新しい集合は、クラスターの右辺にその配列があるようなクラスターすべてを含む。第一文は、ある表現の右辺における並べ替えられた配列は、同じクラスターにおける他の各配列の並べ替えを必要とすることがありうることを反映していることが理解されるはずである。さらに、入力配列が表現Bによって使用されるのでも定義されるのでもない場合、その配列は並べ替えられた配列の新しい集合に含まれることが理解されるはずである。換言すれば、入力の並べ替えられた配列が通過され、表現Bのどの配列にも影響せず、どの配列によっても影響されない場合、その並べ替えられた入力配列は、その表現の後に、並べ替えられたままであるべきである。
【００４８】
逆方向伝達関数は
【００４９】
【数１２】
0006377699.tif 000013
に従って定義されてもよい。ここで、←付きのIA()は順方向伝搬関数であり、→付きのIA()は逆方向伝搬関数であり、Bは表現であり、Xは通過すべき並べ替え可能な配列の集合であり、def(B)は文Bにおける定義される配列の集合であり、use(B)は文Bにおける使用される配列の集合であり、.RHSはクラスターの右辺を定義する。逆方向伝達関数は文Bの後からその前へ、その文の左辺および右辺を順に通って通過することを示すことは理解されるはずである。さらに、逆方向伝達関数による文Bを通った伝搬の間に起こりうる、さらなる「成長」が起こりうる三つの場合があることが理解されるはずである。すなわち、第一項
【００５０】
【数１３】
0006377699.tif 000014
を満たす配列、第二項
【００５１】
【数１４】
0006377699.tif 000015
を満たす配列、あるいは第三項
【００５２】
【数１５】
0006377699.tif 000016
を満たす配列である。
【００５３】
いくつかの実施形態では、コンピューティング装置２００は、図８に示されるような双方向データ・フロー解析を実行するための方法８００を実行してもよい。いくつかの実施形態では、双方向データ・フロー解析は、各ブロックBが文／表現である制御フロー・グラフ（CFG:  Control-Flow  Graph）に対してはたらく。例示的方法８００はブロック８０２で始まる。ここでは、コンピューティング装置２００はコード領域内の文／表現の入力および出力集合／状態を初期化する。そうするために、コード領域外の任意の文／表現の入力および出力集合はまず空集合に初期化されてもよい。さらに、各領域エントリーについて、出力集合は、例示的実施形態では、並べ替えるべき第一の配列（FAR）に初期化される。上記のように、FARは、コンピューティング装置２００のユーザーによって提供されてもよく、あるいは他の仕方でコンパイラー３１４によって決定されてもよい。コード領域内の他の文について、出力集合は全体集合に設定されてもよい。いくつかの実施形態では、コード領域内の文の入力集合は、その後のステップにおいて自動的にインスタンス生成されうるので、初期化されない。より形式的には、いくつかの実施形態では、コード領域の外のすべての文BはIn[B]＝Out[B]＝φに従って初期化されてもよい。ここで、In[B]は入力集合であり、Out[B]は出力集合であり、コード領域内のすべての文は、BがエントリーであればOut[B]＝FAR[B]となり、そうでなければOut[B]は全体集合に等しくなるよう初期化されてもよい。
【００５４】
ブロック８０４では、コンピューティング装置２００は、コード領域における文の入力集合および出力集合を事前調整する。そうするために、ブロック８０６では、コンピューティング装置２００は順方向伝達関数を文に適用してもよい。よって、各文Bについて、入力集合In[B]は、すべての先行者の後で並べ替え可能である配列を含み、出力集合Out[B]は順方向伝達関数に基づいて文Bを通じてIn[B]を伝搬させた結果であることが理解されるはずである。これは、入力集合および出力集合に変化がなくなるまで繰り返されてもよい。より形式的には、いくつかの実施形態では、Bがコード領域のエントリーでないコード領域内のすべての文Bは、
【００５５】
【数１６】
0006377699.tif 000017
に従って事前調整されてもよい。ここで、pred()はBの先行表現の集合である。
【００５６】
いくつかの実施形態では、ブロック８０８において、コンピューティング装置２００は（たとえば逆方向伝達関数について）伝達関数最適化を選択してもよい。特に、例示的実施形態では、コンピューティング装置２００は、最適化なしに、配列のライブ性に基づく最適化を用いて、あるいはコード領域内のさまざまな表現の実行頻度に基づく最適化を用いて、逆方向伝達関数を適用してもよい。
【００５７】
ブロック８１０では、コンピューティング装置２００は逆方向伝達関数をコード領域内の文に適用する。そうすることにおいて、ブロック８１２では、コンピューティング装置２００は、選択された最適化に基づいて逆方向伝達関数を適用してもよい。例示的実施形態では、逆方向伝達関数は、すべての後継者の前で並べ替え可能な配列を追加することによってOut[B]を拡大してもよく、および／またはその特定の逆方向伝達関数に基づいてBを通じてOut[B]を伝搬させた結果である配列を追加することによってIn[B]が拡大されてもよい。ライブ性最適化が用いられる実施形態では、変数が後継者の前に「デッド」である場合（すなわち、後継者を通るいかなる実行経路においても使われない場合）、その変数は、人為的に、後継者の前に並べ替えられることができる。そうすることによってプログラムの意味内容が影響を受けないからである（たとえば、その配列はいずれにせよその点では不使用である）。実行頻度最適化が用いられる実施形態では、文Bが二つ以上の後継ブロックをもち、実行頻度が（たとえば所定の閾値に基づいて）有意に異なる場合には、最も頻度の高い後継者xが常に、In[x]内の並べ替え可能な諸配列がOut[B]まで伝搬させられることを許容してもよい。たとえば、特定の後継者xがループ内であり、他のすべてがループ外である場合、その後継者xの伝搬は、文Bとxとの間における配列並べ替えの挿入を回避してもよい。むろん、いくつかの実施形態では、Bとx以外の後継者との間において、それらの配列のうち一つまたは複数の配列の逆並べ替え関数を挿入することが必要であることがある。より形式的には、いくつかの実施形態では、領域内のすべての文Bについて、逆方向伝達関数は
【００５８】
【数１７】
0006377699.tif 000018
と、ライブ性最適化が用いられる場合には
【００５９】
【数１８】
0006377699.tif 000019
実行頻度最適化が用いられる場合には
【００６０】
【数１９】
0006377699.tif 000020
あるいは最適化が用いられない場合には
【００６１】
【数２０】
0006377699.tif 000021
のうちの一つとに従って適用されてもよい。ここで、succs(B)は文Bのすべての後継者の集合であり、
【００６２】
【数２１】
0006377699.tif 000022
であり、Frequent[B]＝In[x]、ここでx∈succs(B)であり、Bのすべての後継者のうちで最も頻繁に実行されるものであり、Dead[S]は後継者Sの前にデッドであるが他の後継者の前ではデッドでない（すなわち、すべての後継者の間では「部分的にデッド」である）変数／配列の集合であり、LiveIn[S]は後継者Sの前でライブである変数／配列の集合である。
【００６３】
ブロック８１４では、コンピューティング装置２００は順方向伝達関数をコード領域内の文に適用する。順方向伝達関数についての適用は、事前調整に関して上記したものと同様であるが、In[B]およびOut[B]はそれらのもとの値を保持し、新たな配列をもって「成長」することは理解されるはずである。より形式的には、いくつかの実施形態では、コード領域内の文Bのすべてについて、順方向伝達関数は
【００６４】
【数２２】
0006377699.tif 000023
に従って適用されてもよい。ブロック８１８では、コンピューティング装置２００は入力集合および出力集合が不変であるかどうかを判定する。もしそうであれば、方法８００はブロック８１０に戻り、そこで逆方向伝達関数が再び文に適用される。換言すれば、入力集合と出力集合が変わらなくなり、安定するまで、逆方向および順方向の伝達関数が逐次反復的に適用される。
【００６５】
図５に戻って参照するに、ブロック５２０において、コンピューティング装置２００は、発見された並べ替え可能な配列に基づいてプログラム・コードを変換する。特に、コンピューティング装置２００は、コード領域内またはプログラム・コード内におけるコード領域の近傍内（たとえばコード領域の直前または直後）の一つまたは複数の配列を並べ替えるおよび／または逆並べ替えをするよう構成されている。上記のように、コンピューティング装置２００は、プログラム・コード自身の変換を実施するためにいかなる好適な技法を利用してもよい。いくつかの実施形態では、コード領域内の任意の文B1について、文B1からその後の文B2へのエッジ（たとえば制御フロー・グラフ（CFG）内のエッジ）があり、ここでB2はたとえばCFG内の別のブロックである、場合には、すべての変数／配列x∈LiveIn[B2]について、
【００６６】
【数２３】
0006377699.tif 000024
のときはプログラム・コード「x＝reorder(x)」がそのエッジにおいて挿入されてもよく、
【００６７】
【数２４】
0006377699.tif 000025
のときは、プログラム・コード「x＝reverse_reorder(x)」がそのエッジにおいて挿入されてもよい。文B2がコード領域のエントリーである実施形態では、すべての変数／配列x∈LiveIn[B2]について、x∈In[B]であるときはプログラム・コード「x＝reorder(x)」がB2の前に挿入されてもよい。
【００６８】
いくつかの実施形態では、方法４００、５００、６００および／または８００の任意の一つまたは複数が、コンピュータ可読媒体上に記憶されるさまざまな命令として具現されてもよく、該命令がプロセッサ２１０および／またはコンピューティング装置２００の他のコンポーネントによって実行されてコンピューティング装置２００にそれぞれの方法４００、５００、６００および／または８００を実行させてもよいことは理解されるはずである。コンピュータ可読媒体は、コンピューティング装置２００が読むことができるいかなる型の媒体として具現されてもよく、メモリ２１４、データ記憶２１６、コンピューティング装置２００の他のメモリもしくはデータ記憶デバイス、コンピューティング装置２００の周辺装置２２０が読むことのできるポータブル・メディアおよび／または他の媒体を含むがそれに限られない。
【００６９】
部分的なテーブル９００は、二つの文／ブロック：B1:F＝EおよびB2:H＝F＋Gのみを含む単純なコード領域に対する双方向解析の適用から帰結する結果を描いている。図のように、初期化段階の間に、B1の出力集合は発見すべき第一の配列（FAR）を割り当てられる。これはこの個別的な実施形態では{F}である（たとえばユーザーによって選択される）。B2の出力集合は全体集合（universal  set）を割り当てられる。事前調整の間、コンピューティング装置２００は上記のように順方向伝達関数の順方向通過９０２を適用し、その結果、B2は出力集合{F,G,H}を割り当てられる。図のように、文B2の入力集合は文B1の出力集合と同じである。これは、B1とB2の間に、集合を変えるような文がないからである。コンピューティング装置２００はその後、逆方向伝達関数の逆方向通過９０４を適用し、その結果、B2は入力集合{F,G}をもち、B1は出力集合{F,G}および入力集合{E,G}をもつ。図のように、そのような実施形態では、コンピューティング装置２００は逆方向伝達関数および順方向電圧関数を、文B1およびB2のそれぞれの入力集合および出力集合が変わらなくなるまで逐次反復的に適用する。
【００７０】
ここで図１０を参照するに、プログラム・コードから同定されたコード領域を描く制御フロー・グラフ１０００が示されている。図のように、グラフ１０００は、プログラム・コードのさまざまな文を描く複数のブロックB1〜B13を含んでいる。この例示的実施形態では、同定されたコード領域はブロックB1〜B12を含む。一方、ブロックB13はコード領域の外である。図１１〜図１６は、さまざまな双方向フロー解析アルゴリズム（すなわち最適化ありおよびなし）の適用からの結果および結果として得られる変換されたプログラム・コードを描いていることが理解されるはずである。さらに、一つの双方向フロー解析アルゴリズム（たとえば最適化あり）の適用からの結果として得られる変換コードは該結果として得られる変換コードにおけるいくつかの文を別の双方向フロー解析アルゴリズム（たとえば最適化なし）の適用から持ち上げる／移すことの結果として見ることもできるが、本稿に記載される技法ではそうする必要はないことがある。いくつかの実施形態では、それぞれの結果として得られる変換されたコードは、対応する双方向フロー解析アルゴリズムの結果に基づくだけで生成されうる。
【００７１】
最適化なしに図１０のプログラム・コードに双方向解析を適用することからの結果の部分的なテーブル１１００が図１１に示されている。部分的なテーブル１１００（および後述するテーブル１３００および１５００）は、本稿に記載される初期化、事前調整および第一の逆方向通過の段階のみを含むことが理解されるはずである。しかしながら、実際上は、テーブル全体が本稿に記載される技法に基づいて完成されうる。テーブル１１００に対応する図１２の制御フロー・グラフ１２００に示されるように、プログラム・コードは、コード領域内のさまざまなプログラミング点において変数／配列（たとえばp,x,rおよびi）を並べ替え、逆並べ替えするよう、変換される。
【００７２】
上記のように、いくつかの実施形態では、双方向フロー解析は、変数ライブ性を考慮に入れるよう最適化されてもよい。そのような最適化を用いた双方向フロー解析を適用する結果は、図１３のテーブル１３００に部分的に示されており、対応する変換されたプログラム・コードは図１４の制御フロー・グラフ１４００に示されている。図示され、上記されるように、「部分的にデッドな」変数（たとえばA,p,rおよびi）に関連する並べ替え関数は、より効率的な実行のために、コード領域内からコード領域前に移される。さらに他の実施形態では、双方向フロー解析は、上記のように実行頻度を考慮に入れるために最適化されてもよい。そのような最適化を用いた双方向フロー解析を適用する結果は、図１５のテーブル１５００に示されており、対応する変換されたプログラム・コードは図１６の制御フロー・グラフ１６００に描かれている。図示され、上記されるように、プログラム・コードの、あるいはより特定的にはコード領域の頻繁に実行される領域（たとえばループ）内に現われる並べ替え関数は、実行を改善するために、ループの外に（たとえばループおよび／またはコード領域の前に）移されてもよい。しかしながら、そのような実施形態では、追加的な逆並べ替え関数をコード領域内に置くことが必要になることがある（プログラム・コード内に条件文がある状況では）。たとえば、例示的実施形態では、コード領域に続く「print(x)」文に出力される配列／変数が正確であることを保証するために、逆並べ替え関数が文B2とB13との間に含まれる。
【実施例】
【００７３】
本稿に開示される技術を例解する例を以下に与える。これらの技術の実施形態は、以下に記述される例の任意の一つまたは複数およびその任意の組み合わせを含みうる。
【００７４】
実施例１は、疎行列の自動並べ替えのためのコンピューティング装置であって、プログラム・コードのコード領域において定義された表現の分配性を判定する分配性解析モジュールであって、前記表現は、前記表現の意味内容が前記表現の入力の並べ替えか出力の並べ替えかによって影響されない場合に分配性であると判定される、分配性解析モジュールと；前記表現に対して相互依存配列解析を実行して、前記表現の相互依存する配列の一つまたは複数のクラスターを決定する相互依存配列解析モジュールであって、前記一つまたは複数のクラスターのうちのクラスターの各配列は、そのクラスターの他のそれぞれの配列と相互依存している、相互依存配列解析モジュールと；前記相互依存する配列の前記一つまたは複数のクラスターに基づく前記コード領域内の諸表現を通じた並べ替え可能な配列の逐次反復的な逆方向伝搬および順方向伝搬により、前記コード領域に対して双方向データ・フロー解析を実行する並べ替え可能配列発見モジュールであって、前記逆方向伝搬は逆方向伝達関数に基づき、前記順方向伝搬は順方向伝達関数に基づく、並べ替え可能配列発見モジュールとを有する、コンピューティング装置を含む。
【００７５】
実施例２は、実施例１の主題を含み、前記プログラム・コードの前記コード領域を同定する領域同定モジュールをさらに含む。
【００７６】
実施例３は、実施例１および２のいずれか一項記載の主題を含み、前記コード領域を同定することが、ループの本体内にコードを含み、フロー制御文を含まない、前記プログラム・コードの線形ループ領域を同定することを含む。
【００７７】
実施例４は、実施例１ないし３のいずれか一項記載の主題を含み、前記コード領域を同定することが、前記コンピューティング装置のコンパイラーによって前記コード領域を同定することを含む。
【００７８】
実施例５は、実施例１ないし４のいずれか一項記載の主題を含み、前記コード領域を同定することが、少なくともある閾値時間期間にわたって前記コンピューティング装置によって実行されるコード領域を同定することを含む。
【００７９】
実施例６は、実施例１ないし５のいずれか一項記載の主題を含み、前記領域同定モジュールがさらに、前記コンピューティング装置のコンパイラーにより前記プログラム・コードを受領する。
【００８０】
実施例７は、実施例１ないし６のいずれか一項記載の主題を含み、前記表現の分配性を判定することが、前記コード領域において定義されている各表現の分配性を判定することを含む。
【００８１】
実施例８は、実施例１ないし７のいずれか一項記載の主題を含み、前記相互依存配列解析を実行することが、各表現が分配性であるとの判定に応答して前記相互依存配列解析を実行することを含む。
【００８２】
実施例９は、実施例１ないし８のいずれか一項記載の主題を含み、前記表現の分配性を判定することが、陳述R(ε(i1,…,n))＝ε(R(i1),…,R(in))であることを判別することを含み、εは前記表現であり、Rは前記表現に対する並べ替えであり、i1,…,nは入力の集合である。
【００８３】
実施例１０は、実施例１ないし９のいずれか一項記載の主題を含み、前記表現の分配性を判定することが、（ｉ）前記表現が入力または出力構造が特定の形をもつことを要求する、（ｉｉ）前記表現が前記プログラム・コードの入力‐出力機能を定義する、（ｉｉｉ）前記表現がビット毎の再現性を要求する、あるいは（ｉｖ）前記表現が前記コンピューティング装置のコンパイラーにとって未知の関数を含む、のうちの少なくとも一つであるとの判定に応答して、前記表現を非分配性であると判定することを含む。
【００８４】
実施例１１は、実施例１ないし１０のいずれか一項記載の主題を含み、前記一つまたは複数のクラスターのうちのクラスターの各配列がそのクラスターの他のそれぞれの配列と相互依存していることにより、前記一つまたは複数のクラスターのうちの特定のクラスター内のある配列の並べ替えは、その特定のクラスターのそれぞれの他の配列に影響する。
【００８５】
実施例１２は、実施例１ないし１１のいずれか一項記載の主題を含み、前記相互依存配列解析を実行することが：前記表現についての表現木を生成する段階であって、前記表現木の各内部ノードは前記表現の演算を示し、前記表現木の各端末ノードは配列またはスカラーを示す、段階と；前記表現木を、配列の相互依存性に基づいて表現部分木の集合に分解する段階と；各表現部分木についての相互依存配列の対応するクラスターを、その表現部分木に含まれる配列に基づいて決定する段階とを実行することを含む。
【００８６】
実施例１３は、実施例１ないし１２のいずれか一項記載の主題を含み、前記表現木を、表現部分木の集合に分解することが、前記表現木の各内部ノードの結果型を判別することを含む。
【００８７】
実施例１４は、実施例１ないし１３のいずれか一項記載の主題を含み、前記双方向データ・フロー解析を実行することが：前記表現の入力集合および出力集合を初期化し；前記順方向伝達関数を並べ替えるべき第一の配列に適用することによって、前記表現の前記入力集合および前記出力集合を事前調整し；前記入力集合および前記出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む。
【００８８】
実施例１５は、実施例１ないし１４のいずれか一項記載の主題を含み、前記並べ替え可能配列発見モジュールがさらに、前記並べ替えるべき第一の配列を、前記コンピューティング装置のユーザーから受領する。
【００８９】
実施例１６は、実施例１ないし１５のいずれか一項記載の主題を含み、前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することが、各表現の入力集合および出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む。
【００９０】
実施例１７は、実施例１ないし１６のいずれか一項記載の主題を含み、少なくとも一つの配列を並べ替えるよう前記双方向データ・フロー解析に基づいて前記プログラム・コードを変換するコード変換モジュールをさらに有する。
【００９１】
実施例１８は、実施例１ないし１７のいずれか一項記載の主題を含み、前記コード領域内の各文における前記コード領域内の各変数のライブ性を判別するライブ性解析モジュールをさらに含む。
【００９２】
実施例１９は、疎行列の自動並べ替えの方法を含む。本方法は、コンピューティング装置によって、プログラム・コードのコード領域において定義された表現の分配性を判定する段階であって、前記表現は、前記表現の意味内容が前記表現の入力の並べ替えか出力の並べ替えかによって影響されない場合に分配性であると判定される、段階と；前記コンピューティング装置によって、前記表現に対して相互依存配列解析を実行して、前記表現の相互依存する配列の一つまたは複数のクラスターを決定する段階であって、前記一つまたは複数のクラスターのうちのクラスターの各配列は、そのクラスターの他のそれぞれの配列と相互依存している、段階と；前記コンピューティング装置によって、前記相互依存する配列の前記一つまたは複数のクラスターに基づく前記コード領域内の諸表現を通じた並べ替え可能な配列の逐次反復的な逆方向伝搬および順方向伝搬により、前記コード領域に対して双方向データ・フロー解析を実行する段階であって、前記逆方向伝搬は逆方向伝達関数に基づき、前記順方向伝搬は順方向伝達関数に基づく、段階とを含む。
【００９３】
実施例２０は、実施例１９の主題を含み、前記コンピューティング装置によって、前記プログラム・コードの前記コード領域を同定する段階をさらに含む。
【００９４】
実施例２１は、実施例１９または２０記載の主題を含み、前記コード領域を同定することが、ループの本体内にコードを含み、フロー制御文を含まない、前記プログラム・コードの線形ループ領域を同定することを含む。
【００９５】
実施例２２は、実施例１９ないし２１のいずれか一項記載の主題を含み、前記コード領域を同定することが、前記コンピューティング装置のコンパイラーによって前記コード領域を同定することを含む。
【００９６】
実施例２３は、実施例１９ないし２２のいずれか一項記載の主題を含み、前記コード領域を同定することが、少なくともある閾値時間期間にわたって前記コンピューティング装置によって実行されるコード領域を同定することを含む。
【００９７】
実施例２４は、実施例１９ないし２３のいずれか一項記載の主題を含み、前記コンピューティング装置のコンパイラーにより前記プログラム・コードを受領する段階をさらに含む。
【００９８】
実施例２５は、実施例１９ないし２４のいずれか一項記載の主題を含み、前記表現の分配性を判定することが、前記コード領域において定義されている各表現の分配性を判定することを含む。
【００９９】
実施例２６は、実施例１９ないし２５のいずれか一項記載の主題を含み、前記相互依存配列解析を実行することが、各表現が分配性であると判定することに応答して前記相互依存配列解析を実行することを含む。
【０１００】
実施例２７は、実施例１９ないし２６のいずれか一項記載の主題を含み、前記表現の分配性を判定することが、陳述R(ε(i1,…,n))＝ε(R(i1),…,R(in))であることを判別することを含み、εは前記表現であり、Rは前記表現に対する並べ替えであり、i1,…,nは入力の集合である。
【０１０１】
実施例２８は、実施例１９ないし２７のいずれか一項記載の主題を含み、前記表現の分配性を判定することが、（ｉ）前記表現が入力または出力構造が特定の形をもつことを要求する、（ｉｉ）前記表現が前記プログラム・コードの入力‐出力機能を定義する、（ｉｉｉ）前記表現がビット毎の再現性を要求する、あるいは（ｉｖ）前記表現が前記コンピューティング装置のコンパイラーにとって未知の関数を含む、のうちの少なくとも一つであるとの判定に応答して、前記表現を非分配性であると判定することを含む。
【０１０２】
実施例２９は、実施例１９ないし２８のいずれか一項記載の主題を含み、前記一つまたは複数のクラスターのうちのクラスターの各配列がそのクラスターの他のそれぞれの配列と相互依存していることにより、前記一つまたは複数のクラスターのうちの特定のクラスター内のある配列の並べ替えは、その特定のクラスターのそれぞれの他の配列に影響する。
【０１０３】
実施例３０は、実施例１９ないし２９のいずれか一項記載の主題を含み、前記相互依存配列解析を実行することが：前記表現についての表現木を生成する段階であって、前記表現木の各内部ノードは前記表現の演算を示し、前記表現木の各端末ノードは配列またはスカラーを示す、段階と；前記表現木を、配列の相互依存性に基づいて表現部分木の集合に分解する段階と；各表現部分木についての相互依存配列の対応するクラスターを、その表現部分木に含まれる配列に基づいて決定する段階とを含む。
【０１０４】
実施例３１は、実施例１９ないし３０のいずれか一項記載の主題を含み、前記表現木を、表現部分木の集合に分解することが、前記表現木の各内部ノードの結果型を判別することを含む。
【０１０５】
実施例３２は、実施例１９ないし３１のいずれか一項記載の主題を含み、前記双方向データ・フロー解析を実行することが：前記表現の入力集合および出力集合を初期化し；前記順方向伝達関数を並べ替えるべき第一の配列に適用することによって、前記表現の前記入力集合および前記出力集合を事前調整し；前記入力集合および前記出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む。
【０１０６】
実施例３３は、実施例１９ないし３２のいずれか一項記載の主題を含み、前記コンピューティング装置によって、前記並べ替えるべき第一の配列を、前記コンピューティング装置のユーザーから受領する段階をさらに含む。
【０１０７】
実施例３４は、実施例１９ないし３３のいずれか一項記載の主題を含み、前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することが、各表現の入力集合および出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む。
【０１０８】
実施例３５は、実施例１９ないし３４のいずれか一項記載の主題を含み、少なくとも一つの配列を並べ替えるよう前記双方向データ・フロー解析に基づいて前記プログラム・コードを変換する段階をさらに含む。
【０１０９】
実施例３６は、実施例１９ないし３５のいずれか一項記載の主題を含み、前記コンピューティング装置によって、前記コード領域内の各文における前記コード領域内の各変数のライブ性を判別する段階をさらに含む。
【０１１０】
実施例３７は、プロセッサと、複数の命令を記憶しているメモリとを有するコンピューティング装置を含む。前記命令は、前記プロセッサによって実行されたときに、前記コンピューティング装置に実施例１９ないし３６のうちいずれか一項記載の方法を実行させる。
【０１１１】
実施例３８は、複数の命令を記憶している一つまたは複数の機械可読記憶媒体を含む。前記命令は、実行されることに応答して、コンピューティング装置が実施例１９ないし３６のうちいずれか一項記載の方法を実行することにつながる。
【０１１２】
実施例３９は、実施例１９ないし３６のうちいずれか一項記載の方法を実行するための手段を有するコンピューティング装置を含む。
【０１１３】
実施例４０は、疎行列の自動並べ替えのためのコンピューティング装置を含む。コンピューティング装置は、プログラム・コードのコード領域において定義された表現の分配性を判定する手段であって、前記表現は、前記表現の意味内容が前記表現の入力の並べ替えか出力の並べ替えかによって影響されない場合に分配性であると判定される、手段と；前記表現に対して相互依存配列解析を実行して、前記表現の相互依存する配列の一つまたは複数のクラスターを決定する手段であって、前記一つまたは複数のクラスターのうちのクラスターの各配列は、そのクラスターの他のそれぞれの配列と相互依存している、手段と；前記相互依存する配列の前記一つまたは複数のクラスターに基づく前記コード領域内の諸表現を通じた並べ替え可能な配列の逐次反復的な逆方向伝搬および順方向伝搬により、前記コード領域に対して双方向データ・フロー解析を実行する手段であって、前記逆方向伝搬は逆方向伝達関数に基づき、前記順方向伝搬は順方向伝達関数に基づく、手段とを含む。
【０１１４】
実施例４１は、実施例４０の主題を含み、前記プログラム・コードの前記コード領域を同定する手段をさらに含む。
【０１１５】
実施例４２は、実施例４０または４１記載の主題を含み、前記コード領域を同定する手段が、ループの本体内にコードを含み、フロー制御文を含まない、前記プログラム・コードの線形ループ領域を同定する手段を含む。
【０１１６】
実施例４３は、実施例４０ないし４２のいずれか一項記載の主題を含み、前記コード領域を同定する手段が、前記コンピューティング装置のコンパイラーによって前記コード領域を同定する手段を含む。
【０１１７】
実施例４４は、実施例４０ないし４３のいずれか一項記載の主題を含み、前記コード領域を同定する手段が、少なくともある閾値時間期間にわたって前記コンピューティング装置によって実行されるコード領域を同定する手段を含む。
【０１１８】
実施例４５は、実施例４０ないし４４のいずれか一項記載の主題を含み、前記コンピューティング装置のコンパイラーにより前記プログラム・コードを受領する手段をさらに含む。
【０１１９】
実施例４６は、実施例４０ないし４５のいずれか一項記載の主題を含み、前記表現の分配性を判定する手段が、前記コード領域において定義されている各表現の分配性を判定する手段を含む。
【０１２０】
実施例４７は、実施例４０ないし４６のいずれか一項記載の主題を含み、前記相互依存配列解析を実行する手段が、各表現が分配性であると判定することに応答して前記相互依存配列解析を実行する手段を含む。
【０１２１】
実施例４８は、実施例４０ないし４７のいずれか一項記載の主題を含み、前記表現の分配性を判定する手段が、陳述R(ε(i1,…,n))＝ε(R(i1),…,R(in))であることを判別する手段を含み、εは前記表現であり、Rは前記表現に対する並べ替えであり、i1,…,nは入力の集合である。
【０１２２】
実施例４９は、実施例４０ないし４８のいずれか一項記載の主題を含み、前記表現の分配性を判定する手段が、（ｉ）前記表現が入力または出力構造が特定の形をもつことを要求する、（ｉｉ）前記表現が前記プログラム・コードの入力‐出力機能を定義する、（ｉｉｉ）前記表現がビット毎の再現性を要求する、あるいは（ｉｖ）前記表現が前記コンピューティング装置のコンパイラーにとって未知の関数を含む、のうちの少なくとも一つであるとの判定に応答して、前記表現を非分配性であると判定することを含む。
【０１２３】
実施例５０は、実施例４０ないし４９のいずれか一項記載の主題を含み、前記一つまたは複数のクラスターのうちのクラスターの各配列がそのクラスターの他のそれぞれの配列と相互依存していることにより、前記一つまたは複数のクラスターのうちの特定のクラスター内のある配列の並べ替えは、その特定のクラスターのそれぞれの他の配列に影響する。
【０１２４】
実施例５１は、実施例４０ないし５０のいずれか一項記載の主題を含み、前記相互依存配列解析を実行する手段が：前記表現についての表現木を生成する手段であって、前記表現木の各内部ノードは前記表現の演算を示し、前記表現木の各端末ノードは配列またはスカラーを示す、手段と；前記表現木を、配列の相互依存性に基づいて表現部分木の集合に分解する手段と；各表現部分木についての相互依存配列の対応するクラスターを、その表現部分木に含まれる配列に基づいて決定する手段とを含む。
【０１２５】
実施例５２は、実施例４０ないし５１のいずれか一項記載の主題を含み、前記表現木を、表現部分木の集合に分解する手段が、前記表現木の各内部ノードの結果型を判別する手段を含む。
【０１２６】
実施例５３は、実施例４０ないし５２のいずれか一項記載の主題を含み、前記双方向データ・フロー解析を実行する手段が：前記表現の入力集合および出力集合を初期化する手段と；前記順方向伝達関数を並べ替えるべき第一の配列に適用することによって、前記表現の前記入力集合および前記出力集合を事前調整する手段と；前記入力集合および前記出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用する手段とを含む。
【０１２７】
実施例５４は、実施例４０ないし５３のいずれか一項記載の主題を含み、前記並べ替えるべき第一の配列を、前記コンピューティング装置のユーザーから受領する手段をさらに含む。
【０１２８】
実施例５５は、実施例４０ないし５４のいずれか一項記載の主題を含み、前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用する手段が、各表現の入力集合および出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む。
【０１２９】
実施例５６は、実施例４０ないし５５のいずれか一項記載の主題を含み、少なくとも一つの配列を並べ替えるよう前記双方向データ・フロー解析に基づいて前記プログラム・コードを変換する手段をさらに含む。
【０１３０】
実施例５７は、実施例４０ないし５６のいずれか一項記載の主題を含み、前記コード領域内の各文における前記コード領域内の各変数のライブ性を判別する手段をさらに含む。
いくつかの態様を記載しておく。
〔態様１〕
疎行列の自動並べ替えのためのコンピューティング装置であって：
プログラム・コードのコード領域において定義された表現の分配性を判定する分配性解析モジュールであって、前記表現は、前記表現の意味内容が前記表現の入力の並べ替えか出力の並べ替えかによって影響されない場合に分配性であると判定される、分配性解析モジュールと；
前記表現に対して相互依存配列解析を実行して、前記表現の相互依存する配列の一つまたは複数のクラスターを決定する相互依存配列解析モジュールであって、前記一つまたは複数のクラスターのうちのクラスターの各配列は、そのクラスターの他のそれぞれの配列と相互依存している、相互依存配列解析モジュールと；
前記相互依存する配列の前記一つまたは複数のクラスターに基づく前記コード領域内の諸表現を通じた並べ替え可能な配列の逐次反復的な逆方向伝搬および順方向伝搬により、前記コード領域に対して双方向データ・フロー解析を実行する並べ替え可能配列発見モジュールであって、前記逆方向伝搬は逆方向伝達関数に基づき、前記順方向伝搬は順方向伝達関数に基づく、並べ替え可能配列発見モジュールとを有する、
コンピューティング装置。
〔態様２〕
前記プログラム・コードの前記コード領域を同定する領域同定モジュールをさらに有する、態様１記載のコンピューティング装置。
〔態様３〕
前記コード領域を同定することが、ループの本体内にコードを含み、フロー制御文を含まない、前記プログラム・コードの線形ループ領域を同定することを含む、態様２記載のコンピューティング装置。
〔態様４〕
前記コード領域を同定することが、前記コンピューティング装置のコンパイラーによって前記コード領域を同定することを含む、態様２記載のコンピューティング装置。
〔態様５〕
前記コード領域を同定することが、少なくともある閾値時間期間にわたって前記コンピューティング装置によって実行されるコード領域を同定することを含む、態様２記載のコンピューティング装置。
〔態様６〕
前記領域同定モジュールがさらに、前記コンピューティング装置のコンパイラーにより前記プログラム・コードを受領する、態様２記載のコンピューティング装置。
〔態様７〕
前記表現の分配性を判定することが、前記コード領域において定義されている各表現の分配性を判定することを含む、態様１記載のコンピューティング装置。
〔態様８〕
前記相互依存配列解析を実行することが、各表現が分配性であるとの判定に応答して前記相互依存配列解析を実行することを含む、態様７記載のコンピューティング装置。
〔態様９〕
前記表現の分配性を判定することが、陳述R(ε(i1,…,n))＝ε(R(i1),…,R(in))であることを判別することを含み、
εは前記表現であり、
Rは前記表現に対する並べ替えであり、
i1,…,nは入力の集合である、態様１ないし７のうちいずれか一項記載のコンピューティング装置。
〔態様１０〕
前記表現の分配性を判定することが、（ｉ）前記表現が入力または出力構造が特定の形をもつことを要求する、（ｉｉ）前記表現が前記プログラム・コードの入出力機能を定義する、（ｉｉｉ）前記表現がビット毎の再現性を要求する、あるいは（ｉｖ）前記表現が前記コンピューティング装置のコンパイラーにとって未知の関数を含む、のうちの少なくとも一つであるとの判定に応答して、前記表現を非分配性であると判定することを含む、態様１ないし８のうちいずれか一項記載のコンピューティング装置。
〔態様１１〕
前記一つまたは複数のクラスターのうちのクラスターの各配列がそのクラスターの他のそれぞれの配列と相互依存していることにより、前記一つまたは複数のクラスターのうちの特定のクラスター内のある配列の並べ替えは、その特定のクラスターのそれぞれの他の配列に影響する、態様１ないし８のうちいずれか一項記載のコンピューティング装置。
〔態様１２〕
前記相互依存配列解析を実行することが：
前記表現についての表現木を生成する段階であって、前記表現木の各内部ノードは前記表現の演算を示し、前記表現木の各端末ノードは配列またはスカラーを示す、段階と；
前記表現木を、配列の相互依存性に基づいて表現部分木の集合に分解する段階と；
各表現部分木についての相互依存配列の対応するクラスターを、その表現部分木に含まれる配列に基づいて決定する段階とを実行することを含む、
態様１記載のコンピューティング装置。
〔態様１３〕
前記表現木を、表現部分木の集合に分解することが、前記表現木の各内部ノードの結果型を判別することを含む、態様１２記載のコンピューティング装置。
〔態様１４〕
前記双方向データ・フロー解析を実行することが：
前記表現の入力集合および出力集合を初期化し；
前記順方向伝達関数を並べ替えるべき第一の配列に適用することによって、前記表現の前記入力集合および前記出力集合を事前調整し；
前記入力集合および前記出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む、
態様１記載のコンピューティング装置。
〔態様１５〕
前記並べ替え可能配列発見モジュールがさらに、前記並べ替えるべき第一の配列を、前記コンピューティング装置のユーザーから受領する、態様１４記載のコンピューティング装置。
〔態様１６〕
前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することが、各表現の入力集合および出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む、
態様１４記載のコンピューティング装置。
〔態様１７〕
少なくとも一つの配列を並べ替えるよう前記双方向データ・フロー解析に基づいて前記プログラム・コードを変換するコード変換モジュールをさらに有する、態様１ないし８のうちいずれか一項記載のコンピューティング装置。
〔態様１８〕
疎行列の自動並べ替えの方法であって：
コンピューティング装置によって、プログラム・コードのコード領域において定義された表現の分配性を判定する段階であって、前記表現は、前記表現の意味内容が前記表現の入力の並べ替えか出力の並べ替えかによって影響されない場合に分配性であると判定される、段階と；
前記コンピューティング装置によって、前記表現に対して相互依存配列解析を実行して、前記表現の相互依存する配列の一つまたは複数のクラスターを決定する段階であって、前記一つまたは複数のクラスターのうちのクラスターの各配列は、そのクラスターの他のそれぞれの配列と相互依存している、段階と；
前記コンピューティング装置によって、前記相互依存する配列の前記一つまたは複数のクラスターに基づく前記コード領域内の諸表現を通じた並べ替え可能な配列の逐次反復的な逆方向伝搬および順方向伝搬により、前記コード領域に対して双方向データ・フロー解析を実行する段階であって、前記逆方向伝搬は逆方向伝達関数に基づき、前記順方向伝搬は順方向伝達関数に基づく、段階とを含む、
方法。
〔態様１９〕
前記表現の分配性を判定することが、前記コード領域において定義されている各表現の分配性を判定することを含み、
前記相互依存配列解析を実行することが、各表現が分配性であると判定することに応答して前記相互依存配列解析を実行することを含む、
態様１８記載の方法。
〔態様２０〕
前記表現の分配性を判定することが、陳述R(ε(i1,…,n))＝ε(R(i1),…,R(in))であることを判別することを含み、
εは前記表現であり、
Rは前記表現に対する並べ替えであり、
i1,…,nは入力の集合である、
態様１８記載の方法。
〔態様２１〕
前記一つまたは複数のクラスターのうちのクラスターの各配列がそのクラスターの他のそれぞれの配列と相互依存していることにより、前記一つまたは複数のクラスターのうちの特定のクラスター内のある配列の並べ替えは、その特定のクラスターのそれぞれの他の配列に影響する、態様１８記載の方法。
〔態様２２〕
前記相互依存配列解析を実行することが：
前記表現についての表現木を生成する段階であって、前記表現木の各内部ノードは前記表現の演算を示し、前記表現木の各端末ノードは配列またはスカラーを示す、段階と；
前記表現木を、配列の相互依存性に基づいて表現部分木の集合に分解する段階と；
各表現部分木についての相互依存配列の対応するクラスターを、その表現部分木に含まれる配列に基づいて決定する段階とを含む、
態様１８記載の方法。
〔態様２３〕
前記双方向データ・フロー解析を実行することが：
前記表現の入力集合および出力集合を初期化し；
前記順方向伝達関数を並べ替えるべき第一の配列に適用することによって、前記表現の前記入力集合および前記出力集合を事前調整し；
前記入力集合および前記出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む、
態様１８記載の方法。
〔態様２４〕
前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することが、各表現の入力集合および出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む、
態様２３の方法。
〔態様２５〕
態様１８ないし２４のうちいずれか一項記載の方法をコンピューティング装置に実行させるためのコンピュータ・プログラム。
〔態様２６〕
態様２５記載のコンピュータ・プログラムを記憶している一つまたは複数のコンピュータ可読記憶媒体。
【符号の説明】
【０１３１】
２００  コンピューティング装置
２１０  プロセッサ
２１２  I/Oサブシステム
２１４  メモリ
２１６  データ記憶部
２１８  通信回路
２２０  周辺装置
３０２  領域識別モジュール
３０４  分配性解析モジュール
３０６  ライブ性解析モジュール
３０８  相互依存配列解析モジュール
３１０  並べ替え可能配列発見モジュール
３１２  コード変換モジュール
３１４  コンパイラー
５０２  疎行列をもつプログラムを受領
５０４  プログラム・コードのコード領域を同定
５０６  コード領域に対して分配性解析を実行
５０８  コード領域内の諸表現を同定
５１０  諸表現に対する、並べ替えの分配性を判別
５１２  分配性？
５１４  ライブ性解析を実行
５１６  相互依存配列解析を実行
５１８  双方向データ・フロー解析を実行
５２０  プログラム・コードを変換
６０２  解析のために文を同定し、選択
６０４  文について表現木を生成
６０６  表現木を部分木に分解
６０８  内部ノードの結果型を判別
６１０  各部分器について相互依存する配列の集合を決定
６１２  別の文？
８０２  文の入力集合および出力集合を初期化
８０４  コード領域における文の入力集合および出力集合を事前調整
８０６  順方向伝達関数を文に適用
８０８  伝達関数最適化を選択
８１０  逆方向伝達関数を文に適用
８１２  選択された最適化に基づいて逆方向伝達関数を適用
８１４  順方向伝達関数をコード領域内の文に適用
８１６  入力集合および出力集合が不変かどうかを判定
８１８  不変？
【図１】
0006377699.tif 000026
【図２】
0006377699.tif 000027
【図３】
0006377699.tif 000028
【図４】
0006377699.tif 000029
【図５】
0006377699.tif 000030
【図６】
0006377699.tif 000031
【図７】
0006377699.tif 000032
【図８】
0006377699.tif 000033
【図９】
0006377699.tif 000034
【図１０】
0006377699.tif 000035
【図１１】
0006377699.tif 000036
【図１２】
0006377699.tif 000037
【図１３】
0006377699.tif 000038
【図１４】
0006377699.tif 000039
【図１５】
0006377699.tif 000040
【図１６】
0006377699.tif 000041