(57)【要約】      （修正有）【課題】ＭＰＩソースコードプログラムをＭＰＩスレッドベースプログラムに自動的に変換する方法を提供する。【解決手段】コンバータは、ＭＰＩソースコードプログラムおよびコマンドが入力されると、グローバル変数をスレッドプライベート変数として宣言して、第１のスレッド２１０用の第１のプライベート変数２１２および第２のスレッド２２０用の第２のプライベート変数２２２を生成する。ＭＰＩスレッドベースプログラム実行中にスレッドへの変換プロセスをサポートするべく特定したライブラリを用いてＭＰＩスレッドベースプログラムの実行バージョンをビルドする。特定したライブラリのコードは、ＭＰＩスレッドベースプログラムが実行されている場合に、新しいプロセスのインスタンス化を特定すると共に、これに応じて、ＭＰＩスレッドベースプログラム用の対応するスレッドをインスタンス化させる。【選択図】図２
2011014137.tif 000002
【特許請求の範囲】
【請求項１】
ＭＰＩソースコードプログラムをＭＰＩスレッドベースプログラムに変換するコマンドに応じて、プロセッサで実行されるコンバータが、
前記ＭＰＩソースコードプログラムのグローバル変数をスレッドプライベート変数として宣言して、第１のスレッドについて第１のプライベート変数を作成し、第２のスレッドについて第２のプライベート変数を作成して、
前記ＭＰＩスレッドベースプログラムの実行バージョンをビルドするべく利用されるライブラリを特定して、
特定された前記ライブラリを用いて前記ＭＰＩスレッドベースプログラムの前記実行バージョンをビルドする
ことを含む方法。
【請求項２】
第２のプロセッサ上で前記ＭＰＩスレッドベースプログラムの前記実行バージョンが実行されている間に、前記第１のプライベート変数の内容を前記第２のスレッドに直接提供することによって、前記第１のスレッドから前記第２のスレッドへとデータを転送することをさらに含む請求項１に記載の方法。
【請求項３】
前記第１のスレッドから前記第２のスレッドへと前記データを転送する場合において、前記データの転送には共有メモリセグメントを利用しない請求項２に記載の方法。
【請求項４】
特定された前記ライブラリは、マルチスレッディングをサポートする請求項１に記載の方法。
【請求項５】
無名共通ブロック内のデータが、前記ＭＰＩソースコードプログラムの第１のコンポーネントによってアクセスされた場合には第１のサイズを持ち、前記ＭＰＩソースコードプログラムの第２のコンポーネントによってアクセスされた場合には第２のサイズを持ち、前記第１のサイズおよび前記第２のサイズは互いに異なるという第１の条件、
無名共通ブロック内のデータが、前記ＭＰＩソースコードプログラムの第１のコンポーネントによってアクセスされた場合には第１のレイアウトを持ち、前記ＭＰＩソースコードプログラムの第２のコンポーネントによってアクセスされた場合には第２のレイアウトを持ち、前記第１のレイアウトおよび前記第２のレイアウトは互いに異なるという第２の条件、
前記ＭＰＩソースコードプログラムのコンポーネントが、前記コンポーネントの第１のインスタンスから前記コンポーネントの第２のインスタンスへと値を維持する変数を持つという第３の条件、
前記プロセッサの状態に依存する第４の条件、および
前記プロセッサの制御ワードの状態に依存する第５の条件
のうち１つがあるか否か、前記ＭＰＩソースコードプログラムを調べることと、
前記第１、第２、第３、第４、および第５の条件のうち１つを見つけると、前記ＭＰＩソースコードプログラムを変換する前記コマンドを拒否することと
をさらに含む請求項１に記載の方法。
【請求項６】
特定された前記ライブラリはコードを含み、前記コードは、前記ＭＰＩスレッドベースプログラムが実行されている間に、
前記第１のスレッドによる第１のファイルへのアクセスを特定して、
第１のファイルハンドルを介して前記第１のスレッドに前記第１のファイルへとアクセスさせ、
前記第２のスレッドによる前記第１のファイルへのアクセスを特定して、
第２のファイルハンドルを介して前記第２のスレッドに前記第１のファイルへとアクセスさせ、
前記第１のファイルハンドルおよび前記第２のファイルハンドルは互いに異なる請求項１に記載の方法。
【請求項７】
特定された前記ライブラリはコードを含み、前記コードは、前記ＭＰＩスレッドベースプログラムが実行されている間に、
新しいプロセスのインスタンス化を特定して、
前記新しいプロセスの前記インスタンス化を特定することに応じて、前記ＭＰＩスレッドベースプログラム用の対応するスレッドをインスタンス化させる請求項１に記載の方法。
【請求項８】
少なくとも１つのプロセッサと、
前記プロセッサ上で実行されるコンバータ用の命令を有するメモリと
を備え、
前記命令は、ＭＰＩソースコードプログラムをＭＰＩスレッドベースプログラムに変換するコマンドに応じて、
前記ＭＰＩソースコードプログラムのグローバル変数をスレッドプライベート変数として宣言して、第１のスレッドについて第１のプライベート変数を作成し、第２のスレッドについて第２のプライベート変数を作成して、
前記ＭＰＩスレッドベースプログラムの実行バージョンをビルドするべく利用されるライブラリを特定して、
特定された前記ライブラリを用いて前記ＭＰＩスレッドベースプログラムの前記実行バージョンをビルドする
ための命令であるシステム。
【請求項９】
前記メモリはさらに、第２のプロセッサ上で前記ＭＰＩスレッドベースプログラムの前記実行バージョンが実行されている間に、前記第１のプライベート変数の内容を前記第２のスレッドに直接提供することによって、前記第１のスレッドから前記第２のスレッドへとデータを転送するための命令を有する請求項８に記載のシステム。
【請求項１０】
前記第１のスレッドから前記第２のスレッドへと前記データを転送する場合において、前記データの転送には共有メモリセグメントを利用しない請求項９に記載のシステム。
【請求項１１】
特定された前記ライブラリは、マルチスレッディングをサポートする請求項８に記載のシステム。
【請求項１２】
前記コンバータ用の前記命令はさらに、
無名共通ブロック内のデータが、前記ＭＰＩソースコードプログラムの第１のコンポーネントによってアクセスされた場合には第１のサイズを持ち、前記ＭＰＩソースコードプログラムの第２のコンポーネントによってアクセスされた場合には第２のサイズを持ち、前記第１のサイズおよび前記第２のサイズは互いに異なるという第１の条件、
無名共通ブロック内のデータが、前記ＭＰＩソースコードプログラムの第１のコンポーネントによってアクセスされた場合には第１のレイアウトを持ち、前記ＭＰＩソースコードプログラムの第２のコンポーネントによってアクセスされた場合には第２のレイアウトを持ち、前記第１のレイアウトおよび前記第２のレイアウトは互いに異なるという第２の条件、
前記ＭＰＩソースコードプログラムのコンポーネントが、前記コンポーネントの第１のインスタンスから前記コンポーネントの第２のインスタンスへと値を維持する変数を持つという第３の条件、
前記プロセッサの状態に依存する第４の条件、および
前記プロセッサの制御ワードの状態に依存する第５の条件
のうち１つがあるか否か、前記ＭＰＩソースコードプログラムを調べ、
前記第１、第２、第３、第４、および第５の条件のうち１つを見つけることに応じて、前記ＭＰＩソースコードプログラムを変換する前記コマンドを拒否するための命令を含む請求項８に記載のシステム。
【請求項１３】
特定された前記ライブラリはコードを含み、前記コードは、前記ＭＰＩスレッドベースプログラムが実行されている間に、
前記第１のスレッドによる第１のファイルへのアクセスを特定して、
第１のファイルハンドルを介して前記第１のスレッドに前記第１のファイルへとアクセスさせ、
前記第２のスレッドによる前記第１のファイルへのアクセスを特定して、
第２のファイルハンドルを介して前記第２のスレッドに前記第１のファイルへとアクセスさせ、
前記第１のファイルハンドルおよび前記第２のファイルハンドルは互いに異なる請求項８に記載のシステム。
【請求項１４】
特定された前記ライブラリはコードを含み、前記コードは、前記ＭＰＩスレッドベースプログラムが実行されている間に、
新しいプロセスのインスタンス化を特定して、
前記新しいプロセスの前記インスタンス化を特定することに応じて、前記ＭＰＩスレッドベースプログラム用の対応するスレッドをインスタンス化させる請求項８に記載のシステム。
【請求項１５】
ＭＰＩソースコードプログラムをＭＰＩスレッドベースプログラムに変換するコマンドに応じる手段
を備え、
前記手段は、
前記ＭＰＩソースコードプログラムのグローバル変数をスレッドプライベート変数として宣言して、第１のスレッドについて第１のプライベート変数を作成し、第２のスレッドについて第２のプライベート変数を作成する手段と、
前記ＭＰＩスレッドベースプログラムの実行バージョンをビルドするべく利用されるライブラリを特定する手段と、
特定された前記ライブラリを用いて前記ＭＰＩスレッドベースプログラムの前記実行バージョンをビルドする手段と
を有する装置。
【発明の詳細な説明】
【技術分野】
【０００１】
＜著作権表示＞
本文献の内容は著作権で保護されるべきものである。著作権保持者は、特許商標庁の特許のファイルまたは記録に示されている人物が特許開示をファクシミリで複製することには異存がないが、それ以外については著作権に関する全ての権利を有する。
【０００２】
本開示は概して、メッセージ・パッシング・インフラストラクチャ（Ｍｅｓｓａｇｅ  Ｐａｓｓｉｎｇ  Ｉｎｆｒａｓｔｒｕｃｔｕｒｅ）で実行されるようにコンピュータプログラムを自動変換することに関する。
【背景技術】
【０００３】
計算関連の問題の多くは、独立したタスクまたは緩やかな依存関係を持つタスクに分類され、一群を構成している複数のプロセッサまたはシステム間で分配して並列に実行することができる。この技術によれば、全てのタスクを１つのプロセッサまたはシステムで実行する場合に比べて、主要な問題をより早く解決できることが多い。場合によっては、サブタスクを処理しているプロセッサまたはシステムの数に比例して、処理時間を短縮することができる。各プロセスは、別のタスクとデータを交換する必要がある場合を除いて、独立して計算を行うことができる。
【０００４】
協働する複数のプロセッサおよびシステムは、両者の間でメッセージを送信することで、必要に応じて連係させることができる。また、メッセージを用いて、作業の分配および結果の収集を行うこともできる。問題の分割または分解によっては、多数のメッセージの送受信またはメッセージ内での大量のデータの転送のために、メッセージ・パッシング・インフラストラクチャに対する要求が非常に大きくなる場合がある。
【０００５】
プロセス間でのメッセージの転送は、複数の異なる通信チャネルまたは「ファブリック」を介して行われるとしてよい。例えば、物理的に同一のマシンで実行されているプロセス同士は、マルチプロセッサマシン上のポイント・ツー・ポイント・プロセッサ・インターコネクトまたは共有メモリを用いて、効率よく通信することができる。別のマシンで実行されているプロセス同士の場合、ＩｎｆｉｎｉＢａｎｄ（ＩｎｆｉｎｉＢａｎｄ  Ｔｒａｄｅ  Ａｓｓｏｃｉａｔｉｏｎの登録商標）、Ｍｙｒｉｎｅｔ（米国、カリフォルニア州、アルカディア、Ｍｙｒｉｃｏｍ，Ｉｎｃ．社の登録商標）、スケーラブル・コヒーレント・インターフェース（Ｓｃａｌａｂｌｅ  Ｃｏｈｅｒｅｎｔ  Ｉｎｔｅｒｆａｃｅ：ＳＣＩ）、または、ＱＳＮｅｔ（英国、ブリストル、Ｑｕａｄｒｉｃｓ，Ｌｔｄ．社）といった高速ネットワークを介して通信し得る。こういったネットワークは、ファブリックで利用可能な機能全てを出すネイティブ動作モード、および、ネットワークをレガシーソフトウェアで利用できるようにするエミュレーションモードを持つとしてよい。プロセス同士は、イーサネット（登録商標）等の従来のネットワークを介して通信を行うとしてもよい。
【０００６】
一連の標準的なメッセージ・パッシング関数を定義して、標準的な関数をそれぞれの種類のファブリック上で実行するべくライブラリを設けるとしてよい。メッセージ・パッシング・インターフェース（ＭＰＩ）は、メッセージ・パッシングに関して、分散型メモリシステムおよび共有メモリシステムをプログラミングするための基本的なアプリケーション・プログラミング・インターフェース（ＡＰＩ）を定めている業界標準である。ＭＰＩ規格は、ＭＰＩフォーラムのメンバーによって定められたものである（ＭＰＩ：メッセージ・パッシング・インターフェース規格、バージョン２．１、メッセージ・パッシング・インターフェース・フォーラム、２００８年６月２３日、ｘｗｗｗｘ．ｍｐｉ−ｆｏｒｕｍ．ｏｒｇ／ｄｏｃｓ／を参照のこと、尚、本明細書中でアクティブリンクを避けるべく、ＵＲＬ中では「ｗｗｗ」の代わりに「ｘｗｗｗｘ」を使用している）。ＭＰＩ（または同様の）ライブラリによって、１以上のファブリックにおける標準的な関数が提供され得る。
【０００７】
１つのプロセス内の複数のスレッドを用いてメモリ等のリソースを共有することがあり、スレッド同士は通信するのにメッセージ・パッシング・メカニズムを利用する必要がないという利点がある。スレッドは特に、マルチプロセッサシステムにおいて複数の異なるプロセッサコアを利用する場合に有用である。マルチプロセッサシステムのオペレーティングシステムは、複数の異なるプロセッサコアで実行されている複数のスレッド間でタスクを割り当てて、１つの共通アドレス空間内で実行されている複数のスレッドについて、マルチプロセッサ環境下で利用可能なプロセッサ・インターコネクトによって可能となるデータ共有化を利用する。
【０００８】
しかし、ＭＰＩ環境では、１つのプロセス内の複数のスレッドは、特別な実装方法に従って実行する必要がある。ＭＰＩ規格の場合、各ＭＰＩプロセスは通常、一意的なオペレーティングシステムプロセスにマッピングされている。１つのプロセスのアドレス空間は、別のプロセスがＭＰＩライブラリ関数を呼び出すことによってのみ、アクセスすることができる。ＭＰＩ−２仕様書、セクション１２．４「ＭＰＩおよびスレッド」で指摘されているように、プロセス内の各スレッドはＭＰＩ呼び出しを発行することができるが、送信呼び出しまたは受信呼び出しのパラメータは、スレッドではなくプロセスを特定するので、スレッドはそれぞれを別個にアドレス指定することができない。あるプロセスに送信されたメッセージは、このプロセス内のどのスレッドによっても受信され得る。プロセスがマルチスレッドプロセスであっても、当該プロセスの対外インターフェースには影響がない。
【０００９】
ＭＰＩ−２仕様書、セクション１２．４「ＭＰＩおよびスレッド」に記載されているＭＰＩ規格に従う場合、スレッド準拠型実装では、全てのＭＰＩ呼び出しがスレッドに対応可能であることと、ＭＰＩ呼び出しをブロックする場合、呼び出しスレッドのみをブロックして、もし存在すればその他のスレッドは実行可能とすることとを保証しなければならない。しかし、この規格を満たすためには、ＭＰＩ呼び出しを行うスレッドが利用するスタティック変数およびグローバル変数を、例えば、１度に１つのスレッドのみがアクセスすることを許可する相互排除プリミティブを用いて保護する必要がある。スレッド準拠型実装では通常、Ｐｏｓｉｘスレッド等の技術を用いて、または、ＭＰＩ／ＯｐｅｎＭＰ混合規格に従って、プログラマによってソースコードプログラムを書き換える必要がある。このような高度なプログラミングパラダイムによって、プログラムの複雑性が増してしまうと同時にプログラム性能が全体的に低下してしまう。このような実装では、共有メモリメカニズムを介したメッセージの送信というオーバーヘッドを発生させることなく通信するべくスタティック変数およびグローバル変数を利用することができるという、スレッドを利用する場合の利点の１つが失われてしまう。
【図面の簡単な説明】
【００１０】
【図１】共有メモリセグメントを用いた、ＭＰＩインフラストラクチャで実行されているプロセス間でのデータ転送を示す図である。
【図２】本発明の一実施形態に応じて、スレッドに変換されたプロセス間でのデータ転送を示す図である。
【図３】本発明の一実施形態に係る、ＭＰＩソースコードプログラムからＭＰＩスレッドベースプログラムへのコンバータの動作を示す流れ図である。
【図４】本発明の一実施形態に係る図３のコンバータの動作を説明するためのフローチャートである。
【図５】本発明の実施形態例の特定の側面が実施される適切なデータ処理環境を示すブロック図である。
【発明を実施するための形態】
【００１１】
本発明の実施形態は、ＭＰＩソースコードプログラムを自動的にＭＰＩスレッドベースプログラムに変換する方式を含む。ＭＰＩスレッドベースプログラムは、スレッドのデータ転送高速化機能を利用することを可能としつつ、他のＭＰＩ機能も引き続き利用できるようにする。また、非スレッド型ＭＰＩプログラムをＭＰＩスレッドベースプログラムに自動的に変換することによって、マルチプロセッサ環境を利用することができない多くのレガシーＭＰＩプログラムを、プログラマの介入なしに、自動的に変換することができるようになる。このように自動的に変換することによって、企業は、自動的且つ低コストで、ＭＰＩソースコードプログラム群をマルチプロセッサ環境に移植することができるようになる。
【００１２】
コンバータは、ＭＰＩソースコードプログラムおよびコマンドが入力されると、ＭＰＩソースコードプログラムのグローバル変数をスレッドプライベート変数として宣言して、第１のスレッド用の第１のプライベート変数および第２のスレッド用の第２のプライベート変数を生成する。ＭＰＩスレッドベースプログラム実行中にスレッドへの変換プロセスをサポートするべくライブラリを特定して、特定したライブラリを用いてＭＰＩスレッドベースプログラムの実行バージョンをビルドする。特定したライブラリは、コードを含むとしてよく、当該コードは、ＭＰＩスレッドベースプログラムが実行されている場合に新しいプロセスのインスタンス化を特定すると共に、これに応じて、ＭＰＩスレッドベースプログラム用の対応するスレッドをインスタンス化させる。データを所与のスレッドから別のスレッドに転送するには、グローバル変数に対応する所与のスレッドのプライベート変数の内容を直接別のスレッドに提供する。このようなデータ転送方式では、スレッド間のデータ転送に共有メモリセグメントを利用しない。
【００１３】
図１は、共有メモリセグメントを用いた、ＭＰＩインフラストラクチャで実行されているプロセス間でのデータ転送を示す図である。通常の実装では、ＭＰＩプログラムは、図１ではプロセス１１０、１２０、および１３０として示しているが、ｎ個のプロセス０からｎ−１のインスタンスを生成する。これらのプロセスはそれぞれ、対応するアドレス空間を有しており、プロセス１１０はプロセスアドレス空間１１２、プロセス１２０はプロセスアドレス空間１２２、プロセス１３０はプロセスアドレス空間１３２を有している。データ１０２をプロセス１１０からプロセス１２０へと転送する場合、プロセス１１０がデータ１０２をプロセスアドレス空間１１２から共有メモリセグメント１４０へと転送して、プロセス１２０がデータ１０２を共有メモリセグメント１４０からプロセスアドレス空間１２２へと複製する必要がある。このようなデータ転送処理では、メモリ複製処理が２回必要となる。
【００１４】
共有メモリセグメント１４０は、複数のプロセスで共有され、より大きいメインメモリの一部であって、複数の異なるプロセスによるアクセスを調整する部分であってよい。共有メモリ１４０に対するアクセスは、１つのプロセスが、他のプロセスがアクセス可能な領域をランダムアクセスメモリ内に作成するプロセス間通信を用いて、または、仮想メモリマッピングを用いて、通常であれば１つのデータの複数の複製に対する複数のアクセスを１つのインスタンスへと移動させることによって、制御されるとしてよい。共有メモリ１４０に対するアクセスを調整するには、オペレーティングシステムおよび／または仮想化ソフトウェアのようなリソースを用いるとしてよい。
【００１５】
図２は、本発明の一実施形態に応じて、スレッドに変換されたプロセス間でのデータ転送を示す図である。ｎ個のプロセス０からｎ−１は、共通プロセスアドレス空間２５０内で、スレッド０からｎ−１としてインスタンス化される。スレッド２１０、２２０、および２３０はそれぞれ、対応する一群のプライベート変数を有しており、スレッド２１０はプライベート変数２１２、スレッド２２０はプライベート変数２２２、スレッド２３０はプライベート変数２３２を有する。データ１０２をスレッド２１０からスレッド２２０に転送する場合、データ１０２を、プライベート変数２１２内のアドレスから、プライベート変数２２２内のアドレスへと直接転送することができる。このように、スレッド２１０、２２０、および２３０は共有プロセスアドレス空間２５０内のアドレスを共有しているので、図１に示した共有メモリセグメント１４０のような共有メモリセグメントを介して間接的にではなく、直接的にデータ転送を行うことができる。複製処理を２回行う必要がなく、直接データ転送されると、プログラムの性能が一躍高まる。
【００１６】
図３は、本発明の一実施形態に係る、ＭＰＩソースコードプログラムから実行可能ＭＰＩスレッドベースプログラムへのコンバータの動作を示す流れ図である。コンバータ３６０は、入力としてＭＰＩソースコードプログラム３６２およびコマンド３６４を受け取り、出力として実行可能ＭＰＩスレッドベースプログラム３６６を提供する。コマンド３６４は、例えば、ＭＰＩソースベースプログラムをＭＰＩスレッドベースプログラムとしてコンパイルするようコンバータ３６０に指示するコマンドであってよい。例えば、ソースコードプログラム「ｔｅｓｔ．ｃ」をコンパイルするべく、「＄  ｍｐｉｃｃ−ｏ  ｔｅｓｔ＿ｍｐｉ_ｐｒｏｃｅｓｓ  ｔｅｓｔ．ｃ」というコマンドでコンパイラが呼び出されると仮定する。このコマンドに応じて「ｔｅｓｔ．ｃ」をコンパイルした後、出力されるプログラム「ｔｅｓｔ＿ｍｐｉ＿ｐｒｏｃｅｓｓ」は、プロセスに基づいて従来のＭＰＩアプリケーションとして実行される。一方、本発明に係るコンバータは、ソースコードプログラムｔｅｓｔ．ｃをコンパイルするべく、「＄  ｍｐｉｃｃ−ｍｐｉ＿ｏｎ＿ｔｈｒｅａｄｓ−ｏ  ｔｅｓｔ  ｔｅｓｔ＿ｍｐｉ＿ｔｈｒｅａｄ  ｔｅｓｔ．ｃ」と同様のコマンドで呼び出される。コマンドのうち「−ｍｐｉ＿ｏｎ＿ｔｈｒｅａｄｓ」の部分によって、当該コマンドはコンパイラに供給され、実行可能ＭＰＩスレッドベースプログラムとして出力されるプログラム「ｔｅｓｔ＿ｍｐｉ＿ｔｈｒｅａｄ」が生成される。
【００１７】
コンバータ３６０は、コマンド３６４に応じて、ＭＰＩソースコードプログラムのグローバル変数をスレッドプライベート変数として宣言して、第１のスレッド用の第１のプライベート変数および第２のスレッド用の第２のプライベート変数を作成する。本明細書で用いる場合、「グローバル変数」という用語は、プロセス内での範囲がグローバルである変数、例えば、グローバル変数またはスタティック変数として宣言された変数を意味する。ＭＰＩスレッドベースプログラム３６６を実行すると、グローバル変数に対応するあるスレッドのプライベート変数の内容を、直接別のスレッドへと提供することで、スレッド間でデータを転送することができる。このデータ転送方式では、スレッド間でのデータ転送に、共有メモリセグメントを利用しない。ＭＰＩスレッドベースプログラム３６６は、スレッドのデータ転送高速化機能を利用することを可能としつつ、他のＭＰＩ機能も引き続き利用できるようにする。
【００１８】
図４は、本発明の一実施形態に係る図３のコンバータの動作を説明するためのフローチャートである。上述したように、コンバータ３６０は、入力として、ＭＰＩソースコードプログラム３６２およびコマンド３６４を受け取る。処理は、「ＭＰＩソースコードプログラムをＭＰＩスレッドベースプログラムに変換するコマンドに応じて、問題コードを示す条件があるか否かＭＰＩソースコードを調べる」ステップ４１０から開始される。このステップでは、コンバータ３６０は、ＭＰＩプロセスをスレッドに変換する際に問題となる複数の異なる条件があるか否か、ＭＰＩソースコードプログラム３６２を調べる。例えば、ＭＰＩアプリケーションの構築で多く用いられる、ＦｏｒｔｒａｎおよびＣ言語等、一部の言語には、プロセス内で実行されるスレッドでは適切に処理されないメモリ管理機能がある。例えば、Ｆｏｒｔｒａｎの場合、無名共通ブロックのデータは、Ｆｏｒｔｒａｎソースコードプログラムのコンポーネントまたはサブルーチン毎に、サイズおよびレイアウトが異なる場合がある。無名共通ブロック内のデータは、１つのＭＰＩプロセス内で実行される複数のスレッド間で共有される種類のグローバル変数である。各プロセスが、自身のバージョンの無名共通ブロックを持つスレッドに変換されると、コンポーネント毎に異なるサイズおよびレイアウトは、各コンポーネントに持ち越されない場合がある。Ｆｏｒｔｒａｎコンパイラは通常、各コンポーネントまたはサブルーチンを別個にコンパイルするので、コンバータ３６０は、ＭＰＩソースコードの全てのコンポーネントまたはサブルーチンを調べて、問題コードを特定する必要がある。
【００１９】
コンバータ３６０は、このような機能を特定するべく、無名共通ブロック内のデータが、ＭＰＩソースコードプログラムの第１のコンポーネントによってアクセスされた場合には第１のサイズを持ち、ＭＰＩソースコードプログラムの第２のコンポーネントによってアクセスされた場合には第２のサイズを持ち、第１のサイズおよび第２のサイズは互いに異なるという条件があるか否か、ＭＰＩソースコードプログラムを調べる。コンバータ３６０は、このような条件を見つけると、スレッドベース実装への変換に際して問題を引き起こすコードとして当該コードを特定する。コンバータ３６０はさらに、無名共通ブロック内のデータがＭＰＩソースコードプログラムの第１のコンポーネントによってアクセスされた場合には第１のレイアウトを持ち、ＭＰＩソースコードプログラムの第２のコンポーネントによってアクセスされた場合には第２のレイアウトを持ち、第１のレイアウトおよび第２のレイアウトは互いに異なるという条件があるか否か、ＭＰＩソースコードプログラムを調べるとしてもよい。コンバータ３６０は、このような条件を見つけると、スレッドベース実装への変換に際して問題を引き起こすコードとして当該コードを特定する。
【００２０】
コンバータ３６０が検索するその他の種類の問題コードには、あるコンポーネントのあるインスタンスから当該コンポーネントの次のインスタンスへとデータをセーブするコードが含まれる。例えば、Ｆｏｒｔｒａｎは、コンポーネントが有する変数には、当該コンポーネントが同一スレッド内でインスタンス化されるか否かに関わりなく、当該コンポーネントのあるインスタンスから次のインスタンスへと当該変数の値が維持される変数があるという機能を持つ。コンバータ３６０は、このような機能を見つけるべく、第１のインスタンスから第２のインスタンスへと値を維持する変数を持つコンポーネントがあるか否か、ＭＰＩソースコードプログラムを調べる。コンバータ３６０は、このような条件を見つけると、スレッドベース実装への変換に際して問題を引き起こすコードとして当該コードを特定する。
【００２１】
コンバータ３６０が検索するその他の種類の問題コードには、プロセッサまたはプロセッサの制御ワードの状態に依存するコードが含まれる。例えば、浮動小数点演算を処理するべく特定の状態または特定の制御ワードで動作するプロセッサに依存するコードは、プログラムの結果がプロセッサの複数の異なる設定で動作する複数の異なるＭＰＩプロセスに依存している場合、スレッドベース実装に適切に変換されない場合がある。コンバータ３６０は、このような条件を見つけると、スレッドベース実装への変換に際して問題を引き起こすコードとして当該コードを特定する。
【００２２】
コンバータ３６０は、スレッドベース実装への変換に際して問題となるコードを示す条件を見つけたことに応じて、「問題コードを示す条件あり？」という判断ポイント４２０を「ＹＥＳ」へと進む。そして、「ＭＰＩソースコードプログラムを変換するコマンドを拒否して、ＭＰＩソースコードプログラム用のオブジェクトコードを通常通り生成」するステップ４２５へと進む。上述したような条件が見つかったことに応じてＭＰＩソースコードプログラムを変換するコマンドは拒否されて、ＭＰＩソースコードプログラム用のオブジェクトコードが通常通り生成される。別の実施形態によると、コンバータ３６０は、ＭＰＩソースコードプログラム用のオブジェクトコードを生成するのではなく、ＭＰＩソースコードプログラムを変換するコマンドを拒否して、ＭＰＩソースコードプログラムの実行バージョンを生成することなく終了するとしてもよい。
【００２３】
コンバータ３６０は、問題コードを示す条件が見つからなかったことに応じて、「問題コードを示す条件あり？」という判断ポイント４２０を「ＮＯ」へと進む。そして、「オブジェクトコードを生成して、ＭＰＩソースコードプログラムのグローバル変数をスレッドプライベート変数として宣言」するステップ４３０へと進む。コンバータ３６０は、このステップで、オブジェクトコードを生成して、ＭＰＩソースコードプログラムの各グローバル変数をスレッドプライベート変数として宣言する。このように宣言することによって、図２の共通プロセスアドレス空間２５０内のスレッドプライベート変数２１２、２２２、および２３２と同様に、１つの共通の親プロセスアドレス空間内の各スレッドについて別個のプライベート変数が作成される。スレッドプライベート変数が有効であることを保証するためには、ＭＰＩソースコードプログラムによってインスタンス化される各プロセスを、コンバータ３６０が生成するＭＰＩスレッドベースプログラム内の対応するスレッドによってインスタンス化する必要がある。
【００２４】
ＭＰＩスレッドベースプログラムを実行した場合にＭＰＩプロセスではなくスレッドがインスタンス化されることを保証するためには、適切なライブラリを用いてＭＰＩスレッドベースプログラムの実行バージョンをビルドしなければならない。このため、「オブジェクトコードを生成して、ＭＰＩソースコードプログラムのグローバル変数をスレッドプライベート変数として宣言」するステップ４３０から、「適切なライブラリを特定して実行コードをビルド」するステップ４４０へと進む。例えば、ＭＰＩスレッドベースプログラムの実行バージョンをビルドするべく利用される各ライブラリは、マルチスレッディングをサポートする必要がある。マルチスレッドシステムライブラリを用いることによって、オペレーティングシステムは、１つのマルチコアプロセッサ内の複数のコアを利用して、複数の異なるスレッドのインスタンスを作成してタスクを実行できるので、ＭＰＩスレッドベースプログラムの実行が高速化される。
【００２５】
ＭＰＩスレッドベースプログラムを適切に処理するには、ＭＰＩプロセスをスレッドに変換することを可能とする特定のライブラリを利用する必要があると考えられる。このようなライブラリには、ＭＰＩプロセスを初期化する際、または、ＭＰＩ実行環境をビルドする際に特定の機能を呼び出すコードが含まれ得る。例えば、ライブラリ内のコードを用いて、ＭＰＩスレッドベースプログラムの実行中の新しいプロセスのインスタンス化を特定するとしてよい。ライブラリは、新しいプロセスのインスタンス化が特定されたことに応じて、ＭＰＩスレッドベースプログラム用の対応するスレッドをインスタンス化するためのコードを呼び出すとしてよい。新しいプロセスのインスタンス化は、ＭＰＩプロセスを発生させるＭＰＩ＿Ｉｎｉｔコマンドに応じて起こることによって特定されるとしてよい。ＭＰＩ＿Ｉｎｉｔコマンド用のコードは、新しいＭＰＩプロセスを発生させる代わりに、スレッドをインスタンス化することができる。そして、スレッドは、元のＭＰＩソースコードプログラムで初期化されているＭＰＩプロセスによって実行されるはずであった機能を実行することができる。
【００２６】
ＭＰＩプロセスに変わってＭＰＩ機能を実行するスレッドは、ＭＰＩ＿Ｉｎｉｔコマンドに応じて、または、これよりも早くＭＰＩ実行環境がビルドされた場合に、作成することができる。例えば、ｍｐｉｅｘｅｃコマンドを用いてＭＰＩ実行環境を初期化するとしてよく、ｍｐｉｅｘｅｃコマンドに応じて多くのスレッドをインスタンス化することができる。これらのスレッドがインスタンス化された後、ＭＰＩ＿Ｉｎｉｔが呼び出されて新しいプロセスをインスタンス化すると、ＭＰＩ＿Ｉｎｉｔコマンド用のコードが、既にあるスレッドのうち１つをマッピングして、ＭＰＩプロセスの代わりに機能を実行することができる。
【００２７】
ＭＰＩプロセスのスレッドベース実装で問題となり得る別の種類の条件に、ファイル入出力（Ｉ／Ｏ）がある。複数の異なるプロセスが１つの共通のファイルに対して読み書きを行うと、オペレーティングシステムのファイルシステムコンポーネントが通常、ファイルＩ／Ｏの調整を行って、複数の異なるプロセスによる動作の順序を適切に決定する。これらのプロセスがスレッドに変換されると、ファイルＩ／Ｏユニットへのアクセス試行または複数の異なるスレッドによる処理は、アプリケーションレベルにおける複数の異なるファイルに関連するもののように扱う必要がある。ファイルＩ／Ｏを調整するためには適切なライブラリによるサポートが必要となり得る。このようなライブラリには、例えば、第１のスレッドによる第１のファイルに対するアクセスを特定して、第１のスレッドには第１のファイルハンドルを介して第１のファイルにアクセスさせて、第２のスレッドによる第１のファイルへのアクセスを特定して、第２のスレッドには第２のファイルハンドルを介して第１のファイルにアクセスさせるコードが含まれ得る。尚、第１のファイルハンドルおよび第２のファイルハンドルは、互いに異なる。
【００２８】
問題コードが特定されてＭＰＩソースコードプログラム用のオブジェクトコードが通常通り生成される場合、「ＭＰＩソースコードプログラムを変換するコマンドを拒否して、ＭＰＩソースコードプログラム用のオブジェクトコードを通常通り生成」するステップ４２５から、「実行コードをビルドするのに適切なライブラリを特定」するステップ４４０に進む。この場合、使用されるライブラリは、マルチスレッディング機能を持つ必要はなく、ＭＰＩソースコードプログラムの実行バージョンをビルドする際に通常必要とされるライブラリでなければならない。
【００２９】
そして、「実行コードをビルドするのに適切なライブラリを特定」するステップ４４０から、「特定されたライブラリを用いて実行コードをビルド」するステップ４５０に進む。ＭＰＩソースコードプログラムの実行バージョンは、特定されたライブラリを用いてビルドされる。ＭＰＩソースコードプログラムの実行バージョンは、問題コードが見つからなかった場合には、ＭＰＩスレッドベースプログラムであってよい。または、実行バージョンは、問題コードが見つかった場合には、ＭＰＩソースコードプログラム用に通常生成されるオブジェクトコードからビルドされるとしてもよい。
【００３０】
複数の別個のＭＰＩプロセスではなくスレッドがインスタンス化されると、図２を参照しつつ説明したように、スレッド間で直接データを転送することができ、図１を参照しつつ説明したように共有メモリセグメントとの間で複製動作を実行する必要がなくなる。第１のスレッドから第２のスレッドへのデータ転送は、ＭＰＩスレッドベースプログラムの実行バージョンの実行中に、第１のプライベート変数の内容を第２のスレッドに直接提供することによって行われるとしてよい。このような第１のスレッドから第２のスレッドへのデータ転送は、データ転送に共有メモリセグメントを利用しない。
【００３１】
本発明に係るコンバータが実行する変換プロセスは自動である。図３のＭＰＩソースコードプログラム３６２用のソースコードは、ＭＰＩスレッドベースプログラム３６６としてスレッドを用いた実行可能プログラムを生成する上で、変更する必要がない。ＭＰＩソースコードプログラム３６２をスレッドベースパラダイムに自動変換することによって、ＭＰＩスレッドベースプログラム３６６は、マルチプロセッサ環境で提供されているスレッディング機能を始めとするスレッド間データ転送の効果を得ることができる。この自動変換は、現在の技術水準において通常必要とされている技術とは対照的に、上述したようにＭＰＩソースコードプログラムを書き換えることによって、スレッディング機能を利用するべく、ＭＰＩソースコードプログラムを変換する。例えば、共有メモリまたはクラスタの環境においてＭＰＩ機能を実現する試みにおいて、カリフォルニア大学サンタバーバラ校の研究者は、ＭＰＩ環境におけるスレッディングについてコンパイル時間および実行時間が共にサポートされているＴＭＰＩと呼ばれる技術を開発した。コンパイル時間の変換には、Ｃ言語コードにおいてグローバル変数およびスタティック変数の利用を避けるべく、スレッド固有データ構造を採用する。実行時間サポートは、ロック・フリー・キュー管理方式に基づくポイント・ツー・ポイント通信プロトコルを含む。しかし、このポイント・ツー・ポイント通信プロトコルを利用するにはソースコードプログラムを修正しなければならず、修正されていないソースコードプログラムを自動変換して、スレッディング機能を用いるＭＰＩ環境で実行することはできない。
【００３２】
図５は、本発明の実施形態例の特定の側面が実施される適切なデータ処理環境５０１を示すブロック図である。データ処理環境５０１は、図５ではプロセッサ５１０Ａおよび５１０Ｂとして図示されている１以上のプロセッサまたは中央演算処理装置（ＣＰＵ）を有する処理システム５００を備える。図示しているプロセッサは２つであるが、処理システム５００のプロセッサ機能は１つのプロセッサまたは任意の数のプロセッサによって提供されるとしてもよいことは当業者であれば想到するであろう。プロセッサ５１０Ａおよび５１０Ｂはそれぞれ、シングルコアプロセッサまたはマルチコアプロセッサであってよい。プロセッサ５１０Ａおよび５１０Ｂは、１以上のシステムバス５４０またはその他の通信経路あるいは通信媒体を介して、メモリ５２０を含むほかのさまざまな構成要素と通信可能に結合されるものとして図示されている。また、プロセッサ５１０Ａおよび５１０Ｂは、ＨｙｐｅｒＴｒａｎｓｐｏｒｔリンクまたはインテルのＱｕｉｃｋＰａｔｈ  Ｉｎｔｅｒｃｏｎｎｅｃｔ（ＱＰＩ）といったポイント・ツー・ポイントプロセッサインターコネクト５１１を介して接続されるものとしても図示されている。
【００３３】
コンバータ５６０は、図３および図４を参照しつつ上述したように、ＭＰＩソースコードプログラムをＭＰＩスレッドベースプログラムへと変換する。コンバータ５６０は、メモリ５２０内でプロセッサ５１０Ａおよび／またはプロセッサ５１０Ｂに実行される命令として実装されるとしてよい。
【００３４】
本明細書で用いる場合、「処理システム」および「データ処理システム」といった用語は、１つのマシンまたは共に動作する互いに通信可能に結合された複数のマシンまたはデバイスを含むシステムを広く含むものとする。処理システムの例を挙げると、これらに限定されないが、分散型演算システム、スーパーコンピュータ、高性能演算システム、演算クラスタ、メインフレームコンピュータ、ミニコンピュータ、クライアント−サーバシステム、パーソナルコンピュータ、ワークステーション、サーバ、ポータブル・コンピュータ、ノート型コンピュータ、タブレット、電話、携帯情報端末（ＰＤＡ）、ハンドヘルドデバイス、オーディオデバイスおよび／またはビデオデバイス等の娯楽用デバイス、ならびにその他の情報処理デバイスまたは情報伝送デバイスが含まれる。
【００３５】
処理システム５００は、従来の入力デバイス、例えば、キーボード、マウス等からの入力によって、および／または、別のマシン、バイオメトリクスフィードバック、あるいはその他の入力源または入力信号から受信するコマンドによって、少なくとも部分的に、制御されるとしてよい。処理システム５００は、例えば、ネットワークインターフェースコントローラ（ＮＩＣ）５５０、モデム、または、その他の通信ポートあるいは通信結合部等を介して、１以上のリモートデータ処理システム（不図示）に対する１以上の接続を利用するとしてよい。
【００３６】
処理システム５００は、ローカル・エリア・ネットワーク（ＬＡＮ）、ワイド・エリア・ネットワーク（ＷＡＮ）、イントラネット、インターネット等の物理ネットワークおよび／または論理ネットワーク５０２を用いて、別の処理システム（不図示）に相互接続されるとしてもよい。ネットワーク５０２を介した通信は、さまざまな有線形式および／または無線形式の短距離または長距離用キャリアおよびプロトコルを利用するとしてよく、高周波（ＲＦ）通信、衛星通信、マイクロ波通信、米国電気電子学会（ＩＥＥＥ）８０２．１１、Ｂｌｕｅｔｏｏｔｈ（登録商標）、光通信、赤外線通信、ケーブル通信、レーザ通信等が含まれる。
【００３７】
処理システム５００内において、プロセッサ５１０Ａおよび５１０Ｂは、メモリ５２０等、１以上の揮発性または不揮発性のデータ格納デバイスと通信可能に結合されているとしてもよい。プロセッサ５１０Ａおよび５１０Ｂは、システムバス５４０およびインターコネクト５４１ａ、５４１ｂ、および５４１ｍを介して、メモリ５２０に接続されている。メモリ５２０は、ＲＡＭ（ランダムアクセスメモリ）、ＲＯＭ（リードオンリーメモリ）、ＩＤＥ（Ｉｎｔｅｇｒａｔｅｄ  Ｄｒｉｖｅ  Ｅｌｅｃｔｒｏｎｉｃｓ）ハードドライブ等の大容量記憶装置、および／または、その他のデバイスあるいは媒体、例えば、フロッピー（登録商標）ディスク、光学ストレージ、テープ、フラッシュメモリ、メモリスティック、デジタルビデオディスク、生物学的ストレージ等を含むとしてよい。本開示では、「ＲＯＭ」という用語は概して、ＥＰＲＯＭ（消去可能プログラム可能ＲＯＭ）、ＥＥＰＲＯＭ（登録商標）（電気的消去可能プログラム可能ＲＯＭ）、フラッシュＲＯＭ、フラッシュメモリ等の不揮発性メモリデバイスを意味するべく用いられるとしてよい。プロセッサ５１０Ａおよび５１０Ｂはさらに、ビデオコントローラ、小型計算機システムインターフェース（ＳＣＳＩ）コントローラ、ネットワークコントローラ、ユニバーサルシリアルバス（ＵＳＢ）コントローラ、キーボードおよびマウス等の入力デバイス等の追加構成要素に通信可能に結合されているとしてもよい。処理システム５００はさらに、さまざまなシステム構成要素を互いに通信可能に結合するべく、メモリコントローラハブ、入出力（Ｉ／Ｏ）コントローラハブ、ＰＣＩルートブリッジ等の１以上のブリッジまたはハブを有するとしてよい。本明細書で使用する場合、「バス」という用語は、共通通信経路およびポイント・ツー・ポイント経路を意味するべく利用されるとしてよい。システムバス５４０はさらに、インターコネクト５４１ｎを介して、ネットワークインターフェース５５０に対するアクセスを提供する。
【００３８】
例えばＮＩＣ等、一部の構成要素は、バスと通信するためのインターフェース（例えば、ＰＣＩコネクタ）を有するアダプタカードとして実現されるとしてよい。一実施形態によると、１以上のデバイスは、プログラム可能あるいはプログラム不可能なロジックデバイスあるいはロジックアレイ、特定用途向け集積回路（ＡＳＩＣ）、組み込みコンピュータ、スマートカード等の構成要素を用いて、組み込みコントローラとして実現されるとしてよい。
【００３９】
本明細書に開示したメカニズムの実施形態は、ハードウェア、ソフトウェア、ファームウェア、またはこのような実装技術の組み合わせによって実装されるとしてよい。本発明の実施形態は、少なくとも１つのプロセッサと、データストレージシステム（揮発性および不揮発性のメモリおよび／またはストレージ素子を含む）と、少なくとも１つの入力デバイスと、少なくとも１つの出力デバイスとを備えるプログラム可能なシステムで実行されるコンピュータプログラムとして実装されるとしてよい。
【００４０】
プログラムコードを入力データに適用して、本明細書に記載した機能を実行して出力情報を生成するとしてよい。本発明の実施形態はさらに、本発明に係る処理を実行するための命令を格納している機械アクセス可能媒体、または、本明細書に記載した構造、回路、装置、プロセッサ、および／またはシステム特徴を定義しているＨＤＬ等の設計データを格納している機械アクセス可能媒体を含む。このような実施形態をプログラム製品と呼ぶとしてもよい。
【００４１】
上述した機械アクセス可能格納媒体は、これらに限定されないが、マシンまたはデバイスによって製造または形成された粒子の有形な配列を含むとしてよい。例えば、ハードディスク等の格納媒体、フロッピー（登録商標）ディスク、光ディスク、ＣＤ−ＲＯＭ（コンパクトディスクリードオンリーメモリ）、ＣＲ−ＲＷ（コンパクトディスクリライタブル）、および光磁気ディスクを含む任意のその他の種類のディスク、ＲＯＭ（リードオンリーメモリ）等の半導体デバイス、ＤＲＡＭ（ダイナミックランダムアクセスメモリ）およびＳＲＡＭ（スタティックランダムアクセスメモリ）等のＲＡＭ（ランダムアクセスメモリ）、ＥＰＲＯＭ（消去可能プログラム可能リードオンリーメモリ）、ＦＬＡＳＨ（フラッシュプログラム可能メモリ）、ＥＥＰＲＯＭ（登録商標）（電気的消去可能プログラム可能リードオンリーメモリ）、磁気カードあるいは光カード、または、電子的な命令を格納するのに適している任意のその他の種類の媒体を含むとしてよい。
【００４２】
出力情報は、公知の方法で、１以上の出力デバイスに適用されるとしてよい。本願では、処理システムは、例えば、デジタルシグナルプロセッサ（ＤＳＰ）、マイクロコントローラ、特定用途向け集積回路（ＡＳＩＣ）、またはマイクロプロセッサ等のプロセッサを備えるシステムであればどのようなものも含む。
【００４３】
プログラムは、処理システムと通信するべく、高級プロシージャプログラミング言語またはオブジェクト指向型プログラミング言語で実装されるとしてよい。また、プログラムは、所望の場合は、アセンブリ言語またはマシン語で実装されるとしてもよい。実際には、本明細書に記載したメカニズムの範囲は、任意の特定のプログラミング言語に限定されるものではない。いずれの場合も、コンパイラ型言語またはインタープリタ型言語であってよい。
【００４４】
本明細書では、ＭＰＩソースコードプログラムからＭＰＩスレッドベースプログラムへの変換を自動的に行う方法およびシステムの実施形態を提示している。本発明の具体的な実施形態を図示および説明しているが、本願特許請求の範囲から逸脱することなくそれらの実施形態を多くの点で変更、変形、修正することができるのは、当業者には明らかである。したがって、当業者であれば、本発明をより広く見た場合、その範囲から逸脱することなく、変更および変形が可能であることに想到するであろう。本願特許請求の範囲は、本発明の真の範囲および精神に含まれる変更、変形、および修正をすべて包含するものとする。
【図１】
2011014137.tif 000003
【図２】
2011014137.tif 000004
【図３】
2011014137.tif 000005
【図４】
2011014137.tif 000006
【図５】
2011014137.tif 000007
【外国語明細書】
2011014137000001.pdf