(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024021989
(43)【公開日】2024-02-16
(54)【発明の名称】情報処理プログラム、情報処理方法、および情報処理装置
(51)【国際特許分類】
G06F 8/41 20180101AFI20240208BHJP
【FI】
G06F8/41 130
【審査請求】未請求
【請求項の数】7
【出願形態】OL
(21)【出願番号】P 2022125237
(22)【出願日】2022-08-05
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】100104190
【弁理士】
【氏名又は名称】酒井 昭徳
(72)【発明者】
【氏名】津金 佳祐
【テーマコード(参考)】
5B081
【Fターム(参考)】
5B081CC32
(57)【要約】
【課題】タスクのデッドロックを回避し易くすること。
【解決手段】情報処理装置は、同時通信可能な通信タスク数分の要素を含むバッファを設定する。情報処理装置は、ソースコードにおける、いずれかのタスクの記述が、通信を実施する通信タスクの記述である場合、当該いずれかのタスクの記述に、バッファを用いたデータ依存の記述を追加する。これにより、情報処理装置は、デッドロックを回避し易くすることができる。情報処理装置は、例えば、HPCの大規模演算処理を実施し易くすることができる。
【選択図】
図13
【特許請求の範囲】
【請求項1】
並列実行の対象となる複数のタスクの記述を含むソースコードを取得し、
取得した前記ソースコードに規定された前記複数のタスクの記述のうち、それぞれ通信を制御する2以上の通信タスクの記述を検出し、
取得した前記ソースコードにおける、検出した前記2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加する、
処理をコンピュータに実行させることを特徴とする情報処理プログラム。
【請求項2】
追加後の前記ソースコードをコンパイルし、ランタイムを用いて前記複数のタスクをスケジューリングし、2以上のスレッドを用いてスケジューリングした前記複数のタスクを並列実行する、
処理を前記コンピュータに実行させることを特徴とする請求項1に記載の情報処理プログラム。
【請求項3】
前記追加する処理は、
取得した前記ソースコードにおける、検出した前記2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの記述順序に基づき決定される当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加する、ことを特徴とする請求項1または2に記載の情報処理プログラム。
【請求項4】
同時に通信可能な通信タスクの上限数分の複数の要素データを設定し、
前記追加する処理は、
取得した前記ソースコードにおける、検出した前記2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの記述順序に基づき決定される当該通信タスクの実行順序に応じて前記複数の要素データからサイクリックに選択したいずれかの要素データにアクセスすることにより他の通信タスクとのデータ依存を形成する記述を追加する、ことを特徴とする請求項3に記載の情報処理プログラム。
【請求項5】
前記取得する処理は、
並列実行の対象となる複数の第1タスクの記述を含むソースコードを取得し、
取得した前記ソースコードにおける、通信を制御し、かつ、演算を実施する第1タスクの記述を、当該通信を制御する通信タスクの記述と、当該演算を実施する演算タスクの記述とに分割することにより、取得した前記ソースコードを、並列実行の対象となる複数の第2タスクの記述を含む新たなソースコードに変換し、
前記検出する処理は、
変換した前記新たなソースコードに規定された前記複数の第2タスクの記述のうち、それぞれ通信を制御する2以上の通信タスクの記述を検出し、
前記追加する処理は、
変換した前記新たなソースコードにおける、検出した前記2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加する、ことを特徴とする請求項1または2に記載の情報処理プログラム。
【請求項6】
並列実行の対象となる複数のタスクの記述を含むソースコードを取得し、
取得した前記ソースコードに規定された前記複数のタスクの記述のうち、それぞれ通信を制御する2以上の通信タスクの記述を検出し、
取得した前記ソースコードにおける、検出した前記2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加する、
処理をコンピュータが実行することを特徴とする情報処理方法。
【請求項7】
並列実行の対象となる複数のタスクの記述を含むソースコードを取得し、
取得した前記ソースコードに規定された前記複数のタスクの記述のうち、それぞれ通信を制御する2以上の通信タスクの記述を検出し、
取得した前記ソースコードにおける、検出した前記2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加する、
制御部を有することを特徴とする情報処理装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、情報処理プログラム、情報処理方法、および情報処理装置に関する。
【背景技術】
【0002】
従来、各ノードにプロセスが割り当てられ、プロセス内で1以上のスレッドが生成され、それぞれのスレッド上でタスクが実行されるシステムがある。例えば、当該システムにおいて、それぞれ異なるノードに割り当てられた2つのプロセス間でデータをやり取りするために、通信を実行する通信タスクがそれぞれのプロセス内のスレッド上で実行されることがある。
【0003】
先行技術としては、例えば、ある処理単位より分岐される複数の処理単位を1つのプロセッサが単独で逐次実行するモードの処理単位に関してはコンテキストスイッチを実施しないようにするものがある。また、例えば、浮動スレッドの参照情報を高速メモリに格納する技術がある。また、例えば、コンテキストスイッチを、サブルーチンレベルでは実施しないようにする技術がある。また、例えば、プログラムの実行単位モジュールであるスレッドごとに使用するレジスタ数に応じて、汎用レジスタを割り当てるための命令コードオフセットデータを作成する技術がある。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特開平6-044199号公報
【特許文献2】米国特許出願公開第2005/0066302号明細書
【特許文献3】米国特許出願公開第2005/0102650号明細書
【特許文献4】特開2005-129001号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかしながら、従来技術では、通信タスクのデッドロックが発生してしまうことがある。例えば、一方のプロセス内のスレッドで第1データを送信するための通信タスクが実行された際、他方のプロセス内のスレッドで第2データを受信するための通信タスクが実行されると、いずれの通信タスクも完了せずにスレッドを占有してしまう。第2データは、第1データとは異なるデータである。これに対し、他方のプロセス内のスレッドに対して、実行するタスクを定期的に切り替えるコンテキストスイッチと呼ばれる技術を適用することが考えられるが、オーバーヘッドの増大化を招き、タスクの性能低下を招くという問題が発生してしまうことがある。
【0006】
1つの側面では、本発明は、タスクのデッドロックを回避し易くすることを目的とする。
【課題を解決するための手段】
【0007】
1つの実施態様によれば、並列実行の対象となる複数のタスクの記述を含むソースコードを取得し、取得した前記ソースコードに規定された前記複数のタスクの記述のうち、それぞれ通信を制御する2以上の通信タスクの記述を検出し、取得した前記ソースコードにおける、検出した前記2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加する情報処理プログラム、情報処理方法、および情報処理装置が提案される。
【発明の効果】
【0008】
一態様によれば、タスクのデッドロックを回避し易くすることが可能になる。
【図面の簡単な説明】
【0009】
【
図1】
図1は、実施の形態にかかる情報処理方法の一実施例を示す説明図である。
【
図2】
図2は、情報処理システム200の一例を示す説明図である。
【
図3】
図3は、情報処理装置100のハードウェア構成例を示すブロック図である。
【
図4】
図4は、情報処理装置100の機能的構成例を示すブロック図である。
【
図5】
図5は、コンテキストスイッチ機能の一例を示す説明図である。
【
図6】
図6は、受信タスクの記述を含むソースコード600を変換する一例を示す説明図(その1)である。
【
図7】
図7は、受信タスクの記述を含むソースコード600を変換する一例を示す説明図(その2)である。
【
図8】
図8は、送信タスクの記述を含むソースコード800を変換する一例を示す説明図(その1)である。
【
図9】
図9は、送信タスクの記述を含むソースコード800を変換する一例を示す説明図(その2)である。
【
図10】
図10は、タスク間のデータ依存関係の一例を示す説明図である。
【
図11】
図11は、複数のタスクを並列実行する一例を示す説明図である。
【
図12】
図12は、情報処理装置100による効果の一例を示す説明図である。
【
図13】
図13は、全体処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【0010】
以下に、図面を参照して、本発明にかかる情報処理プログラム、情報処理方法、および情報処理装置の実施の形態を詳細に説明する。
【0011】
(実施の形態にかかる情報処理方法の一実施例)
図1は、実施の形態にかかる情報処理方法の一実施例を示す説明図である。情報処理装置100は、複数のタスクを並列実行する場合において、タスクのデッドロックを回避し易くするためのコンピュータである。情報処理装置100は、例えば、サーバ、または、PC(Personal Computer)などである。
【0012】
例えば、各ノードにプロセスを割り当てて、プロセス内で1以上のスレッドを生成し、それぞれのスレッド上で異なるタスクを実行することにより、複数のタスクを並列実行するシステムがある。例えば、当該システムにおいて、それぞれ異なるノードに割り当てられた2つのプロセス間でデータをやり取りするために、通信を実行する通信タスクがそれぞれのプロセス内のスレッド上で実行されることがある。
【0013】
しかしながら、通信タスクのデッドロックが発生してしまうことがある。例えば、それぞれ異なるノードに割り当てられた2つのプロセスのうち、一方のプロセス内のスレッドで第1データを送信するための通信タスクが実行された際、他方のプロセス内のスレッドで第2データを受信するための通信タスクが実行される場合が考えられる。第2データは、第1データとは異なるデータであるとする。
【0014】
この場合、それぞれのプロセス内のスレッドが1つであれば、それぞれのプロセス内でいずれの通信タスクも完了せずにスレッドを占有することになる。例えば、一方のプロセス内のスレッドで、第1データを送信するための通信タスクが完了しなければ、第2データを送信するための通信タスクが開始されないため、他方のプロセス内のスレッドで、第2データを受信するための通信タスクが完了しない。同様に、例えば、他方のプロセス内のスレッドで、第2データを受信するための通信タスクが完了しなければ、第1データを受信するための通信タスクが開始されないため、一方のプロセス内のスレッドで、第1データを送信するための通信タスクが完了しない。
【0015】
このように、それぞれ異なるノードに割り当てられた2つのプロセスのそれぞれのプロセス内のスレッドで、通信タスクのデッドロックが発生してしまうことになる。従って、通信タスクのデッドロックを回避することが望まれる。
【0016】
これに対し、従来では、他方のプロセス内のスレッドに対して、実行するタスクを定期的に切り替えるコンテキストスイッチと呼ばれる技術を適用する手法が考えられる。この手法では、オーバーヘッドの増大化を招き、プロセス内のスレッドで実行するタスクの性能低下を招くという問題が発生してしまうことがある。
【0017】
例えば、プロセス内のスレッドで現在実行中のタスクを退避し、後に復元する際に作業負担の増大化を招き、オーバーヘッドの増大化を招く。例えば、プロセス内のスレッドで実行可能なタスクが複数存在すると、同一のタスクが再度実行されるまでにかかる所要時間の増大化を招き、オーバーヘッドの増大化を招く。このため、プロセス内のスレッドで実行するタスクの性能低下を招くことになる。
【0018】
そこで、本実施の形態では、タスクのデッドロックを回避し易くすることができる情報処理方法について説明する。
【0019】
図1において、(1-1)情報処理装置100は、並列実行の対象となる複数のタスクの記述を含むソースコード101を取得する。情報処理装置100は、例えば、それぞれ異なるノードに割り当てられた2つのプロセスのうち、一方のプロセス内で並列実行の対象となる複数のタスクの記述を含むソースコード101を取得する。
【0020】
例えば、1つのプロセス内で、2つのスレッドが存在するため、1つのプロセス内で、タスクを2つまで同時に実行可能であるとする。
図1の例では、情報処理装置100は、タスクA~Fの記述を含むソースコード101を取得する。いずれかのノードは、例えば、情報処理装置100であってもよい。
【0021】
一方のプロセス内で並列実行の対象となる複数のタスクは、通信を制御する通信タスクを含む。当該通信タスクは、他方のプロセス内で並列実行の対象となる複数のタスクのうち、通信を制御するいずれかの通信タスクに対応する。ここで、それぞれのプロセス内で、互いに対応する通信タスク同士が、同タイミングで実行されれば、それぞれの通信タスクは正常に完了する。一方で、それぞれのプロセス内で、互いに対応する通信タスク同士が、同タイミングで実行されなければ、それぞれの通信タスクは完了しない。
【0022】
(1-2)情報処理装置100は、取得したソースコード101に規定された複数のタスクの記述のうち、それぞれ通信を制御する2以上の通信タスクの記述を検出する。
図1の例では、情報処理装置100は、ソースコード101に記載されたタスクA~Fの記述のうち、通信タスクとなるタスクA~Dの記述を検出する。これにより、情報処理装置100は、デッドロックを発生し得る通信タスクの記述を検出することができる。
【0023】
(1-3)情報処理装置100は、取得したソースコード101における、検出した2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加する。情報処理装置100は、例えば、検出した2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの記述順序に基づき決定される当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加する。
【0024】
図1の例では、情報処理装置100は、ソースコード101において、タスクA~Dの記述順序に沿って、タスクA、タスクB、タスクC、タスクDという実行順序を決定する。ここで、情報処理装置100は、決定した実行順序に従って、プロセス内の各スレッドで、サイクリックにタスクA~Dを実行するよう、タスクA~Dの記述に、通信タスク間のデータ依存を形成する記述を追加する。
【0025】
情報処理装置100は、例えば、一方のスレッドで、タスクAを実行した後タスクCを実行するよう、かつ、他方のスレッドで、タスクBを実行した後タスクDを実行するよう、タスクA~Dの記述に、通信タスク間のデータ依存を形成する記述を追加する。情報処理装置100は、具体的には、タスクA~Dの記述に、タスクAとタスクCとのデータ依存を形成する記述と、タスクBとタスクDとのデータ依存を形成する記述とを追加する。
【0026】
これにより、情報処理装置100は、プロセス内の各スレッドで、サイクリックにタスクA~Dを実行するよう、タスクA~Dの実行順序を制御および保証することができる。このため、情報処理装置100は、それぞれ異なるノードに割り当てられた2つのプロセスのそれぞれのプロセス内で、互いに対応する通信タスク同士が、同タイミングで実行され易くすることができ、正常に完了し易くすることができる。
【0027】
従って、情報処理装置100は、通信タスク間のデッドロックを回避し易くすることができる。情報処理装置100は、同様に、それぞれ異なるノードに割り当てられた2つのプロセスのうち、他方のプロセス内で並列実行の対象となる複数のタスクの記述を含むソースコード101を取得し、通信タスク間にデータ依存を形成する記述を追加することができる。このため、情報処理装置100は、通信タスク間のデッドロックをさらに回避し易くすることができる。
【0028】
ここでは、情報処理装置100が、単独で動作する場合について説明したが、これに限らない。例えば、情報処理装置100が、他のコンピュータと協働する場合があってもよい。例えば、複数のコンピュータが、情報処理装置100としての機能を実現する場合があってもよい。具体的には、クラウド上に、情報処理装置100としての機能が実現される場合があってもよい。
【0029】
(情報処理システム200の一例)
次に、
図2を用いて、
図1に示した情報処理装置100を適用した、情報処理システム200の一例について説明する。
【0030】
図2は、情報処理システム200の一例を示す説明図である。
図2において、情報処理システム200は、情報処理装置100と、1以上のノード装置201と、1以上のクライアント装置202とを含む。
【0031】
情報処理システム200において、情報処理装置100とノード装置201とは、有線または無線のネットワーク210を介して接続される。ネットワーク210は、例えば、LAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどである。情報処理システム200において、情報処理装置100とクライアント装置202とは、有線または無線のネットワーク210を介して接続される。
【0032】
情報処理装置100は、通信タスクのデッドロックを回避し易くするためのコンピュータである。情報処理装置100は、それぞれ異なるノードに割り当てられた2つのプロセスのそれぞれのプロセスについて、当該プロセス内で並列実行の対象となる複数のタスクの記述を含むソースコードを、クライアント装置202から受信する。
【0033】
情報処理装置100は、
図1と同様に、それぞれのプロセスについて受信した、当該プロセス内で並列実行の対象となる複数のタスクの記述を含むソースコードに、通信タスク間のデータ依存を形成する記述を追加する。情報処理装置100は、追加後のソースコードを、ノード装置201に送信することにより、追加後のソースコードを、それぞれ異なるノードで実行するよう制御する。情報処理装置100は、追加後のソースコードを、それぞれ異なるノード装置201に送信してもよい。情報処理装置100は、例えば、サーバ、または、PC(Personal Computer)などである。
【0034】
ノード装置201は、ソースコードを実行するノードを実現するコンピュータである。ノード装置201は、複数のコアを有していてもよく、コアごとに異なるノードを実現するコンピュータであってもよい。ノード装置201は、追加後のソースコードを、情報処理装置100から受信する。ノード装置201は、プロセスを実行する。ノード装置201は、プロセス内で1以上のスレッドを生成する。ノード装置201は、受信した追加後のソースコードが規定する複数のタスクを、生成した1以上のスレッドで並列実行する。ノード装置201は、例えば、サーバ、または、PCなどである。
【0035】
クライアント装置202は、システム利用者によって用いられるコンピュータである。クライアント装置202は、システム利用者の操作入力に基づき、それぞれ異なるノードに割り当てられた2つのプロセスのそれぞれのプロセスについて、当該プロセス内で並列実行の対象となる複数のタスクの記述を含むソースコードを生成する。クライアント装置202は、生成したソースコードを、情報処理装置100に送信する。クライアント装置202は、例えば、PC、タブレット端末、または、スマートフォンなどである。
【0036】
ここでは、情報処理装置100が、ノード装置201とは異なる装置である場合について説明したが、これに限らない。例えば、情報処理装置100が、ノード装置201としての機能を有し、ノード装置201としても動作する場合があってもよい。ここでは、情報処理装置100が、クライアント装置202とは異なる装置である場合について説明したが、これに限らない。例えば、情報処理装置100が、クライアント装置202としての機能を有し、クライアント装置202としても動作する場合があってもよい。
【0037】
(情報処理システム200の適用例)
情報処理システム200は、例えば、スーパーコンピュータを用いてHPC(high-performance computing)の大規模演算処理を実施する場合に適用することが考えられる。この場合、スーパーコンピュータが、ノード装置201として動作する。大規模演算処理は、例えば、地震または天候などの予測処理、画像処理、物体または流体の解析処理、または、言語処理などである。
【0038】
(情報処理装置100のハードウェア構成例)
次に、
図3を用いて、情報処理装置100のハードウェア構成例について説明する。
【0039】
図3は、情報処理装置100のハードウェア構成例を示すブロック図である。
図3において、情報処理装置100は、CPU(Central Processing Unit)301と、メモリ302と、ネットワークI/F(Interface)303と、記録媒体I/F304と、記録媒体305とを有する。また、各構成部は、バス300によってそれぞれ接続される。
【0040】
ここで、CPU301は、情報処理装置100の全体の制御を司る。メモリ302は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)およびフラッシュROMなどを有する。具体的には、例えば、フラッシュROMやROMが各種プログラムを記憶し、RAMがCPU301のワークエリアとして使用される。メモリ302に記憶されるプログラムは、CPU301にロードされることにより、コーディングされている処理をCPU301に実行させる。
【0041】
ネットワークI/F303は、通信回線を通じてネットワーク210に接続され、ネットワーク210を介して他のコンピュータに接続される。そして、ネットワークI/F303は、ネットワーク210と内部のインターフェースを司り、他のコンピュータからのデータの入出力を制御する。ネットワークI/F303は、例えば、モデムやLANアダプタなどである。
【0042】
記録媒体I/F304は、CPU301の制御に従って記録媒体305に対するデータのリード/ライトを制御する。記録媒体I/F304は、例えば、ディスクドライブ、SSD(Solid State Drive)、USB(Universal Serial Bus)ポートなどである。記録媒体305は、記録媒体I/F304の制御で書き込まれたデータを記憶する不揮発メモリである。記録媒体305は、例えば、ディスク、半導体メモリ、USBメモリなどである。記録媒体305は、情報処理装置100から着脱可能であってもよい。
【0043】
情報処理装置100は、上述した構成部の他、例えば、キーボード、マウス、ディスプレイ、プリンタ、スキャナ、マイク、スピーカーなどを有してもよい。また、情報処理装置100は、記録媒体I/F304や記録媒体305を複数有していてもよい。また、情報処理装置100は、記録媒体I/F304や記録媒体305を有していなくてもよい。
【0044】
(ノード装置201のハードウェア構成例)
ノード装置201のハードウェア構成例は、具体的には、
図3に示した情報処理装置100のハードウェア構成例と同様であるため、説明を省略する。
【0045】
(クライアント装置202のハードウェア構成例)
クライアント装置202のハードウェア構成例は、具体的には、
図3に示した情報処理装置100のハードウェア構成例と同様であるため、説明を省略する。
【0046】
(情報処理装置100の機能的構成例)
次に、
図4を用いて、情報処理装置100の機能的構成例について説明する。
【0047】
図4は、情報処理装置100の機能的構成例を示すブロック図である。情報処理装置100は、記憶部400と、取得部401と、検出部402と、加工部403と、実行部404と、出力部405とを含む。
【0048】
記憶部400は、例えば、
図3に示したメモリ302や記録媒体305などの記憶領域によって実現される。以下では、記憶部400が、情報処理装置100に含まれる場合について説明するが、これに限らない。例えば、記憶部400が、情報処理装置100とは異なる装置に含まれ、記憶部400の記憶内容が情報処理装置100から参照可能である場合があってもよい。
【0049】
取得部401~出力部405は、制御部の一例として機能する。取得部401~出力部405は、具体的には、例えば、
図3に示したメモリ302や記録媒体305などの記憶領域に記憶されたプログラムをCPU301に実行させることにより、または、ネットワークI/F303により、その機能を実現する。各機能部の処理結果は、例えば、
図3に示したメモリ302や記録媒体305などの記憶領域に記憶される。
【0050】
記憶部400は、各機能部の処理において参照され、または更新される各種情報を記憶する。記憶部400は、並列実行の対象となる複数の第1タスクの記述を含む第1ソースコードを記憶する。第1ソースコードは、例えば、取得部401によって取得される。
【0051】
取得部401は、各機能部の処理に用いられる各種情報を取得する。取得部401は、取得した各種情報を、記憶部400に記憶し、または、各機能部に出力する。また、取得部401は、記憶部400に記憶しておいた各種情報を、各機能部に出力してもよい。取得部401は、例えば、自装置利用者の操作入力に基づき、各種情報を取得する。取得部401は、例えば、情報処理装置100とは異なる装置から、各種情報を受信してもよい。
【0052】
取得部401は、第1ソースコードを取得する。第1ソースコードは、複数存在していてもよい。取得部401は、例えば、それぞれ異なるノードに割り当てられた複数のプロセスのそれぞれのプロセスについて、当該プロセス内の1以上のスレッドで並列実行の対象となる複数の第1タスクの記述を含む第1ソースコードを取得する。
【0053】
取得部401は、具体的には、第1ソースコードを、他のコンピュータから受信することにより取得する。他のコンピュータは、例えば、クライアント装置202である。取得部401は、具体的には、自装置利用者の操作入力に基づき、第1ソースコードの入力を受け付けることにより、第1ソースコードを取得する。自装置利用者は、例えば、システム利用者である。
【0054】
取得部401は、いずれかの機能部の処理を開始する開始トリガーを受け付けてもよい。開始トリガーは、例えば、自装置利用者による所定の操作入力があったことである。開始トリガーは、例えば、他のコンピュータから、所定の情報を受信したことであってもよい。開始トリガーは、例えば、いずれかの機能部が所定の情報を出力したことであってもよい。取得部401は、具体的には、第1ソースコードを取得したことを、検出部402と加工部403と実行部404との処理を開始する開始トリガーとして受け付けてもよい。
【0055】
検出部402は、ソースコードに規定された複数のタスクの記述のうち、通信を制御する通信タスクの記述を検出する。検出部402は、例えば、取得した第1ソースコードを解析し、第1ソースコードに規定された複数の第1タスクの記述のうち、それぞれ通信を制御する2以上の通信タスクの記述を検出する。これにより、検出部402は、第1ソースコードのうち、デッドロックを発生する原因となり得る通信タスクの記述を検出することができ、加工部403で第1ソースコードを加工する基準を得ることができる。
【0056】
検出部402は、取得した第1ソースコードにおける、通信を制御し、かつ、演算を実施する第1タスクの記述を検出してもよい。検出部402は、検出した第1タスクの記述を、当該通信を制御する通信タスクの記述と、当該演算を実施する演算タスクの記述とに分割することにより、第1ソースコードを、第2ソースコードに変換してもよい。
【0057】
第2ソースコードは、並列実行の対象となる複数の第2タスクの記述を含む。複数の第2タスクは、例えば、第1タスクから記述が分割された通信タスクと、演算タスクとを包含する。複数の第2タスクは、例えば、複数の第1タスクのうち、記述が分割されなかった第1タスクをすべて包含する。これにより、検出部402は、第1タスクを形成する通信タスクと演算タスクとを分割することができ、当該通信タスクと独立して当該演算タスクを実行し易くすることができ、演算効率の効率化を図ることができる。
【0058】
検出部402は、変換した第2ソースコードに規定された複数の第2タスクの記述のうち、それぞれ通信を制御する2以上の通信タスクの記述を検出する。これにより、検出部402は、第2ソースコードのうち、デッドロックを発生する原因となり得る通信タスクの記述を検出することができ、加工部403で第2ソースコードを加工する基準を得ることができる。
【0059】
加工部403は、ソースコードを加工する。加工部403は、例えば、取得した第1ソースコードにおける、検出した2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加する。異なる2つの通信タスク間のデータ依存は、例えば、異なる2つの通信タスクのそれぞれの通信タスクが、同一のデータにアクセスすることにより形成される。アクセスは、例えば、入力、または、出力である。アクセスは、例えば、出力であることが好ましい。
【0060】
加工部403は、例えば、取得した第1ソースコードにおける、検出した2以上の通信タスクの記述のそれぞれの通信タスクの記述順序に基づいて、当該通信タスクの実行順序を決定する。加工部403は、例えば、2以上の通信タスクのそれぞれの通信タスクの実行順序に応じて、通信タスク間にデータ依存を形成する通信タスクペアを特定する。加工部403は、例えば、取得した第1ソースコードにおける、検出した2以上の通信タスクの記述のそれぞれの通信タスクの記述に、特定した通信タスクペアの通信タスク間にデータ依存を形成する記述を追加する。
【0061】
加工部403は、具体的には、それぞれの通信タスクの記述順序を、当該通信タスクの実行順序として採用することにより、当該通信タスクの実行順序を決定する。加工部403は、具体的には、それぞれの通信タスクの記述順序の逆順を、当該通信タスクの実行順序として採用することにより、当該通信タスクの実行順序を決定してもよい。加工部403は、具体的には、所定の規則に従って、それぞれの通信タスクの記述順序を、当該通信タスクの実行順序に変換することにより、当該通信タスクの実行順序を決定してもよい。
【0062】
加工部403は、具体的には、定数Nを設定する。定数Nは、例えば、同時に通信可能な通信タスクの上限数以下であることが好ましい。定数Nは、例えば、同時に通信可能な通信タスクの上限数である。加工部403は、具体的には、実行順序nの通信タスクと、実行順序n+Nの通信タスクとを、通信タスク間にデータ依存を形成する通信タスクペアとして特定する。nは、正の整数<Nである。加工部403は、具体的には、取得した第1ソースコードにおける、検出した2以上の通信タスクの記述のそれぞれの通信タスクの記述に、特定した通信タスクペアの通信タスク間にデータ依存を形成する記述を追加する。
【0063】
加工部403は、より具体的には、N個の複数の要素データを設定する。加工部403は、より具体的には、第1ソースコードにおける、2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて複数の要素データからサイクリックに選択したいずれかの要素データにアクセスする記述を追加する。これにより、加工部403は、プロセス内の各スレッドで、第1ソースコードに規定された複数の第1タスクをサイクリックに実行するよう、複数の第1タスクの実行順序を制御可能および保証可能にすることができる。
【0064】
加工部403は、例えば、取得した第2ソースコードにおける、検出した2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加する。異なる2つの通信タスク間のデータ依存は、例えば、異なる2つの通信タスクのそれぞれの通信タスクが、同一のデータにアクセスすることにより形成される。アクセスは、例えば、入力、または、出力である。アクセスは、例えば、出力であることが好ましい。
【0065】
加工部403は、例えば、取得した第2ソースコードにおける、検出した2以上の通信タスクの記述のそれぞれの通信タスクの記述順序に基づいて、当該通信タスクの実行順序を決定する。加工部403は、例えば、2以上の通信タスクのそれぞれの通信タスクの実行順序に応じて、通信タスク間にデータ依存を形成する通信タスクペアを特定する。加工部403は、例えば、取得した第2ソースコードにおける、検出した2以上の通信タスクの記述のそれぞれの通信タスクの記述に、特定した通信タスクペアの通信タスク間にデータ依存を形成する記述を追加する。
【0066】
加工部403は、具体的には、それぞれの通信タスクの記述順序を、当該通信タスクの実行順序として採用することにより、当該通信タスクの実行順序を決定する。加工部403は、具体的には、それぞれの通信タスクの記述順序の逆順を、当該通信タスクの実行順序として採用することにより、当該通信タスクの実行順序を決定してもよい。加工部403は、具体的には、所定の規則に従って、それぞれの通信タスクの記述順序を、当該通信タスクの実行順序に変換することにより、当該通信タスクの実行順序を決定してもよい。
【0067】
加工部403は、具体的には、定数Nを設定する。定数Nは、例えば、同時に通信可能な通信タスクの上限数以下であることが好ましい。定数Nは、例えば、同時に通信可能な通信タスクの上限数である。加工部403は、具体的には、実行順序nの通信タスクと、実行順序n+Nの通信タスクとを、通信タスク間にデータ依存を形成する通信タスクペアとして特定する。nは、正の整数<Nである。加工部403は、具体的には、取得した第2ソースコードにおける、検出した2以上の通信タスクの記述のそれぞれの通信タスクの記述に、特定した通信タスクペアの通信タスク間にデータ依存を形成する記述を追加する。
【0068】
加工部403は、より具体的には、N個の複数の要素データを設定する。加工部403は、より具体的には、第2ソースコードにおける、2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて複数の要素データからサイクリックに選択したいずれかの要素データにアクセスする記述を追加する。これにより、加工部403は、プロセス内の各スレッドで、第2ソースコードに規定された複数の第2タスクをサイクリックに実行するよう、複数の第2タスクの実行順序を制御可能および保証可能にすることができる。
【0069】
実行部404は、ソースコードをコンパイルし、ランタイムを用いてソースコードに規定された複数のタスクをスケジューリングし、2以上のスレッドを用いてスケジューリングした複数のタスクを並列実行する。実行主体は、例えば、情報処理装置100、または、ノード装置201である。
【0070】
実行部404は、例えば、追加後の第1ソースコードをコンパイルし、ランタイムを用いて複数の第1タスクをスケジューリングし、2以上のスレッドを用いてスケジューリングした複数の第1タスクを並列実行する。実行部404は、具体的には、スケジューリングした結果に基づいて、ノード装置201が、2以上のスレッドを用いてスケジューリングした複数の第1タスクを並列実行するよう、ノード装置201を制御する。これにより、実行部404は、複数の第1タスクの実行順序を制御および保証することができる。
【0071】
実行部404は、例えば、追加後の第2ソースコードをコンパイルし、ランタイムを用いて複数の第2タスクをスケジューリングし、2以上のスレッドを用いてスケジューリングした複数の第2タスクを並列実行する。実行部404は、具体的には、スケジューリングした結果に基づいて、ノード装置201が、2以上のスレッドを用いてスケジューリングした複数の第2タスクを並列実行するよう、ノード装置201を制御する。これにより、実行部404は、複数の第2タスクの実行順序を制御および保証することができる。
【0072】
出力部405は、少なくともいずれかの機能部の処理結果を出力する。出力形式は、例えば、ディスプレイへの表示、プリンタへの印刷出力、ネットワークI/F303による外部装置への送信、または、メモリ302や記録媒体305などの記憶領域への記憶である。これにより、出力部405は、少なくともいずれかの機能部の処理結果を自装置利用者に通知可能にし、情報処理装置100の利便性の向上を図ることができる。
【0073】
出力部405は、加工後の第1ソースコードを出力する。出力部405は、例えば、加工後の第1ソースコードを、ソースコードを実行する機能を有する他のコンピュータに送信する。他のコンピュータは、例えば、ノード装置201である。出力部405は、例えば、加工後の第1ソースコードを、システム利用者が参照可能に出力してもよい。これにより、出力部405は、外部で、加工後の第1ソースコードを実行可能にすることができる。
【0074】
出力部405は、加工後の第2ソースコードを出力する。出力部405は、例えば、加工後の第2ソースコードを、ソースコードを実行する機能を有する他のコンピュータに送信する。他のコンピュータは、例えば、ノード装置201である。出力部405は、例えば、加工後の第2ソースコードを、システム利用者が参照可能に出力してもよい。これにより、出力部405は、外部で、加工後の第2ソースコードを実行可能にすることができる。
【0075】
出力部405は、実行部404で複数の第1タスクを並列実行した結果を出力してもよい。これにより、出力部405は、第1ソースコードに規定された複数の第1タスクを並列実行した結果を利用可能にすることができる。
【0076】
出力部405は、実行部404で複数の第2タスクを並列実行した結果を出力してもよい。これにより、出力部405は、第2ソースコードに規定された複数の第2タスクを並列実行した結果を利用可能にすることができる。
【0077】
ここでは、情報処理装置100が、取得部401と、検出部402と、加工部403と、実行部404と、出力部405とを含む場合について説明したが、これに限らない。例えば、情報処理装置100が、いずれかの機能部を含まない場合があってもよい。具体的には、情報処理装置100が、実行部404を含まない場合があってもよい。この場合、情報処理装置100は、実行部404を含む他のコンピュータと通信可能であることが考えられる。情報処理装置100は、他のコンピュータに、加工後の第1ソースコード、または、加工後の第2ソースコードを送信する。
【0078】
(情報処理システム200の動作例)
次に、
図5~
図12を用いて、情報処理システム200の動作例について説明する。まず、
図5を用いて、情報処理システム200において、いずれかのノード装置201に対して実装されるコンテキストスイッチ機能の一例について説明する。
【0079】
図5は、コンテキストスイッチ機能の一例を示す説明図である。
図5に示すように、ノード装置201は、コンテキストスイッチ機能が実装される。ノード装置201は、例えば、実行待ちタスクを管理するFirst in First outのキューを用意する。
【0080】
ノード装置201は、プロセス内のスレッドで、タスクを実行開始後一定時間経過しても、当該タスクが完了しない場合、当該タスクについてコンテキストスイッチ機能を実施する。コンテキストスイッチ機能は、実行中のタスクをキューに退避して実行待ちタスクとして管理すると共に、キューの先頭のタスクを取り出してプロセス内のスレッドで実行開始する機能である。
【0081】
図5の例では、ノード装置201は、プロセス内のスレッドで、データの受信を制御する受信タスクRecv501を実行中であるとする。ノード装置201は、データの演算を制御する演算タスクCalc502と、データの送信を制御する送信タスクSend503と、データの演算を制御する演算タスクCalc504とを、実行待ちタスクとして順にキューに格納して管理中であるとする。
【0082】
図5の例では、ノード装置201は、プロセス内のスレッドで、受信タスクRecv501を実行開始後一定時間経過しても、受信タスクRecv501が完了しなければ、受信タスクRecv501をキューに退避して実行待ちタスクとして管理する。また、ノード装置201は、受信タスクRecv501に代わり、キューの先頭の演算タスクCalc502を取り出して、プロセス内のスレッドで実行開始する。
【0083】
これにより、ノード装置201は、タスクがスレッドを占有しないようにすることができ、デッドロックを回避し易くすることができる。ノード装置201が、コンテキストスイッチを実施する回数が多くなるほど、オーバーヘッドの増大化を招き、プロセス内のスレッドで実行するタスクの性能低下を招くという問題が発生する。このため、ノード装置201が、コンテキストスイッチ機能を実施する回数の増大化を抑制することが望まれる。
【0084】
これに対し、情報処理装置100は、複数のタスクの記述を含むソースコードを変換してから、ノード装置201に提供することにより、デッドロックを回避し易くすると共に、コンテキストスイッチを実施する回数を低減することを目的とする。
【0085】
ここで、
図6~
図9を用いて、情報処理装置100が、ノード装置201で実行する受信タスクの記述を含むソースコード600と、ノード装置201で実行する送信タスクの記述を含むソースコード800とを変換する一例について説明する。まず、例えば、
図6および
図7を用いて、情報処理装置100が、受信タスクの記述を含むソースコード600を変換する一例について説明する。
【0086】
図6および
図7は、受信タスクの記述を含むソースコード600を変換する一例を示す説明図である。
図6において、情報処理装置100は、受信タスクの記述を含むソースコード600を取得する。情報処理装置100は、ノード装置201のプロセス内で同時に実行可能な通信タスク数N分の要素データを含むバッファbufを確保する。以下の説明では、バッファbufのi番目の要素データを「要素データbuf[i-1]」と表記する場合がある。iは、1~Nの整数である。
【0087】
情報処理装置100は、ソースコード600を解析する。情報処理装置100は、ソースコード600を解析した結果に基づいて、ソースコード600のうち、通信を制御し、かつ、演算を実施する複合タスクの記述を検索する。
図6の例では、タスクAは、E=5の演算を実施し、かつ、MPI_Recv()の受信を制御する複合タスクである。このため、情報処理装置100は、検索した結果、ソースコード600のうち、複合タスクとなるタスクAの記述を検出する。
【0088】
そこで、情報処理装置100は、ソースコード600のうち、検出したタスクAに、通信を制御する部分を残して、検出したタスクAから、E=5の演算を実施する部分を、タスクGとして分離する。タスクAは、MPI_Recv()の受信を制御する通信タスクになる。これにより、情報処理装置100は、タスクAと独立してタスクGを実行し易くすることができ、演算効率の効率化を図ることができる。
【0089】
情報処理装置100は、ソースコード600を解析した結果に基づいて、ソースコード600のうち、通信タスクの記述を検索する。
図6の例では、情報処理装置100は、検索した結果、ソースコード600のうち、それぞれ通信タスクとなるタスクAの記述、タスクBの記述、タスクCの記述、タスクDの記述、タスクEの記述、および、タスクFの記述を検出する。これにより、情報処理装置100は、デッドロックの原因となり得る通信タスクの記述を検出することができ、ソースコード600を変換する指針を得ることができる。ここで、
図7の説明に移行する。
【0090】
図7において、情報処理装置100は、ソースコード600の先頭に、カウンタ用の変数の定義int cnt=0;を挿入する。情報処理装置100は、通信タスクの記述順序に従って、変数cntを0以上N未満の範囲でサイクリックにインクリメントしながら、それぞれの通信タスクの記述に、要素データbuf[cnt]を用いて他の通信タスクとデータ依存を形成する記述を追加する。データ依存を形成する記述は、例えば、#pragma omp task depend(out:buf[cnt])である。
【0091】
図7の例では、情報処理装置100は、タスクAの記述に、要素データbuf[cnt]を用いて他の通信タスクとデータ依存を形成する記述「#pragma omp task depend(out:buf[cnt])」を追加する。また、情報処理装置100は、タスクAの記述に、変数cntを0以上N未満の範囲でサイクリックにインクリメントするため、変数cntをインクリメントする記述cnt++と、N以上になった変数cntを初期化する記述とを追加する。初期化する記述は、例えば、if(N<=cnt)cnt=0である。
【0092】
これにより、情報処理装置100は、ソースコード600を、ソースコード700に変換することができる。情報処理装置100は、ソースコード700により、タスクA、タスクB、タスクC、タスクD、タスクE、および、タスクFの実行順序を制御および保証することができる。次に、例えば、
図8および
図9を用いて、情報処理装置100が、送信タスクの記述を含むソースコード800を変換する一例について説明する。
【0093】
図8および
図9は、送信タスクの記述を含むソースコード800を変換する一例を示す説明図である。
図8において、情報処理装置100は、送信タスクの記述を含むソースコード800を取得する。情報処理装置100は、ノード装置201のプロセス内で同時に実行可能な通信タスク数N分の要素データを含むバッファbufを確保する。
【0094】
情報処理装置100は、ソースコード800を解析する。情報処理装置100は、ソースコード800を解析した結果に基づいて、ソースコード800のうち、通信を制御し、かつ、演算を実施する複合タスクの記述を検索する。
図8の例では、タスクAは、E=4の演算を実施し、かつ、MPI_Send()の送信を制御する複合タスクである。このため、情報処理装置100は、検索した結果、ソースコード800のうち、複合タスクとなるタスクAの記述を検出する。
【0095】
そこで、情報処理装置100は、ソースコード800のうち、検出したタスクAに、通信を制御する部分を残して、検出したタスクAから、E=5の演算を実施する部分を、タスクGとして分離する。タスクAは、MPI_Send()の送信を制御する通信タスクになる。これにより、情報処理装置100は、タスクAと独立してタスクGを実行し易くすることができ、演算効率の効率化を図ることができる。
【0096】
情報処理装置100は、ソースコード800を解析した結果に基づいて、ソースコード800のうち、通信タスクの記述を検索する。
図8の例では、情報処理装置100は、検索した結果、ソースコード800のうち、それぞれ通信タスクとなるタスクAの記述、タスクBの記述、タスクCの記述、タスクDの記述、タスクEの記述、および、タスクFの記述を検出する。これにより、情報処理装置100は、デッドロックの原因となり得る通信タスクの記述を検出することができ、ソースコード800を変換する指針を得ることができる。ここで、
図9の説明に移行する。
【0097】
図9において、情報処理装置100は、ソースコード800の先頭に、カウンタ用の変数の定義int cnt=0;を挿入する。情報処理装置100は、通信タスクの記述順序に従って、変数cntを0以上N未満の範囲でサイクリックにインクリメントしながら、それぞれの通信タスクの記述に、要素データbuf[cnt]を用いて他の通信タスクとデータ依存を形成する記述を追加する。データ依存を形成する記述は、例えば、#pragma omp task depend(out:buf[cnt])である。
【0098】
図9の例では、情報処理装置100は、タスクAの記述に、要素データbuf[cnt]を用いて他の通信タスクとデータ依存を形成する記述「#pragma omp task depend(out:buf[cnt])」を追加する。また、情報処理装置100は、タスクAの記述に、変数cntを0以上N未満の範囲でサイクリックにインクリメントするため、変数cntをインクリメントする記述cnt++と、N以上になった変数cntを初期化する記述とを追加する。初期化する記述は、例えば、if(N<=cnt)cnt=0である。
【0099】
これにより、情報処理装置100は、ソースコード800を、ソースコード900に変換することができる。情報処理装置100は、ソースコード900により、タスクA、タスクB、タスクC、タスクD、タスクE、および、タスクFの実行順序を制御および保証することができる。ここで、
図10を用いて、情報処理装置100が、N=2として、ソースコード600を、ソースコード700に変換した場合における、タスク間のデータ依存関係の一例について説明する。
【0100】
図10は、タスク間のデータ依存関係の一例を示す説明図である。
図10の符号1000に示すように、変換前のソースコード600では、タスクA、タスクB、タスクC、タスクD、タスクE、および、タスクFは、データ依存の関係が存在しない。このため、プロセス内で、タスクA、タスクB、タスクC、タスクD、タスクE、および、タスクFの実行順序は、不定であると考えられる。
【0101】
これに対し、符号1010に示すように、変換後のソースコード700は、タスクA、タスクB、タスクC、タスクD、タスクE、および、タスクFに、データ依存の関係を形成することができる。例えば、変換後のソースコード700は、buf[0]に関して、タスクA、タスクC、および、タスクEに、順にデータ依存の関係を形成することができる。このため、タスクA、タスクC、および、タスクEの実行順序は、固定されると考えられる。
【0102】
例えば、変換後のソースコード700は、buf[1]に関して、タスクB、タスクD、および、タスクFに、順にデータ依存の関係を形成することができる。このため、タスクB、タスクD、および、タスクFの実行順序は、固定されると考えられる。次に、
図11を用いて、プロセス内のスレッドで、ソースコード700に規定された複数のタスクを並列実行する一例について説明する。
【0103】
図11は、複数のタスクを並列実行する一例を示す説明図である。
図11において、情報処理装置100は、ソースコード700,900を、1または複数のノード装置201に送信する。これにより、情報処理装置100は、ソースコード700に規定された複数のタスクと、ソースコード900に規定された複数のタスクとが、それぞれ異なるプロセスで実行されるよう、1または複数のノード装置201を制御する。
【0104】
図11の例では、ソースコード700を受信した第1ノード装置201が、プロセス内の3つのスレッドで、ソースコード700に規定された複数のタスクを並列実行するとする。符号1110に示すように、第1ノード装置201は、ソースコード700に従って、通信タスク間のデータ依存を考慮して、スレッド0でタスクAを実行し、スレッド1でタスクBを実行し、スレッド2でタスクGを実行する。
【0105】
第1ノード装置201は、スレッド0でタスクAを完了してから、スレッド0でタスクCを実行する。第1ノード装置201は、スレッド0でタスクCを完了してから、スレッド0でタスクEを実行する。第1ノード装置201は、スレッド1でタスクBを完了してから、スレッド1でタスクDを実行する。第1ノード装置201は、スレッド1でタスクDを完了してから、スレッド1でタスクFを実行する。これにより、第1ノード装置201は、タスクA、タスクB、タスクC、タスクD、タスクE、および、タスクFを、固定の実行順序で実行することができる。
【0106】
同様に、ソースコード900を受信した第2ノード装置201は、タスクA、タスクB、タスクC、タスクD、タスクE、および、タスクFを、固定の実行順序で実行することができる。これにより、情報処理システム200は、第1ノード装置201と第2ノード装置201とが、互いに対応する通信タスクを、同タイミングで実行し易くすることができる。従って、情報処理システム200は、デッドロックを回避し易くすることができる。
【0107】
これに対し、第1ノード装置201が、変換前のソースコード600に従って、タスクA、タスクB、タスクC、タスクD、タスクE、および、タスクFを実行した場合を仮定する。この場合、第1ノード装置201は、タスクA、タスクB、タスクC、タスクD、タスクE、および、タスクFを、固定の実行順序で実行するとは限らない。例えば、符号1100に示すように、第1ノード装置201は、変換前のソースコード600に従うと、スレッド0でタスクBを実行し、スレッド1でタスクFを実行し、スレッド2でタスクAを実行することが考えられる。
【0108】
同様に、第2ノード装置201が、変換前のソースコード800に従って、タスクA、タスクB、タスクC、タスクD、タスクE、および、タスクFを実行した場合を仮定する。この場合、第2ノード装置201は、タスクA、タスクB、タスクC、タスクD、タスクE、および、タスクFを、固定の実行順序で実行するとは限らない。第2ノード装置201は、変換前のソースコード800に従うと、スレッド0でタスクEを実行し、スレッド1でタスクDを実行し、スレッド2でタスクCを実行することが考えられる。
【0109】
このように、第1ノード装置201と、第2ノード装置201とが、互いに対応する通信タスクを、同タイミングで実行するとは限らない。このため、従来では、デッドロックを回避することが難しい場合がある。従って、従来では、第1ノード装置201と、第2ノード装置201とが、コンテキストスイッチを実施する回数を低減することができず、オーバーヘッドの増大化を招くことがある。次に、
図12を用いて、情報処理装置100の効果の一例について説明する。具体的には、
図12を用いて、デッドロックを回避することについて説明する。
【0110】
図12は、情報処理装置100による効果の一例を示す説明図である。
図12の符号1210に示すように、従来では、第2ノード装置201のプロセス0において、スレッド0がSend0の送信タスクを実行し、スレッド1がSend1の送信タスクを実行することがある。Send0の送信タスクは、Recv0の受信タスクに対応する。Send1の送信タスクは、Recv1の受信タスクに対応する。
【0111】
同様に、
図12の符号1210に示すように、従来では、第1ノード装置201のプロセス1において、スレッド0がRecv2の受信タスクを実行し、スレッド1がRecv3の受信タスクを実行することがある。Recv2の受信タスクは、Send2の送信タスクに対応する。Recv3の受信タスクは、Send3の送信タスクに対応する。
【0112】
プロセス0において、Send0の送信タスク、または、Send1の送信タスクの少なくともいずれかが完了しなければ、Send2の送信タスク、および、Send3の送信タスクは、実行開始されない。プロセス1において、Recv2の受信タスク、または、Recv3の受信タスクの少なくともいずれかが完了しなければ、Recv0の受信タスク、および、Recv1の受信タスクは、実行開始されない。
【0113】
従って、プロセス0において、スレッド0,1をタスクが占有したまま完了せず、プロセス1において、スレッド0,1をタスクが占有したまま完了しなくなる。このため、従来では、プロセス0,1において、タスクのデッドロックが発生する確率が比較的高いと考えられる。そして、従来では、コンテキストスイッチを実施する回数を低減することが難しいと考えられる。
【0114】
これに対し、情報処理装置100は、
図12の符号1200に示すように、第2ノード装置201のプロセス0において、スレッド0がSend0の送信タスクを実行し、スレッド1がSend1の送信タスクを実行するよう制御することができる。
【0115】
同様に、情報処理装置100は、
図12の符号1200に示すように、第1ノード装置201のプロセス1において、スレッド0がRecv0の受信タスクを実行し、スレッド1がRecv1の受信タスクを実行するよう制御することができる。このため、情報処理装置100は、デッドロックを回避することができる。情報処理装置100は、コンテキストスイッチを実施する回数を低減することができる。
【0116】
ここでは、ノード装置201に対してコンテキストスイッチ機能が実装される場合について説明したが、これに限らない。例えば、ノード装置201に対してコンテキストスイッチ機能が実装されない場合があってもよい。
【0117】
(全体処理手順)
次に、
図13を用いて、情報処理装置100が実行する、全体処理手順の一例について説明する。全体処理は、例えば、
図3に示したCPU301と、メモリ302や記録媒体305などの記憶領域と、ネットワークI/F303とによって実現される。
【0118】
図13は、全体処理手順の一例を示すフローチャートである。
図13において、情報処理装置100は、同時通信可能な通信タスク数分の要素を含むバッファを設定する(ステップS1301)。
【0119】
次に、情報処理装置100は、ソースコードを解析し、ソースコードにおける複数のタスクの記述を検出する(ステップS1302)。そして、情報処理装置100は、ソースコードにおける、検出した複数のタスクの記述のうち、まだ選択していないいずれかのタスクの記述を選択する(ステップS1303)。
【0120】
次に、情報処理装置100は、ソースコードにおける、選択したいずれかのタスクの記述が、通信と演算とを両方実施する複合タスクの記述であるか否かを判定する(ステップS1304)。ここで、複合タスクの記述ではない場合(ステップS1304:No)、情報処理装置100は、ステップS1306の処理に移行する。一方で、複合タスクの記述である場合(ステップS1304:Yes)、情報処理装置100は、ステップS1305の処理に移行する。
【0121】
ステップS1305では、情報処理装置100は、ソースコードにおける、選択したいずれかのタスクの記述のうち、演算を実施する演算タスクの記述を分離する(ステップS1305)。そして、情報処理装置100は、ステップS1306の処理に移行する。
【0122】
ステップS1306では、情報処理装置100は、ソースコードにおける、選択したいずれかのタスクの記述が、通信を実施する通信タスクの記述であるか否かを判定する(ステップS1306)。ここで、通信タスクの記述ではない場合(ステップS1306:No)、情報処理装置100は、ステップS1308の処理に移行する。一方で、通信タスクの記述である場合(ステップS1306:Yes)、情報処理装置100は、ステップS1307の処理に移行する。
【0123】
ステップS1307では、情報処理装置100は、ソースコードにおける、選択したいずれかのタスクの記述に、バッファを用いたデータ依存の記述を追加する(ステップS1307)。そして、情報処理装置100は、ステップS1308の処理に移行する。
【0124】
ステップS1308では、情報処理装置100は、すべてのタスクを選択したか否かを判定する(ステップS1308)。ここで、まだ選択していないタスクがある場合(ステップS1308:No)、情報処理装置100は、ステップS1303の処理に戻る。一方で、すべてのタスクを選択した場合(ステップS1308:Yes)、情報処理装置100は、全体処理を終了する。これにより、情報処理装置100は、デッドロックを回避し易くすることができ、コンテキストスイッチを実施する回数を低減することができる。
【0125】
ここで、情報処理装置100は、
図13の一部ステップの処理の順序を入れ替えて実行してもよい。また、情報処理装置100は、
図13の一部ステップの処理を省略してもよい。例えば、ステップS1304,S1305の処理は省略可能である。
【0126】
以上説明したように、情報処理装置100によれば、並列実行の対象となる複数のタスクの記述を含むソースコードを取得することができる。情報処理装置100によれば、取得したソースコードに規定された複数のタスクの記述のうち、それぞれ通信を制御する2以上の通信タスクの記述を検出することができる。情報処理装置100によれば、取得したソースコードにおける、検出した2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加することができる。これにより、情報処理装置100は、デッドロックを回避し易くすることができる。
【0127】
情報処理装置100によれば、追加後のソースコードをコンパイルし、ランタイムを用いて複数のタスクをスケジューリングし、2以上のスレッドを用いてスケジューリングした複数のタスクを並列実行することができる。これにより、情報処理装置100は、デッドロックを回避しつつ複数のタスクを並列実行することができる。
【0128】
情報処理装置100によれば、2以上の通信タスクのそれぞれの通信タスクの記述順序に基づいて、当該通信タスクの実行順序を決定することができる。情報処理装置100によれば、取得したソースコードにおける、検出した2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加することができる。これにより、情報処理装置100は、ソースコードの作成者の意図に沿って通信タスクの実行順序を決定し易くすることができ、複数のタスクの実行効率を向上し易くすることができる。
【0129】
情報処理装置100によれば、同時に通信可能な通信タスクの上限数分の複数の要素データを設定することができる。情報処理装置100によれば、2以上の通信タスクのそれぞれの通信タスクの記述順序に基づいて、当該通信タスクの実行順序を決定することができる。情報処理装置100によれば、検出した2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて複数の要素データからサイクリックに選択したいずれかの要素データにアクセスする記述を追加することができる。これにより、情報処理装置100は、要素データを用いて複数のタスクの正常動作を阻害しないよう、データ依存を形成することができる。
【0130】
情報処理装置100によれば、アクセスとして、要素データの出力を採用することができる。これにより、情報処理装置100は、それぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて複数の要素データからサイクリックに選択したいずれかの要素データにアクセスする記述を追加し易くすることができる。情報処理装置100は、通信タスク間のデータ依存に、入力と出力とを使い分けずに済ませることができる。
【0131】
情報処理装置100によれば、並列実行の対象となる複数の第1タスクの記述を含むソースコードを取得することができる。情報処理装置100によれば、取得したソースコードにおける、通信を制御し、かつ、演算を実施する第1タスクの記述を検出することができる。情報処理装置100によれば、検出した第1タスクの記述を、当該通信を制御する通信タスクの記述と、当該演算を実施する演算タスクの記述とに分割することにより、取得したソースコードを、新たなソースコードに変換することができる。情報処理装置100によれば、変換した新たなソースコードに規定された複数の第2タスクの記述のうち、それぞれ通信を制御する2以上の通信タスクの記述を検出することができる。情報処理装置100によれば、変換した第2ソースコードにおける、検出した2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加することができる。これにより、情報処理装置100は、第1タスクを形成する通信タスクと演算タスクとを分割することができ、当該通信タスクと独立して当該演算タスクを実行し易くすることができ、演算効率の効率化を図ることができる。
【0132】
なお、本実施の形態で説明した情報処理方法は、予め用意されたプログラムをPCやワークステーションなどのコンピュータで実行することにより実現することができる。本実施の形態で説明した情報処理プログラムは、コンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。記録媒体は、ハードディスク、フレキシブルディスク、CD(Compact Disc)-ROM、MO(Magneto Optical disc)、DVD(Digital Versatile Disc)などである。また、本実施の形態で説明した情報処理プログラムは、インターネットなどのネットワークを介して配布してもよい。
【0133】
上述した実施の形態に関し、さらに以下の付記を開示する。
【0134】
(付記1)並列実行の対象となる複数のタスクの記述を含むソースコードを取得し、
取得した前記ソースコードに規定された前記複数のタスクの記述のうち、それぞれ通信を制御する2以上の通信タスクの記述を検出し、
取得した前記ソースコードにおける、検出した前記2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加する、
処理をコンピュータに実行させることを特徴とする情報処理プログラム。
【0135】
(付記2)追加後の前記ソースコードをコンパイルし、ランタイムを用いて前記複数のタスクをスケジューリングし、2以上のスレッドを用いてスケジューリングした前記複数のタスクを並列実行する、
処理を前記コンピュータに実行させることを特徴とする付記1に記載の情報処理プログラム。
【0136】
(付記3)前記追加する処理は、
取得した前記ソースコードにおける、検出した前記2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの記述順序に基づき決定される当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加する、ことを特徴とする付記1または2に記載の情報処理プログラム。
【0137】
(付記4)同時に通信可能な通信タスクの上限数分の複数の要素データを設定し、
前記追加する処理は、
取得した前記ソースコードにおける、検出した前記2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの記述順序に基づき決定される当該通信タスクの実行順序に応じて前記複数の要素データからサイクリックに選択したいずれかの要素データにアクセスすることにより他の通信タスクとのデータ依存を形成する記述を追加する、ことを特徴とする付記3に記載の情報処理プログラム。
【0138】
(付記5)前記アクセスは、前記要素データの出力である、ことを特徴とする付記4に記載の情報処理プログラム。
【0139】
(付記6)前記取得する処理は、
並列実行の対象となる複数の第1タスクの記述を含むソースコードを取得し、
取得した前記ソースコードにおける、通信を制御し、かつ、演算を実施する第1タスクの記述を、当該通信を制御する通信タスクの記述と、当該演算を実施する演算タスクの記述とに分割することにより、取得した前記ソースコードを、並列実行の対象となる複数の第2タスクの記述を含む新たなソースコードに変換し、
前記検出する処理は、
変換した前記新たなソースコードに規定された前記複数の第2タスクの記述のうち、それぞれ通信を制御する2以上の通信タスクの記述を検出し、
前記追加する処理は、
変換した前記新たなソースコードにおける、検出した前記2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加する、ことを特徴とする付記1または2に記載の情報処理プログラム。
【0140】
(付記7)並列実行の対象となる複数のタスクの記述を含むソースコードを取得し、
取得した前記ソースコードに規定された前記複数のタスクの記述のうち、それぞれ通信を制御する2以上の通信タスクの記述を検出し、
取得した前記ソースコードにおける、検出した前記2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加する、
処理をコンピュータが実行することを特徴とする情報処理方法。
【0141】
(付記8)並列実行の対象となる複数のタスクの記述を含むソースコードを取得し、
取得した前記ソースコードに規定された前記複数のタスクの記述のうち、それぞれ通信を制御する2以上の通信タスクの記述を検出し、
取得した前記ソースコードにおける、検出した前記2以上の通信タスクの記述のそれぞれの通信タスクの記述に、当該通信タスクの実行順序に応じて特定される通信タスク間にデータ依存を形成する記述を追加する、
制御部を有することを特徴とする情報処理装置。
【符号の説明】
【0142】
100 情報処理装置
101,600,700,800,900 ソースコード
200 情報処理システム
201 ノード装置
202 クライアント装置
210 ネットワーク
300 バス
301 CPU
302 メモリ
303 ネットワークI/F
304 記録媒体I/F
305 記録媒体
400 記憶部
401 取得部
402 検出部
403 加工部
404 実行部
405 出力部
501 受信タスクRecv
502,504 演算タスクCalc
503 送信タスクSend
1000,1010,1110,1200,1210 符号