まず、本実施例にかかるライブラリ変換の概念について説明する。本実施例に示すライブラリ変換装置は、プログラム上に存在する逐次ライブラリの関数(以下、逐次ライブラリ関数)の変換対象となる並列ライブラリの関数(以下、並列ライブラリ関数)を選択/変換すると共に、変換後の並列ライブラリ関数の前後に分割データを分割/収集する関数を追加する。
なお、本実施例では一例として、逐次ライブラリ関数を並列ライブラリ関数に変換する場合を示すが、これに限定されるものではなく、例えば、逐次ライブラリ関数を異なる逐次ライブラリ関数に変換することができる。
次に、本実施例に示すライブラリ変換装置の構成について説明する。図1は、本実施例に示すライブラリ変換装置の構成を示す機能ブロック図である。同図に示すように、このライブラリ変換装置100は、キーボードやマウスなどの入力装置40およびディスプレイなどの表示装置50に接続されている。
また、ライブラリ変換装置100は、前処理部200と、記憶部300と、後処理部400とを有する。前処理部200は、逐次ライブラリ関数の関数名や引数などの関係を示す逐次ライブラリテーブルと、並列ライブラリ関数の関数名、引数、精度、特性などの関係を示す並列ライブラリテーブルとを生成する処理部である(並列ライブラリテーブルは、入力装置40から入力される並列ライブラリ関数の精度や特性などの情報を基にして生成される)。
さらに、前処理部200は、生成した逐次ライブラリテーブルと並列ライブラリテーブルとを表示装置50に表示し、各ライブラリ間で機能の等しい関数の情報を入力装置40から取得する(ユーザが表示装置50に表示された情報を基にして、各ライブラリ間で機能の等しい関数の情報を入力装置40から入力する)。
そして、前処理部200は、取得した情報を基に逐次ライブラリテーブルの逐次ライブラリ関数と並列ライブラリテーブルの並列ライブラリ関数とを関連付け、関連付けた情報を逐次/並列ライブラリリンク構造情報300aとして記憶部300に記憶させる。
記憶部300は、逐次/並列ライブラリリンク構造情報300aおよびライブラリ関数の変換対象となるプログラム300bとを記憶する記憶部である。
後処理部400は、プログラム300bに含まれる逐次ライブラリ関数を並列ライブラリ関数に変換する処理部である。具体的に、この後処理部400は、プログラム300bの逐次ライブラリ関数に関連付けられた並列ライブラリ関数を逐次/並列ライブラリリンク構造情報300aから検索し、検索した並列ライブラリ関数と、対応する逐次ライブラリ関数とを置換する。なお、後処理部400は、並列ライブラリ関数に対応する分割データが存在する場合には、分割データを分散/収集する関数を並列ライブラリ関数の前後に追加する。
次に、図1に示した前処理部200の構成について説明する。図2は、図1に示した前処理部200の構成を示す機能ブロック図である。同図に示すように、前処理部200は、逐次ライブラリ情報記憶部210と、逐次ライブラリテーブル生成部220と、逐次ライブラリテーブル記憶部230と、並列ライブラリ情報記憶部240と、並列ライブラリテーブル生成部250と、並列ライブラリテーブル記憶部260と、逐次/並列ライブラリ初期リンク生成部270とを有する。
逐次ライブラリ情報記憶部210は、逐次ライブラリ関数の関数名や引数の情報を記憶する記憶部であり、逐次ライブラリテーブル生成部220は、逐次ライブラリ情報記憶部210に記憶された逐次ライブラリ関数の関数名や引数の情報を基にして、逐次ライブラリテーブルを作成する処理部である。
図3は、逐次ライブラリテーブルの一例を示す図である。同図に示すように、この逐次ライブラリテーブルは、「関数名」、「引数の数」および「引数1〜6」から構成される。ここで、「関数名」には逐次ライブラリ関数の名前が登録され、「引数の数」には逐次ライブラリ関数で利用される引数の数が登録され、「引数1〜6」には各引数の型、サイズ、入力データまたは出力データかを識別するための情報(inの場合は入力データであることを示し、outの場合は出力データであることを示す)が登録される。
なお、逐次ライブラリテーブル生成部220は、生成した逐次ライブラリテーブルを表示装置50に表示させると共に、逐次ライブラリテーブルを逐次ライブラリテーブル記憶部230に記憶させる。逐次ライブラリテーブル記憶部230は、逐次ライブラリテーブルを記憶する記憶部である。
並列ライブラリ情報記憶部240は、並列ライブラリ関数の関数名や引数の情報を記憶する記憶部であり、並列ライブラリテーブル生成部250は、並列ライブラリ情報記憶部240に記憶された並列ライブラリ関数の関数名や引数の情報と、入力装置60から入力される情報とを基にして並列ライブラリテーブルを生成する処理部である。
入力装置60から並列ライブラリ生成部250に入力される情報は、並列ライブラリ関数の精度、性能および使用するメモリ量の情報を有する。また、並列ライブラリ関数が、プロセス並列用の関数であり、かつ使用されるデータを各プロセスに分割する必要のある関数である場合には、ユーザは、各プロセスに対応するように分割したデータ(以下、分割データ)と分割データの分割形式とを入力装置60から並列ライブラリ生成部250に入力する。
図4は、並列ライブラリテーブルの一例を示す図である。同図に示すように、この並列ライブラリテーブルは、「関数名」、「引数の数」、「引数1〜6」、「精度」、「性能」、「メモリ量」および「分割データ」から構成される。
ここで、「関数名」には並列ライブラリ関数の名前が登録され、「引数の数」には並列ライブラリ関数で利用される引数の数が登録され、「引数1〜6」には各引数の型、サイズ、入力データまたは出力データかを識別するための情報(inの場合は入力データであることを示し、outの場合は出力データであることを示す)が登録される。
また、「精度」には並列ライブラリ関数の精度が登録され(*の数が少ないほど精度が高い)、「性能」には並列ライブラリ関数の性能が登録され(*の数が少ないほど性能が高い)、「メモリ量」には並列ライブラリ関数で使用されるメモリの量が登録され(*の数が少ないほどメモリ使用量が少ない)、「分割データ」には分割変数と分割形式とが登録される。なお、“*”は、入力装置のユーザインターフェースとして使用される表示形態である。
なお、並列ライブラリテーブル生成部250は、生成した並列ライブラリテーブルを表示装置50に表示させると共に、並列ライブラリテーブルを並列ライブラリテーブル記憶部260に記憶させる。並列ライブラリテーブル記憶部260は、並列ライブラリテーブルを記憶する記憶部である。
逐次/並列ライブラリ初期リンク生成部270は、逐次ライブラリテーブル記憶部210に記憶された逐次ライブラリテーブルと、並列ライブラリテーブル記憶部240に記憶された並列ライブラリテーブルと、入力装置40から入力される逐次ライブラリ関数および並列ライブラリ関数の結合情報とを基にして、逐次ライブラリ関数と並列ライブラリ関数とをリンク付け(関連付け)した逐次/並列ライブラリリンク構造情報300aを生成し、生成した逐次/並列ライブラリリンク構造情報300aを記憶部300に記憶させる処理部である。
なお、逐次/並列ライブラリ初期リンク生成部270は、逐次ライブラリテーブルおよび並列ライブラリテーブルを表示装置50に出力させ、ユーザが入力装置50を介して機能の等しい逐次ライブラリ関数と並列ライブラリ関数とを関連付けることによって結合情報をえることになる。
図5は、逐次/並列ライブラリ初期リンク生成部270によって生成される逐次/並列ライブラリリンク構造情報300aの一例を示す図である。(なお、この図5に示される表示内容は、表示装置50に表示されるものとする。)同図に示すように、この逐次/並列ライブラリリンク構造情報300aは、機能の等しい逐次ライブラリ関数と並列ライブラリ関数とが関連付けられている。
具体的には、逐次ライブラリテーブルの「dsyevx」が並列ライブラリテーブルの「dsyevx」「dsyevd」および「dsyevr」に関連付けられ、逐次ライブラリテーブルの「dsyevd」が並列ライブラリテーブルの「dsyevx」、「dsyevd」および「dsyevr」に関連付けられ、逐次ライブラリテーブルの「dsyevr」が、並列ライブラリテーブルの「dsyevx」、「dsyevd」および「dsyevr」に関連付けられ、逐次ライブラリテーブルの「dgemm」が並列ライブラリテーブルの「dgemm」に関連付けられている。
次に、図1に示した後処理部400の構成について説明する。図6は、図1に示した後処理部400の構成を示す機能ブロック図である。同図に示すように、この後処理部4000は、コマンド受付部410と、リンク再構成処理部420と、ライブラリ置換処理部430と、ライブラリ関数検索部440とオブジェクトコード変換部450とを有する。
コマンド受付部410は、プログラム300bのコンパイルを行うコマンド(以下、コンパイルコマンドと表記する)を入力装置40から取得し、取得したコンパイルコマンドの指示内容を解析すると共に、解析した指示内容をリンク再構成処理部420に渡す処理部である。
例えば、コマンド受付部410がコンパイルコマンド「ffc-mxxx.c-laaa-lbbb-lccc-linktable link.lf」を取得した場合には、このコンパイルコマンドの指示内容は「ffc」○○社製Cコンパリラを使用し、「-m」ライブラリ関数の優先要素はメモリ量を優先し、「laaa-lbbb-lccc」リンクするライブラリをlaaaとlbbbとlcccとに指定し、「linktablle link.lf」利用するリンクテーブルを逐次/並列ライブラリリンク構造情報330aに指定する旨を示している。
なお、コンパイルコマンドにかかる優先要素が「p」の場合には精度を優先する旨を示し、優先要素が「m」の場合には使用メモリを優先する(使用メモリ量の最も少ないライブラリ関数を優先する)旨を示し、優先要素が「s」の場合には処理速度を優先する旨を示す。
また、優先要素が「ms」の場合には、使用メモリ量を第一優先とし、メモリ使用量が最小の関数を検索する。メモリ使用量が最小の関数が複数存在する場合には、第二優先として、メモリ使用量が最小の関数の内、最も処理速度が速い関数を選択する旨を示す。その他、優先要素は「pm」、「pms」および「mp」などのように「p」、「m」、「s」を組み合わせて、ユーザが所望する関数を選択することができる。
さらに、優先要素は「m0.4s0.5p0.1」と指定することもできる(本実施例では一例を示す)。この場合、使用メモリ量を40%の割合、処理速度を50%の割合、精度を10%の割合で優先することを示す。
リンク再構成処理部420は、逐次/並列ライブラリリンク構造情報300aをコマンド受付部410から渡される指示内容を基にして再構成する処理部であり、リンク構造排除処理部420aと、N(多)対1リンク構造生成部420bとを有する。
リンク構造排除処理部420aは、コマンド受付部410からリンクするライブラリにかかる情報(以下、リンクライブラリ情報)を取得し、取得したリンクライブラリ情報を基にして逐次/並列ライブラリリンク構造情報300aの初期リンク構造にある不要なライブラリテーブルやリンク構造を削除する。
図7は、初期リンク構造にある不要なライブラリテーブルやリンク構造の削除を説明するための説明図である。同図に示すように、初期リンク構造では、逐次ライブラリテーブル1が並列ライブラリ4にリンクされ、逐次ライブラリテーブル2が並列ライブラリテーブル5、6にリンクされ、逐次ライブラリテーブル3が並列ライブラリテーブル4〜8にリンクされている。
そして、リンク構造排除処理部420aが、逐次ライブラリテーブル3と並列ライブラリテーブル4〜7をリンクする旨のリンクライブラリ情報を取得した場合には、逐次ライブラリテーブル1,2を削除すると共に、逐次ライブラリテーブル1と並列ライブラリテーブル4とのリンク、逐次ライブラリテーブル2と並列ライブラリテーブル5,6とのリンク、逐次ライブラリテーブル3と並列ライブラリテーブル8とのリンクを削除する。
N対1リンク構造生成部420bは、コマンド受付部410からコンパイルコマンドの優先要素にかかる情報(以下、優先要素情報)を取得し、取得した優先要素情報を基にして、逐次/並列ライブラリリンク構造情報300aでリンクされている複数の並列ライブラリ関数の内、最適な並列ライブラリ関数を選択し、「1対1またはN(多)対1」のリンク構造に再構成する処理部である。
図8は、メモリ量を優先した場合に、再構成される逐次/並列ライブラリリンク構造情報300aを示す図である。元々、逐次/並列ライブラリリンク構造情報300aは、図5に示したように、逐次ライブラリ関数「dsyevx」が並列ライブラリ関数「dsyevx」、「dsyevd」および「dsyevr」に関連付けれ、逐次ライブラリ関数「dsyevd」が並列ライブラリ関数「dsyevx」、「dsyevd」および「dsyevr」に関連付けれ、逐次ライブラリ関数「dsyevr」が並列ライブラリ関数「dsyevx」、「dsyevd」および「dsyevr」に関連付けれ、逐次ライブラリ関数「dgemm」が並列ライブラリ関数「dgemm」に関連付けられていた。
しかし、メモリ量を優先する場合には、図8に示すように、関連付けられた並列ライブラリ関数の内、使用されるメモリ量が最も少ない並列ライブラリ関数以外の関連付けを解除する。具体的には、逐次ライブラリ関数「dsyevx」を並列ライブラリ関数「dsyevr」のみに関連付け、逐次ライブラリ関数「dsyevd」を並列ライブラリ関数「dsyevr」のみに関連付け、逐次ライブラリ関数「dsyevr」を並列ライブラリ関数「dsyevr」のみに関連付ける。なお、逐次ライブラリ関数「dgemm」に関しては、一つの並列ライブラリ関数「dgemm」のみに関連付けられているため、関連付けに変更はない。
なお、図8に示した各関数の関連付けは、実際には関連付け先となる並列ライブラリ関数のポインタを利用することになる。図9は、ポインタによって関連付けられた逐次/並列ライブラリリンク構造情報300aの一例を示す図である。
同図に示すように、各逐次ライブラリ関数はそれぞれ関連付け先となる並列ライブラリ関数のポインタを有し、このポインタによって、関連付けられる並列ライブラリ関数が特定される。また、並列ライブラリテーブルの精度、性能およびメモリ量は、「*」ではなく、実際には数字によって登録される。また、並列ライブラリテーブルのポインタ領域は「null」に設定され使用されない。
ライブラリ置換処理部430は、逐次/並列ライブラリリンク構造情報300aを基にして、プログラム上の逐次ライブラリ関数を並列ライブラリ関数に置換する処理部であり、整合性調整処理部430aと、分割データ生成部430bと、収集データ生成部430cと、並列ライブラリ結合部430dとを有する。
整合性調整処理部430aは、引数コンバータライブラリを保持し、関連付けられた逐次ライブラリ関数と並列ライブラリ関数との引数の並び順が異なる場合に、引数コンバータライブラリに含まれる引数コンバータライブラリ関数を利用して、逐次ライブラリ関数の引数の並び順と等しい並列ライブラリ関数を新たに生成し、生成した並列ライブラリ関数と逐次ライブラリ関数とを新たに関連付ける処理部である。
図10は、整合性調整処理部430aの処理を説明するための説明図である。同図に示すように、整合性調整処理部430aは、逐次ライブラリ関数10の引数の並びが並列ライブラリ関数11の引数の並びと異なる場合に、並列ライブラリ関数11の前に、引数コンバータライブラリ関数「argv_converter」を設定することによって、逐次ライブラリ関数10の引数の並びと同様の引数の並びを有する並列ライブラリ関数12を生成し、逐次ライブラリ関数10と並列ライブラリ関数12とを新たにリンク付ける。なお、整合性調整処理部430aは、逐次ライブラリ関数10と並列ライブラリ関数11とのリンク付けは解除する。
分割データ生成部430bは、データ分割/収集ライブラリを保持し、置換対象となる並列ライブラリ関数に分割データの指定があり、かつ分割データが入力データに対応する場合に、分割データを各プロセスに分配する機能を有する関数をデータ分割/収集ライブラリから検索し、検索した関数と分割データとで分割関数を生成し、生成した分割関数を並列ライブラリ結合部430dに渡す処理部である。
例えば、変換対象となる並列ライブラリ関数が、図2に示す「dsyevr」であり、dsyevrに対する分割変数が「A,B,C」であり、この分割変数の内、「A,B」が入力データである場合には、分割データ生成部430bは、分割関数「div_data(a…)」、「div_data(b…)」を生成し、生成した分割関数を、並列ライブラリ結合部430に渡す。
収集データ生成部430cは、データ分割/収集ライブラリを保持し、置換対象となる並列ライブラリ関数に分割データの指定があり、かつ分割データが出力データに対応する場合に、各プロセスから出力されるデータを収集する機能を有する関数をデータ分割/収集ライブラリから検索し、検索した関数と分割データとで収集関数を生成し、生成した収集関数を並列ライブラリ結合部430dに渡す処理部である。
例えば、変換対象となる並列ライブラリ関数が、図2に示す「dsyevr」であり、dsyevrに対する分割変数が「A,B,C」であり、この分割変数の内、「C」が出力データである場合には、収集データ生成部430bは、収集関数「gather_data(c…)」を生成し、生成した収集関数を、並列ライブラリ結合部430dに渡す。
並列ライブラリ結合部430dは、プログラム300bに含まれる逐次ライブラリ関数を、並列ライブラリ関数に置換する処理部である。具体的に、並列ライブラリ結合部430dは、並列ライブラリ関数に置換する場合に、並列ライブラリ関数の情報を整合性調整処理部430、分割データ生成部430bおよび収集データ生成部430cに通知する。
そして、整合性調整処理部430aによって逐次ライブラリ関数と並列ライブラリ関数との引数の順番を調整され、分割データ生成部430bが分割関数を生成し、収集データ生成部430cが収集関数を生成し、並列ライブラリ結合部430dが変換対象となる並列ライブラリ関数と分割関数と収集関数とを結合し、結合した並列ライブラリ関数とプログラム上の逐次ライブラリ関数とを置換する。
図11は、並列ライブラリ結合部430dが行う処理を説明するための説明図である。同図に示すように、並列ライブラリ結合部430dは、並列ライブラリテーブルの並列ライブラリ関数「dsyevr」と、分割関数「div_data(a…)」、「div_data(b…)」と、収集関数「gather_data(c…)」とを結合し、各関数を結合した並列ライブラリ関数と、プログラム上の逐次ライブラリ関数とを置換する。
なお、プログラム上にプラグマ(コンパイラへ特別な指示をするように開発プログラム中に書き込む指示文)が存在する場合は、並列ライブラリ結合部430dは、プラグマを解読し、プラグマによって指定された逐次ライブラリ関数を関連付けられた並列ライブラリ関数に変換する。
ライブラリ関数検索部440は、プログラム300b中のライブラリ関数のコールを検索し、コールされている逐次ライブラリ関数の情報を並列ライブラリ結合部430に通知する処理部である。並列ライブラリ結合部430dは、通知を受けた逐次ライブラリ関数のポインタを検索し、逐次ライブラリ関数が関連付けられている場合に(ポインタがnull以外の場合に)、逐次ライブラリ関数を並列ライブラリ関数に置換することになる。
また、ライブラリ関数検索部440は、プログラム中からプラグマを検出した場合には、プラグマを検出した旨と、対応する逐次ライブラリ関数の情報とを並列ライブラリ結合部430dに通知する。さらに、ライブラリ関数検索部440は、プログラム中からライブラリ関数のコールおよびプラグマを検索し終わった場合に、検索が終了した旨をオブジェクトコード変換部450に通知する。
オブジェクトコード変換処理部450は、ライブラリ関数検索部440からプログラム300b上のライブラリ関数のコールおよびプラグマを検索し終わった旨の通知を取得した場合に、プログラム300bをオブジェクトコードに変換する処理部である。
次に、図6に示した後処理部400の処理について説明する。図12は、図6に示した後処理部400の処理手順を示すフローチャートである。同図に示すように、後処理部400は、コマンド受付部410がコンパイルコマンドを取得して、コンパイルコマンドの指示内容をリンク再編成処理部420に通知し(ステップS101)、リンク再編成処理部420が逐次/並列ライブラリリンク構造情報300aを取得する(ステップS102)。
そして、リンク構造排除処理部420aが不要なライブラリとそのリンク構造を排除し(ステップS103)、N対1リンク構造生成部420bがコンパイルコマンドの指示内容に対するリンク構造を生成し(ステップS104)、ライブラリ関数検索部440がプログラム中にライブラリ関数コールがあるか否かを判定する(ステップS105)。
プログラム中にライブラリ関数のコールがない場合には(ステップS105,No)、処理を終了し、プログラム中にライブラリ関数のコールがある場合には(ステップS105,Yes)、並列ライブラリ結合部430dが、リンクされている関数があるか否かを判定する(ステップS106)。
リンクされている関数がない場合には(ステップS106,No)、処理を終了し、リンクされている関数がある場合には(ステップS106,Yes)、並列ライブラリ結合部430dがライブラリ関数の置換を行い(ステップS107)、整合性調整処理部430aがリンクされた関数どうしの引数が一致するか否かを判定する(ステップS108)。
リンクされた関数どうしの引数が一致しない場合には(ステップS108,No)、整合性調整処理部430aが引数並びの同じ関数を生成し、新たなリンク付けを行い(ステップS109)、分割データ生成部430bおよび収集データ生成部430cが変換後の関数に分割データがあるか否かを判定する(ステップS110)。一方、リンクされた関数どうしの引数が一致する場合には(ステップS108,Yes)、そのままステップS110に移行する。
関数に分割データがない場合には(ステップS110,No)、処理を終了し、関数に分割データがある場合には(ステップS110,Yes)、分割データ生成部430bが分割関数を生成し、収集データ生成部430cが収集関数を生成し、並列ライブラリ結合部430dが、分割関数または収集関数をプログラムに挿入する(ステップS111)。
このように、プログラム中のライブラリ関数にコールがあり、且つコールされた関数がリンクされている場合には、並列ライブラリ結合部430が、プログラム中の逐次ライブラリ関数を、並列ライブラリ関数に置換し、分割関数または収集関数をプログラムに挿入するので、置換対象となる逐次ライブラリ関数の機能などが、置換元の並列ライブラリ関数の機能などと異なっていてもユーザが元プログラム修正することなくライブラリ関数を置換することができる。
次に、プログラム中のプラグマを考慮した後処理部400bの処理について説明する。図13は、プログラム中のプラグマを考慮した後処理部400bの処理手順を示すフローチャートである。同図に示すように、後処理部400は、コマンド受付部410がコンパイルコマンドを取得して、コンパイルコマンドの指示内容をリンク再編成処理部420に通知し(ステップS201)、リンク再編成処理部420が逐次/並列ライブラリリンク構造情報300aを取得する(ステップS202)。
そして、リンク構造排除処理部420aが不要なライブラリとそのリンク構造を排除し(ステップS203)、ライブラリ関数検索部440がプログラム中にプラグマ指定があるか否かを判定し(ステップS204)、プログラム中にプラグマ指定がある場合には(ステップS204,Yes)、ライブラリ置換処理部430がプラグマ処理を行い(ステップS205)、N対1リンク構造生成部420bがコンパイルコマンドの指示内容に対するリンク構造を生成する(ステップS206)。一方、プログラム中にプラグマ指定がない場合には(ステップS204,No)、そのままステップS206に移行する。
続いて、ライブラリ関数検索部440がプログラム中にライブラリ関数(プラグマ指定以外)コールがあるか否かを判定し(ステップS207)、プログラム中にライブラリ関数コールがない場合には(ステップS207,No)、処理を終了し、プログラム中にライブラリ関数コールがある場合には(ステップS207,Yes)、並列ライブラリ結合部430dが、リンクされている関数があるか否かを判定する(ステップS208)。
リンクされている関数がない場合には(ステップS208,No)、処理を終了し、リンクされている関数がある場合には(ステップS208,Yes)、並列ライブラリ結合部430dがライブラリ関数の置換を行い(ステップS209)、整合性調整処理部430aがリンクされた関数どうしの引数が一致するか否かを判定する(ステップS210)。
リンクされた関数どうしの引数が一致しない場合には(ステップS210,No)、整合性調整処理部430aが引数並びの同じ関数を生成し、新たなリンク付けを行い(ステップS211)、分割データ生成部430bおよび収集データ生成部430cが変換後の関数に分割データがあるか否かを判定する(ステップS212)。一方、リンクされた関数どうしの引数が一致する場合には(ステップS210,Yes)、そのままステップS212に移行する。
変換後の関数に分割データがない場合には(ステップS212,No)、処理を終了し、変換後の関数に分割データがある場合には(ステップS212,Yes)、分割データ生成部430bが分割関数を生成し、収集データ生成部430cが収集関数を生成し、並列ライブラリ結合部430dが分割関数または収集関数をプログラムに挿入する(ステップS213)。
次に、図13のステップS205に示したプラグマ処理について説明する。図14は、図13のステップS205に示したプラグマ処理を示すフローチャートである。同図に示すように、後処理部400は、並列ライブラリ結合部430dが使用するライブラリ関数を決定し、ライブラリ関数を置換する(ステップS301)。
そして、整合性調整部430aがリンクされている関数どうしの引数が一致するか否かを判定し(ステップS302)、リンクされた関数どうしの引数が一致しない場合には(ステップS302,No)、整合性調整処理部430aが引数並びの同じ関数を生成し、新たなリンク付けを行い(ステップS303)、分割データ生成部430bおよび収集データ生成部430cが変換後の関数に分割データがあるか否かを判定する(ステップS304)。一方、リンクされた関数どうしの引数が一致する場合には(ステップS302,Yes)、そのままステップS304に移行する。
変換後の関数に分割データがない場合には(ステップS304,No)、プラグマ処理を終了し、変換後の関数に分割データがある場合には(ステップS304,Yes)、分割データ生成部430bが分割関数を生成し、収集データ生成部430cが収集関数を生成し、並列ライブラリ結合部430dが分割関数または収集関数をプログラムに挿入する(ステップS305)。
このように、プログラム中にプラグマが存在する場合であっても、並列ライブラリ結合部430dがプラグマ指定されたライブラリ関数を、置換対象となるライブラリ関数に変換し、分割関数および収集関数を、置換したライブラリ関数の前後に追加するので、効率よくライブラリ関数を置換することができる。
上述してきたように、本実施例にかかるライブラリ変換装置100は、予め、前処理部200が、逐次/並列ライブラリリンク構造情報300aを生成する。そして、コンパイルコマンドをコマンド受付部410が受け取った場合に、コマンド受付部410が指示内容を解析し、リンク再構成処理部420がコンパイルコマンドの指示内容を基に、逐次/並列ライブラリリンク構造情報300aを変換し、ライブラリ置換処理部430が、変換された逐次/並列ライブラリリンク情報300aを基にして、プログラム中の逐次ライブラリ関数を、並列ライブラリ関数に置換するので、置換元の逐次ライブラリ関数関数名と置換対象となる並列ライブラリ関数関数名とが異なっていてもユーザが元プログラムを修正することなくライブラリ関数を置換することができる。
また、元プログラムを修正することなく、逐次ライブラリ関数を並列ライブラリ関数に変換することができるので、ユーザは並列プログラムのノウハウを知らなくとも容易に並列プログラムを作成することができ、並列プログラム開発を短縮化することが出来る。
ところで、上記の実施例で説明した各種の処理は、予め用意されたプログラムをコンピュータで実行することによって実現することができる。そこで、以下では、図15を用いて、上記の実施例と同様の機能を有するライブラリ変換プログラムを実行するコンピュータの一例を説明する。図15は、ライブラリ変換プログラムを実行するコンピュータを示す図である。
同図に示すように、ライブラリ変換装置としてのコンピュータ30は、入力装置31、表示装置32、RAM33、HDD34、ROM35およびCPU36をバス37で接続して構成される。ここで、入力装置31および表示装置32は、図1に示した入力装置40および表示装置50にそれぞれ対応する。
そして、ROM35には、上記の実施例と同様の機能を発揮するライブラリ変換プログラム、つまり、図15に示すように、逐次/並列ライブラリリンク生成プログラム35a、並列ライブラリ結合処理プログラム35b、が予め記憶されている。
そして、CPU35が、これらのプログラム35a,35bをROM35から読み出して実行することで、図15に示すように、各プログラム35a,35bは、逐次/並列ライブラリリンク生成プロセス36a、並列ライブラリ結合処理プロセス36bとして機能するようになる。逐次/並列ライブラリリンク生成プロセス36aは、図1に示した前処理部200に対応し、並列ライブラリ結合処理プロセス36bは、図1に示した後処理部400に対応する。
また、HDD34には、図15に示すように、変換対象プログラム34aとライブラリ情報34bが記録される。なお、変換対象プログラム34aは、図1に示したプログラム300bに対応し、ライブラリ情報34bは、図2に示した逐次ライブラリ情報記憶部210および並列ライブラリ情報記憶部240に対応する。そして、CPU36は、変換対象プログラム34aおよびライブラリ情報34bを読み出して、RAM33に格納する。また、CPU36は、逐次/並列ライブラリリンク構造情報33cを作成し、作成した逐次/並列ライブラリリンク構造情報33cを基にして、変換対象プログラム33aのライブラリ関数を置換する。ここで、逐次/並列ライブラリリンク構造情報33cは、図1に示した逐次/並列ライブラリリンク構造情報300aに対応する。
ところで、上記したプログラム35a、35bについては、必ずしも最初からROM35に記憶させておく必要はなく、例えば、コンピュータに挿入されるフレキシブルディスク(FD)、CD−ROM、MOディスク、DVDディスク、光磁気ディスク、ICカードなどの「可搬用の物理媒体」、または、コンピュータ30の内外に備えられるハードディスクドライブ(HDD)などの「固定用の物理媒体」、さらには、公衆回線、インターネット、LAN、WANなどを介してコンピュータ30に接続される。「他のコンピュータ(またはサーバ)」などに各プログラムを記憶させておき、コンピュータ30がこれらから各プログラムを読み出して実行するようにしてもよい。
(付記1)プログラム上のライブラリに含まれる関数を異なるライブラリの関数に変換するライブラリ変換プログラムであって、
ライブラリに含まれる関数と該ライブラリと異なるライブラリに含まれる関数とを関連付けた情報であるライブラリリンク構造情報を生成するリンク構造情報生成手順と、
前記ライブラリリンク構造情報を基にして、ライブラリに含まれる関数を異なるライブラリで同等の機能を有する関数に変換する変換処理手順と、
をコンピュータに実行させることを特徴とするライブラリ変換プログラム。
(付記2)前記リンク構造情報生成手順は、逐次ライブラリに含まれる関数と並列ライブラリに含まれる関数とを関連付けたライブラリリンク構造情報を生成し、前記変換処理手順は、前記ライブラリリンク構造情報を基にして、逐次ライブラリに含まれる関数を並列ライブラリで同等の機能を有する関数に変換することを特徴とする付記1に記載のライブラリ変換プログラム。
(付記3)前記リンク構造情報生成手順は、前記逐次ライブラリに含まれる関数と関連付ける並列ライブラリの関数の精度および性能の情報を含んだ関連付先情報を取得する関連付先情報取得手順と、前記関連付先情報を基にして、前記逐次ライブラリの関数と並列ライブラリの関数とが1対1または多対1に関連付けられた情報であるライブラリリンク構造情報を生成するリンク生成手順とをさらにコンピュータに実行させることを特徴とする付記2に記載のライブラリ変換プログラム。
(付記4)前記逐次ライブラリの関数に関連付けられる並列ライブラリの関数に対する入力データのデータ分割形式を解読し、前記並列ライブラリの関数の並列プロセスに利用されるデータを分割分配する分割関数を生成すると共に、該分割関数を前記プログラムに追加する分割関数生成手順をさらにコンピュータに実行させることを特徴とする付記2または3に記載のライブラリ変換プログラム。
(付記5)前記逐次ライブラリの関数に関連付けられる並列ライブラリの関数に対する出力データのデータ分割形式を解読し、前記並列ライブラリの関数の並列プロセスから分割されたデータを収集し結合する収集関数を生成すると共に、該収集関数を前記プログラムに追加する収集関数生成手順をさらにコンピュータに実行させることを特徴とする付記2、3または4に記載のライブラリ変換プログラム。
(付記6)プログラムに含まれるプラグマを検索し、プラグマに対応する逐次ライブラリの関数を同等の機能を有する並列ライブラリの関数に変換するプラグマ処理手順をさらにコンピュータに実行させることを特徴とする付記1〜5のいずれか一つに記載のライブラリ変換プログラム。
(付記7)プログラム上のライブラリに含まれる関数を異なるライブラリの関数に変換するライブラリ変換方法であって、
ライブラリに含まれる関数と該ライブラリと異なるライブラリに含まれる関数とを関連付けた情報であるライブラリリンク構造情報を生成するリンク構造情報生成工程と、
前記ライブラリリンク構造情報を基にして、ライブラリに含まれる関数を異なるライブラリで同等の機能を有する関数に変換する変換処理工程と、
を含んだことを特徴とするライブラリ変換方法。
(付記8)前記リンク構造情報生成工程は、逐次ライブラリに含まれる関数と並列ライブラリに含まれる関数とを関連付けたライブラリリンク構造情報を生成し、前記変換処理工程は、前記ライブラリリンク構造情報を基にして、逐次ライブラリに含まれる関数を並列ライブラリで同等の機能を有する関数に変換することを特徴とする付記7に記載のライブラリ変換方法。
(付記9)前記リンク構造情報生成工程は、前記逐次ライブラリに含まれる関数と関連付ける並列ライブラリの関数の精度および性能の情報を含んだ関連付先情報を取得する関連付先情報取得工程と、前記関連付先情報を基にして、前記逐次ライブラリの関数と並列ライブラリの関数とが1対1または多対1に関連付けられた情報であるライブラリリンク構造情報を生成するリンク生成工程とをさらに含んだことを特徴とする付記8に記載のライブラリ変換方法。
(付記10)前記逐次ライブラリの関数に関連付けられる並列ライブラリの関数に対する入力データのデータ分割形式を解読し、前記並列ライブラリの関数の並列プロセスに利用されるデータを分割分配する分割関数を生成すると共に、該分割関数を前記プログラムに追加する分割関数生成工程をさらに含んだことを特徴とする付記8または9に記載のライブラリ変換方法。
(付記11)前記逐次ライブラリの関数に関連付けられる並列ライブラリの関数に対する出力データのデータ分割形式を解読し、前記並列ライブラリの関数の並列プロセスから分割されたデータを収集し結合する収集関数を生成すると共に、該収集関数を前記プログラムに追加する収集関数生成工程をさらに含んだことを特徴とする付記8、9または10に記載のライブラリ変換方法。
(付記12)プログラムに含まれるプラグマを検索し、プラグマに対応する逐次ライブラリの関数を同等の機能を有する並列ライブラリの関数に変換するプラグマ処理工程をさらに含んだことを特徴とする付記7〜11のいずれか一つに記載のライブラリ変換方法。