(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024129675
(43)【公開日】2024-09-27
(54)【発明の名称】実行制御プログラム、実行制御方法、および情報処理装置
(51)【国際特許分類】
G06F 9/48 20060101AFI20240919BHJP
【FI】
G06F9/48 300H
G06F9/48 300B
【審査請求】未請求
【請求項の数】6
【出願形態】OL
(21)【出願番号】P 2023039026
(22)【出願日】2023-03-13
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】100104190
【弁理士】
【氏名又は名称】酒井 昭徳
(72)【発明者】
【氏名】津金 佳祐
(57)【要約】
【課題】プログラムにおけるコンテキストスイッチを削減して、プログラムの性能を向上させること。
【解決手段】情報処理装置101は、プログラム110を解析してタスク1,2,3を検出する。情報処理装置101は、検出したタスク1,2,3それぞれを、当該タスク1,2,3の処理内容に応じて、通信タスク121、同期タスク122および演算タスク123のいずれかに分類する。情報処理装置101は、分類した通信タスク121が演算タスク123および同期タスク122よりも優先的に実行され、演算タスク123が同期タスク122よりも優先的に実行されるように、検出したタスク1,2,3それぞれに対して優先度を設定する。情報処理装置101は、設定した優先度に基づいて、検出したタスク1,2,3の実行を制御する。
【選択図】
図1
【特許請求の範囲】
【請求項1】
プログラムを解析してタスクを検出し、
検出した前記タスクそれぞれを、当該タスクの処理内容に応じて、データ共有にかかる通信を行う通信タスク、前記通信タスクにより開始された通信の完了を待つ同期タスク、前記通信タスクおよび前記同期タスクとは異なる演算タスクのいずれかに分類し、
分類した前記通信タスクが前記演算タスクおよび前記同期タスクよりも優先的に実行され、前記演算タスクが前記同期タスクよりも優先的に実行されるように、検出した前記タスクそれぞれに対して優先度を設定し、
設定した前記優先度に基づいて、検出した前記タスクそれぞれの実行を制御する、
処理をコンピュータに実行させることを特徴とする実行制御プログラム。
【請求項2】
前記制御する処理は、
設定した前記優先度と、前記プログラムに記述されたタスク間のデータ依存関係とに基づいて、検出した前記タスクそれぞれの実行を制御する、
ことを特徴とする請求項1に記載の実行制御プログラム。
【請求項3】
前記分類する処理は、
検出した前記タスクの処理内容に、前記通信タスクを実行する際に用いられる第1関数が含まれる場合に、前記タスクを前記通信タスクに分類し、
検出した前記タスクの処理内容に、前記同期タスクを実行する際に用いられる第2関数が含まれる場合に、前記タスクを前記同期タスクに分類し、
検出した前記タスクの処理内容に、前記第1関数および前記第2関数のいずれも含まれない場合に、前記タスクを前記演算タスクに分類する、
ことを特徴とする請求項1に記載の実行制御プログラム。
【請求項4】
前記プログラムは、データ依存付きタスク並列記述のプログラムである、ことを特徴とする請求項1~3のいずれか一つに記載の実行制御プログラム。
【請求項5】
プログラムを解析してタスクを検出し、
検出した前記タスクそれぞれを、当該タスクの処理内容に応じて、データ共有にかかる通信を行う通信タスク、前記通信タスクにより開始された通信の完了を待つ同期タスク、前記通信タスクおよび前記同期タスクとは異なる演算タスクのいずれかに分類し、
分類した前記通信タスクが前記演算タスクおよび前記同期タスクよりも優先的に実行され、前記演算タスクが前記同期タスクよりも優先的に実行されるように、検出した前記タスクそれぞれに対して優先度を設定し、
設定した前記優先度に基づいて、検出した前記タスクそれぞれの実行を制御する、
処理をコンピュータが実行することを特徴とする実行制御方法。
【請求項6】
プログラムを解析してタスクを検出し、
検出した前記タスクそれぞれを、当該タスクの処理内容に応じて、データ共有にかかる通信を行う通信タスク、前記通信タスクにより開始された通信の完了を待つ同期タスク、前記通信タスクおよび前記同期タスクとは異なる演算タスクのいずれかに分類し、
分類した前記通信タスクが前記演算タスクおよび前記同期タスクよりも優先的に実行され、前記演算タスクが前記同期タスクよりも優先的に実行されるように、検出した前記タスクそれぞれに対して優先度を設定し、
設定した前記優先度に基づいて、検出した前記タスクそれぞれの実行を制御する、
制御部を有することを特徴とする情報処理装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、実行制御プログラム、実行制御方法、および情報処理装置に関する。
【背景技術】
【0002】
従来、分散メモリ環境におけるプログラミング手法の一つに、データ依存付きタスク並列がある。データ依存付きタスク並列記述のプログラムでは、プロセス間でデータを共有するために、タスク内で通信を実行する場合がある。また、通信完了を保証するための同期を実行するタスクがスレッドを占有して、デッドロックが発生する可能性がある。
【0003】
先行技術としては、タスクの実行開始からプログラム全体の終了までの時間が長いタスクほど高いプライオリティを与え、演算処理装置に空きが出るたびに現時点で実行可能なタスクのうち最もプライオリティの高いタスクを割り当てた場合の実行状況を求め、タスクのプライオリティを変更するものがある。
【0004】
また、タスク内に含まれる特定の処理を、コプロセッサを利用して実行する場合と、コプロセッサを利用せずに実行する場合とで、処理時間が短くなるのはいずれかの場合かを判断する技術がある。また、GPUタスクが完了しなければならない期限と、実行中のGPUタスクの実行を完了するのに必要な時間と、他のGPUタスクの実行に必要な時間の推定値に基づいて、GPUの動作を制御する技術がある。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開平5-242051号公報
【特許文献2】特開2019-106065号公報
【特許文献3】米国特許出願公開第2018/0365062号明細書
【特許文献4】米国特許出願公開第2018/0373562号明細書
【発明の概要】
【発明が解決しようとする課題】
【0006】
しかしながら、従来技術では、データ依存付きタスク並列記述などのプログラムにおいて、デッドロックを回避するためのコンテキストスイッチが頻発して、プログラムの性能が低下するという問題がある。
【0007】
一つの側面では、本発明は、プログラムにおけるコンテキストスイッチを削減して、プログラムの性能を向上させることを目的とする。
【課題を解決するための手段】
【0008】
1つの実施態様では、プログラムを解析してタスクを検出し、検出した前記タスクそれぞれを、当該タスクの処理内容に応じて、データ共有にかかる通信を行う通信タスク、前記通信タスクにより開始された通信の完了を待つ同期タスク、前記通信タスクおよび前記同期タスクとは異なる演算タスクのいずれかに分類し、分類した前記通信タスクが前記演算タスクおよび前記同期タスクよりも優先的に実行され、前記演算タスクが前記同期タスクよりも優先的に実行されるように、検出した前記タスクそれぞれに対して優先度を設定し、設定した前記優先度に基づいて、検出した前記タスクそれぞれの実行を制御する、実行制御プログラムが提供される。
【発明の効果】
【0009】
本発明の一側面によれば、プログラムにおけるコンテキストスイッチを削減して、プログラムの性能を向上させることができるという効果を奏する。
【図面の簡単な説明】
【0010】
【
図1】
図1は、実施の形態にかかる実行制御方法の一実施例を示す説明図である。
【
図2】
図2は、データ依存付きタスク並列記述のプログラムの一例を示す説明図である。
【
図3】
図3は、ノンブロッキング通信の一例を示す説明図である。
【
図5】
図5は、情報処理装置101のハードウェア構成例を示すブロック図である。
【
図6】
図6は、情報処理装置101の機能的構成例を示すブロック図である。
【
図7】
図7は、対象プログラムの具体例を示す説明図である。
【
図8A】
図8Aは、タスクの分類例を示す説明図(その1)である。
【
図8B】
図8Bは、タスクの分類例を示す説明図(その2)である。
【
図8C】
図8Cは、タスクの分類例を示す説明図(その3)である。
【
図9A】
図9Aは、タスクに対する優先度の設定例を示す説明図(その1)である。
【
図9B】
図9Bは、タスクに対する優先度の設定例を示す説明図(その2)である。
【
図9C】
図9Cは、タスクに対する優先度の設定例を示す説明図(その3)である。
【
図10】
図10は、情報処理装置101の優先度設定処理手順の一例を示すフローチャートである。
【
図11】
図11は、情報処理装置101の実行制御処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【0011】
以下に図面を参照して、本発明にかかる実行制御プログラム、実行制御方法、および情報処理装置の実施の形態を詳細に説明する。
【0012】
(実施の形態)
図1は、実施の形態にかかる実行制御方法の一実施例を示す説明図である。
図1において、情報処理装置101は、プログラム110の実行を制御するコンピュータである。情報処理装置101は、例えば、PC(Personal Computer)である。また、情報処理装置101は、サーバであってもよい。
【0013】
プログラム110は、例えば、データ依存付きタスク並列記述のプログラムである。データ依存付きタスク並列記述は、演算をタスク化し、タスク内で使用するデータのread/writeを陽(明示的)に記述することで、タスクを並列実行するための記述である。タスクは、プログラム(例えば、プログラム110)の実行単位である。
【0014】
例えば、OpenMP(Open Multi-Processing)によるデータ依存付きタスク並列では、タスク間のデータ依存記述(in,out)に基づいて、タスクが並列実行される。OpenMPは、共有メモリ型マシンで並列プログラミングを可能にするAPI(Application Programming Interface)である。
【0015】
例えば、タスク内の入出力処理(in,out)を記述することで、フロー依存、逆フロー依存、出力依存などの依存関係が発生する。フロー依存は、書き込んだデータをその後読み出すものである(out→in)。逆フロー依存は、フロー依存と逆であり、読み込み後に書き込みを行うものである(in→out)。出力依存は、書き込みが行われた後に、別の値が書き込まれるものである(out→out)。
【0016】
タスク間に、フロー依存、逆フロー依存および出力依存のいずれのデータ依存に基づく依存関係があっても並列に実行することはできない。このため、コンパイラのランタイムが、タスク内の入出力処理(in,out)の記述をもとに、タスクをスケジューリングし、各スレッド上で実行する。ランタイムは、プログラムを実行するための部品(機能)である。
【0017】
ここで、
図2を用いて、データ依存付きタスク並列記述のプログラムの一例について説明する。OpenMPでは、プラグマ・ディレクティブ(#pragma)と呼ばれるコンパイラへの指示文を用いてタスクが記述される。
【0018】
図2は、データ依存付きタスク並列記述のプログラムの一例を示す説明図である。
図2において、プログラム200は、データ依存付きタスク並列記述によって実装されたプログラムの一例である。dependは、タスク内の入出力処理(in,out)を記述するための指示節である。
【0019】
プログラム200において、task1は、変数Aに対して書き込みがあるため、out:Aとなる。task2は、変数Bに対して書き込みがあるため、out:Bとなる。task3は、変数A,Bの読み込みがあるため、in:A、Bとなり、変数Cに対して書き込みがあるため、out:Cとなる。プログラム200において、task1とtask2の間に依存関係はないため、並列実行される。一方、task3は、task1,2とフロー依存があるため、task1,2が完了した後に実行される。
【0020】
データ依存付きタスク並列の一つの実行形態としては、例えば、各ノードにプロセスが割り当てられ、プロセス内でコアに対応するスレッドが生成され、スレッド上でタスクが実行されるものがある。プロセス間でデータを共有するために、タスク内で通信が実行される場合がある。
【0021】
プロセス間の通信は、例えば、ノンブロッキング通信により行われる。ノンブロッキング通信では、送受信実行後は完了まで別処理ができないブロッキング通信とは異なり、プログラムの高速化を図るべく、送受信実行後に同期まで別処理を実行可能である。
【0022】
ここで、
図3を用いて、ノンブロッキング通信の一例について説明する。
【0023】
図3は、ノンブロッキング通信の一例を示す説明図である。
図3に示すように、ノンブロッキング通信では、Isend/Irecvが実行された後、Waitが実行されるまでの間に、別処理(例えば、Calc)を実行することができる。Isend/Irecvは、送受信処理を表す。Waitは、通信完了を保証するための同期処理を表す。Calcは、演算処理を表す。なお、Isend/Irecvが実行された後、実際の通信開始は、ランタイムが決定するため破線矢印で示している。
【0024】
一方で、実行スレッド数やデータ依存がない同時実行可能な通信数によっては、同期(通信完了を保証)を実行するタスク(同期タスク)がスレッドを占有して、デッドロックが発生する可能性がある。デッドロックとは、2つ以上の処理単位が互いの処理終了を待ち、結果としてどの処理も先に進めなくなってしまうことである。
【0025】
ここで、
図4Aおよび
図4Bを用いて、ノンブロッキング通信により、タスク内でプロセス間通信をする場合の通信パターン例について説明する。ここでは、既存のランタイムのスケジューリングに従って、プロセス0からプロセス1へのデータ依存がない4回の通信にかかるタスク(Isend0~3/Irecv0~3,Wait0~3)を実行する場合を想定する。
【0026】
図4Aは、第1の通信パターンを示す説明図である。
図4Bは、第2の通信パターンを示す説明図である。
図4Aにおいて、ノンブロッキング通信により、タスク内でプロセス間通信をする場合の第1の通信パターンが示されている。また、
図4Bにおいて、ノンブロッキング通信により、タスク内でプロセス間通信をする場合の第2の通信パターンが示されている。ただし、
図4Aおよび
図4Bでは、一部のタスクのみ表記している。
【0027】
第1の通信パターンでは、各プロセス0,1において、タスクがスレッドに割り当てられた結果、プロセス0,1間で通信ペア(末尾の数字が同じタスク)が揃ったため、デッドロックは発生しない。一方、第2の通信パターンでは、各プロセス0,1において、タスクがスレッドに割り当てられた結果、プロセス0,1間で通信ペアが揃わなかったため、デッドロックが発生する。
【0028】
具体的には、第2の通信パターンでは、通信が完了せず、各同期タスクがスレッドを占有してデッドロックが発生する。例えば、プロセス0では、Isend0,1の通信が完了せず、各同期タスク(Wait0,1)がスレッドを占有する。また、プロセス1では、Irecv2,3の通信が完了せず、各同期タスク(Wait2,3)がスレッドを占有する。これにより、デッドロックが発生する。
【0029】
このように、従来技術では、ランタイムのスケジューリングによっては、第1の通信パターンおよび第2の通信パターンのどちらの通信パターンにもなり得る。
【0030】
ここで、コンテキストスイッチによって、実行中の同期タスクを退避させ、他のタスクを優先実行することでデッドロックを回避することができる。しかしながら、コンテキストスイッチにはオーバーヘッドがあるため、コンテキストスイッチが頻発すると、プログラムの性能が低下するという問題がある。
【0031】
コンテキストスイッチのオーバーヘッドには、例えば、実行中の処理の待避や復元にかかるオーバーヘッドのほか、再度同じタスクが投入されるまでの時間などがある。大量のタスクがキューにある場合、再度同じタスクが投入されるまでの時間が長期化する。
【0032】
そこで、本実施の形態では、プログラム110の高速化を図るべく、同期タスクによるデッドロックを防ぎつつ、コンテキストスイッチを削減する実行制御方法について説明する。ここで、情報処理装置101の処理例について説明する。
【0033】
(1)情報処理装置101は、プログラム110を解析してタスクを検出する。具体的には、例えば、情報処理装置101は、プログラム110を解析して、タスク指示文を特定する。タスク指示文は、タスクを生成するための指示文である。そして、情報処理装置101は、特定したタスク指示文それぞれに対応するタスクをプログラム110から検出する。
【0034】
図1の例では、プログラム110からタスク1,2,3が検出された場合を想定する。
【0035】
(2)情報処理装置101は、検出したタスク1,2,3それぞれを、当該タスク1,2,3の処理内容に応じて、通信タスク121、同期タスク122および演算タスク123のいずれかに分類する。ここで、通信タスク121は、データ共有にかかる通信を行うタスクである。同期タスク122は、通信タスク121により開始された通信の完了を待つタスクである。演算タスク123は、通信タスク121および同期タスク122とは異なる他のタスクである。
【0036】
具体的には、例えば、情報処理装置101は、各タスク1,2,3のステートメントの処理内容から、各タスク1,2,3を通信タスク121、同期タスク122および演算タスク123のいずれかに分類する。ステートメントは、プログラム(例えば、プログラム110)の構成単位となる一つ一つの手続き、命令、宣言などの文であり、例えば、式、関数呼び出しなどを含む。
【0037】
図1の例では、タスク1が演算タスク123に分類され、タスク2が通信タスク121に分類され、タスク3が同期タスク122に分類された場合を想定する。
【0038】
(3)情報処理装置101は、分類した通信タスク121が演算タスク123および同期タスク122よりも優先的に実行され、演算タスク123が同期タスク122よりも優先的に実行されるように、検出したタスク1,2,3それぞれに対して優先度を設定する。優先度は、例えば、プログラム110の実行時に、コンパイラ(ランタイム)において優先的に実行するタスクを判断するためのものである。
【0039】
図1の例では、通信タスク121に分類されたタスク2に優先度「高」が設定され、演算タスク123に分類されたタスク1に優先度「中」が設定され、同期タスク122に分類されたタスク3に優先度「低」が設定された場合を想定する。
【0040】
(4)情報処理装置101は、設定した優先度に基づいて、検出したタスク1,2,3の実行を制御する。具体的には、例えば、コンパイラのランタイムにおいて、各タスク1,2,3に対して設定された優先度に従ってスケジューリングが行われる。この結果、各タスク1,2,3が、優先度が高い順「タスク2⇒タスク1⇒タスク3」に実行される。
【0041】
ただし、タスク間にデータ依存関係が存在する場合、優先度よりも、データ依存関係が優先される。例えば、優先度「高」のタスク2であっても、他のタスクとのデータ依存関係があれば、そのデータ依存関係が満たされるまでは実行されない。
図1の例では、通信タスク121と同期タスク122との間の依存関係以外の依存関係は存在しない場合を想定する。
【0042】
これにより、情報処理装置101によれば、同期タスク(例えば、同期タスク122)によるデッドロックの発生を防ぎつつ、プログラム110におけるコンテキストスイッチを削減して、プログラム110の性能を向上させることができる。
【0043】
図1の例では、タスク1,2,3のうち、通信タスク121(タスク2)が先に実行されることで通信開始が早まり、その後に演算タスク123(タスク1)が実行されることで通信完了までの間に演算が行われる。そして、最後に同期タスク122(タスク3)を実行するときに、通信タスク121(タスク2)の通信が完了していれば、コンテキストスイッチを実行する必要がなくなり、プログラム110の性能が低下するのを防ぐことができる。
【0044】
(情報処理装置101のハードウェア構成例)
つぎに、
図5を用いて、情報処理装置101のハードウェア構成例について説明する。
【0045】
図5は、情報処理装置101のハードウェア構成例を示すブロック図である。
図5において、情報処理装置101は、CPU(Central Processing Unit)501と、メモリ502と、ディスクドライブ503と、ディスク504と、通信I/F(Interface)505と、ディスプレイ506と、入力装置507と、可搬型記録媒体I/F508と、可搬型記録媒体509と、を有する。また、各構成部は、バス500によってそれぞれ接続される。
【0046】
ここで、CPU501は、情報処理装置101の全体の制御を司る。CPU501は、複数のコアを有していてもよい。メモリ502は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)およびフラッシュROMなどを有する。具体的には、例えば、フラッシュROMがOS(Operating System)のプログラムを記憶し、ROMがアプリケーションプログラムを記憶し、RAMがCPU501のワークエリアとして使用される。メモリ502に記憶されるプログラムは、CPU501にロードされることで、コーディングされている処理をCPU501に実行させる。
【0047】
ディスクドライブ503は、CPU501の制御に従ってディスク504に対するデータのリード/ライトを制御する。ディスク504は、ディスクドライブ503の制御で書き込まれたデータを記憶する。ディスク504は、例えば、磁気ディスク、光ディスクなどである。
【0048】
通信I/F505は、通信回線を通じてネットワーク510に接続され、ネットワーク510を介して外部のコンピュータに接続される。そして、通信I/F505は、ネットワーク510と装置内部とのインターフェースを司り、外部のコンピュータからのデータの入出力を制御する。ネットワーク510は、例えば、インターネット、LAN(Local Area Network)、WAN(Wide Area Network)などである。通信I/F505は、例えば、モデムやLANアダプタなどである。
【0049】
ディスプレイ506は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する表示装置である。ディスプレイ506は、例えば、液晶ディスプレイや有機EL(Electroluminescence)ディスプレイなどである。
【0050】
入力装置507は、文字、数字、各種指示などの入力のためのキーを有し、データの入力を行う。入力装置507は、キーボードやマウスなどであってもよく、また、タッチパネル式の入力パッドやテンキーなどであってもよい。
【0051】
可搬型記録媒体I/F508は、CPU501の制御に従って可搬型記録媒体509に対するデータのリード/ライトを制御する。可搬型記録媒体509は、可搬型記録媒体I/F508の制御で書き込まれたデータを記憶する。可搬型記録媒体509は、例えば、CD(Compact Disc)-ROM、DVD(Digital Versatile Disk)、USB(Universal Serial Bus)メモリなどである。
【0052】
なお、情報処理装置101は、上述した構成部のうち、例えば、ディスクドライブ503、ディスク504、可搬型記録媒体I/F508、可搬型記録媒体509を有していなくてもよい。
【0053】
(情報処理装置101の機能的構成例)
つぎに、
図6を用いて、情報処理装置101の機能的構成例について説明する。
【0054】
図6は、情報処理装置101の機能的構成例を示すブロック図である。
図6において、情報処理装置101は、受付部601と、検出部602と、分類部603と、設定部604と、実行制御部605と、を含む。受付部601~実行制御部605は制御部600となる機能であり、具体的には、例えば、
図5に示したメモリ502、ディスク504、可搬型記録媒体509などの記憶装置に記憶されたプログラムをCPU501に実行させることにより、または、通信I/F505により、その機能を実現する。各機能部の処理結果は、例えば、メモリ502、ディスク504などの記憶装置に記憶される。より詳細に説明すると、例えば、受付部601~実行制御部605は、情報処理装置101のコンパイラによって実現される。
【0055】
受付部601は、実行対象となるプログラムを受け付ける。実行対象となるプログラムは、例えば、データ依存付きタスク並列記述のプログラムであり、OpenMPを利用したHPC(High Performance Computing)向けのプログラムである。対象プログラムは、例えば、プロセスに対応する。
【0056】
以下の説明では、実行対象となるプログラムを「対象プログラム」と表記する場合がある。対象プログラムの具体例については、
図7を用いて後述する。
【0057】
具体的には、例えば、受付部601は、
図5に示した入力装置507を用いたユーザの操作入力により、対象プログラムを受け付ける。また、受付部601は、通信I/F505を介して、外部のコンピュータから対象プログラムを受信することにより、対象プログラムを受け付けてもよい。
【0058】
検出部602は、対象プログラムを解析してタスクを検出する。具体的には、例えば、検出部602は、対象プログラムを解析して、対象プログラムからタスク指示文を特定する。タスク指示文は、タスクを生成するための指示文である。例えば、OpenMPの場合、タスク指示文は「#pragma omp task」である。そして、検出部602は、特定したタスク指示文それぞれに対応するタスクを対象プログラムから検出する。
【0059】
【0060】
分類部603は、検出されたタスクそれぞれを、当該タスクの処理内容に応じて、通信タスク、同期タスク、通信タスクおよび同期タスクとは異なる演算タスクのいずれかに分類する。ここで、通信タスクは、データ共有にかかる通信を行うタスクである。データ共有は、例えば、プロセス間のデータ共有である。同期タスクは、通信タスクにより開始された通信の完了を待つタスクである。演算タスクは、通信タスクおよび同期タスクとは異なる他のタスクである。
【0061】
具体的には、例えば、分類部603は、検出された各タスクのステートメントの処理内容から、各タスクを通信タスク、同期タスクおよび演算タスクのいずれかに分類する。ステートメントは、プログラムの構成単位であり、タスクの中で実行される処理に相当する。ここでは、1タスク1ステートメントを想定する。
【0062】
より詳細に説明すると、例えば、分類部603は、検出されたタスクの処理内容(ステートメントの処理内容を表す記述)に、第1関数(第1関数を表す文字列)が含まれる場合に、検出されたタスクを通信タスクに分類してもよい。ここで、第1関数は、通信タスクを実行する際に用いられる関数であり、予め設定される。第1関数を表す文字列(関数名)は、例えば、Isend、Irecvなどである。
【0063】
また、分類部603は、検出されたタスクの処理内容に、第2関数(第2関数を表す文字列)が含まれる場合に、検出されたタスクを同期タスクに分類してもよい。ここで、第2関数は、同期タスクを実行する際に用いられる関数であり、予め設定される。第2関数を表す文字列(関数名)は、例えば、Waitである。また、分類部603は、検出されたタスクの処理内容に、第1関数および第2関数のいずれも含まれない場合に、検出されたタスクを演算タスクに分類してもよい。
【0064】
【0065】
設定部604は、分類された通信タスクが演算タスクおよび同期タスクよりも優先的に実行され、演算タスクが同期タスクよりも優先的に実行されるように、検出されたタスクそれぞれに対して優先度を設定する。例えば、OpenMPの場合、設定部604は、priority節を利用して、検出されたタスクそれぞれに対して優先度を設定する。優先度は、例えば、値が大きいほど優先度が高く、優先的に実行されることを示す。
【0066】
具体的には、例えば、設定部604は、対象プログラム内の通信タスクに分類されたタスクそれぞれに対して、priority節を用いて優先度「10」を設定する。また、設定部604は、対象プログラム内の演算タスクに分類されたタスクそれぞれに対して、priority節を用いて優先度「5」を設定する。また、設定部604は、対象プログラム内の同期タスクに分類されたタスクそれぞれに対して、priority節を用いて優先度「0」を設定する。
【0067】
対象プログラム内のタスクに対する優先度の設定例については、
図9A、
図9Bおよび
図9Cを用いて後述する。
【0068】
実行制御部605は、設定された優先度に基づいて、検出されたタスクそれぞれの実行を制御する。具体的には、例えば、実行制御部605は、優先度「10」が設定されたタスクを、優先度「5,0」が設定されたタスクよりも先に実行する。また、実行制御部605は、優先度「5」が設定されたタスクを、優先度「0」が設定されたタスクよりも先に実行する。
【0069】
ただし、データ依存付きタスク並列記述のプログラムの場合、タスク間にデータ依存関係が存在することがある。この場合、優先度よりも、データ依存関係が優先される。具体的には、例えば、実行制御部605は、設定された優先度と、対象プログラムに記述されたタスク間のデータ依存関係とに基づいて、検出されたタスクそれぞれの実行を制御する。
【0070】
これにより、対象プログラムから検出されたタスクのうち、他のタスクとデータ依存関係があるタスクは、他のタスクとのデータ依存関係が満たされた後、設定された優先度に従って実行される。なお、タスクの実行順序は、例えば、コンパイラのランタイムにより制御される。
【0071】
(対象プログラムの具体例)
つぎに、
図7を用いて、対象プログラムの具体例について説明する。
【0072】
図7は、対象プログラムの具体例を示す説明図である。
図7において、対象プログラム700は、OpenMPによるデータ依存付きタスク並列記述のプログラムである。OpenMPの指示文は、プラグマ(#pragma)によって記述され、「#pragma omp・・・」のような形をとる。
【0073】
例えば、「#pragma omp task」は、タスクを指定する。task0,task1,task2,task3,task4,task5,task6,task7,task8は、タスクを識別する識別子である。対象プログラム700では、4回のIrecvおよびWaitと、1回のfuncが実行され、デッドロックが起きる可能性がある。
【0074】
具体的には、通信タスク(Irecv)と同期タスク(Wait)には、「通信バッファとMPI_Requestの出力依存:out→out」の依存関係がある。通信タスク(Irecv)と同期タスク(Wait)は、req#で対応付けられている(#=0,1,2,3)。例えば、task0のIrecvは、req0でtask5のWaitと対応付けられている。通信タスク(Irecv)と同期タスク(Wait)以外のタスク間には依存関係はない。
【0075】
ここで、タスクの検出例について説明する。
【0076】
検出部602は、対象プログラム700を解析して、対象プログラム700からタスク指示文(#pragma omp task)を特定する。そして、検出部602は、対象プログラム700から、特定したタスク指示文それぞれに対応するタスクを検出する。ここでは、task0~task8が検出される。
【0077】
なお、task4は、forループ(ループの中でタスクが実行される)のため、N*N個生成される。ここでは、検出部602は、task4を一つのタスクとして検出する(優先度を付与する上では、1個のタスクとして検出して問題ないため)。
【0078】
(タスクの分類例)
つぎに、
図8A、
図8Bおよび
図8Cを用いて、タスクの分類例について説明する。
【0079】
図8A、
図8Bおよび
図8Cは、タスクの分類例を示す説明図である。
図8Aにおいて、プログラム810は、対象プログラム700から検出されたtask0~task8のうち、通信タスクに分類されたtask0,task1,task2,task3を示す。各task0,task1,task2,task3の処理内容には、通信タスクを実行する際に用いられる関数を表す文字列「Irecv」が含まれる。このため、task0,task1,task2,task3は、通信タスクに分類される。
【0080】
図8Bにおいて、プログラム820は、対象プログラム700から検出されたtask0~task8のうち、同期タスクに分類されたtask5,task6,task7,task8を示す。各task5,task6,task7,task8の処理内容には、同期タスクを実行する際に用いられる関数を表す文字列「Wait」が含まれる。このため、task5,task6,task7,task8は、同期タスクに分類される。
【0081】
図8Cにおいて、プログラム830は、対象プログラム700から検出されたtask0~task8のうち、演算タスクに分類されたtask4を示す。task4の処理内容には、通信タスクや同期タスクを実行する際に用いられる関数を表す文字列「Irecv,Wait」が含まれない。このため、task4は、演算タスクに分類される。
【0082】
(タスクに対する優先度の設定例)
つぎに、
図9A、
図9Bおよび
図9Cを用いて、対象プログラム内のタスクに対する優先度の設定例について説明する。
【0083】
図9A、
図9Bおよび
図9Cは、タスクに対する優先度の設定例を示す説明図である。ここでは、以下のように優先度(PRIO_COMM,PRIO_CALC,PRIO_SYNC)が定義されているものとする。各優先度は、値が大きいほど優先度が高い(PRIO_COMM>PRIO_CALC>PRIO_SYNC)。
【0084】
#define PRIO_COMM 10
#define PRIO_CALC 5
#define PRIO_SYNC 0
【0085】
図9Aにおいて、プログラム810は、通信タスクに分類されたtask0,task1,task2,task3を示す。設定部604は、通信タスクに分類された各task0,task1,task2,task3に対して、priority節を用いて優先度「10」を設定する。ここでは、各task0,task1,task2,task3に対して、「priority(PRIO_COMM)」が出力される。
【0086】
図9Bにおいて、プログラム820は、同期タスクに分類されたtask5,task6,task7,task8を示す。設定部604は、同期タスクに分類された各task5,task6,task7,task8に対して、priority節を用いて優先度「0」を設定する。ここでは、各task5,task6,task7,task8に対して、「priority(PRIO_SYNC)」が出力される。
【0087】
図9Cにおいて、プログラム830は、演算タスクに分類されたtask4を示す。設定部604は、演算タスクに分類されたtask4に対して、priority節を用いて優先度「5」を設定する。ここでは、task4に対して、「priority(PRIO_CALC)」が出力される。なお、各task0~task8に対する実際の優先度の設定は、例えば、対象プログラム700に対して行われる。
【0088】
ここで、task0~task8に対して優先度を付けない場合、ランタイムのスケジューリングの仕方によっては、通信ペアが揃わないことで、
図4Bに示したようなデッドロックが発生する可能性がある。例えば、
図4Bに示したプロセス1のスレッド0で「task2→task7」、スレッド1で「task3→task8」と実行された場合などに、デッドロックが発生する。また、通信タスク実行後に直ぐに同期タスクが実行される場合があり、通信完了まで同期タスクがスレッドを占有するか、コンテキストスイッチが実行される可能性がある。
【0089】
これに対して、情報処理装置101は、各task0~task8に対して優先度を付けたことで、全ての通信タスク(task0,task1,task2,task3)の終了後に、同期タスク(task5,task6,task7,task8)が実行される。また、「通信タスク>演算タスク>同期タスク」と優先順位を付けたことで、通信中(task0~task3実行後)に演算タスク(task4)が実行され、その後に同期タスク(task5~task8)となる。演算タスク(task4)を実行中に通信が完了すれば、同期タスク(task5~task8)がスレッドを占有することや、コンテキストスイッチが実行されることを防ぐことができる。また、演算タスク(task4)が終了しても通信が完了していない場合であっても、通信タスク(task0~task3)の実行後に直ちに同期タスク(task5~task8)を実行する場合と比べて、演算タスク(task4)が終了している分、対象プログラム700の処理は早く終了する。
【0090】
(情報処理装置101の各種処理手順)
つぎに、情報処理装置101の各種処理手順について説明する。まず、
図10を用いて、情報処理装置101の優先度設定処理手順について説明する。
【0091】
図10は、情報処理装置101の優先度設定処理手順の一例を示すフローチャートである。
図10のフローチャートにおいて、まず、情報処理装置101は、対象プログラムを解析してタスクを検出する(ステップS1001)。つぎに、情報処理装置101は、検出したタスクのうち、選択されていない未選択のタスクを選択する(ステップS1002)。
【0092】
そして、情報処理装置101は、選択したタスクのステートメントの処理内容を参照して、選択したタスクが通信タスクであるか否かを判断する(ステップS1003)。ここで、通信タスクと判断した場合(ステップS1003:Yes)、情報処理装置101は、選択したタスクに対して、通信タスクに応じた優先度を設定して(ステップS1004)、ステップS1008に移行する。通信タスクに応じた優先度は、例えば、優先度「10」である。
【0093】
また、ステップS1003において、選択したタスクが通信タスクではない場合(ステップS1003:No)、情報処理装置101は、選択したタスクのステートメントの処理内容を参照して、選択したタスクが同期タスクであるか否かを判断する(ステップS1005)。
【0094】
ここで、同期タスクと判断した場合(ステップS1005:Yes)、情報処理装置101は、選択したタスクに対して、同期タスクに応じた優先度を設定して(ステップS1006)、ステップS1008に移行する。同期タスクに応じた優先度は、例えば、優先度「0」である。
【0095】
また、ステップS1005において、選択したタスクが同期タスクではない場合(ステップS1005:No)、情報処理装置101は、選択したタスクに対して、演算タスクに応じた優先度を設定する(ステップS1007)。演算タスクに応じた優先度は、例えば、優先度「5」である。
【0096】
つぎに、情報処理装置101は、検出したタスクのうち、選択されていない未選択のタスクがあるか否かを判断する(ステップS1008)。ここで、未選択のタスクがある場合(ステップS1008:Yes)、情報処理装置101は、ステップS1002に戻る。一方、未選択のタスクがない場合(ステップS1008:No)、情報処理装置101は、本フローチャートによる一連の処理を終了する。
【0097】
これにより、情報処理装置101は、対象プログラム内のタスクそれぞれについて、タスクの処理内容に応じて、通信タスク、同期タスクおよび演算タスクのいずれかに分類し、分類した結果に応じて異なる優先度を設定することができる。例えば、情報処理装置101は、3種のタスクがキューに混在する場合に、通信タスクが演算タスクおよび同期タスクよりも優先的に実行され、演算タスクが同期タスクよりも優先的に実行されるように、各タスクに優先度を設定することができる。
【0098】
つぎに、
図11を用いて、情報処理装置101の実行制御処理手順について説明する。ここでは、プロセス内の1スレッドがタスクを生成し、他のスレッドがタスクを実行するモデルを想定する。タスクを生成するスレッドは、タスクを生成し、生成したタスクをキューに挿入する。また、ユーザによって優先度がないタスクが記述される場合があることを想定して、優先度が設定されたタスクと、優先度が設定されていないタスクとを分けるための2種類のキューが設けられるとする。優先度が設定されたタスクは、キューへの挿入時に優先度が高い順にソートされる。情報処理装置101の実行制御処理は、例えば、ランタイムにより実行される。
【0099】
図11は、情報処理装置101の実行制御処理手順の一例を示すフローチャートである。
図11のフローチャートにおいて、まず、情報処理装置101は、優先度付きキューが空であるか否かを判断する(ステップS1101)。ここで、優先度付きキューが空ではない場合(ステップS1101:No)、情報処理装置101は、ステップS1103に移行する。
【0100】
一方、優先度付きキューが空の場合(ステップS1101:Yes)、情報処理装置101は、優先度付きキューではないもう一方のキューが空であるか否かを判断する(ステップS1102)。ここで、キューが空ではない場合(ステップS1102:No)、情報処理装置101は、ステップS1103に移行する。
【0101】
そして、情報処理装置101は、対象キューからタスクを取り出す(ステップS1103)。対象キューが優先度付きキューの場合、優先度が高いタスクから順に取り出される。優先度付きキューではないもう一方のキューの場合、例えば、キューに投入された順にタスクが取り出される。
【0102】
つぎに、情報処理装置101は、取り出したタスクについて、データ依存が満たされているか否かを判断する(ステップS1104)。データ依存が満たされているとは、他のタスクとのデータ依存関係が満たされている、あるいは、他のタスクとのデータ依存関係がないことを表す。
【0103】
ここで、データ依存が満たされている場合(ステップS1104:Yes)、情報処理装置101は、取り出したタスクを実行する(ステップS1105)。そして、情報処理装置101は、対象データ依存を満たした状態に変更して(ステップS1106)、ステップS1101に戻る。
【0104】
なお、対象データ依存を満たした状態に変更するとは、例えば、depend(in:A)のタスクを実行した場合、「変数Aに対する読み込みが完了した」という状態をランタイムが保持することに相当する。この状態によって、ランタイムでデータ依存が満たされたかどうかを判定して、次に実行可能なタスクを判断することができる。
【0105】
また、ステップS1104において、データ依存が満たされていない場合(ステップS1104:No)、情報処理装置101は、取り出したタスクを対象キューに戻して(ステップS1107)、ステップS1101に戻る。また、ステップS1102において、キューが空の場合(ステップS1102:Yes)、情報処理装置101は、本フローチャートによる一連の処理を終了する。
【0106】
これにより、情報処理装置101は、通信タスクが演算タスクおよび同期タスクよりも優先的に実行され、演算タスクが同期タスクよりも優先的に実行されるように、対象プログラム内のタスクの実行を制御することができる。
【0107】
なお、コンテキストスイッチは、例えば、タスクの処理状況に応じて、MPI(Message Passing Interface)通信の関数内で自動で実行される。また、コンテキストスイッチは、ユーザによって対象プログラム内の任意の箇所に指示文により挿入することも可能である(OpenMPの場合)。
【0108】
以上説明したように、実施の形態にかかる情報処理装置101によれば、対象プログラムを解析してタスクを検出し、検出したタスクそれぞれを、当該タスクの処理内容に応じて、通信タスク、同期タスクおよび演算タスクのいずれかに分類することができる。対象プログラムは、例えば、データ依存付きタスク並列記述のプログラムである。そして、情報処理装置101によれば、分類した通信タスクが演算タスクおよび同期タスクよりも優先的に実行され、演算タスクが同期タスクよりも優先的に実行されるように、検出したタスクそれぞれに対して優先度を設定し、設定した優先度に基づいて、検出したタスクそれぞれの実行を制御することができる。
【0109】
これにより、情報処理装置101は、対象プログラムにおける、同期タスクによるデッドロックの発生を防ぎつつコンテキストスイッチを削減して、対象プログラムの性能を向上させることができる。同期タスクは、プロセス間でデータを共有するためにタスク内で実行される通信の完了を保証するための同期を実行するタスクである。例えば、情報処理装置101は、「通信タスク>演算タスク>同期タスク」と優先順位を付けることで、通信タスクの実行後に演算タスクが実行され、その後に同期タスクが実行されやすくすることができる。この結果、情報処理装置101は、演算タスクを実行中に通信が完了すれば、同期タスクがスレッドを占有することやコンテキストスイッチの発生を防ぐことができる。また、全ての演算タスクが終了しても通信が完了していない場合であっても、通信タスクの実行後に直ちに同期タスクを実行する場合と比べて、全ての演算タスクが終了している分、対象プログラムの処理は早く終了する。
【0110】
また、情報処理装置101によれば、設定した優先度と、対象プログラムに記述されたタスク間のデータ依存関係とに基づいて、検出したタスクそれぞれの実行を制御することができる。
【0111】
これにより、情報処理装置101は、タスク間のデータ依存関係を考慮して、データ依存(フロー依存、逆フロー依存、出力依存など)を満たすようにタスクの実行を制御することができる。例えば、対象プログラムから検出されたタスクのうち他のタスクとデータ依存関係があるタスクは、他のタスクとのデータ依存関係が満たされた後、設定した優先度に従って実行される。
【0112】
また、情報処理装置101によれば、検出したタスクの処理内容に、通信タスクを実行する際に用いられる第1関数が含まれる場合に、検出したタスクを通信タスクに分類することができる。また、情報処理装置101によれば、検出したタスクの処理内容に、同期タスクを実行する際に用いられる第2関数が含まれる場合に、検出したタスクを同期タスクに分類することができる。また、情報処理装置101によれば、検出したタスクの処理内容に、第1関数および第2関数のいずれも含まれない場合に、検出したタスクを演算タスクに分類することができる。
【0113】
これにより、情報処理装置101は、Isend,Irecv,Waitなどの予め決められた関数名を手がかりにして、タスクを分類することができる。
【0114】
また、情報処理装置101によれば、対象プログラムを解析して、対象プログラムからタスク指示文を特定し、特定したタスク指示文それぞれに対応するタスクを対象プログラムから検出することができる。
【0115】
これにより、情報処理装置101は、OpenMPの「#pragma omp task」などのタスク指示文を手がかりにして、タスクを検出することができる。
【0116】
また、情報処理装置101によれば、検出したタスクそれぞれに対して、priority節を利用して優先度を設定することができる。
【0117】
これにより、情報処理装置101は、コンパイラのランタイム側で認識可能に各タスクに対して優先度を付与することができる。
【0118】
これらのことから、情報処理装置101によれば、コンパイラにより、データ依存付きタスク並列プログラムのタスク分類と優先度設定を行って、依存関係がない、または、依存関係が満たされた複数のタスクの実行を制御することが可能となる。これにより、情報処理装置101は、デッドロックの発生を防ぎつつコンテキストスイッチを削減して、HPCプログラムなどの性能を向上させることができる。
【0119】
なお、本実施の形態で説明した実行制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本実行制御プログラムは、ハードディスク、フレキシブルディスク、CD-ROM、DVD、USBメモリ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本実行制御プログラムは、インターネット等のネットワークを介して配布してもよい。
【0120】
上述した実施の形態に関し、さらに以下の付記を開示する。
【0121】
(付記1)プログラムを解析してタスクを検出し、
検出した前記タスクそれぞれを、当該タスクの処理内容に応じて、データ共有にかかる通信を行う通信タスク、前記通信タスクにより開始された通信の完了を待つ同期タスク、前記通信タスクおよび前記同期タスクとは異なる演算タスクのいずれかに分類し、
分類した前記通信タスクが前記演算タスクおよび前記同期タスクよりも優先的に実行され、前記演算タスクが前記同期タスクよりも優先的に実行されるように、検出した前記タスクそれぞれに対して優先度を設定し、
設定した前記優先度に基づいて、検出した前記タスクそれぞれの実行を制御する、
処理をコンピュータに実行させることを特徴とする実行制御プログラム。
【0122】
(付記2)前記制御する処理は、
設定した前記優先度と、前記プログラムに記述されたタスク間のデータ依存関係とに基づいて、検出した前記タスクそれぞれの実行を制御する、
ことを特徴とする付記1に記載の実行制御プログラム。
【0123】
(付記3)前記分類する処理は、
検出した前記タスクの処理内容に、前記通信タスクを実行する際に用いられる第1関数が含まれる場合に、前記タスクを前記通信タスクに分類し、
検出した前記タスクの処理内容に、前記同期タスクを実行する際に用いられる第2関数が含まれる場合に、前記タスクを前記同期タスクに分類し、
検出した前記タスクの処理内容に、前記第1関数および前記第2関数のいずれも含まれない場合に、前記タスクを前記演算タスクに分類する、
ことを特徴とする付記1または2に記載の実行制御プログラム。
【0124】
(付記4)前記検出する処理は、
前記プログラムを解析して、前記プログラムからタスク指示文を特定し、
特定した前記タスク指示文それぞれに対応するタスクを前記プログラムから検出する、
ことを特徴とする付記1~3のいずれか一つに記載の実行制御プログラム。
【0125】
(付記5)前記設定する処理は、
検出した前記タスクそれぞれに対して、priority節を利用して優先度を設定する、ことを特徴とする付記1~4のいずれか一つに記載の実行制御プログラム。
【0126】
(付記6)検出した前記タスクのうち他のタスクとデータ依存関係があるタスクは、前記他のタスクとのデータ依存関係が満たされた後、設定した前記優先度に従って実行される、ことを特徴とする付記2に記載の実行制御プログラム。
【0127】
(付記7)前記プログラムは、データ依存付きタスク並列記述のプログラムである、ことを特徴とする付記1~6のいずれか一つに記載の実行制御プログラム。
【0128】
(付記8)プログラムを解析してタスクを検出し、
検出した前記タスクそれぞれを、当該タスクの処理内容に応じて、データ共有にかかる通信を行う通信タスク、前記通信タスクにより開始された通信の完了を待つ同期タスク、前記通信タスクおよび前記同期タスクとは異なる演算タスクのいずれかに分類し、
分類した前記通信タスクが前記演算タスクおよび前記同期タスクよりも優先的に実行され、前記演算タスクが前記同期タスクよりも優先的に実行されるように、検出した前記タスクそれぞれに対して優先度を設定し、
設定した前記優先度に基づいて、検出した前記タスクそれぞれの実行を制御する、
処理をコンピュータが実行することを特徴とする実行制御方法。
【0129】
(付記9)プログラムを解析してタスクを検出し、
検出した前記タスクそれぞれを、当該タスクの処理内容に応じて、データ共有にかかる通信を行う通信タスク、前記通信タスクにより開始された通信の完了を待つ同期タスク、前記通信タスクおよび前記同期タスクとは異なる演算タスクのいずれかに分類し、
分類した前記通信タスクが前記演算タスクおよび前記同期タスクよりも優先的に実行され、前記演算タスクが前記同期タスクよりも優先的に実行されるように、検出した前記タスクそれぞれに対して優先度を設定し、
設定した前記優先度に基づいて、検出した前記タスクそれぞれの実行を制御する、
制御部を有することを特徴とする情報処理装置。
【符号の説明】
【0130】
101 情報処理装置
110,200,810,820,830 プログラム
121 通信タスク
122 同期タスク
123 演算タスク
500 バス
501 CPU
502 メモリ
503 ディスクドライブ
504 ディスク
505 通信I/F
506 ディスプレイ
507 入力装置
508 可搬型記録媒体I/F
509 可搬型記録媒体
510 ネットワーク
600 制御部
601 受付部
602 検出部
603 分類部
604 設定部
605 実行制御部
700 対象プログラム