【文献】
川端 英之 他,「疎行列に対応した行列言語コンパイラCMCの開発」,情報処理学会論文誌,日本,2004年10月15日,Vol.45 No.SIG11(ACS7),第378頁-第392頁
【文献】
長坂 侑亮 他,「GPUのキャッシュを考慮した疎行列ベクトル積計算手法の性能評価」,情報処理学会 研究報告,日本,情報処理学会,2014年 5月19日,Vol.2014-HPC-144 No.5,第1頁-第9頁
【文献】
長坂 侑亮 他,「疎行列ベクトル積計算を対象としたGPU向けメモリアクセス削減手法」,情報処理学会 研究報告,日本,情報処理学会,2015年10月 8日,Vol.2015-HPC-151 No.8,第1頁-第7頁
(58)【調査した分野】(Int.Cl.,DB名)
前記コード領域を同定することが、ループの本体内にコードを含み、フロー制御文を含まない、前記プログラム・コードの線形ループ領域を同定することを含む、請求項2記載のコンピューティング装置。
前記コード領域を同定することが、前記コンピューティング装置のコンパイラーによって前記コード領域を同定することを含む、請求項2記載のコンピューティング装置。
前記コード領域を同定することが、少なくともある閾値時間期間にわたって前記コンピューティング装置によって実行されるコード領域を同定することを含む、請求項2記載のコンピューティング装置。
前記相互依存配列解析を実行することが、各表現が分配性であるとの判定に応答して前記相互依存配列解析を実行することを含む、請求項7記載のコンピューティング装置。
前記一つまたは複数のクラスターのうちのクラスターの各配列がそのクラスターの他のそれぞれの配列と相互依存していることにより、前記一つまたは複数のクラスターのうちの特定のクラスター内のある配列の並べ替えは、その特定のクラスターのそれぞれの他の配列に影響する、請求項1ないし8のうちいずれか一項記載のコンピューティング装置。
前記並べ替え可能配列発見モジュールがさらに、前記並べ替えるべき第一の配列を、前記コンピューティング装置のユーザーから受領する、請求項14記載のコンピューティング装置。
前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することが、各表現の入力集合および出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む、
請求項14記載のコンピューティング装置。
少なくとも一つの配列を並べ替えるよう前記双方向データ・フロー解析に基づいて前記プログラム・コードを変換するコード変換モジュールをさらに有する、請求項1ないし8のうちいずれか一項記載のコンピューティング装置。
前記一つまたは複数のクラスターのうちのクラスターの各配列がそのクラスターの他のそれぞれの配列と相互依存していることにより、前記一つまたは複数のクラスターのうちの特定のクラスター内のある配列の並べ替えは、その特定のクラスターのそれぞれの他の配列に影響する、請求項18記載の方法。
前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することが、各表現の入力集合および出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む、
請求項23の方法。
【発明を実施するための形態】
【0005】
本開示の概念は、さまざまな修正および代替形を受けることができるものの、例としてその個別的な実施形態が図面において示されており、本稿において詳細に記載される。しかしながら、本開示の概念を開示される特定の形に限定する意図はなく、逆に、意図は、本開示および付属の請求項と整合するあらゆる修正、等価物および代替をカバーすることである。
【0006】
本明細書における「一つの実施形態」、「ある実施形態」、「例示的な実施形態」などへの言及は、記載されるその実施形態が特定の特徴、構造または特性を含みうることを示すが、すべての実施形態がその特定の特徴、構造または特性を含むこともあれば、必ずしも含まないこともある。さらに、そのような句は必ずしも同じ実施形態を指しているのではない。さらに、特定の特徴、構造または特性がある実施形態との関連で記述されるとき、そのような特徴、構造または特性を他の実施形態との関連で実施することは、明示されているか否かによらず、当業者の知識の範囲内であることを述べておく。さらに、「少なくとも一つの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)を意味することができる。
【0007】
開示される実施形態は、場合によっては、ハードウェア、ファームウェアもしくはソフトウェアまたはそれらの任意の組み合わせによって実装されうる。開示される実施形態は、一つまたは複数の一時的または非一時的な機械可読(たとえばコンピュータ可読)記憶媒体に搬送されるまたは記憶される命令として実装されてもよく、該命令は一つまたは複数のプロセッサによって読まれ、実行されてもよい。機械可読記憶媒体は、機械によって読み取り可能な形で情報を記憶または伝送するための任意の記憶装置、機構または他の物理的構造(たとえば、揮発性または不揮発性メモリ、メディア・ディスクまたは他のメディア・デバイス)として具現されうる。
【0008】
図面において、いくつかの構造的または方法の特徴が特定の配置および/または順序において示されることがあるが、そのような特定の配置および/または順序は必須ではないことがあることは理解しておくべきである。むしろ、いくつかの実施形態では、そのような特徴は、例示的な図に示したのとは異なる仕方および/または順序で配列されてもよい。さらに、構造的または方法の特徴が特定の図に含まれることは、そのような特徴がすべての実施形態において必要とされることを含意することは意図されていない。いくつかの実施形態では、含まれなくてもよく、あるいは他の特徴と組み合わされてもよい。
【0009】
ここで
図2を参照するに、疎行列の自動並べ替えのためのコンピューティング装置200が示されている。下記でより詳細に述べるように、コンピューティング装置200は、本稿に記載されるアルゴリズム(単数または複数)を(たとえば疎カーネルの実行を高速化するために)任意の並べ替え関数に自動的に適用して、該任意の関数に並べ替えが適用可能である/許容できるかどうかを自動的に判定し、もしそうであれば、根底にある表現(単数または複数)の意味内容(semantics)を変えることなく、該アルゴリズム(単数または複数)を適用するよう構成される。そのような自動的並べ替え技法が、たとえばしばしば誤りを起こしやすく時間がかかる工程いである手動の並べ替え最適化の必要性をなくすまたは減らすことにより、熟練したプログラマーの能力および/または効率をも改善しうることは理解されるはずである。例示的な実施形態では、コンピューティング装置200は、関心のある特定のコード領域における文が分配性である(distributive)ことを確認することによって、並べ替えの実現可能性を判別し、もしそうであれば、そのコード領域の外のコードが並べ替えによって影響されないよう、そのコード領域の前、後および/または中において並べ替えるおよび/または逆並べ替えをするべき配列(単数または複数)(たとえば、多次元行列および/または一次元ベクトル)を同定する。
【0010】
コンピューティング装置200は、本稿に記載される機能を実行できるいかなる型のコンピューティング装置またはシステムとして具現されてもよい。たとえば、いくつかの実施形態では、コンピューティング装置200はデスクトップ・コンピュータ、ラップトップ・コンピュータ、タブレット・コンピュータ、ノートブック、ネットブック、ウルトラブック(商標)、スマートフォン、携帯電話、ウェアラブル・コンピューティング装置、携帯情報端末、モバイル・インターネット装置、スマート装置、サーバー、ルーター、スイッチ、ハイブリッド装置および/または他の任意のコンピューティング/通信装置として具現されうる。
図2に示されるように、例示的なコンピューティング装置200は、プロセッサ210と、入出力(「I/O」)サブシステム212と、メモリ214と、データ記憶部216と、通信回路218と、一つまたは複数の周辺装置220とを含んでいる。むろん、コンピューティング装置200は、他の実施形態では、典型的なコンピューティング装置に普通に見出されるもののような他のまたは追加的なコンポーネント(たとえばさまざまな入出力装置および/または他のコンポーネント)を含んでいてもよい。さらに、いくつかの実施形態では、これらの例示的なコンポーネントの一つまたは複数が、別のコンポーネントに組み込まれたり、あるいは他の仕方で別のコンポーネントの一部分をなしたりしていてもよい。たとえば、いくつかの実施形態では、メモリ214またはその一部はプロセッサ210に組み込まれていてもよい。
【0011】
プロセッサ210は、本稿に記載される機能を実行することのできるいかなる型のプロセッサとして具現されてもよい。たとえば、プロセッサ210は、単一コアまたは複数コア・プロセッサ(単数または複数)、デジタル信号プロセッサ、マイクロコントローラまたは他のプロセッサもしくは処理/制御回路として具現されてもよい。同様に、メモリ214は、本稿に記載される機能を実行することができる任意の型の揮発性もしくは不揮発性メモリまたはデータ記憶として具現されてもよい。動作では、メモリ214は、オペレーティング・システム、アプリケーション、プログラム、ライブラリおよびドライバのようなコンピューティング装置200の動作の間に使用されるさまざまなデータおよびソフトウェアを記憶してもよい。メモリ214はI/Oサブシステム212を介してプロセッサ210に通信上結合されている。I/Oサブシステム212は、プロセッサ210、メモリ214およびコンピューティング装置200の他のコンポーネントとの入出力動作を容易にするための回路および/またはコンポーネントとして具現されてもよい。たとえば、I/Oサブシステム212は、メモリ・コントローラ・ハブ、入出力コントロール・ハブ、ファームウェア・デバイス、通信リンク(すなわちポイントツーポイント・リンク、バス・リンク、ワイヤ、ケーブル、光導波路、プリント回路基板トレースなど)および/または入出力動作を容易にするための他のコンポーネントおよびサブシステムとして具現されてもよく、あるいは他の仕方でそれらを含んでいてもよい。いくつかの実施形態では、I/Oサブシステム212は、システム・オン・チップ(SoC)の一部をなし、プロセッサ210、メモリ214およびコンピューティング装置200の他のコンポーネントとともに単一の集積回路チップに組み込まれていてもよい。
【0012】
データ記憶部216は、たとえばメモリ・デバイスおよび回路、メモリ・カード、ハードディスクドライブ、半導体ドライブまたは他のデータ記憶デバイスといった、データの短期または長期の記憶のために構成された任意の型のデバイス(単数または複数)として具現されてもよい。データ記憶部216および/またはメモリ214は、本稿に記載されるコンピューティング装置200の動作の間にさまざまなデータを記憶しうる。
【0013】
通信回路218は、コンピューティング装置200と他のリモート装置との間のネットワークを通じた通信を可能にすることができる任意の通信回路、装置またはそれらの集まりとして具現されてもよい。たとえば、いくつかの実施形態では、コンピューティング装置200は、ユーザー・プログラム、並べ替えるべき第一の配列(FAR: a first array to reorder)の特定情報および/または本稿に記載される機能を実行するための他の有用なデータをリモート・コンピューティング装置から受領してもよい。通信回路218は、そのような通信を実施するために任意の一つまたは複数の通信技術(たとえば、無線または有線の通信)および関連するプロトコル(たとえばイーサネット(登録商標)、ブルートゥース(登録商標)、WiMAX、LTE、5Gなど)を使うよう構成されていてもよい。
【0014】
周辺装置220は、任意の数の追加的な周辺装置またはインターフェース装置、たとえばスピーカー、マイクロフォン、追加的な記憶デバイスなどを含みうる。周辺装置220に含まれる具体的な装置は、たとえば、コンピューティング装置200の型および/または意図される使用に依存しうる。
【0015】
ここで
図3を参照するに、使用において、コンピューティング装置200は、疎行列の自動並べ替えのための環境300を確立する。例示的な環境300は、領域同定モジュール302、分配性解析モジュール304、ライブ性解析モジュール306、相互依存配列解析モジュール308、並べ替え可能配列発見モジュール310およびコード変換モジュール312を含む。環境300のさまざまなモジュールは、ハードウェア、ソフトウェア、ファームウェアまたはそれらの組み合わせとして具現されうる。たとえば、環境300のさまざまなモジュール、論理および他のコンポーネントは、プロセッサ210またはコンピューティング装置200の他のハードウェア・コンポーネントの一部をなしてもよいし、あるいはそれによって確立されてもよい。よって、いくつかの実施形態では、環境300のモジュールの一つまたは複数は、回路または電気デバイスの集まり(たとえば、領域同定回路302、分配性解析回路304、ライブ性解析回路306、相互依存配列解析回路308、並べ替え可能配列発見回路310および/またはコード変換回路312)として具現されてもよい。そのような実施形態では領域同定回路302、分配性解析回路304、ライブ性解析回路306、相互依存配列解析回路308、並べ替え可能配列発見回路310および/またはコード変換回路312の一つまたは複数はプロセッサ210、I/Oサブシステム212、メモリ214、データ記憶部216、通信回路218および/または周辺装置220の一つまたは複数の一部をなしてもよいことは理解されるはずである。さらに、いくつかの実施形態では、例示的なモジュールの一つまたは複数が別のモジュールの一部をなしてもよく、および/または例示的なモジュールの一つまたは複数が互いと独立であってもよい。
図3に示されるように、いくつかの実施形態では、環境300のさまざまなモジュールの一つまたは複数が、コンピューティング装置200のコンパイラー314の一部をなしてもよく、あるいはそれによって実行されてもよい。
【0016】
本稿で記載されるところでは、コンピューティング装置200は、たとえばプログラムの実行時間を改善するために、プログラムのコード領域に並べ替え変換を適用するよう構成されている。領域同定モジュール302は、並べ替えのために解析するべきコード領域を同定するよう構成されている。コード領域は、プログラムの任意の表現、ブロック、文、文/命令の集合/シーケンスおよび/または他の部分でありうる。たとえば、いくつかの実施形態では、コード領域は、逐次的ないくつかの文、ループ文(たとえば「for」「repeat…until」「while」など)、フロー制御文(たとえば、「if…else」「goto」「break」「exit」など)および/または他の文を含みうる。より特定的には、いくつかの実施形態では、領域同定モジュール302はフロー文を含まない線形なループ領域をコード領域として選択する。さらに、いくつかの実施形態では、領域同定モジュール302は、プログラムがかなりの実行時間(たとえば、少なくとも閾値時間期間、少なくとも閾値クロック・サイクル数および/または他の仕方で決定される時間)を費やすところのコード領域を選択してもよい。議論の簡単のため、「表現(expression)」、「ブロック(block)」および/または「文(statement)」は、具体的な文脈に依存して本記述を通じて交換可能に使われることがある。
【0017】
並べ替え変換が、コード領域内において使用に先立って、いくつかの配列を並べ替えることによってコード領域に影響しうることは理解しておくべきである。さらに、コード領域の外のプログラム・コードが影響されないことを保証するために、コード領域後に使用されうる配列が逆並べ替えされてもよい(すなわち、並べ替えの逆操作が適用されて、並べ替えられた配列をその初期状態に戻してもよい)。さらに、コード領域がフロー制御文を含む場合、そのような文を考慮に入れるために、一つまたは複数の配列が、コード領域においてさまざまな経路に沿って順序付けられ、適宜逆並べ替えされてもよい。コード領域が線形なループ領域であるいくつかの実施形態では、並べ替えはコード領域の外でのみ生起してもよい。
【0018】
プログラム・コード400のセクションの例示的実施形態が
図4のAに示されている。図のように、一般的なコード領域400は、領域同定モジュール302によって同定されたコード領域402と、同定されたコード領域402の外にある「print(x)」文とを含む。コード領域402が外側ループ文と、該外側ループ文の中のさまざまな動作文とを含むことは理解されるはずである。本稿で記載されるところでは、コード領域内で使われる変数/配列の一つまたは複数が並べ替えられてもよく、それによりプログラム・コード400内に存在する文/命令が影響される。たとえば、いくつかの実施形態では、並べ替えは、
図4のBに示されるように、プログラム・コード400の修正版を生成するための、コード領域402内における「reorder()」文および/または「reverse_reorder()」文の挿入に関わってもよい(たとえば、コード領域402の外でのそのような文の挿入に加えて)。他の実施形態では、並べ替えは、
図4Cに示されるように、プログラム・コード400の修正版を生成するための、コード領域402(たとえば線形ループ領域)の外側での(たとえばコード領域402の直前および直後での)そのような並べ替え文の挿入に関わるのみであってもよい。
【0019】
分配性解析モジュール304は、同定されたコード領域において定義されている表現の一つまたは複数(たとえば各表現)の分配性を判別するよう構成されている。すなわち、分配性解析モジュール304は、コード領域内の表現のすべてをスキャンし、並べ替えが、それらの表現のそれぞれに対して分配性であるかどうかを判定してもよい。図示した実施形態では、並べ替えRは、xが行列であればR(x)=P'*x*Pに(すなわち相似変換)、xがベクトルであればR(x)=P'*xに、あるいはxがスカラー数であればR(x)=xに従って定義されてもよい。ここで、Pは置換行列であり、P'はPの転置/逆である。さらに、図示した実施形態において、表現εに対する並べ替えRは、その出力が並べ替えられるおよび/またはその入力が並べ替えられるかどうかに関わりなくその意味内容が同じままである場合に、分配性である。換言すれば、R(ε(i
1,…,n))=ε(R(i
1),…,R(i
n))ということであり、ここでi
1,…,nは入力の集合である。
【0020】
いくつかの実施形態では、フロー制御文のないコード領域は、まとめて単一の表現であると解釈されてもよい。並べ替えが特定のコード領域内の全表現に対して分配性である場合、並べ替えは、例示的実施形態における集団表現としての領域全体に対しても分配性であることは理解されるはずである。よって、コード領域の結果を並べ替えるために、コンピューティング装置200は、領域内のコードを修正することなくコード領域への諸入力を並べ替えてもよい。コード領域がフロー制御文を含んでいる実施形態では、入力の一つまたは複数が条件付きであることがあり、よってそれらの入力の並べ替えも条件付きであることがある(たとえば
図4のB参照)。
【0021】
いくつかの普通に見られる配列関係の表現はしばしば分配性であることは理解されるはずである。たとえば、表現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」文)に対して、およびスカラーの入力および出力をもつ表現に対しては分配性である。対照的に、いくつかの他の普通に見られる配列関係の表現は分配性ではない。たとえば、入力および/または出力が特定の「形」であることを要求する表現(たとえば、入力が上半または下半三角行列であることを想定する三角行列ソルバー)、入出力表現(たとえばプリント・コマンド)、ビット毎の再現性を要求する表現および/またはコンパイラー314にとって未知の関数は一般に非分配性であると見なされうる。特定のユーザー定義関数についてのソース・コードが利用可能であれば、本稿に記載される技法と整合して、その分配性を判別するためにソース・コードが解析されてもよいことは理解されるはずである。コード領域形成/同定と分配性解析は本稿では別個に記載されているが、いくつかの実施形態では、コード領域形成および分配性は同時並行して解析されてもよい。たとえば、いくつかの実施形態では、コンピューティング装置200は空の領域で始まり、分配性であると確認された文を加えることによって徐々に領域を「成長」させてもよい。
【0022】
ライブ性解析モジュール306は、コード領域内の一つまたは複数の位置における一つまたは複数の(たとえばそれぞれの)変数/配列のライブ性(liveness)(すなわち、変数/配列がライブ(live)であるかデッド(dead)であるか)を判別するよう構成される。たとえば、いくつかの実施形態では、ライブ性解析モジュール306は、コード領域内の各文/表現の前および/または後の各変数のライブ性を判別してもよい。例示的実施形態では、変数/配列はプログラム・コードにおけるある特定のプログラミング点において、その変数が将来(すなわち、そのプログラミング点より後に)使われる可能性がある場合には、ライブであると考えられる。コンピューティング装置200(たとえばコンパイラー314)は、変数のライブ性を判別するための任意の好適な技法、アルゴリズムおよび/または機構を利用しうることは理解されるはずである。
【0023】
相互依存配列解析モジュール308は、特定の表現を解析して、該表現の相互依存している配列/変数のクラスターを構築するまたは他の仕方で決定するよう構成されている。例示的実施形態では、一組の配列が互いに相互依存していると考えられるのは、それらの配列のいずれかの並べ替えが他の配列の並べ替えを必要とする場合である。たとえば表現x=A*yにおける疎行列Aが並べ替えられる(たとえばいくつかの列および/または行が交換される)場合、ベクトルxおよびyは並べ替えられる必要がある。同様に、xまたはyが並べ替えられる場合には、Aがしかるべく並べ替えられる必要がある。一般に、一つまたは複数の配列に関わる表現の、別の配列への代入文は、それらの配列のそれぞれの間の相互依存性を示す。たとえば、コード領域が文array
1=ε(array
2,array
3)を含み、ここで、εは配列array
2およびarray
3の表現である場合、配列array
1、array
2およびarray
3は相互依存する配列である。のちにより詳細に述べるように、いくつかの実施形態では、相互依存配列解析モジュール308は、表現のどの変数/配列が互いに相互依存するかを判別し、それによりクラスターを生成するために、特定の文について表現木(expression tree)を生成してもよい。むろん、いくつかの実施形態では、文は、表現木の明示的な生成なしに暗黙的に表現木である3アドレス・フォーマット(結果、演算子および二つのオペランド)で表現されてもよい。
【0024】
並べ替え可能配列発見モジュール310は、コード領域における並べ替え可能な配列を発見するために、同定されたコード領域に対して双方向データ・フロー解析を実行するよう構成される。後述するように、いくつかの実施形態では、並べ替え可能配列発見モジュール310は、コード領域における表現(単数または複数)を通じた並べ替え可能配列の、逆方向伝達関数に基づく逆方向伝搬(backward propagation)と、順方向伝達関数に基づく順方向伝搬(forward propagation)とを逐次反復的に実行してもよい。たとえば、いくつかの実施形態では、並べ替え可能配列発見モジュール310は、並べ替え変換によって改善されうるデータ局在性をもつ疎配列を同定し、(並べ替えるべき他の配列を判別するために)その配列を双方向フロー解析を用いて解析する/伝搬させることをしてもよい。いくつかの実施形態では、そのような配列は、コード領域にとって重要であると知られているいくつかの動作(単数または複数)(たとえば疎行列ベクトル乗算(SpMV))に関係した最初の一つまたは若干数の疎配列であってもよい。別の実施形態では、並べ替え可能配列発見モジュール310は、並べ替えるべき第一の配列(FAR)をユーザーから(たとえばコンパイラー314による解析のためのコード領域のユーザー注釈を介して)受領してもよい。
【0025】
コード変換モジュール312は、コード領域内またはプログラム・コード内におけるコード領域の近傍内(たとえばコード領域の直前または直後)で一つまたは複数の配列を並べ替えるおよび/または逆並べ替えをするよう構成されている。例示的実施形態では、コード変換モジュール312は、並べ替え可能配列発見モジュール310の双方向フロー解析に基づいて、並べ替えおよび/または逆並べ替えすべき具体的な配列およびそのような動作を実行すべきプログラム・コード内の具体的な位置を決定することは理解されるはずである。さらに、コード変換モジュール312は、具体的な実施形態に依存して、いかなる好適な並べ替えアルゴリズムを用いてもよく、プログラム・コードの変換を実際に実施するためにいかなる好適なアルゴリズム、技法および/または機構を利用してもよいことは理解されるはずである。
【0026】
ここで
図5を参照するに、コンピューティング装置200は、(たとえばユーザー指令および/または介入のない)疎行列の自動並べ替えのための方法500を実行してもよい。例示的な方法500はブロック502で始まる。ここで、コンピューティング装置200は、並べ替えされうる一つまたは複数の疎行列を含むプログラム(たとえばプログラム・コード)を受領する。より特定的には、いくつかの実施形態では、プログラム・コードは、コンピューティング装置200のコンパイラー314によって取り出されてもよい。ブロック504では、コンピューティング装置200は、配列の並べ替えのために解析するべき前記プログラム・コードのコード領域を同定する。上記のように、コード領域は、プログラム・コードの任意の部分でありうるが、いくつかの実施形態では、同定される/選択されるコード領域は、かなりの実行時間がある前記プログラム・コードの線形ループ領域または別の部分である。
【0027】
ブロック506では、コンピューティング装置200は、同定されたコード領域において定義されている表現の一つまたは複数(たとえば各表現)の分配性を判別するために、プログラム・コードのコード領域の分配性解析を実行する。よって、ブロック508では、コンピューティング装置200は、コード領域内の具体的な諸表現を同定してもよく、ブロック510では、それらの表現に対する、並べ替えアルゴリズムの分配性を判別してもよい。たとえば、コンピューティング装置200は、コード領域内の表現のすべてをスキャンし、並べ替えが、それらの表現のそれぞれに対して分配性であるかどうかを判定してもよい。上記のように、図示した実施形態では、表現εに対する並べ替えRは、その出力が並べ替えられるおよび/またはその入力が並べ替えられるかどうかに関わりなくその意味内容が同じままである場合に、分配性である。つまり、R(ε(i
1,…,n))=ε(R(i
1),…,R(i
n))であれば、並べ替えRは表現εに対して分配性である。ここでi
1,…,nは入力の集合である。いくつかの実施形態では、表現は、分配性または非分配性であることがわかっている、普通に使われる配列関係の表現を含みうる。よって、いくつかの実施形態では、コンピューティング装置200は、所与の表現における特定の配列に対して実行される演算の型を判別してもよい。分配性解析はコード領域同定の後であるものとして記述されているが、いくつかの実施形態では、分配性解析とコード領域同定は同時並行して行なわれてもよい。たとえば、いくつかの実施形態では、コンピューティング装置200は空の領域で始まり、分配性であると識別された/知られている文を追加することによって徐々にコード領域を「成長」させてもよい。
【0028】
ブロック512においてコンピューティング装置200がコード領域内の表現の一つまたは複数が非分配性であると判別する場合には、方法500は終了する。しかしながら、コンピューティング装置200が
、並べ替えがコード領域内の表現のそれぞれに対して分配性であり、よって全体としてのコード領域に対して分配性であると判別する場合、コンピューティング装置200はブロック514においてコード領域に対してライブ性解析を実行して、コード領域内のさまざまなプログラミング点における配列の一つまたは複数(たとえば各配列)のライブ性を判別する。たとえば、いくつかの実施形態では、コンピューティング装置200は、コード領域の各文/表現の前および後で配列が「ライブ」か「デッド」かを判定する。上記のように、コンピューティング装置200(たとえばコンパイラー314)は、変数のライブ性を判定するためにいかなる好適な技法、アルゴリズムおよび/または機構を用いてもよい。さらに、ライブ性解析は
図5では分配性解析の後であるものとして示されているが、いくつかの実施形態では、ライブ性解析は、分配性解析より前に実行されてもよい。
【0029】
ブロック516では、コンピューティング装置200は、コード領域における一つまたは複数の(たとえばそれぞれの)表現に対して相互依存配列解析を実行して、それらの表現のそれぞれについて、表現のどの配列/変数が互いに相互依存するかを判別し、その判別に基づいて適切なクラスターを生成する。換言すれば、コンピューティング装置200は、表現のある配列の並べ替えが、その表現の他の配列の並べ替えを必要とさせるかどうかを判定する。たとえば、上記のように、コード領域が文array
1=ε(array
2,array
3)を含み、ここで、εは配列array
2およびarray
3の表現である場合、配列array
1、array
2およびarray
3は相互依存する配列である。いくつかの実施形態では、コンピューティング装置200は、表現のどの配列/変数が互いに相互依存するかを判別し、それによりクラスターを生成するために、方法600を実行して、
図6に示されるような表現木を生成して解析してもよい。むろん、いくつかの実施形態では、文は、表現木の明示的な生成なしに暗黙的に表現木である3アドレス・フォーマット(結果、演算子および二つのオペランド)で表現されてもよい。
【0030】
ここで
図6を参照するに、例示的方法600は、コンピューティング装置200が解析のためにコード領域の文/表現を同定し、選択するブロック602をもって始まる。例として、コード領域は、コンピューティング装置200によって選択される表現v1=v2+v3*dot(M*v4,v5)を含んでいてもよい。ここで、v1、v2、v3、v4およびv5はベクトルであり、Mは行列であり、dot()はドット積関数である。ブロック604では、コンピューティング装置200は、選択された文/表現について表現木を生成する。特に、コンピューティング装置200は
図7のAに示されるような表現木を生成してもよい。図のように、表現木700は、複数の内部ノードおよび端末ノードを含む。特に、例示的実施形態では、表現木700は、演算(=、+、*およびdot())を示す内部ノードを含み、対応する演算のオペランドを示す子ノードを含む。さらに、表現木700は、変数/配列および/またはスカラー定数(v1、v2、v3、v4、v5およびM)を示す端末ノードを含む。例示的な表現v1=v2+v3*dot(M*v4,v5)、よって表現木700は二項演算のみを含んでいるが、他の実施形態では、いかなる具体的な表現および表現木も、(たとえば表現における三項演算子のため)異なる数のオペランドをもつ演算を含みうることは理解されるはずである。よって、表現木の特定の演算ノードは、他の実施形態では、二つより多いまたは少ない子ノードを含むことがある。
【0031】
ブロック606では、コンピューティング装置200は、表現木を、可能であれば複数の部分木に分解する。そうすることにおいて、ブロック608において、コンピューティング装置200は、表現木の内部ノードの結果型を判別してもよい。例示的実施形態では、内部ノードの結果型が数であれば、そのノードとその親との間のエッジは切断され、表現木は二つの部分木に分解される。いくつかの実施形態において、内部ノードが関数であれば、その結果型を判別するために、その関数のソース・コードが解析されてもよい。他の実施形態では、コンピューティング装置200は、相互依存配列解析のために結果型を判別するために、関数のメタデータ(たとえばコンピューティング装置200のユーザーから受領される)に頼ってもよい。例示的実施形態では、表現木および/または部分木は、もとの表現木がより小さな部分木に分解できなくなるまで分解される。表現木700に関わる例示的実施形態では、dot(M*v4,v5)演算はスカラー値を生成する。よって、表現木700は、
図7のBに示されるように、dot()ノードとその親との間のリンクを断ち切ることによって二つの部分木702に分解される。
【0032】
図6のブロック610では、コンピューティング装置200は、生成された表現部分木のそれぞれについて相互依存する配列の集合/クラスターを生成または決定する。具体的には、例示的実施形態では、特定の部分木における各配列/変数が、その特定の部分木に関連付けられた集合/クラスター内に含まれる。たとえば、
図7のA〜Bの例示的実施形態では、第一の部分木702の配列/変数v1、v2およびv3が第一のクラスターに含められ、第二の部分木のMが第二のクラスターに含められる。
図6のブロック612では、コンピューティング装置200は、別の文/表現を解析するかどうかを判定する。たとえば、例示的実施形態では、コンピューティング装置200は、表現の配列の相互依存性について解析されていない他の表現があるかどうかを判定する。コンピューティング装置200が別の表現を解析することを決定する場合、方法600はブロック602に戻り、そこでコンピューティング装置200は別の表現を解析のために同定し、選択する。
【0033】
図5の参照に戻ると、ブロック518において、コンピューティング装置200は、コード領域における並べ替え可能な配列を発見するために、同定されたコード領域に対して双方向データ・フロー解析を実行する。後述するように、コンピューティング装置200は、たとえば提供された並べ替えるべき第一の配列(FAR)に基づいて並べ替え可能な配列を発見するために、順方向および逆方向伝搬関数、順方向および逆方向伝達関数および/または他の関数を利用してもよい。たとえば、順方向相互依存配列伝搬関数は
【0034】
【数1】
に従って定義されてもよい。ここで、←付きのIA()は順方向伝搬関数、Bは表現、Xは通過すべき入力配列の集合、Cはクラスター、C.RHSはクラスターの右辺(すなわち、対応する表現によって使われる配列を示す)である。さらに、逆方向相互依存配列伝搬関数は
【0035】
【数2】
に従って定義されてもよい。ここで、→付きのIA()は逆方向伝搬関数、C.LHSはクラスターの左辺(すなわち、対応する表現によって定義される配列を示す)である。
【0036】
たとえば、上記の例示的な表現v1=v2+v3*dot(M*v4,v5)に基づくと、相互依存配列解析は、(たとえば二つの部分木702に基づく)二つのクラスターを与える:第一のクラスター{v1|v2,v3}および第二のクラスター{ |M,v4,v5}である。ここで、|は定義される配列/変数(すなわち左辺のもの)を使用される配列/変数(すなわち右辺のもの)から分離する。
【0037】
例として、そのような実施形態では、次のことが理解されるはずである。すなわち、
【0038】
【数3】
これはv1が第一のクラスターの右辺にも第二のクラスターの右辺にも含まれないため。
【0039】
【数4】
これはv2が第一のクラスターの右辺にあるため。
【0040】
【数5】
これはv2が第一のクラスターの右辺にあり、どのクラスターの右辺にもないuは結果に影響しないため。
【0041】
【数6】
これはv2が第一のクラスターの右辺にあり、v4が第二のクラスターの右辺にあるため。
【0042】
【数7】
これはv1が第一のクラスターの左辺にあるため。
【0043】
【数8】
これはv1が第一のクラスターの左辺にあり、どのクラスターの左辺にもないv4は結果に影響しないためである。
【0044】
例示的実施形態では、順方向伝達関数は
【0045】
【数9】
に従って定義されてもよい。ここで、←付きのIA()は順方向伝搬関数であり、Bは表現であり、Xは通過すべき並べ替え可能な配列の集合であり、def(B)は文Bにおける定義される配列の集合であり、use(B)は文Bにおける使用される配列の集合である。順方向伝達関数は文Bの前からその後へ、その文の右辺および左辺を順に通って通過することを示すことは理解されるはずである。また、順方向伝達関数による文Bを通った伝搬の間に起こりうる、さらなる「成長」が起こりうる二つの場合があることも理解されるはずである。すなわち、第一項
【0047】
【数11】
を満たす配列である。よって、Xにおける入力配列が文Bによって使われる場合、並べ替え可能な配列の新しい集合は、クラスターの右辺にその配列があるようなクラスターすべてを含む。第一文は、ある表現の右辺における並べ替えられた配列は、同じクラスターにおける他の各配列の並べ替えを必要とすることがありうることを反映していることが理解されるはずである。さらに、入力配列が表現Bによって使用されるのでも定義されるのでもない場合、その配列は並べ替えられた配列の新しい集合に含まれることが理解されるはずである。換言すれば、入力の並べ替えられた配列が通過され、表現Bのどの配列にも影響せず、どの配列によっても影響されない場合、その並べ替えられた入力配列は、その表現の後に、並べ替えられたままであるべきである。
【0049】
【数12】
に従って定義されてもよい。ここで、←付きのIA()は順方向伝搬関数であり、→付きのIA()は逆方向伝搬関数であり、Bは表現であり、Xは通過すべき並べ替え可能な配列の集合であり、def(B)は文Bにおける定義される配列の集合であり、use(B)は文Bにおける使用される配列の集合であり、.RHSはクラスターの右辺を定義する。逆方向伝達関数は文Bの後からその前へ、その文の左辺および右辺を順に通って通過することを示すことは理解されるはずである。さらに、逆方向伝達関数による文Bを通った伝搬の間に起こりうる、さらなる「成長」が起こりうる三つの場合があることが理解されるはずである。すなわち、第一項
【0051】
【数14】
を満たす配列、あるいは第三項
【0053】
いくつかの実施形態では、コンピューティング装置200は、
図8に示されるような双方向データ・フロー解析を実行するための方法800を実行してもよい。いくつかの実施形態では、双方向データ・フロー解析は、各ブロックBが文/表現である制御フロー・グラフ(CFG: Control-Flow Graph)に対してはたらく。例示的方法800はブロック802で始まる。ここでは、コンピューティング装置200はコード領域内の文/表現の入力および出力集合/状態を初期化する。そうするために、コード領域外の任意の文/表現の入力および出力集合はまず空集合に初期化されてもよい。さらに、各領域エントリーについて、出力集合は、例示的実施形態では、並べ替えるべき第一の配列(FAR)に初期化される。上記のように、FARは、コンピューティング装置200のユーザーによって提供されてもよく、あるいは他の仕方でコンパイラー314によって決定されてもよい。コード領域内の他の文について、出力集合は全体集合に設定されてもよい。いくつかの実施形態では、コード領域内の文の入力集合は、その後のステップにおいて自動的にインスタンス生成されうるので、初期化されない。より形式的には、いくつかの実施形態では、コード領域の外のすべての文BはIn[B]=Out[B]=φに従って初期化されてもよい。ここで、In[B]は入力集合であり、Out[B]は出力集合であり、コード領域内のすべての文は、BがエントリーであればOut[B]=FAR[B]となり、そうでなければOut[B]は全体集合に等しくなるよう初期化されてもよい。
【0054】
ブロック804では、コンピューティング装置200は、コード領域における文の入力集合および出力集合を事前調整する。そうするために、ブロック806では、コンピューティング装置200は順方向伝達関数を文に適用してもよい。よって、各文Bについて、入力集合In[B]は、すべての先行者の後で並べ替え可能である配列を含み、出力集合Out[B]は順方向伝達関数に基づいて文Bを通じてIn[B]を伝搬させた結果であることが理解されるはずである。これは、入力集合および出力集合に変化がなくなるまで繰り返されてもよい。より形式的には、いくつかの実施形態では、Bがコード領域のエントリーでないコード領域内のすべての文Bは、
【0055】
【数16】
に従って事前調整されてもよい。ここで、pred()はBの先行表現の集合である。
【0056】
いくつかの実施形態では、ブロック808において、コンピューティング装置200は(たとえば逆方向伝達関数について)伝達関数最適化を選択してもよい。特に、例示的実施形態では、コンピューティング装置200は、最適化なしに、配列のライブ性に基づく最適化を用いて、あるいはコード領域内のさまざまな表現の実行頻度に基づく最適化を用いて、逆方向伝達関数を適用してもよい。
【0057】
ブロック810では、コンピューティング装置200は逆方向伝達関数をコード領域内の文に適用する。そうすることにおいて、ブロック812では、コンピューティング装置200は、選択された最適化に基づいて逆方向伝達関数を適用してもよい。例示的実施形態では、逆方向伝達関数は、すべての後継者の前で並べ替え可能な配列を追加することによってOut[B]を拡大してもよく、および/またはその特定の逆方向伝達関数に基づいてBを通じてOut[B]を伝搬させた結果である配列を追加することによってIn[B]が拡大されてもよい。ライブ性最適化が用いられる実施形態では、変数が後継者の前に「デッド」である場合(すなわち、後継者を通るいかなる実行経路においても使われない場合)、その変数は、人為的に、後継者の前に並べ替えられることができる。そうすることによってプログラムの意味内容が影響を受けないからである(たとえば、その配列はいずれにせよその点では不使用である)。実行頻度最適化が用いられる実施形態では、文Bが二つ以上の後継ブロックをもち、実行頻度が(たとえば所定の閾値に基づいて)有意に異なる場合には、最も頻度の高い後継者xが常に、In[x]内の並べ替え可能な諸配列がOut[B]まで伝搬させられることを許容してもよい。たとえば、特定の後継者xがループ内であり、他のすべてがループ外である場合、その後継者xの伝搬は、文Bとxとの間における配列並べ替えの挿入を回避してもよい。むろん、いくつかの実施形態では、Bとx以外の後継者との間において、それらの配列のうち一つまたは複数の配列の逆並べ替え関数を挿入することが必要であることがある。より形式的には、いくつかの実施形態では、領域内のすべての文Bについて、逆方向伝達関数は
【0058】
【数17】
と、ライブ性最適化が用いられる場合には
【0059】
【数18】
実行頻度最適化が用いられる場合には
【0060】
【数19】
あるいは最適化が用いられない場合には
【0061】
【数20】
のうちの一つとに従って適用されてもよい。ここで、succs(B)は文Bのすべての後継者の集合であり、
【0062】
【数21】
であり、Frequent[B]=In[x]、ここでx∈succs(B)であり、Bのすべての後継者のうちで最も頻繁に実行されるものであり、Dead[S]は後継者Sの前にデッドであるが他の後継者の前ではデッドでない(すなわち、すべての後継者の間では「部分的にデッド」である)変数/配列の集合であり、LiveIn[S]は後継者Sの前でライブである変数/配列の集合である。
【0063】
ブロック814では、コンピューティング装置200は順方向伝達関数をコード領域内の文に適用する。順方向伝達関数についての適用は、事前調整に関して上記したものと同様であるが、In[B]およびOut[B]はそれらのもとの値を保持し、新たな配列をもって「成長」することは理解されるはずである。より形式的には、いくつかの実施形態では、コード領域内の文Bのすべてについて、順方向伝達関数は
【0064】
【数22】
に従って適用されてもよい。ブロック818では、コンピューティング装置200は入力集合および出力集合が不変であるかどうかを判定する。もしそうであれば、方法800はブロック810に戻り、そこで逆方向伝達関数が再び文に適用される。換言すれば、入力集合と出力集合が変わらなくなり、安定するまで、逆方向および順方向の伝達関数が逐次反復的に適用される。
【0065】
図5に戻って参照するに、ブロック520において、コンピューティング装置200は、発見された並べ替え可能な配列に基づいてプログラム・コードを変換する。特に、コンピューティング装置200は、コード領域内またはプログラム・コード内におけるコード領域の近傍内(たとえばコード領域の直前または直後)の一つまたは複数の配列を並べ替えるおよび/または逆並べ替えをするよう構成されている。上記のように、コンピューティング装置200は、プログラム・コード自身の変換を実施するためにいかなる好適な技法を利用してもよい。いくつかの実施形態では、コード領域内の任意の文B1について、文B1からその後の文B2へのエッジ(たとえば制御フロー・グラフ(CFG)内のエッジ)があり、ここでB2はたとえばCFG内の別のブロックである、場合には、すべての変数/配列x∈LiveIn[B2]について、
【0066】
【数23】
のときはプログラム・コード「x=reorder(x)」がそのエッジにおいて挿入されてもよく、
【0067】
【数24】
のときは、プログラム・コード「x=reverse_reorder(x)」がそのエッジにおいて挿入されてもよい。文B2がコード領域のエントリーである実施形態では、すべての変数/配列x∈LiveIn[B2]について、x∈In[B]であるときはプログラム・コード「x=reorder(x)」がB2の前に挿入されてもよい。
【0068】
いくつかの実施形態では、方法400、500、600および/または800の任意の一つまたは複数が、コンピュータ可読媒体上に記憶されるさまざまな命令として具現されてもよく、該命令がプロセッサ210および/またはコンピューティング装置200の他のコンポーネントによって実行されてコンピューティング装置200にそれぞれの方法400、500、600および/または800を実行させてもよいことは理解されるはずである。コンピュータ可読媒体は、コンピューティング装置200が読むことができるいかなる型の媒体として具現されてもよく、メモリ214、データ記憶216、コンピューティング装置200の他のメモリもしくはデータ記憶デバイス、コンピューティング装置200の周辺装置220が読むことのできるポータブル・メディアおよび/または他の媒体を含むがそれに限られない。
【0069】
部分的なテーブル900は、二つの文/ブロック:B1:F=EおよびB2:H=F+Gのみを含む単純なコード領域に対する双方向解析の適用から帰結する結果を描いている。図のように、初期化段階の間に、B1の出力集合は発見すべき第一の配列(FAR)を割り当てられる。これはこの個別的な実施形態では{F}である(たとえばユーザーによって選択される)。B2の出力集合は全体集合(universal set)を割り当てられる。事前調整の間、コンピューティング装置200は上記のように順方向伝達関数の順方向通過902を適用し、その結果、B2は出力集合{F,G,H}を割り当てられる。図のように、文B2の入力集合は文B1の出力集合と同じである。これは、B1とB2の間に、集合を変えるような文がないからである。コンピューティング装置200はその後、逆方向伝達関数の逆方向通過904を適用し、その結果、B2は入力集合{F,G}をもち、B1は出力集合{F,G}および入力集合{E,G}をもつ。図のように、そのような実施形態では、コンピューティング装置200は逆方向伝達関数および順方向電圧関数を、文B1およびB2のそれぞれの入力集合および出力集合が変わらなくなるまで逐次反復的に適用する。
【0070】
ここで
図10を参照するに、プログラム・コードから同定されたコード領域を描く制御フロー・グラフ1000が示されている。図のように、グラフ1000は、プログラム・コードのさまざまな文を描く複数のブロックB1〜B13を含んでいる。この例示的実施形態では、同定されたコード領域はブロックB1〜B12を含む。一方、ブロックB13はコード領域の外である。
図11〜
図16は、さまざまな双方向フロー解析アルゴリズム(すなわち最適化ありおよびなし)の適用からの結果および結果として得られる変換されたプログラム・コードを描いていることが理解されるはずである。さらに、一つの双方向フロー解析アルゴリズム(たとえば最適化あり)の適用からの結果として得られる変換コードは該結果として得られる変換コードにおけるいくつかの文を別の双方向フロー解析アルゴリズム(たとえば最適化なし)の適用から持ち上げる/移すことの結果として見ることもできるが、本稿に記載される技法ではそうする必要はないことがある。いくつかの実施形態では、それぞれの結果として得られる変換されたコードは、対応する双方向フロー解析アルゴリズムの結果に基づくだけで生成されうる。
【0071】
最適化なしに
図10のプログラム・コードに双方向解析を適用することからの結果の部分的なテーブル1100が
図11に示されている。部分的なテーブル1100(および後述するテーブル1300および1500)は、本稿に記載される初期化、事前調整および第一の逆方向通過の段階のみを含むことが理解されるはずである。しかしながら、実際上は、テーブル全体が本稿に記載される技法に基づいて完成されうる。テーブル1100に対応する
図12の制御フロー・グラフ1200に示されるように、プログラム・コードは、コード領域内のさまざまなプログラミング点において変数/配列(たとえばp,x,rおよびi)を並べ替え、逆並べ替えするよう、変換される。
【0072】
上記のように、いくつかの実施形態では、双方向フロー解析は、変数ライブ性を考慮に入れるよう最適化されてもよい。そのような最適化を用いた双方向フロー解析を適用する結果は、
図13のテーブル1300に部分的に示されており、対応する変換されたプログラム・コードは
図14の制御フロー・グラフ1400に示されている。図示され、上記されるように、「部分的にデッドな」変数(たとえばA,p,rおよびi)に関連する並べ替え関数は、より効率的な実行のために、コード領域内からコード領域前に移される。さらに他の実施形態では、双方向フロー解析は、上記のように実行頻度を考慮に入れるために最適化されてもよい。そのような最適化を用いた双方向フロー解析を適用する結果は、
図15のテーブル1500に示されており、対応する変換されたプログラム・コードは
図16の制御フロー・グラフ1600に描かれている。図示され、上記されるように、プログラム・コードの、あるいはより特定的にはコード領域の頻繁に実行される領域(たとえばループ)内に現われる並べ替え関数は、実行を改善するために、ループの外に(たとえばループおよび/またはコード領域の前に)移されてもよい。しかしながら、そのような実施形態では、追加的な逆並べ替え関数をコード領域内に置くことが必要になることがある(プログラム・コード内に条件文がある状況では)。たとえば、例示的実施形態では、コード領域に続く「print(x)」文に出力される配列/変数が正確であることを保証するために、逆並べ替え関数が文B2とB13との間に含まれる。
【実施例】
【0073】
本稿に開示される技術を例解する例を以下に与える。これらの技術の実施形態は、以下に記述される例の任意の一つまたは複数およびその任意の組み合わせを含みうる。
【0074】
実施例1は、疎行列の自動並べ替えのためのコンピューティング装置であって、プログラム・コードのコード領域において定義された表現の分配性を判定する分配性解析モジュールであって、前記表現は、前記表現の意味内容が前記表現の入力の並べ替えか出力の並べ替えかによって影響されない場合に分配性であると判定される、分配性解析モジュールと;前記表現に対して相互依存配列解析を実行して、前記表現の相互依存する配列の一つまたは複数のクラスターを決定する相互依存配列解析モジュールであって、前記一つまたは複数のクラスターのうちのクラスターの各配列は、そのクラスターの他のそれぞれの配列と相互依存している、相互依存配列解析モジュールと;前記相互依存する配列の前記一つまたは複数のクラスターに基づく前記コード領域内の諸表現を通じた並べ
替え可能な配列の逐次反復的な逆方向伝搬および順方向伝搬により、前記コード領域に対して双方向データ・フロー解析を実行する並べ替え可能配列発見モジュールであって、前記逆方向伝搬は逆方向伝達関数に基づき、前記順方向伝搬は順方向伝達関数に基づく、並べ替え可能配列発見モジュールとを有する、コンピューティング装置を含む。
【0075】
実施例2は、実施例1の主題を含み、前記プログラム・コードの前記コード領域を同定する領域同定モジュールをさらに含む。
【0076】
実施例3は、実施例1および2のいずれか一項記載の主題を含み、前記コード領域を同定することが、ループの本体内にコードを含み、フロー制御文を含まない、前記プログラム・コードの線形ループ領域を同定することを含む。
【0077】
実施例4は、実施例1ないし3のいずれか一項記載の主題を含み、前記コード領域を同定することが、前記コンピューティング装置のコンパイラーによって前記コード領域を同定することを含む。
【0078】
実施例5は、実施例1ないし4のいずれか一項記載の主題を含み、前記コード領域を同定することが、少なくともある閾値時間期間にわたって前記コンピューティング装置によって実行されるコード領域を同定することを含む。
【0079】
実施例6は、実施例1ないし5のいずれか一項記載の主題を含み、前記領域同定モジュールがさらに、前記コンピューティング装置のコンパイラーにより前記プログラム・コードを受領する。
【0080】
実施例7は、実施例1ないし6のいずれか一項記載の主題を含み、前記表現の分配性を判定することが、前記コード領域において定義されている各表現の分配性を判定することを含む。
【0081】
実施例8は、実施例1ないし7のいずれか一項記載の主題を含み、前記相互依存配列解析を実行することが、各表現が分配性であるとの判定に応答して前記相互依存配列解析を実行することを含む。
【0082】
実施例9は、実施例1ないし8のいずれか一項記載の主題を含み、前記表現の分配性を判定することが、陳述R(ε(i
1,…,n))=ε(R(i
1),…,R(i
n))であることを判別することを含み、εは前記表現であり、Rは前記表現に対する並べ替えであり、i
1,…,nは入力の集合である。
【0083】
実施例10は、実施例1ないし9のいずれか一項記載の主題を含み、前記表現の分配性を判定することが、(i)前記表現が入力または出力構造が特定の形をもつことを要求する、(ii)前記表現が前記プログラム・コードの入力‐出力機能を定義する、(iii)前記表現がビット毎の再現性を要求する、あるいは(iv)前記表現が前記コンピューティング装置のコンパイラーにとって未知の関数を含む、のうちの少なくとも一つであるとの判定に応答して、前記表現を非分配性であると判定することを含む。
【0084】
実施例11は、実施例1ないし10のいずれか一項記載の主題を含み、前記一つまたは複数のクラスターのうちのクラスターの各配列がそのクラスターの他のそれぞれの配列と相互依存していることにより、前記一つまたは複数のクラスターのうちの特定のクラスター内のある配列の並べ替えは、その特定のクラスターのそれぞれの他の配列に影響する。
【0085】
実施例12は、実施例1ないし11のいずれか一項記載の主題を含み、前記相互依存配列解析を実行することが:前記表現についての表現木を生成する段階であって、前記表現木の各内部ノードは前記表現の演算を示し、前記表現木の各端末ノードは配列またはスカラーを示す、段階と;前記表現木を、配列の相互依存性に基づいて表現部分木の集合に分解する段階と;各表現部分木についての相互依存配列の対応するクラスターを、その表現部分木に含まれる配列に基づいて決定する段階とを実行することを含む。
【0086】
実施例13は、実施例1ないし12のいずれか一項記載の主題を含み、前記表現木を、表現部分木の集合に分解することが、前記表現木の各内部ノードの結果型を判別することを含む。
【0087】
実施例14は、実施例1ないし13のいずれか一項記載の主題を含み、前記双方向データ・フロー解析を実行することが:前記表現の入力集合および出力集合を初期化し;前記順方向伝達関数を並べ替えるべき第一の配列に適用することによって、前記表現の前記入力集合および前記出力集合を事前調整し;前記入力集合および前記出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む。
【0088】
実施例15は、実施例1ないし14のいずれか一項記載の主題を含み、前記並べ替え可能配列発見モジュールがさらに、前記並べ替えるべき第一の配列を、前記コンピューティング装置のユーザーから受領する。
【0089】
実施例16は、実施例1ないし15のいずれか一項記載の主題を含み、前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することが、各表現の入力集合および出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む。
【0090】
実施例17は、実施例1ないし16のいずれか一項記載の主題を含み、少なくとも一つの配列を並べ替えるよう前記双方向データ・フロー解析に基づいて前記プログラム・コードを変換するコード変換モジュールをさらに有する。
【0091】
実施例18は、実施例1ないし17のいずれか一項記載の主題を含み、前記コード領域内の各文における前記コード領域内の各変数のライブ性を判別するライブ性解析モジュールをさらに含む。
【0092】
実施例19は、疎行列の自動並べ替えの方法を含む。本方法は、コンピューティング装置によって、プログラム・コードのコード領域において定義された表現の分配性を判定する段階であって、前記表現は、前記表現の意味内容が前記表現の入力の並べ替えか出力の並べ替えかによって影響されない場合に分配性であると判定される、段階と;前記コンピューティング装置によって、前記表現に対して相互依存配列解析を実行して、前記表現の相互依存する配列の一つまたは複数のクラスターを決定する段階であって、前記一つまたは複数のクラスターのうちのクラスターの各配列は、そのクラスターの他のそれぞれの配列と相互依存している、段階と;前記コンピューティング装置によって、前記相互依存する配列の前記一つまたは複数のクラスターに基づく前記コード領域内の諸表現を通じた並べ
替え可能な配列の逐次反復的な逆方向伝搬および順方向伝搬により、前記コード領域に対して双方向データ・フロー解析を実行する段階であって、前記逆方向伝搬は逆方向伝達関数に基づき、前記順方向伝搬は順方向伝達関数に基づく、段階とを含む。
【0093】
実施例20は、実施例19の主題を含み、前記コンピューティング装置によって、前記プログラム・コードの前記コード領域を同定する段階をさらに含む。
【0094】
実施例21は、実施例19または20記載の主題を含み、前記コード領域を同定することが、ループの本体内にコードを含み、フロー制御文を含まない、前記プログラム・コードの線形ループ領域を同定することを含む。
【0095】
実施例22は、実施例19ないし21のいずれか一項記載の主題を含み、前記コード領域を同定することが、前記コンピューティング装置のコンパイラーによって前記コード領域を同定することを含む。
【0096】
実施例23は、実施例19ないし22のいずれか一項記載の主題を含み、前記コード領域を同定することが、少なくともある閾値時間期間にわたって前記コンピューティング装置によって実行されるコード領域を同定することを含む。
【0097】
実施例24は、実施例19ないし23のいずれか一項記載の主題を含み、前記コンピューティング装置のコンパイラーにより前記プログラム・コードを受領する段階をさらに含む。
【0098】
実施例25は、実施例19ないし24のいずれか一項記載の主題を含み、前記表現の分配性を判定することが、前記コード領域において定義されている各表現の分配性を判定することを含む。
【0099】
実施例26は、実施例19ないし25のいずれか一項記載の主題を含み、前記相互依存配列解析を実行することが、各表現が分配性であると判定することに応答して前記相互依存配列解析を実行することを含む。
【0100】
実施例27は、実施例19ないし26のいずれか一項記載の主題を含み、前記表現の分配性を判定することが、陳述R(ε(i
1,…,n))=ε(R(i
1),…,R(i
n))であることを判別することを含み、εは前記表現であり、Rは前記表現に対する並べ替えであり、i
1,…,nは入力の集合である。
【0101】
実施例28は、実施例19ないし27のいずれか一項記載の主題を含み、前記表現の分配性を判定することが、(i)前記表現が入力または出力構造が特定の形をもつことを要求する、(ii)前記表現が前記プログラム・コードの入力‐出力機能を定義する、(iii)前記表現がビット毎の再現性を要求する、あるいは(iv)前記表現が前記コンピューティング装置のコンパイラーにとって未知の関数を含む、のうちの少なくとも一つであるとの判定に応答して、前記表現を非分配性であると判定することを含む。
【0102】
実施例29は、実施例19ないし28のいずれか一項記載の主題を含み、前記一つまたは複数のクラスターのうちのクラスターの各配列がそのクラスターの他のそれぞれの配列と相互依存していることにより、前記一つまたは複数のクラスターのうちの特定のクラスター内のある配列の並べ替えは、その特定のクラスターのそれぞれの他の配列に影響する。
【0103】
実施例30は、実施例19ないし29のいずれか一項記載の主題を含み、前記相互依存配列解析を実行することが:前記表現についての表現木を生成する段階であって、前記表現木の各内部ノードは前記表現の演算を示し、前記表現木の各端末ノードは配列またはスカラーを示す、段階と;前記表現木を、配列の相互依存性に基づいて表現部分木の集合に分解する段階と;各表現部分木についての相互依存配列の対応するクラスターを、その表現部分木に含まれる配列に基づいて決定する段階とを含む。
【0104】
実施例31は、実施例19ないし30のいずれか一項記載の主題を含み、前記表現木を、表現部分木の集合に分解することが、前記表現木の各内部ノードの結果型を判別することを含む。
【0105】
実施例32は、実施例19ないし31のいずれか一項記載の主題を含み、前記双方向データ・フロー解析を実行することが:前記表現の入力集合および出力集合を初期化し;前記順方向伝達関数を並べ替えるべき第一の配列に適用することによって、前記表現の前記入力集合および前記出力集合を事前調整し;前記入力集合および前記出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む。
【0106】
実施例33は、実施例19ないし32のいずれか一項記載の主題を含み、前記コンピューティング装置によって、前記並べ替えるべき第一の配列を、前記コンピューティング装置のユーザーから受領する段階をさらに含む。
【0107】
実施例34は、実施例19ないし33のいずれか一項記載の主題を含み、前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することが、各表現の入力集合および出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む。
【0108】
実施例35は、実施例19ないし34のいずれか一項記載の主題を含み、少なくとも一つの配列を並べ替えるよう前記双方向データ・フロー解析に基づいて前記プログラム・コードを変換する段階をさらに含む。
【0109】
実施例36は、実施例19ないし35のいずれか一項記載の主題を含み、前記コンピューティング装置によって、前記コード領域内の各文における前記コード領域内の各変数のライブ性を判別する段階をさらに含む。
【0110】
実施例37は、プロセッサと、複数の命令を記憶しているメモリとを有するコンピューティング装置を含む。前記命令は、前記プロセッサによって実行されたときに、前記コンピューティング装置に実施例19ないし36のうちいずれか一項記載の方法を実行させる。
【0111】
実施例38は、複数の命令を記憶している一つまたは複数の機械可読記憶媒体を含む。前記命令は、実行されることに応答して、コンピューティング装置が実施例19ないし36のうちいずれか一項記載の方法を実行することにつながる。
【0112】
実施例39は、実施例19ないし36のうちいずれか一項記載の方法を実行するための手段を有するコンピューティング装置を含む。
【0113】
実施例40は、疎行列の自動並べ替えのためのコンピューティング装置を含む。コンピューティング装置は、プログラム・コードのコード領域において定義された表現の分配性を判定する手段であって、前記表現は、前記表現の意味内容が前記表現の入力の並べ替えか出力の並べ替えかによって影響されない場合に分配性であると判定される、手段と;前記表現に対して相互依存配列解析を実行して、前記表現の相互依存する配列の一つまたは複数のクラスターを決定する手段であって、前記一つまたは複数のクラスターのうちのクラスターの各配列は、そのクラスターの他のそれぞれの配列と相互依存している、手段と;前記相互依存する配列の前記一つまたは複数のクラスターに基づく前記コード領域内の諸表現を通じた並べ
替え可能な配列の逐次反復的な逆方向伝搬および順方向伝搬により、前記コード領域に対して双方向データ・フロー解析を実行する手段であって、前記逆方向伝搬は逆方向伝達関数に基づき、前記順方向伝搬は順方向伝達関数に基づく、手段とを含む。
【0114】
実施例41は、実施例40の主題を含み、前記プログラム・コードの前記コード領域を同定する手段をさらに含む。
【0115】
実施例42は、実施例40または41記載の主題を含み、前記コード領域を同定する手段が、ループの本体内にコードを含み、フロー制御文を含まない、前記プログラム・コードの線形ループ領域を同定する手段を含む。
【0116】
実施例43は、実施例40ないし42のいずれか一項記載の主題を含み、前記コード領域を同定する手段が、前記コンピューティング装置のコンパイラーによって前記コード領域を同定する手段を含む。
【0117】
実施例44は、実施例40ないし43のいずれか一項記載の主題を含み、前記コード領域を同定する手段が、少なくともある閾値時間期間にわたって前記コンピューティング装置によって実行されるコード領域を同定する手段を含む。
【0118】
実施例45は、実施例40ないし44のいずれか一項記載の主題を含み、前記コンピューティング装置のコンパイラーにより前記プログラム・コードを受領する手段をさらに含む。
【0119】
実施例46は、実施例40ないし45のいずれか一項記載の主題を含み、前記表現の分配性を判定する手段が、前記コード領域において定義されている各表現の分配性を判定する手段を含む。
【0120】
実施例47は、実施例40ないし46のいずれか一項記載の主題を含み、前記相互依存配列解析を実行する手段が、各表現が分配性であると判定することに応答して前記相互依存配列解析を実行する手段を含む。
【0121】
実施例48は、実施例40ないし47のいずれか一項記載の主題を含み、前記表現の分配性を判定する手段が、陳述R(ε(i
1,…,n))=ε(R(i
1),…,R(i
n))であることを判別する手段を含み、εは前記表現であり、Rは前記表現に対する並べ替えであり、i
1,…,nは入力の集合である。
【0122】
実施例49は、実施例40ないし48のいずれか一項記載の主題を含み、前記表現の分配性を判定する手段が、(i)前記表現が入力または出力構造が特定の形をもつことを要求する、(ii)前記表現が前記プログラム・コードの入力‐出力機能を定義する、(iii)前記表現がビット毎の再現性を要求する、あるいは(iv)前記表現が前記コンピューティング装置のコンパイラーにとって未知の関数を含む、のうちの少なくとも一つであるとの判定に応答して、前記表現を非分配性であると判定することを含む。
【0123】
実施例50は、実施例40ないし49のいずれか一項記載の主題を含み、前記一つまたは複数のクラスターのうちのクラスターの各配列がそのクラスターの他のそれぞれの配列と相互依存していることにより、前記一つまたは複数のクラスターのうちの特定のクラスター内のある配列の並べ替えは、その特定のクラスターのそれぞれの他の配列に影響する。
【0124】
実施例51は、実施例40ないし50のいずれか一項記載の主題を含み、前記相互依存配列解析を実行する手段が:前記表現についての表現木を生成する手段であって、前記表現木の各内部ノードは前記表現の演算を示し、前記表現木の各端末ノードは配列またはスカラーを示す、手段と;前記表現木を、配列の相互依存性に基づいて表現部分木の集合に分解する手段と;各表現部分木についての相互依存配列の対応するクラスターを、その表現部分木に含まれる配列に基づいて決定する手段とを含む。
【0125】
実施例52は、実施例40ないし51のいずれか一項記載の主題を含み、前記表現木を、表現部分木の集合に分解する手段が、前記表現木の各内部ノードの結果型を判別する手段を含む。
【0126】
実施例53は、実施例40ないし52のいずれか一項記載の主題を含み、前記双方向データ・フロー解析を実行する手段が:前記表現の入力集合および出力集合を初期化する手段と;前記順方向伝達関数を並べ替えるべき第一の配列に適用することによって、前記表現の前記入力集合および前記出力集合を事前調整する手段と;前記入力集合および前記出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用する手段とを含む。
【0127】
実施例54は、実施例40ないし53のいずれか一項記載の主題を含み、前記並べ替えるべき第一の配列を、前記コンピューティング装置のユーザーから受領する手段をさらに含む。
【0128】
実施例55は、実施例40ないし54のいずれか一項記載の主題を含み、前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用する手段が、各表現の入力集合および出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む。
【0129】
実施例56は、実施例40ないし55のいずれか一項記載の主題を含み、少なくとも一つの配列を並べ替えるよう前記双方向データ・フロー解析に基づいて前記プログラム・コードを変換する手段をさらに含む。
【0130】
実施例57は、実施例40ないし56のいずれか一項記載の主題を含み、前記コード領域内の各文における前記コード領域内の各変数のライブ性を判別する手段をさらに含む。
いくつかの態様を記載しておく。
〔態様1〕
疎行列の自動並べ替えのためのコンピューティング装置であって:
プログラム・コードのコード領域において定義された表現の分配性を判定する分配性解析モジュールであって、前記表現は、前記表現の意味内容が前記表現の入力の並べ替えか出力の並べ替えかによって影響されない場合に分配性であると判定される、分配性解析モジュールと;
前記表現に対して相互依存配列解析を実行して、前記表現の相互依存する配列の一つまたは複数のクラスターを決定する相互依存配列解析モジュールであって、前記一つまたは複数のクラスターのうちのクラスターの各配列は、そのクラスターの他のそれぞれの配列と相互依存している、相互依存配列解析モジュールと;
前記相互依存する配列の前記一つまたは複数のクラスターに基づく前記コード領域内の諸表現を通じた並べ替え可能な配列の逐次反復的な逆方向伝搬および順方向伝搬により、前記コード領域に対して双方向データ・フロー解析を実行する並べ替え可能配列発見モジュールであって、前記逆方向伝搬は逆方向伝達関数に基づき、前記順方向伝搬は順方向伝達関数に基づく、並べ替え可能配列発見モジュールとを有する、
コンピューティング装置。
〔態様2〕
前記プログラム・コードの前記コード領域を同定する領域同定モジュールをさらに有する、態様1記載のコンピューティング装置。
〔態様3〕
前記コード領域を同定することが、ループの本体内にコードを含み、フロー制御文を含まない、前記プログラム・コードの線形ループ領域を同定することを含む、態様2記載のコンピューティング装置。
〔態様4〕
前記コード領域を同定することが、前記コンピューティング装置のコンパイラーによって前記コード領域を同定することを含む、態様2記載のコンピューティング装置。
〔態様5〕
前記コード領域を同定することが、少なくともある閾値時間期間にわたって前記コンピューティング装置によって実行されるコード領域を同定することを含む、態様2記載のコンピューティング装置。
〔態様6〕
前記領域同定モジュールがさらに、前記コンピューティング装置のコンパイラーにより前記プログラム・コードを受領する、態様2記載のコンピューティング装置。
〔態様7〕
前記表現の分配性を判定することが、前記コード領域において定義されている各表現の分配性を判定することを含む、態様1記載のコンピューティング装置。
〔態様8〕
前記相互依存配列解析を実行することが、各表現が分配性であるとの判定に応答して前記相互依存配列解析を実行することを含む、態様7記載のコンピューティング装置。
〔態様9〕
前記表現の分配性を判定することが、陳述R(ε(i1,…,n))=ε(R(i1),…,R(in))であることを判別することを含み、
εは前記表現であり、
Rは前記表現に対する並べ替えであり、
i1,…,nは入力の集合である、態様1ないし7のうちいずれか一項記載のコンピューティング装置。
〔態様10〕
前記表現の分配性を判定することが、(i)前記表現が入力または出力構造が特定の形をもつことを要求する、(ii)前記表現が前記プログラム・コードの入出力機能を定義する、(iii)前記表現がビット毎の再現性を要求する、あるいは(iv)前記表現が前記コンピューティング装置のコンパイラーにとって未知の関数を含む、のうちの少なくとも一つであるとの判定に応答して、前記表現を非分配性であると判定することを含む、態様1ないし8のうちいずれか一項記載のコンピューティング装置。
〔態様11〕
前記一つまたは複数のクラスターのうちのクラスターの各配列がそのクラスターの他のそれぞれの配列と相互依存していることにより、前記一つまたは複数のクラスターのうちの特定のクラスター内のある配列の並べ替えは、その特定のクラスターのそれぞれの他の配列に影響する、態様1ないし8のうちいずれか一項記載のコンピューティング装置。
〔態様12〕
前記相互依存配列解析を実行することが:
前記表現についての表現木を生成する段階であって、前記表現木の各内部ノードは前記表現の演算を示し、前記表現木の各端末ノードは配列またはスカラーを示す、段階と;
前記表現木を、配列の相互依存性に基づいて表現部分木の集合に分解する段階と;
各表現部分木についての相互依存配列の対応するクラスターを、その表現部分木に含まれる配列に基づいて決定する段階とを実行することを含む、
態様1記載のコンピューティング装置。
〔態様13〕
前記表現木を、表現部分木の集合に分解することが、前記表現木の各内部ノードの結果型を判別することを含む、態様12記載のコンピューティング装置。
〔態様14〕
前記双方向データ・フロー解析を実行することが:
前記表現の入力集合および出力集合を初期化し;
前記順方向伝達関数を並べ替えるべき第一の配列に適用することによって、前記表現の前記入力集合および前記出力集合を事前調整し;
前記入力集合および前記出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む、
態様1記載のコンピューティング装置。
〔態様15〕
前記並べ替え可能配列発見モジュールがさらに、前記並べ替えるべき第一の配列を、前記コンピューティング装置のユーザーから受領する、態様14記載のコンピューティング装置。
〔態様16〕
前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することが、各表現の入力集合および出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む、
態様14記載のコンピューティング装置。
〔態様17〕
少なくとも一つの配列を並べ替えるよう前記双方向データ・フロー解析に基づいて前記プログラム・コードを変換するコード変換モジュールをさらに有する、態様1ないし8のうちいずれか一項記載のコンピューティング装置。
〔態様18〕
疎行列の自動並べ替えの方法であって:
コンピューティング装置によって、プログラム・コードのコード領域において定義された表現の分配性を判定する段階であって、前記表現は、前記表現の意味内容が前記表現の入力の並べ替えか出力の並べ替えかによって影響されない場合に分配性であると判定される、段階と;
前記コンピューティング装置によって、前記表現に対して相互依存配列解析を実行して、前記表現の相互依存する配列の一つまたは複数のクラスターを決定する段階であって、前記一つまたは複数のクラスターのうちのクラスターの各配列は、そのクラスターの他のそれぞれの配列と相互依存している、段階と;
前記コンピューティング装置によって、前記相互依存する配列の前記一つまたは複数のクラスターに基づく前記コード領域内の諸表現を通じた並べ替え可能な配列の逐次反復的な逆方向伝搬および順方向伝搬により、前記コード領域に対して双方向データ・フロー解析を実行する段階であって、前記逆方向伝搬は逆方向伝達関数に基づき、前記順方向伝搬は順方向伝達関数に基づく、段階とを含む、
方法。
〔態様19〕
前記表現の分配性を判定することが、前記コード領域において定義されている各表現の分配性を判定することを含み、
前記相互依存配列解析を実行することが、各表現が分配性であると判定することに応答して前記相互依存配列解析を実行することを含む、
態様18記載の方法。
〔態様20〕
前記表現の分配性を判定することが、陳述R(ε(i1,…,n))=ε(R(i1),…,R(in))であることを判別することを含み、
εは前記表現であり、
Rは前記表現に対する並べ替えであり、
i1,…,nは入力の集合である、
態様18記載の方法。
〔態様21〕
前記一つまたは複数のクラスターのうちのクラスターの各配列がそのクラスターの他のそれぞれの配列と相互依存していることにより、前記一つまたは複数のクラスターのうちの特定のクラスター内のある配列の並べ替えは、その特定のクラスターのそれぞれの他の配列に影響する、態様18記載の方法。
〔態様22〕
前記相互依存配列解析を実行することが:
前記表現についての表現木を生成する段階であって、前記表現木の各内部ノードは前記表現の演算を示し、前記表現木の各端末ノードは配列またはスカラーを示す、段階と;
前記表現木を、配列の相互依存性に基づいて表現部分木の集合に分解する段階と;
各表現部分木についての相互依存配列の対応するクラスターを、その表現部分木に含まれる配列に基づいて決定する段階とを含む、
態様18記載の方法。
〔態様23〕
前記双方向データ・フロー解析を実行することが:
前記表現の入力集合および出力集合を初期化し;
前記順方向伝達関数を並べ替えるべき第一の配列に適用することによって、前記表現の前記入力集合および前記出力集合を事前調整し;
前記入力集合および前記出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む、
態様18記載の方法。
〔態様24〕
前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することが、各表現の入力集合および出力集合が変わらなくなるまで前記逆方向伝達関数および前記順方向伝達関数を逐次反復的に適用することを含む、
態様23の方法。
〔態様25〕
態様18ないし24のうちいずれか一項記載の方法をコンピューティング装置に実行させるためのコンピュータ・プログラム。
〔態様26〕
態様25記載のコンピュータ・プログラムを記憶している一つまたは複数のコンピュータ可読記憶媒体。