(57)【特許請求の範囲】
【請求項１】
ソースプログラムに記述される配列データを複数の物理プロセッサに分散配置するコンパイル処理装置において、
分散配置の対象となる配列データを分割するとともに、この分割配列データをツイストする形態でもって各物理プロセッサに割り付ける配置手段を備えることを、
特徴とするコンパイル処理装置。
【請求項２】
ソースプログラムに記述される配列データを複数の物理プロセッサに分散配置するコンパイル処理装置において、
分散配置の対象となる配列データを、指定される次元を分散対象の次元としつつ、規定のアルゴリズムに従って複数の仮想プロセッサに割り付ける割付手段(11)と、
上記割付手段(11)の割り付けた分割配列データを、ツイストする形態でもって各物理プロセッサに割り付ける配置手段(12)とを備えることを、
特徴とするコンパイル処理装置。
【請求項３】
請求項２記載のコンパイル処理装置において、
割付手段(11)は、配列データをブロック単位に仮想プロセッサに割り付けるよう処理することを、
特徴とするコンパイル処理装置。
【請求項４】
請求項２記載のコンパイル処理装置において、
割付手段(11)は、配列データをサイリックに仮想プロセッサに割り付けるよう処理することを、
特徴とするコンパイル処理装置。
【請求項５】
請求項２ないし４記載のコンパイル処理装置において、
並列実行の対象となるループを、配置手段(12)の配置した配列データに合わせて分割して各物理プロセッサに割り付ける分割手段(13)を備えることを、
特徴とするコンパイル処理装置。
【請求項６】
請求項２ないし５記載のコンパイル処理装置において、
配列データ名及び次元名を指定する配列データ分散指示のソースプログラム記述を検出する検出手段(10)を備え、
上記検出手段(10)の検出するプログラム記述が異なるループネストで同一配列データの異なる次元の分散指示を表示するときには、該配列データ及び該次元を指定して割付手段(11)を起動していくよう構成されることを、
特徴とするコンパイル処理装置。
【請求項７】
請求項２ないし５記載のコンパイル処理装置において、
ソースプログラムに記述される並列実行可能なループの添え字が、ループボディ内に記述される配列データの特定の次元のみに表れる場合に、その次元を検出する検出手段(10)を備え、
上記検出手段(10)が異なるループネストで同一配列データの異なる次元を検出するときには、該配列データ及び該次元を指定して割付手段(11)を起動していくよう構成されることを、
特徴とするコンパイル処理装置。
【請求項８】
請求項２ないし５記載のコンパイル処理装置において、
ソースプログラムに記述される並列実行可能なループの添え字が、ループボディ内に記述される配列データの複数の次元に表れる場合に、最も出現頻度の高い次元を検出する検出手段(10)を備え、
上記検出手段(10)が異なるループネストで同一配列データの異なる次元を検出するときには、該配列データ及び該次元を指定して割付手段(11)を起動していくよう構成されることを、
特徴とするコンパイル処理装置。
【請求項９】
請求項２ないし５記載のコンパイル処理装置において、
配列データ名及び次元名を指定する配列データツイスト指示のソースプログラム記述を検出する検出手段(10)を備え、
上記検出手段(10)の検出するプログラム記述が指定する配列データ及び次元を指定して割付手段(11)を起動していくよう構成されることを、
特徴とするコンパイル処理装置。
【請求項１０】
請求項２ないし５記載のコンパイル処理装置において、
ソースプログラムに記述される並列実行可能なループの添え字が、同一ループボディ内の異なるステートメントで同一配列データの異なる次元に表れる場合に、それらの次元を検出する検出手段(10)を備え、
上記検出手段(10)の検出する配列データ及び次元を指定して割付手段(11)を起動していくよう構成されることを、
特徴とするコンパイル処理装置。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、ソースプログラムに記述される配列データを複数の物理プロセッサに分散配置するコンパイル処理装置に関し、特に、通信のオーバーヘッドを招くことなく高い並列性を実現する配列データの分散配置を提供するコンパイル処理装置に関する。
【０００２】
高速計算機を実現する方式として、複数のプロセッシングエレメント（ＰＥ）を集めてネットワークで一体化した構成を採る並列計算機が普及しつつある。この並列計算機を使用するにあたっては、処理対象となるデータをどのようにＰＥに割り付けるかというデータレイアウトが重要な問題である。なぜならば、このデータレイアウトは、プログラムから抽出できる並列性、通信オーバーヘッド、負荷分散に大きな影響を与えるからである。
【０００３】
【従来の技術】
並列計算機の処理の並列を引き出し、かつＰＥ間の通信のオーバーヘッドを小さくするためには、別々のＰＥで並列に処理すべきデータは異なるＰＥに割り付けることが好ましく、また、同一の処理に必要となる複数データは同じＰＥに割り付けることが好ましい。
【０００４】
これから、従来の並列計算機のデータレイアウト法では、プログラムで用いる配列データのある次元を、そのまま順番にｎ次元格子に想定したＰＥのある次元に割り付けていくという方式を用いている。この場合、ＰＥ格子のある次元に割り付けられる配列データはＰＥ間で分散され、そうでない配列データは同一ＰＥ内に割り付けられることになる。
【０００５】
例えば、図１５に示すプログラムで説明するならば、外側のループ（ＤＯ  １００）にのみ並列性がある場合には、図１６（ａ）に示すような形態に従って、２次元配列Ａの１次元目のみを１次元ＰＥアレイに分散的に割り付け、一方、内側のループ（ＤＯ  ２００）にのみ並列性がある場合には、図１６（ｂ）に示すような形態に従って、２次元配列Ａの２次元目のみを１次元ＰＥアレイに分散的に割り付けていくのである。
【０００６】
ここで、配列データのある次元をＰＥ格子のある次元に割り付けるにあたっては、ブロック割付方式によるデータ分散方法と、サイクリック割付方式によるデータ分散方法という２つがある。
【０００７】
すなわち、前者のブロック割付方式によるデータ分散方法は、図１７に示すように、分散する次元方向のサイズを割付対象のプロセッサ台数で割り算し、等分になるようにと連続した領域に割り付けていく方法である。このデータ分散方法は、連続した複数のデータを用いる処理を行うにあたって、通信量を小さくできるという利点がある。ここで、図１７では、８×８サイズの２次元配列の２次元目を分散次元としつつ、ブロック割付方式に従って分散配置する例を示してある。
【０００８】
一方、後者のサイクリック割付方式によるデータ分散方法は、図１８に示すように、分散する次元方向のデータを１つ（あるいはサイクリックの幅分）ずつ順番にプロセッサに割り付けていって、プロセッサ台数分割り付けたら再び始めから順番に割り付けて、その次元方向のサイズ分がすべて割り付けられるまでこれを行う方法である。このデータ分散方法は、担当するデータの位置により処理の量が違う場合に、負荷分散を良くできるという利点がある。ここで、図１８では、８×８サイズの２次元配列の２次元目を分散次元としつつ、サイクリック割付方式に従って分散配置する例を示してある。
【０００９】
なお、これらの従来手法については下記の文献に紹介されている。
〔１〕High Performance Fortran Forum. High Performance Fortran Language Specification Ver. 1.0. 1933.
〔２〕S.Hiranandani,K.Kennedy,and C.Tseng. "Compiler optimizations for Fortran D on MIMD Distributed-Memory Machines" in Proc. Supercomputig'91 pp.86-100, Nov. 1991.
〔３〕R.Ruhl and M.Annaratone. "Parallelization of FORTRAN Code on Distributed-memory Parallel Processors" in Proc. International Conference on SUPERCOMPUTING, pp342-353, June. 1990.
〔４〕H.Zima,H.Bast, and M.Gerndt. "SUPERB: A tool for semi-automatic MIMD/SIMD parallelization" in Parallel Computing, 6:1-18, 1988.
〔５〕A.Rogers and K.Pingali. "Process Decomposition Through Locality ofReference" in Proc. ACM SIG-PLAN '89 Conf. Programming Language Desigh and Implementation, pp.69-80, June. 1989.
〔６〕C.Koelbel and P.Mehrotra. "Compiling global Name-Space Parallel Loops for Distributed Execution" in IEEE Transactions on Parallel and Distributed Systems, pp.440-451, Oct. 1991.
〔７〕進藤達也，岩下英俊，土肥実久，萩原純一.  "AP1000を対象としたVPP Fortran 処理系の実現と評価” SWoPP鞆の浦'93HPC研究会, Vol.93-HPC-48-2, pp.9-16, Aug. 1993.
【００１０】
【発明が解決しようとする課題】
プログラムのある部分にとって、最適な配列データのデータレイアウトであっても、そのプログラムの別の部分では、最適なものとならないことが起こる。
【００１１】
例えば、図１９に示すプログラムについて考えてみる。ここで、このプログラム中のＤＯＡＬＬループとは、並列実行可能なＤＯループを意味する。
このプログラムの最初のループネスト（１００）内側のループの並列性を活かすためには、２次元配列Ａの２次元目を分散させるデータレイアウトが最適である。すなわち、図１６（ｂ）に示すようなデータレイアウトが最適である。これに対して、２番目のループネスト（２００）外側のループの並列性を活かすためには、この２次元配列Ａの１次元目を分散させるデータレイアウトが最適である。すなわち、図１６（ａ）に示すようなデータレイアウトが最適である。
【００１２】
このような配列データの最適データレイアウトのコンフクリトが起こる場合に、従来手法で対処するには次の２つのやり方が考えられる。
すなわち、その１つとしては、一方のプログラム部分に最適なデータレイアウトを決定し、そのデータレイアウトに従ってデータ分散を行ってプログラム全体を実行するという方法である。
【００１３】
もう１つとしては、一方のプログラム部分に最適なデータレイアウトを決定し、そのデータレイアウトに従ってデータ分散を行って処理を実行し、もう一方のプログラム部分の処理に入る前に、そのプログラム部分に最適なデータレイアウトを決定し、そのデータレイアウトに従ってデータ分散を変更して処理を実行するという方法である。
【００１４】
しかしながら、前者の方法に従うと、一方のプログラム部分では、性能が出るものの、もう一方のプログラム部分では、並列性が活かせないことや通信のオーバーヘッドが大きくなることから、性能が出ないという問題点がある。また、後者の方法に従うと、実行時のデータレイアウトの変更に伴う通信のオーバーヘッドにより性能が低下するという問題点がある。
【００１５】
本発明はかかる事情に鑑みてなされたものであって、ソースプログラムに記述される配列データを複数の物理プロセッサに分散配置するときにあって、通信のオーバーヘッドを招くことなく高い並列性を実現する配列データの分散配置を提供する新たなコンパイル処理装置の実現を目的とする。
【００１６】
【課題を解決するための手段】
図１に本発明の原理構成を図示する。
図中、１は本発明を具備するコンパイル処理装置であって、ソースプログラムに記述される配列データを複数の物理プロセッサに分散配置しつつ、ソースプログラムをコンパイルすることでオブジェクトを生成するもの、２はコンパイル処理装置１に接続されるソースファイルであって、コンパイル対象となるソースプログラムを格納するもの、３はコンパイル処理装置１に接続されるオブジェクトファイルであって、コンパイル結果のオブジェクトを格納するものである。
【００１７】
このコンパイル処理装置１は、本発明を実現するために、検出手段１０／割付手段１１／配置手段１２／分割手段１３を備えるコンパイラ４を展開する。
この検出手段１０は、本発明の分散処理の対象となる配列データ及びその次元を検出する。割付手段１１は、検出手段１０の検出した配列データを、検出手段１０の検出した次元を分散対象の次元（分散次元）としつつ、規定のアルゴリズムに従って複数の仮想プロセッサに割り付ける。配置手段１２は、割付手段１１の割り付けた配列データを、ツイストする形態でもって各物理プロセッサに割り付ける。分割手段１３は、並列実行の対象となるループを、配置手段１２の配置した配列データに合わせて分割して各物理プロセッサに割り付ける。
【００１８】
【作用】
本発明では、検出手段１０が、本発明の分散処理の対象となる配列データ及びその次元を検出すると、割付手段１１は、物理プロセッサの台数がｎ台のときにあって、例えば、分散対象の配列データが２次元であるときには（ｎ×ｎ）台、３次元であるときには（ｎ×ｎ×ｎ）台というような複数の仮想プロセッサを想定して、検出手段１０の検出した配列データを、検出手段１０の検出した次元を分散次元としつつ、規定のアルゴリズムに従ってこれらの仮想プロセッサに割り付ける処理を行う。例えば、ブロック単位やサイクリックのアルゴリズムに従って割り付けるのである。
【００１９】
割付手段１１の処理に従って分散対象の配列データが仮想プロセッサに割り付けられると、続いて、配置手段１２は、この仮想プロセッサ上の配列データをツイストする形態でもって各物理プロセッサに割り付ける処理を行う。
【００２０】
このツイスト分散処理は、仮想プロセッサの集合をＶ、物理プロセッサの集合をＰ、仮想プロセッサの次元数をｍ、分散対象の配列データのｋ次元目のサイズをｌk 、物理プロセッサの台数をｎ、すなわち、
【００２１】
【数１】
0003540837.tif 000002
【００２２】
のように表すならば、
【００２３】
【数２】
0003540837.tif 000003
【００２４】
の変換式に従って実行される。
例えば、４×４（ｌ1=4,ｌ2=4 ）の２次元配列Ａと、４台の物理プロセッサ（ｐ=0,1,2,3）と、次元数２（ｍ=2）の４×４台の仮想プロセッサとを想定して、図２の上段に示すように、これらの仮想プロセッサｖ1,ｖ2(ｖ1=0,1,2,3/ｖ2=0,1,2,3)の各々に、２次元配列データＡの配列要素Ａ(i,j) が割り付けられたとすると、例えば、「ｖ1=2,ｖ2=3 」に割り付けられた配列要素Ａ(2,3) は、この〔数２〕式に従い、
（２＋３）ｍｏｄ４＝１
が指す「ｐ＝１」の物理プロセッサに割り付けられることになる。
【００２５】
この変換処理に従って、図２の上段のように仮想プロセッサに割り付けられた２次元配列データＡは、図２の下段に示すように、本来の２次元配列データＡをツイストした形態で物理プロセッサに割り付けられることになる。従って、２次元配列データＡの１次元目と２次元目の双方が物理プロセッサに分散されることとなって、例えば、配列要素Ａ(0,0),Ａ(1,0),Ａ(2,0),Ａ(3,0) がそれぞれ別の物理プロセッサに割り付けられるとともに、配列要素Ａ(0,0),Ａ(0,1),Ａ(0,2),Ａ(0,3) がそれぞれ別の物理プロセッサに割り付けられることになるので、最適なデータ分散のコンフクリトを防止できるようになる。
【００２６】
配置手段１２の処理に従って配列データがツイストする形態でもって各物理プロセッサに割り付けられると、続いて、分割手段１３は、並列実行の対象となるループを、配置手段１２の配置した配列データに合わせて分割して各物理プロセッサに割り付ける。
【００２７】
このようにして、本発明によれば、ソースプログラムに記述される配列データを複数の物理プロセッサに分散配置するときにあって、通信のオーバーヘッドを招くことなく高い並列性を実現する配列データの分散配置を提供できるようになる。
【００２８】
【実施例】
以下、実施例に従って本発明を詳細に説明する。
図３に、本発明を実装する計算機システムのシステム構成を図示する。
【００２９】
この図に示すように、本発明を実現する計算機システムは、全体の制御処理や入出力処理を実行するホスト計算機２０と、並列処理を実行する複数のプロセッサ２１と、ホスト計算機２０とプロセッサ２１との間を接続するネットワーク２２とから構成される。なお、以下では、プロセッサ２１のことを物理プロセッサ２１と称することがある。
【００３０】
このホスト計算機２０は、本発明により構成されるコンパイラ２３を備えて、このコンパイラ２３を使って実行対象のプログラムをコンパイルして、ネットワーク２２を介して各プロセッサ２１にロードし、このロード処理を受けて、各プロセッサ２１は、ネットワーク２２を介して他プロセッサ２１と通信しつつ、ロードされたプログラムを並列実行していくよう処理することになる。
【００３１】
図４に、このコンパイラ２３の実行する処理フローの一実施例を図示する。
この図に示すように、本発明により構成されるコンパイラ２３は、先ず最初に、ステップ１で、分散対象となる配列データ及びその次元を決定するローカルデータレイアウト決定処理を実行し、続いて、ステップ２で、ツイスト分散対象となる配列データ及びその次元を決定するツイストデータレイアウト決定処理を実行し、続いて、ステップ３で、ツイスト分散対象の配列データを各物理プロセッサ２１にどのようにアロケーションするのかを決定するデータ領域計算処理を実行し、続いて、ステップ４で、ツイスト分散対象の配列データを分散して各物理プロセッサ２１に割り付けるアドレス変換処理を実行し、続いて、ステップ５で、並列実行対象のループを分割して各物理プロセッサ２１に割り付けるループ分割処理を実行する。
【００３２】
次に、これらの各処理について詳細に説明する。
図４の処理フローのステップ１で実行するローカルデータレイアウト決定処理では、分散対象となる配列データ及びその次元を決定する。
【００３３】
この決定処理は、プログラマに対して、ループネスト毎にそこでアクセス対象となっている配列データの分散方法を指定させる構成を採る場合には、その指定値を検出することで実行する。
【００３４】
例えば、プログラマに対して、「！DISTRIBUTE  配列名  次元名」を記述させることで配列データの分散方法を指定させる構成を採る場合には、このディレクティブを検出することで、それぞれのループにおける分散対象の配列データ及びその次元を決定するのである。図５のプログラム例で説明するならば、「！DISTRIBUTE  Ａ  ２」を検出することで、ループネスト１００において配列データＡの２次元目を分散する必要があるということを決定するとともに、「！DISTRIBUTE  Ａ  １」を検出することで、ループネスト２００において配列データＡの１次元目を分散する必要があるということを決定することになる。
【００３５】
また、この決定処理は、プログラマに対して配列データの分散方法を指定させる構成を採らない場合には、並列実行可能なループの添え字を評価することで実行する。
【００３６】
その方法の１つとして、並列実行可能なループの添え字が、ループボディ内に記述される配列データの特定の次元のみに表れるか否かをチェックして、表れる場合には、その配列データをその次元を分散次元にして分散するということを決定するのである。この決定方法に従って、図５のプログラムで「！DISTRIBUTE」が記述されていなくても、ループネスト１００において配列データＡの２次元目を分散する必要があるということと、ループネスト２００において配列データＡの１次元目を分散する必要があるということを決定できることになる。
【００３７】
また、別の方法として、並列実行可能なループの添え字が、ループボディ内に記述される配列データの複数の次元に表れる場合に、最も出現頻度の高い次元を検出して、その配列データをその次元を分散次元にして分散するということを決定するのである。
【００３８】
一方、図４の処理フローのステップ２で実行するツイストデータレイアウト決定処理では、ツイスト分散対象となる配列データ及びその次元を決定する。
この決定処理は、プログラマに対して、配列データのツイスト法を指定させる構成を採る場合には、その指定値を検出することで実行する。
【００３９】
例えば、プログラマに対して、「！TWIST   配列名，次元名，・・，次元名」を記述させることで配列データのツイスト法を指定させる構成を採る場合には、このディレクティブを検出することで、ツイスト対象の配列データ及びその次元を決定するのである。例えば、「！TWIST   Ａ，１，２」を検出するときには、配列データＡの１次元目と２次元目とを処理対象にしてツイストするということを決定することになる。
【００４０】
また、この決定処理は、プログラマに対して配列データのツイスト法を指定させる構成を採らない場合には、ローカルデータレイアウト決定処理で決定した配列データ／次元を評価することで実行する。
【００４１】
具体的には、ローカルデータレイアウト決定処理で決定した配列データ／次元を配列データ毎に集め、各配列データについて、異なるループネストで異なる次元の分散要求があるか否かをチェックして、ある場合には、その配列データとそれらの次元とをツイスト対象として決定するのである。例えば、ローカルデータレイアウト決定処理に従って、図５のプログラム中のループネスト１００において配列データＡの２次元目を分散する要求があるということと、ループネスト２００において配列データＡの１次元目を分散する要求があるということが決定されると、この決定を受けて、配列データＡの１次元目と２次元目とをツイスト対象として決定することになる。
【００４２】
また、この決定処理は、プログラマに対して配列データのツイスト法を指定させる構成を採らないとともに、ローカルデータレイアウト決定処理で決定した配列データ／次元を用いない場合には、１つのループネストに着目して、並列実行可能なループの添え字が、同一ループボディ内の異なるステートメントで同一配列データの異なる次元に表れる否かをチェックして、表れる場合には、その配列データとそれらの次元とをツイスト対象として決定する。図６のプログラム例で説明するならば、「statement １」では並列実行可能なループの添え字Ｊが配列データＡの２次元目に表れ、「statement ２」ではこの添え字Ｊが配列データＡの１次元目に表れるので、配列データＡの１次元目と２次元目とをツイスト対象として決定するのである。
【００４３】
一方、図４の処理フローのステップ３で実行するデータ領域計算処理では、ツイストデータレイアウト決定処理で決定されたツイスト分散対象の配列データを、各物理プロセッサ２１にどのようにアロケーションするのかを決定する。
【００４４】
この決定処理は、物理プロセッサ２１の台数をｎ、ツイスト分散対象の配列データＡの次元数をＮ、この配列データＡの次元ｉのサイズをＤi で表すならば、各次元のサイズがｎのｍ次元仮想プロセッサを想定することで実行されるものであって、先ず最初に、各仮想プロセッサに、
【００４５】
【数３】
0003540837.tif 000004
【００４６】
により算出されるサイズＭi を持つ配列データＡ'(Ｍ1,・・・ ,ＭN ）を割り付け、続いて、ｍ次元の仮想プロセッサから１次元の物理プロセッサ２１に対して、
【００４７】
【数４】
0003540837.tif 000005
【００４８】
で規定される個数分の下記の配列データ
Ａ''（Ｍ1,・・・ ,ＭN ，ｎ，・・・・，ｎ）
但し、ｎは（ｍ−１）個
をアロケートすることで実行する。
【００４９】
この決定処理は、要するに、ツイスト分散対象の配列データＡを仮想プロセッサに等分配する形態で割り付けてから、「ｎ×（ｍ−１）」台の仮想プロセッサの持つ配列データＡを１台の物理プロセッサ２１に割り付けていくことを意味している。
【００５０】
例えば、図７の上段に示すような８×８サイズの２次元配列データＡがツイスト分散対象であるとすると、物理プロセッサ２１が４台である場合、図７の中段に示すように、各次元のサイズが４の２次元仮想プロセッサ（１６台）を想定して、〔数３〕式に従って「Ｍi ＝２」を求めることで、各仮想プロセッサに、２×２サイズの分割した２次元配列データＡを割り付けることを決定し、〔数４〕式に従って、「４×（２−１）＝４」を求めることで、図７の下段に示すように、４台の仮想プロセッサの持つ配列データＡを１台の物理プロセッサ２１に割り付けることを決定するのである。
【００５１】
一方、図４の処理フローのステップ４で実行するアドレス変換処理では、データ領域計算処理でのアロケーション結果を踏まえて、ツイストデータレイアウト決定処理で決定されたツイスト分散対象の配列データ（処理対象の次元についても決定されている）を分散して、各物理プロセッサ２１に割り付けるアドレス変換処理を実行する。
【００５２】
このアドレス変換処理は、先ず最初に、配列データＡの配列インデックスを使って、割り付け先となる仮想プロセッサの番号と、その仮想プロセッサ内でのローカル位置番号とを求め、次に、仮想プロセッサの番号を使って、割り付け先となる物理プロセッサ２１の番号と、その物理プロセッサ２１内でのローカル位置番号とを求めていくことで実行する。
【００５３】
すなわち、配列データＡの配列インデックスを（Ｉ1,・・・，ＩN ）、仮想プロセッサの番号を（Ｖ1,・・・，Ｖm ）、仮想プロセッサ内でのローカル位置番号を（Ｉ1 ' ・・・，ＩN ' ）、物理プロセッサ２１の番号をｐ、物理プロセッサ２１内でのローカル位置番号を（Ｊ1,・・・，Ｊm-1 ）で表すならば、
【００５４】
【数５】
0003540837.tif 000006
【００５５】
のように、第１段階の変換処理ｆX に従って、配列データＡの配列インデックスから、割り付け先となる仮想プロセッサ番号と、仮想プロセッサ内ローカル位置番号とを求め、次に、第２段階の変換処理ｆY に従って、仮想プロセッサ番号から、割り付け先となる物理プロセッサ番号と、その物理プロセッサ内ローカル位置番号とを求めていくのである。なお、物理プロセッサ内ローカル位置で、更に、その位置内のどこに割り付けるのかを指定する必要があるが、この位置（以下、ローカル内部位置と称することがある）については、〔数５〕式に記述するように、仮想プロセッサ内ローカル位置番号をそのまま用いている。
【００５６】
この第１段階の変換処理ｆX では、上述したブロック割付方式によるデータ分散方法を用いる場合には、ツイストデータレイアウト決定処理で決定された次元をｉ次元で表すならば、データ領域計算処理で求めたサイズＭi を用いて、
【００５７】
【数６】
0003540837.tif 000007
【００５８】
に従って、配列データＡの配列インデックス（Ｉ1,・・・，ＩN ）から、仮想プロセッサ番号（Ｖ1,・・・，Ｖm ）と、仮想プロセッサ内ローカル位置番号（Ｉ1 ' ・・・，ＩN ' ）とを求め、一方、上述したサイクリック割付方式によるデータ分散方法を用いる場合には、
【００５９】
【数７】
0003540837.tif 000008
【００６０】
に従って、配列データＡの配列インデックス（Ｉ1,・・・，ＩN ）から、仮想プロセッサ番号（Ｖ1,・・・，Ｖm ）と、仮想プロセッサ内ローカル位置番号（Ｉ1 ' ・・・，ＩN ' ）とを求めていくことになる。
【００６１】
例えば、図８の上段に示す８×８サイズの２次元配列データＡが、１次元目及び２次元目を処理対象として指定されブロック分割されて、図７に示した１６台の仮想プロセッサに割り付けられる場合には、この２次元配列データＡの各配列要素は、図８の下段に示すように仮想プロセッサに割り付けられることになるが、第１段階の変換処理ｆX では、上述の〔数６〕式に従ってこれを実行するものである。なお、図８の下段に示す仮想プロセッサの番号は、図２に示したものと同じものである。
【００６２】
配列データＡ（３，４）を例にして説明するならば、図７の所で説明したように、この例の場合には「Ｍ1 ＝Ｍ2 ＝２」であることから、〔数６〕式に、「Ｉ1 ＝３，Ｉ2 ＝４，Ｍ1 ＝２，Ｍ2 ＝２」を代入することで、「Ｖ1 ＝１，Ｖ2 ＝２」の仮想プロセッサ番号が求められるとともに、「Ｉ1 ' ＝１，Ｉ2 ' ＝０」の仮想プロセッサ内ローカル位置番号（仮想プロセッサ番号と同様にマトリクス位置で定義される）が求められることで、図８のブロック分割処理が実行されるのである。
【００６３】
また、例えば、図９の上段に示すような８×８サイズの２次元配列データＡが、１次元目及び２次元目を処理対象として指定されサイクリック分割されて、図７に示した１６台の仮想プロセッサに割り付けられる場合には、この２次元配列データＡの各配列要素は、図９の下段に示すように仮想プロセッサに割り付けられることになるが、第１段階の変換処理ｆX では、上述の〔数７〕式に従ってこれを実行するものである。なお、図９の下段に示す仮想プロセッサの番号は、図２に示したものと同じものである。
【００６４】
配列データＡ（３，４）を例にして説明するならば、〔数７〕式に、「Ｉ1 ＝３，Ｉ2 ＝４，ｎ＝４」を代入することで、「Ｖ1 ＝３，Ｖ2 ＝０」の仮想プロセッサ番号が求められるとともに、「Ｉ1 ' ＝０，Ｉ2 ' ＝１」の仮想プロセッサ内ローカル位置番号が求められることで、図９のサイクリック分割処理が実行されるのである。
【００６５】
一方、この第２段階の変換処理ｆy では、
【００６６】
【数８】
0003540837.tif 000009
【００６７】
に従って、仮想プロセッサ番号（Ｖ1,・・・，Ｖm ）から、物理プロセッサ２１の番号ｐと、その物理プロセッサ２１内でのローカル位置番号（Ｊ1,・・・，Ｊm-1 ）とを求めていくことになる。
【００６８】
例えば、図１０の上段に示す割付形態で仮想プロセッサに割り付けられた２次元配列データＡの各配列要素（図８の下段に示すものと同じ割付形態である）は、この第２段階の変換処理ｆy で、図１０の下段に示すように物理プロセッサ２１に割り付けられることになる。
【００６９】
仮想プロセッサ番号「Ｖ1 ＝１，Ｖ2 ＝２」、仮想プロセッサ内ローカル位置番号「Ｉ1 ' ＝１，Ｉ2 ' ＝０」に割り付けられた配列データＡ（３，４）を例にして説明するならば、〔数８〕式に、「Ｖ1 ＝１，Ｖ2 ＝２，ｎ＝４」を代入することで、「ｐ＝３」の物理プロセッサ番号が求められるとともに、「Ｊ1 ＝１」の物理プロセッサ内ローカル位置（順番位置で定義される）が求められ、そして、上述したように、物理プロセッサ内ローカル位置でのローカル内部位置については、仮想プロセッサ内ローカル位置番号がそのまま用いられるので、「Ｉ1 ' ＝１，Ｉ2 ' ＝０」のローカル内部位置が求められるのである。
【００７０】
また、例えば、図１１の上段に示す割付形態で仮想プロセッサに割り付けられた２次元配列データの各配列要素（図９の下段に示すものと同じ割付形態である）は、この第２段階の変換処理ｆy で、図１１の下段に示すように物理プロセッサ２１に割り付けられることになる。
【００７１】
仮想プロセッサ番号「Ｖ1 ＝３，Ｖ2 ＝０」、仮想プロセッサ内ローカル位置番号「Ｉ1 ' ＝０，Ｉ2 ' ＝１」に割り付けられた配列データＡ（３，４）を例にして説明するならば、〔数８〕式に、「Ｖ1 ＝３，Ｖ2 ＝０，ｎ＝４」を代入することで、「ｐ＝３」の物理プロセッサ番号が求められるとともに、「Ｊ1 ＝３」の物理プロセッサ内ローカル位置が求められ、そして、上述したように、物理プロセッサ内ローカル位置でのローカル内部位置については、仮想プロセッサ内ローカル位置番号がそのまま用いられるので、「Ｉ1 ' ＝０，Ｉ2 ' ＝１」のローカル内部位置が求められるのである。
【００７２】
この第２段階の変換処理ｆy で用いる〔数８〕式の第１番目の式は、〔作用〕の欄で説明した〔数１〕式と同一のものである。
すなわち、図４の処理フローのステップ４で実行するアドレス変換処理は、要するに、第１段階の変換処理ｆx で、ツイストデータレイアウト決定処理で決定された配列データを、ツイストデータレイアウト決定処理で決定された次元を分割次元として、ブロック割付方式やサイクリック割付方式に従って仮想プロセッサに割り付け、次に、第２段階の変換処理ｆy で、仮想プロセッサに割り付けた配列データを、図２に示すようにツイストする形態で物理プロセッサ２１に割り付けていくものである。
【００７３】
この処理に従って、最適なデータ分散のコンフクリトの防止を実現できるのである。
一方、図４の処理フローのステップ５で実行するループ分割処理では、アドレス変換処理での配列データの分散結果を踏まえて、並列実行対象のループを分割して各物理プロセッサ２１に割り付けるループ分割処理を実行する。
【００７４】
例えば、図１２に示すようなｍ重ループが与えられ、この内のｉl が並列ループで、各ループがそれぞれ仮想プロセッサの各次元に割り付けられるとすると、各物理プロセッサ２１におけるループが、図１３に示すような（ｍ×２−１）重ループとなるようにとコードジェネレーションを行うのである。ここで、ｉl 以外の全てのループは、仮想プロセッサのインデックスを表すループと、その仮想プロセッサ内の配列インデックスを表すループにストリップマインされることになる。
【００７５】
このループ分割処理で用いる図１３中のＬ（Ｖk ）／Ｕ（Ｖk ）／Ｖl について説明する。
このループ分割処理で用いるＬ（Ｖk ）は、仮想プロセッサ内の配列インデックスの下限値、Ｕ（Ｖk ）は、仮想プロセッサ内の配列インデックスの上限値を表しており、アドレス変換処理でブロック割付方式を用いる場合には、
【００７６】
【数９】
0003540837.tif 000010
【００７７】
の式で導出され、サイクリック割付方式を用いる場合には、
【００７８】
【数１０】
0003540837.tif 000011
【００７９】
の式で導出される。ここで、Ｖk は仮想プロセッサ番号、Ｍk は仮想プロセッサに割り付けられる配列データのブロックサイズ、Ｎk は配列データのｋ次元目のサイズから１を引いた値、Ｓは飛び幅を表している。
【００８０】
ブロック割付方式により図１０の上段に示す割付形態でもって仮想プロセッサに割り付けられた８×８サイズの２次元配列データで説明するならば、例えば、仮想プロセッサ番号「Ｖ1 ＝１，Ｖ2 ＝０」の仮想プロセッサには、〔数９〕式に、「Ｖ1 ＝１，Ｖ2 ＝０，Ｍ1 ＝２，Ｍ2 ＝２，Ｎ1 ＝７，Ｎ2 ＝７」を代入することで、
Ｌ（Ｖ1 ）＝２，Ｕ（Ｖ1 ）＝３，Ｌ（Ｖ2 ）＝０，Ｕ（Ｖ2 ）＝１
という上下限値を持つ配列インデックスが展開されていることが分かる。なお、このときの配列インデックスの飛び幅は１である。
【００８１】
また、サイクリック割付方式により図１１の上段に示す割付形態でもって仮想プロセッサに割り付けられた８×８サイズの２次元配列データで説明するならば、例えば、仮想プロセッサ番号「Ｖ1 ＝１，Ｖ2 ＝０」の仮想プロセッサには、〔数１０〕式に、「Ｖ1 ＝１，Ｖ2 ＝０，Ｎ1 ＝７，Ｎ2 ＝７」を代入することで、
Ｌ（Ｖ1 ）＝１，Ｕ（Ｖ1 ）＝５，Ｌ（Ｖ2 ）＝０，Ｕ（Ｖ2 ）＝４
という上下限値を持つ配列インデックスが展開されていることが分かる。なお、このときの配列インデックスの飛び幅は４である。
【００８２】
一方、このループ分割処理で用いるＶl は、物理プロセッサ２１の担当する仮想プロセッサのインデックスを表しており、
【００８３】
【数１１】
0003540837.tif 000012
【００８４】
の式で導出される。ここで、ｐは物理プロセッサ番号、ｎは物理プロセッサ台数、Ｖk は仮想プロセッサ番号である。
【００８５】
上述したように、ループ分割処理では、並列実行対象のループを分割して図１３に示すようなコードを生成する処理を実行する。
例えば、図１９に示す２重ループのプログラムが、図８の上段に示す８×８サイズの２次元配列データを処理するときにあって、アドレス変換処理で、ブロック割付方式を用いる場合には、このループ分割処理では、図１４に示すようなコードを生成するのである。
【００８６】
この場合、Ｌ（Ｖk ）は、
Ｌ（Ｖk ）＝２×Ｖk 
と表され、Ｕ（Ｖk ）は、
Ｕ（Ｖk ）＝２×（Ｖk ＋１）−１
と表され、〔数１１〕式は、
Ｖ1 ＝（ｐ＋（４−Ｖ2 ))ｍｏｄ４
Ｖ2 ＝（ｐ＋（４−Ｖ1 ))ｍｏｄ４
と表される。
【００８７】
従って、「ｐ＝０」の物理プロセッサ２１が担当する仮想プロセッサは、この〔数１１〕式に、「ｐ＝０，Ｖ1 ＝０」を代入することで特定される「Ｖ1 ＝０，Ｖ2 ＝０」の仮想プロセッサと、「ｐ＝０，Ｖ1 ＝１」を代入することで特定される「Ｖ1 ＝１，Ｖ2 ＝３」の仮想プロセッサと、「ｐ＝０，Ｖ1 ＝２」を代入することで特定される「Ｖ1 ＝２，Ｖ2 ＝２」の仮想プロセッサと、「ｐ＝０，Ｖ1 ＝３」を代入することで特定される「Ｖ1 ＝３，Ｖ2 ＝１」の仮想プロセッサとであることが分かる。すなわち、〔数１１〕式に従って、物理プロセッサ２１の担当する仮想プロセッサを特定できるのである。
【００８８】
このようにして、このループ分割処理では、仮想プロセッサ内の配列インデックスの下限値Ｌ（Ｖk ）と、仮想プロセッサ内の配列インデックスの上限値Ｕ（Ｖk ）と、物理プロセッサ２１の担当する仮想プロセッサのインデックスを特定する〔数１１〕式とを使いつつ、要するに、アドレス変換処理での配列データの分散結果を踏まえて、並列実行対象のループを分割して各物理プロセッサ２１に割り付けていく処理を実行するのである。
【００８９】
図示実施例に従って本発明を詳細に説明したが、本発明はこれに限定されるものではない。例えば、実施例で使用した数値はあくまで一例に過ぎないものである。
【００９０】
【発明の効果】
以上説明したように、本発明によれば、ソースプログラムに記述される配列データを複数の物理プロセッサに分散配置するときにあって、最適なデータ分散方法がコンフリクトするときには、配列データをツイストして物理プロセッサに分散配置することで、このコンフリクトを解消するようにとコンパイル処理するものである。
【００９１】
これから、通信のオーバーヘッドを招くことなく高い並列性を実現する配列データの分散配置を提供できるようになる。
【図面の簡単な説明】
【図１】本発明の原理構成図である。
【図２】ツイスト分散処理の説明図である。
【図３】本発明を実装する計算機システムのシステム構成図である。
【図４】本発明のコンパイラが実行する処理フローの一実施例である。
【図５】分散方法の指定されるプログラムの一例である。
【図６】ツイスト対象となるプログラムの一例である。
【図７】データ領域計算処理の説明図である。
【図８】アドレス変換処理の説明図である。
【図９】アドレス変換処理の説明図である。
【図１０】アドレス変換処理の説明図である。
【図１１】アドレス変換処理の説明図である。
【図１２】ループ分割処理の説明図である。
【図１３】ループ分割処理の説明図である。
【図１４】ループ分割処理の説明図である。
【図１５】プログラムの一例である。
【図１６】従来技術の説明図である。
【図１７】従来技術の説明図である。
【図１８】従来技術の説明図である。
【図１９】最適データ分散がコンフリクトを起こすプログラム例である。
【符号の説明】
１    コンパイル処理装置
２    ソースファイル
３    オブジェクトファイル
４    コンパイラ
１０  検出手段
１１  割付手段
１２  配置手段
１３  分割手段
【図１】
0003540837.tif 000013
【図２】
0003540837.tif 000014
【図３】
0003540837.tif 000015
【図４】
0003540837.tif 000016
【図５】
0003540837.tif 000017
【図６】
0003540837.tif 000018
【図７】
0003540837.tif 000019
【図８】
0003540837.tif 000020
【図９】
0003540837.tif 000021
【図１０】
0003540837.tif 000022
【図１１】
0003540837.tif 000023
【図１２】
0003540837.tif 000024
【図１３】
0003540837.tif 000025
【図１４】
0003540837.tif 000026
【図１５】
0003540837.tif 000027
【図１６】
0003540837.tif 000028
【図１７】
0003540837.tif 000029
【図１８】
0003540837.tif 000030
【図１９】
0003540837.tif 000031