JP2023084609A - 変換プログラムおよび変換方法 - Google Patents

変換プログラムおよび変換方法 Download PDF

Info

Publication number
JP2023084609A
JP2023084609A JP2021198907A JP2021198907A JP2023084609A JP 2023084609 A JP2023084609 A JP 2023084609A JP 2021198907 A JP2021198907 A JP 2021198907A JP 2021198907 A JP2021198907 A JP 2021198907A JP 2023084609 A JP2023084609 A JP 2023084609A
Authority
JP
Japan
Prior art keywords
node
program
directed graph
dependency
loop processing
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2021198907A
Other languages
English (en)
Inventor
佳祐 津金
Keisuke Tsugane
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2021198907A priority Critical patent/JP2023084609A/ja
Priority to US17/902,446 priority patent/US20230176851A1/en
Publication of JP2023084609A publication Critical patent/JP2023084609A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • G06F8/452Loops
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/456Parallelism detection

Abstract

【課題】プログラムの並列化効率を向上させること。【解決手段】変換装置101は、プログラム110内のステートメント間の依存関係に基づいて、プログラム110内のステートメントをノードとし、ステートメント間の依存関係をエッジとした有向グラフ120を生成する。変換装置101は、有向グラフ120内のエッジが表す依存関係に基づいて、一部のループ処理が先行または後続する他ノードと依存関係にあるノードを有向グラフから検出する。変換装置101は、検出したノードを、一部のループ処理を持つ第1ノードと、一部のループ処理以外のループ処理を持つ第2ノードに分割し、分割した第1ノードと他ノードを融合し、融合後のノードに対してデータアクセスパターンに基づく依存情報を付与することによって、有向グラフ120を更新する。変換装置101は、更新後の有向グラフ120に基づいて、プログラム110を変換する。【選択図】図1A

Description

本発明は、変換プログラムおよび変換方法に関する。
HPC(High Performance Computing)分野において、共有メモリ型プロセッサ向け並列プログラミングは、OpenMP(Open Multi-Processing)によるデータ並列記述が主流である。データ並列では、並列化可能ループを分割して各スレッドに割り当てて並列に実行する。また、ループ実行後に演算完了を保証するため、並列実行に用いたスレッド間で全体同期が行われる。
先行技術としては、プログラムの文および制御の依存関係を表す複数の依存要素で構成されるプログラム解析情報を用いて、可逆的に縮退可能な依存要素群を求め、依存要素群を縮退することで依存要素が縮退されたプログラム依存グラフを生成するものがある。また、ユーザが入力した並列コードの生成方針を受けて、コードの処理を分割するとともに、その演算量と処理内容、再利用データのキャッシュ利用、主記憶アクセスデータ量から、実行サイクルを予測しながら並列化方法を求める技術がある。
国際公開第2007/096935号 特開2009-104422号公報
しかしながら、従来技術では、プログラムの並列化効率が低下する場合がある。例えば、共有メモリ型プロセッサのコア数の増加や演算のばらつきにより全体同期のコストが増加すると、並列化効率が低下してプログラムの性能が低下する。
一つの側面では、本発明は、プログラムの並列化効率を向上させることを目的とする。
1つの実施態様では、プログラム内のステートメント間の依存関係に基づいて、前記プログラム内のステートメントをノードとし、前記依存関係をエッジとした有向グラフを生成し、生成した前記有向グラフ内のエッジが表す依存関係に基づいて、一部のループ処理が先行または後続する他ノードと依存関係にあるノードを前記有向グラフから検出し、検出した前記ノードを、前記一部のループ処理を持つ第1ノードと、前記一部のループ処理以外のループ処理を持つ第2ノードとに分割し、分割した前記第1ノードと前記他ノードとを融合し、融合後のノードに対してデータアクセスパターンに基づく依存情報を付与することによって、前記有向グラフを更新し、更新後の前記有向グラフに基づいて、前記プログラムを変換する、変換プログラムが提供される。
本発明の一側面によれば、プログラムの並列化効率を向上させることができるという効果を奏する。
図1Aは、実施の形態1にかかる変換方法の一実施例を示す説明図である。 図1Bは、スレッド間の全体同期の一例を示す説明図である。 図1Cは、依存付きタスク並列記述のプログラムの一例を示す説明図である。 図2は、実施の形態2にかかる情報処理装置200のハードウェア構成例を示すブロック図である。 図3は、変換対象のプログラムの具体例を示す説明図である。 図4は、実施の形態2にかかる情報処理装置200の機能的構成例を示すブロック図である。 図5Aは、有向グラフGの具体例を示す説明図である。 図5Bは、データアクセス情報の具体例を示す説明図である。 図6は、有向グラフGの更新例を示す説明図(その1)である。 図7は、有向グラフGの更新例を示す説明図(その2)である。 図8は、有向グラフGの更新例を示す説明図(その3)である。 図9は、有向グラフGの更新例を示す説明図(その4)である。 図10は、先行ノードの分割例を示す説明図である。 図11は、後続ノードのタスク粒度の決定例を示す説明図である。 図12は、変換後のプログラムPの具体例を示す説明図である。 図13は、実施の形態2にかかる情報処理装置200の変換処理手順の一例を示すフローチャートである。 図14は、分割・融合処理の具体的処理手順の一例を示すフローチャートである。
以下に図面を参照して、本発明にかかる変換プログラムおよび変換方法の実施の形態を詳細に説明する。
(実施の形態1)
図1Aは、実施の形態1にかかる変換方法の一実施例を示す説明図である。図1において、変換装置101は、データ並列記述のプログラムを、依存付きタスク並列記述のプログラムに変換するコンピュータである。変換装置101は、例えば、PC(Personal Computer)である。また、変換装置101は、サーバであってもよい。
ここで、データ並列記述とは、データ並列により演算を行うための記述である。HPC分野において、共有メモリ型プロセッサ向け並列プログラミングは、OpenMPによるデータ並列記述が用いられることが多い。OpenMPは、共有メモリ型マシンで並列プログラミングを可能にするAPI(Application Programming Interface)である。
OpenMPでは、プラグマ・ディレクティブ(#pragma)と呼ばれるコンパイラへの指示文を用いて記述される。例えば、並列化可能ループに対して指示文を指定することで、ループを分割して各スレッドに割り当て並列に実行することができる。ループ実行後に演算完了を保証するため、並列実行に用いたスレッド間で全体同期が行われる。ただし、複数ループのループ間で依存関係がない場合は、スレッド間で同期をしないことも可能である。
一方で、共有メモリ型プロセッサのコア数は年々増加しており、全体同期のコストは増加する傾向にある。ここで、図1Bを用いて、スレッド間の全体同期について説明する。
図1Bは、スレッド間の全体同期の一例を示す説明図である。図1Bにおいて、各スレッド0~3は、各コアに割り当てられたスレッドである。ここでは、並列化可能ループが分割され、各スレッド0~3に割り当てられて並列化されているとする。
この場合、ループ実行後に演算完了を保証するために、スレッド間で全体同期が行われる。図1Bの例では、全体同期によって,スレッド2(コア)の演算が終わるまで、他のスレッド0,1,3は、他の演算を始めることができない。
このため、プログラムの高速化には、例えば、できる限り全体同期を減らし、より細粒度な同期にしたうえで、空いているスレッド(コア)で次々に演算を開始することが求められる。しかし、ループ間で依存関係があるかどうかの判定や、依存関係が無くなるようなプログラミングがユーザに求められるため、実装コストが増加するという問題がある。
また、依存付きタスク並列記述は、演算をタスク化し、タスク内で使用するデータのread/writeを陽(明示的)に記述することで、全体同期からタスク間の同期として、プログラムを高速化するための記述である。OpenMPによる依存付きタスク並列では、タスク間のデータ依存記述(in,out,inout)に基づいて、タスクが並列実行される。
図1Cは、依存付きタスク並列記述のプログラムの一例を示す説明図である。図1Cにおいて、プログラムXは、依存付きタスク並列記述によって実装されたプログラムの一例である。プログラムXにおいて、task1とtask2の間に依存関係はないため、並列実行される。一方、task3は、task1,2とフロー依存(変数A,Bに対するRead After Write)があるため、全体同期ではなく、タスク間同期後に実行される。
ここで、データ並列は、データを分割してスレッドへマッピングする。これに対して、タスク並列は、タスクを生成し、コンパイラのランタイムによって実行完了したタスクから依存が解消されたかを判断して実行させるため、手順が複雑で多い。このため、データ並列と比較して、タスク並列のオーバーヘッドは大きい。
このように、データ並列記述は、全体同期のコストが大きい。さらに、プログラム全体の依存関係をユーザが把握して、全体同期を減らすようなプログラミングをするのは困難である。また、タスク並列は、データ並列と比較してオーバーヘッドが大きい。
そこで、実施の形態1では、適切な粒度のタスクを設定して並列性を獲得しつつ、タスク生成数を減らして並列化効率を高めるように、データ並列記述で実装されているプログラムを依存付きタスク並列記述へ自動変換する変換方法について説明する。以下、変換装置101の処理例(下記(1)~(4))について説明する。
(1)変換装置101は、プログラム内のステートメント間の依存関係に基づいて、プログラム内のステートメントをノードとし、ステートメント間の依存関係をエッジとした有向グラフを生成する。ここで、プログラムは、変換対象となるプログラムであり、例えば、データ並列記述のプログラムである。
ステートメントは、プログラムの構成単位となる一つ一つの手続き、命令、宣言などの文であり、例えば、式、関数呼び出しなどを含む。式は、例えば、値、変数、演算子、関数などの組み合わせである。ステートメント間の依存関係は、例えば、フロー依存、逆フロー依存、出力依存などのデータ依存に基づく関係である。
フロー依存は、書き込んだデータをその後読み出すものである(Read After Write)。逆フロー依存は、フロー依存と逆であり、読み込み後に書き込みを行うものである(Write After Read)。出力依存は、書き込みが行われた後に、別の値が書き込まれるものである(Write After Write)。ステートメント間に、フロー依存、逆フロー依存および出力依存のいずれのデータ依存に基づく依存関係があっても並列に実行することはできない。
有向グラフは、ノードと、ノード間を接続するエッジとを含むグラフであって、各エッジが向きを持つグラフである。有向グラフには、エッジにより別のノードに接続されていないノードが含まれていてもよい。ノードは、例えば、ステートメントのデータアクセス情報を有する。データアクセス情報は、例えば、ループ処理のアクセス範囲や、アクセスパターンを示す。アクセスパターンは、例えば、アクセス(read/write)先の変数などで表される。
具体的には、例えば、変換装置101は、コンパイラによるプログラム110の依存解析により、プログラム110内のステートメント間の依存関係を解析する。プログラム110は、データ並列記述のプログラムである。そして、変換装置101は、プログラム110の依存解析の結果に基づいて、有向グラフ120を生成する。
有向グラフ120は、プログラム110内のステートメントを表すノード(例えば、ノード120-1~120-4)と、ステートメント間の依存関係を表すエッジ(例えば、エッジ120-11~120-13)とを含む。依存関係は、データ依存(フロー依存、逆フロー依存、出力依存)に基づく関係である。
(2)変換装置101は、生成した有向グラフ内のエッジが表す依存関係に基づいて、一部のループ処理が先行または後続する他ノードと依存関係にあるノードを有向グラフから検出する。例えば、ノード120-1が表すステートメント1には、A[i]に対して、「i=0」から「i=N-1」までの範囲の読み込みと書き込みを行うループ処理があるとする。
また、ノード120-2が表すステートメント2には、A[0]に対するリードのみがあるとする。この場合、ステートメント1とステートメント2には、A[0]のみに依存がある。また、「i=1」から「i=N-1」までの範囲では、ステートメント1とステートメント2に依存がない。
ここでは、有向グラフ120からノード120-1が検出された場合を想定する。ノード120-1は、一部のループ処理(i=0)が先行する他ノード120-2と依存関係にあるノードである。
(3)変換装置101は、検出したノードを、一部のループ処理を持つ第1ノードと、一部のループ処理以外のループ処理を持つ第2ノードとに分割し、分割した第1ノードと他ノードとを融合する。一部のループ処理は、検出したノードが持つループ処理のうち、先行または後続する他ノードと依存関係にあるループ処理である。ノードの融合とは、2つのノードをまとめて1タスクとして扱うことである。
そして、変換装置101は、融合後のノードに対してデータアクセスパターンに基づく依存情報を付与することによって、有向グラフを更新する。依存情報とは、各ノードの処理(タスク)において、どのデータに対してどういうアクセス(read,write)があるかを示す情報である。例えば、依存情報は、#pragma ompの後に付与される「depend(out:A[0])」といった情報を含む。依存情報によれば、別のタスクとの間にどのような依存があるかを判断可能となる。
具体的には、例えば、変換装置101は、ノード120-1を第1ノード120-1aと第2ノード120-1bとに分割する。第1ノード120-1aは、ノード120-1が持つループ処理のうち、先行する他ノード120-2と依存関係にある一部のループ処理を持つノードである。第2ノード120-1bは、ノード120-1が持つループ処理のうち、先行する他ノード120-2と依存関係にある一部のループ処理以外のループ処理を持つノードである。
つぎに、変換装置101は、分割した第1ノード120-1aと他ノード120-2とを融合する。融合後のノード130は、第1ノード120-1aと他ノード120-2とを1タスクとして融合したものである。そして、変換装置101は、融合後のノード130に対してデータアクセスパターンに基づく依存情報を付与することによって、有向グラフ120を更新する。
より詳細に説明すると、例えば、変換装置101は、融合後のノード130に対して、依存情報140を付与する。依存情報140は、融合後のノード130を一つのタスクとして実行する際に、どのデータに対してどういうアクセス(read,write)があるかを示す。
(4)変換装置101は、更新後の有向グラフに基づいて、プログラムを変換する。具体的には、例えば、変換装置101は、更新後の有向グラフ120に基づいて、データ並列記述のプログラム110を、依存付きタスク並列記述のプログラム150に変換する。
ここで、コンパイラの既存の機能として、プログラムを有向グラフ化した情報をもとに、元のプログラムを復元するような、可逆的な変換を行う機能がある。更新後の有向グラフ120に基づく依存付きタスク並列記述のプログラム150への変換は、例えば、このようなコンパイラの既存の機能を利用して行うことができる。
このように、実施の形態1にかかる変換装置101によれば、有向グラフ内のノードのループ処理の一部分にのみ先行または後続する他ノードと依存関係がある場合に、その一部分のみを別ノードに分割して、他ノードと融合することができる。これにより、タスク並列化にあたり、並列性を獲得しつつタスク生成数を抑えることができ、並列化効率を向上させることができる。具体的には、例えば、変換装置101は、ループ長やタスク化対象の処理のデータアクセスパターンをもとにノードの分割、融合を行うことで、並列性を見出してプログラムの性能を向上させることができる。
(実施の形態2)
つぎに、実施の形態2にかかる変換方法について説明する。以下の説明では、図1に示した変換装置101を、情報処理装置200に適用する場合を例に挙げて説明する。なお、実施の形態1で説明した箇所と同様の箇所については説明を省略する。
まず、図2を用いて、実施の形態2にかかる情報処理装置200のハードウェア構成例について説明する。情報処理装置200は、例えば、ユーザが使用するPC、タブレットPCなどである。ただし、情報処理装置200は、ユーザが使用するPCなどからアクセス可能なサーバであってもよい。
図2は、実施の形態2にかかる情報処理装置200のハードウェア構成例を示すブロック図である。図2において、情報処理装置200は、CPU(Central Processing Unit)201と、メモリ202と、ディスクドライブ203と、ディスク204と、通信I/F(Interface)205と、ディスプレイ206と、入力装置207と、可搬型記録媒体I/F208と、可搬型記録媒体209と、を有する。また、各構成部は、バス220によってそれぞれ接続される。
ここで、CPU201は、情報処理装置200の全体の制御を司る。CPU201は、複数のコアを有していてもよい。メモリ202は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)およびフラッシュROMなどを有する。具体的には、例えば、フラッシュROMがOS(Operating System)のプログラムを記憶し、ROMがアプリケーションプログラムを記憶し、RAMがCPU201のワークエリアとして使用される。メモリ202に記憶されるプログラムは、CPU201にロードされることで、コーディングされている処理をCPU201に実行させる。
ディスクドライブ203は、CPU201の制御に従ってディスク204に対するデータのリード/ライトを制御する。ディスク204は、ディスクドライブ203の制御で書き込まれたデータを記憶する。ディスク204としては、例えば、磁気ディスク、光ディスクなどが挙げられる。
通信I/F205は、通信回線を通じてネットワーク210に接続され、ネットワーク210を介して外部のコンピュータに接続される。そして、通信I/F205は、ネットワーク210と装置内部とのインターフェースを司り、外部のコンピュータからのデータの入出力を制御する。通信I/F205には、例えば、モデムやLANアダプタなどを採用することができる。
ディスプレイ206は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する表示装置である。ディスプレイ206としては、例えば、液晶ディスプレイや有機EL(Electroluminescence)ディスプレイなどを採用することができる。
入力装置207は、文字、数字、各種指示などの入力のためのキーを有し、データの入力を行う。入力装置207は、キーボードやマウスなどであってもよく、また、タッチパネル式の入力パッドやテンキーなどであってもよい。
可搬型記録媒体I/F208は、CPU201の制御に従って可搬型記録媒体209に対するデータのリード/ライトを制御する。可搬型記録媒体209は、可搬型記録媒体I/F208の制御で書き込まれたデータを記憶する。可搬型記録媒体209としては、例えば、CD(Compact Disc)-ROM、DVD(Digital Versatile Disk)、USB(Universal Serial Bus)メモリなどが挙げられる。
なお、情報処理装置200は、上述した構成部のうち、例えば、ディスクドライブ203、ディスク204、可搬型記録媒体I/F208、可搬型記録媒体209を有していなくてもよい。また、図1に示した変換装置101についても、情報処理装置200と同様のハードウェア構成により実現することができる。
(変換対象のプログラムの具体例)
つぎに、図3を用いて、変換対象のプログラムの具体例について説明する。
図3は、変換対象のプログラムの具体例を示す説明図である。図3において、プログラム300は、OpenMPによるデータ並列記述で実装されたプログラムである。OpenMPの指示文は、プログラム300内で並列化を行う場所に挿入され、並列化の方法を指定する。
OpenMPの指示文は、プラグマ(#pragma)によって記述され、「#pragma omp・・・」のような形をとる。例えば、「#pragma omp parallel」は、並列に実行される区間(並列リージョン)を指定する。また、「#pragma omp for」は、for文を並列化する。また、「#pragma omp single」は、1スレッドだけが実行するブロックであることを指定する。
stmt0,stmt1,stmt2,stmt3は、ステートメントを識別する識別子である。stmt0は、「A[i]=A[i]+B[i]」に対応する。stmt1は、「func1(A[0])」に対応する。stmt2は、「A[i]=A[i]+C[i]」に対応する。stmt3は、「func2()」に対応する。
(情報処理装置200の機能的構成例)
つぎに、実施の形態2にかかる情報処理装置200の機能的構成例について説明する。
図4は、実施の形態2にかかる情報処理装置200の機能的構成例を示すブロック図である。図4において、情報処理装置200は、受付部401と、生成部402と、検出部403と、更新部404と、変換部405と、出力部406と、を含む。受付部401~出力部406は制御部となる機能であり、具体的には、例えば、図2に示したメモリ202、ディスク204、可搬型記録媒体209などの記憶装置に記憶されたプログラムをCPU201に実行させることにより、または、通信I/F205により、その機能を実現する。各機能部の処理結果は、例えば、メモリ202、ディスク204などの記憶装置に記憶される。
受付部401は、変換対象となるプログラムを受け付ける。変換対象となるプログラムは、データ並列記述のプログラムであり、例えば、HPC向けのプログラムである。以下の説明では、変換対象となるプログラムを「プログラムP」と表記する場合がある。プログラムPは、例えば、図3に示したようなプログラム300である。
具体的には、例えば、受付部401は、図2に示した入力装置207を用いたユーザの操作入力により、プログラム300を受け付ける。また、受付部401は、通信I/F205を介して、外部のコンピュータからプログラム300を受信することにより、プログラム300を受け付けることにしてもよい。
生成部402は、プログラムP内のステートメント間の依存関係に基づいて、プログラムP内のステートメントをノードとし、ステートメント間の依存関係をエッジとした有向グラフGを生成する。ステートメントは、プログラムの構成単位であり、例えば、式、関数呼び出しなどを含む。ステートメント間の依存関係は、例えば、フロー依存、逆フロー依存および出力依存のいずれかのデータ依存に基づく関係である。ノードは、例えば、ステートメントのデータアクセス情報を有する。
以下の説明では、プログラムP内のステートメントをノードとし、ステートメント間の依存関係をエッジとした有向グラフを「有向グラフG」と表記する場合がある。
具体的には、例えば、生成部402は、コンパイラによるプログラムPの依存解析により、プログラムP内のステートメント間の依存関係を解析する。コンパイラは、高級言語で記述されたプログラムを、コンピュータが直接解読して実行できる機械語に変換する翻訳プログラムである。依存関係は、例えば、ステートメント間に、どの変数のどの範囲に依存があるかによって表される。そして、生成部402は、プログラムPの依存解析の結果に基づいて、有向グラフGを生成する。
有向グラフGの具体例については、図5Aおよび図5Bを用いて後述する。以下の説明では、有向グラフG内の複数のノードのうち、任意のノードを「ノードNi」と表記し、ノードNiとは異なる他ノードを「他ノードNj(j≠i)」と表記する場合がある。
検出部403は、生成された有向グラフG内のエッジが表す依存関係に基づいて、一部のループ処理が先行または後続する他ノードNjと依存関係にあるノードNiを有向グラフGから検出する。ループ処理は、繰り返し実行される処理である。
検出対象となるノードNiは、少なくともループ処理を持つノードである。ノードNiに先行する他ノードNjとは、ノードNiとエッジにより接続された、当該エッジの根元側のノードNjである。また、ノードNiに後続する他ノードNjとは、ノードNiとエッジにより接続された、当該エッジの先側のノードである。
具体的には、例えば、検出部403は、どの変数のどの範囲に依存があるかを表すノードNi,Nj間の依存関係に基づいて、ノードNiの一部のループ処理が他ノードNjと依存関係にあるか否かを判断する。ここで、一部のループ処理が他ノードNjと依存関係にある場合、検出部403は、ノードNiを検出する。
有向グラフGからのノードの検出例については、図6を用いて後述する。
更新部404は、検出されたノードNiを第1ノードと第2ノードとに分割し、分割した第1ノードと他ノードNjとを融合し、融合後のノードに対してデータアクセスパターンに基づく依存情報を付与することによって、有向グラフGを更新する。
ここで、第1ノードは、ノードNiのループ処理のうち、他ノードNjと依存関係にある一部のループ処理のみを持つノードである。第2ノードは、ノードNiのループ処理のうち、他ノードNjと依存関係にある一部のループ処理以外のループ処理のみを持つノードである。また、ノードの融合とは、2つのノードをまとめて1タスクとして扱うことであり、タスクの粒度を設定することに相当する。
なお、融合後のノードと他ノードとの間に依存関係が存在する場合は、融合後のノードと他ノードとがエッジによって接続される。また、第2ノードと他ノードとの間に依存関係が存在する場合は、第2ノードと他ノードとがエッジによって接続される。
データアクセスパターンに基づく依存情報とは、各ノードの処理(タスク)において、どのデータに対してどういうアクセス(read,write)があるかを示す情報である。融合後のノードに付与される依存情報は、例えば、融合後のノードのデータアクセス情報から特定される。
依存情報は、例えば、#pragma ompの後に付与される「depend(out:A[0])」といった情報を含む。out:A[0]は、A[0]に対する書き込みを示す。依存情報は、コンパイラのランタイムにおいて、別のタスクとの間にどのような依存があるかを判断可能にするための情報である。
ノードNiの分割例については、図7を用いて後述する。また、ノードNiから分割した第1ノードと他ノードNjとの融合例については、図8および図9を用いて後述する。
また、更新部404は、分割した第2ノードに先行するノードがループ処理を持つか否かを判断する。この際、第2ノードに先行するノードが複数存在する場合、更新部404は、第2ノードに先行するいずれかのノードがループ処理を持つか否かを判断する。
ここで、第2ノードに先行するノードがループ処理を持たない場合、更新部404は、ハードウェア情報に基づいて、第2ノードが持つループ処理を複数のタスクに分割する際のタスク粒度(分割粒度)を決定する。ハードウェア情報は、変換後のプログラムPを実行するハードウェアの情報であり、例えば、タスクが割り当てられるコアのキャッシュラインのサイズを含む。タスク粒度は、例えば、ループ長によって表される。
具体的には、例えば、更新部404は、キャッシュラインのサイズに収まるループ長となるようにタスク粒度を決定する。そして、更新部404は、第2ノードに対して、決定したタスク粒度を設定するとともにデータアクセスパターンに基づく依存情報を付与することによって、有向グラフGを更新する。第2ノードに付与される依存情報は、例えば、第2ノードのデータアクセス情報とタスク粒度から特定される。
これにより、更新部404は、第2ノードが持つループ処理を分割して複数のタスクで並列実行可能とする。この際、更新部404は、タスク生成数を抑えるため、一回で処理できるデータ量に相当するキャッシュラインのサイズを考慮してタスク粒度(分割粒度)を設定する。ただし、第2ノードが持つループ処理の繰返し回数が1回の場合、更新部404は、第2ノードが持つループ処理の分割を行わない(1タスクで実行)。
第2ノードに対するタスク粒度の設定例および依存情報の付与例については、図9を用いて後述する。依存情報には、例えば、設定されたタスク粒度が含まれる。
一方、第2ノードに先行するノードがループ処理を持つ場合、更新部404は、当該先行するノードとデータアクセス範囲が揃うように、第2ノードが持つループ処理を複数のタスクに分割する際のタスク粒度を決定する。データアクセス範囲は、ループ処理を分割した各タスクがどのデータのどの範囲にアクセスするかを示す。具体的には、例えば、更新部404は、第2ノードに先行するノードがループ処理を持ち、かつ、先行するノードと全てのループ処理に依存関係がある場合に、更新部404は、当該先行するノードとデータアクセス範囲が揃うようなループ長を決定する。
そして、更新部404は、第2ノードに対して、決定したタスク粒度を設定するとともにデータアクセスパターンに基づく依存情報を付与することによって、有向グラフGを更新する。これにより、更新部404は、第2ノードが持つループ処理を分割して複数のタスクで並列実行可能とする。この際、更新部404は、ループ処理単位で粒度設定を行うと性能が低下する可能性があるため、先行するノードとデータアクセス範囲が揃うようにタスク粒度を設定する。
先行するノードとデータアクセス範囲が揃うようなタスク粒度の決定例については、図10および図11を用いて後述する。
なお、有向グラフGが更新された場合、検出部403は、例えば、更新後の有向グラフGから、一部のループ処理が先行または後続する他ノードNjと依存関係にあるノードNiを検出する。また、タスク粒度の設定処理は、例えば、有向グラフG(更新後の有向グラフG)内のループ処理を持つ全てのノードについて行われる。また、依存情報の付与処理は、例えば、有向グラフG(更新後の有向グラフG)内の各ノードについて行われる。
変換部405は、更新後の有向グラフGに基づいて、プログラムPを変換する。具体的には、例えば、更新部404は、更新後の有向グラフGに基づいて、データ並列記述のプログラムPを、依存付きタスク並列記述のプログラムPに変換する。
より詳細に説明すると、例えば、変換部405は、コンパイラの既存の機能を用いて、更新後の有向グラフGから、演算をタスク化した依存付きタスク並列記述のプログラムPを生成する。依存付きタスク並列記述のプログラムPでは、更新後の有向グラフG内の各ノードに付与された依存情報に基づいて、タスク内で使用されるデータのread/writeが陽に記述される。
変換後のプログラムPの具体例については、図12を用いて後述する。
出力部406は、変換後のプログラムPを出力する。出力部406の出力形式としては、例えば、メモリ202、ディスク204などの記憶装置への記憶、通信I/F205による他のコンピュータへの送信などがある。これにより、出力部406は、例えば、変換後のプログラムPを、コンパイラのランタイムに渡したり、他のコンピュータ(例えば、実行装置)に送信したりする。
なお、上述した情報処理装置200の機能部(受付部401~出力部406)は、例えば、情報処理装置200のコンパイラによって実現される。
(有向グラフGの具体例)
つぎに、図5Aおよび図5Bを用いて、有向グラフGの具体例について説明する。
図5Aは、有向グラフGの具体例を示す説明図である。図5Bは、データアクセス情報の具体例を示す説明図である。図5Aにおいて、有向グラフ500は、図3に示したプログラム300内のステートメント間の依存関係に基づいて生成される有向グラフGの一例である。依存関係は、データ依存(フロー依存、逆フロー依存、出力依存)に基づく関係である。
有向グラフ500は、ノードN0~N3と、エッジe1~e3とを含む。ノードN0は、プログラム300内のstmt(ステートメント)0を表す。ノードN1は、プログラム300内のstmt1を表す。ノードN2は、プログラム300内のstmt2を表す。ノードN3は、プログラム300内のstmt3を表す。
エッジe1は、stmt0とstmt1との依存関係を表す。具体的には、エッジe1は、stmt0,1間に変数A[0]の依存(逆フロー依存)があることを表す。エッジe2は、stmt0とstmt2との依存関係を表す。具体的には、エッジe2は、stmt0,2間に、変数A[0:N]の依存(出力依存)があることを表す。[0:N]のNは、要素数を示す。[0:N]は、0,1,…,N-1の範囲を示す。エッジe3は、stmt1とstmt2との依存関係を表す。具体的には、エッジe3は、stmt1,2間に変数A[0]の依存(フロー依存)があることを表す。ノードN3には、別のノードは接続されていない。
また、各ノードN0~N3は、例えば、図5Bに示すような、各stmt0~stmt3のデータアクセス情報501~504を有する。データアクセス情報501~504は、各stmt0~stmt3のループ処理のアクセス範囲や、アクセス(read/write)先の変数などを示す。
データアクセス情報501は、ノードN0が有する情報であり、stmt0のループ処理のアクセス範囲「loop:0<=i<N」と、読み込み先の変数「A[i],B[i]」と、書き込み先の変数「A[i]」を示す。また、データアクセス情報502は、ノードN1が有する情報であり、stmt1の読み込み先の変数「A[0]」を示す。
また、データアクセス情報503は、ノードN2が有する情報であり、stmt2のループ処理のアクセス範囲「loop:0<=i<N」と、読み込み先の変数「A[i],C[i]」と、書き込み先の変数「A[i]」を示す。また、データアクセス情報504は、ノードN3が有する情報であり、stmt3にはループ処理がなく、アクセス先の変数もないことを示す。
(有向グラフGの更新例)
つぎに、図6~図9を用いて、有向グラフGの更新例について説明する。まず、図6を用いて、有向グラフGからのノードNiの検出例について説明する。ノードNiは、一部のループ処理が先行または後続する他ノードNjと依存関係にあるノードである。
図6~図9は、有向グラフGの更新例を示す説明図である。検出部403は、例えば、有向グラフ500のルートノード(ノードN0)から後続ノードを順次探索することにより、一部のループ処理が先行または後続する他ノードNjと依存関係にあるノードNiを有向グラフ500から検出する。
図6に示した有向グラフ500の例では、検出部403は、例えば、「ノードN0⇒ノードN1⇒ノードN2⇒ノードN3」の順番で探索することにより、有向グラフ500からノードNiを検出する。ここでは、stmt0(ノードN0)とstmt1(ノードN1)との間には、変数Aの[0]に対する依存がある。
具体的には、stmt0は、iの0~N-1まで、変数Aに対してreadとwriteがあり、変数Bに対してreadがある。stmt1は、変数Aの[0]に対してreadがある。このため、stmt0とstmt1との間には、変数Aの[0]に対する依存がある。この場合、検出部403は、有向グラフ500からノードN0を検出する。ノードN0は、ノードN0が持つループ処理のうち、一部のループ処理(A[0])が後続する他ノードN1と依存関係にある。
以下、ノードNiと他ノードNjとの組み合わせとして、ノードN0(データアクセス情報501)とノードN1(データアクセス情報502)を例に挙げて説明する。
図7において、更新部404は、検出されたノードN0をノードN0a(第2ノード)とノードN0b(第1ノード)とに分割する。ここで、ノードN0aは、ノードN0のループ処理のうち、他ノードN1と依存関係にある一部のループ処理(A[0])以外のループ処理を持つノードである。
ノードN0bは、ノードN0のループ処理のうち、他ノードN1と依存関係にある一部のループ処理(A[0])を持つノードである。ノードN0bは、エッジe1により他ノードN1と接続される。各ノードN0a,N0b,N1は、データアクセス情報701,702,502を有する。
例えば、データアクセス情報701は、ノードN0aが有する情報であり、stmt0aのループ処理のアクセス範囲「loop:1<=i<N」と、読み込み先の変数「A[i],B[i]」と、書き込み先の変数「A[i]」を示す。stmt0aは、ノードN0aが表すステートメントである。
また、データアクセス情報702は、ノードN0bが有する情報であり、stmt0bの読み込み先の変数「A[0],B[0]」と書き込み先の変数「A[0]」を示す。stmt0bは、ノードN0bが表すステートメントである。
図8において、更新部404は、ノードN0bと他ノードN1とを1タスクとして融合することにより、融合後のノード(N0b+N1)を生成する。これにより、更新部404は、別タスクとすると同期が発生してしまうような、依存関係がある処理同士を一つにまとめる。融合後のノード(N0b+N1)は、データアクセス情報801を有する。データアクセス情報801は、ノード(N0b+N1)が有する情報であり、stmt0b+stmt1の読み込み先の変数「A[0],B[0]」と書き込み先の変数「A[0]」を示す。stmt0b+stmt1は、ノード(N0b+N1)が表すステートメントである。
また、更新部404は、融合後のノード(N0b+N1)に対して、図9に示すような依存情報902を付与することによって、有向グラフ500を更新する。依存情報902は、融合後のノード(N0b+N1)のデータアクセスパターンに基づく情報である。融合後のノード(N0b+N1)のデータアクセスパターンは、データアクセス情報801から特定される。
具体的には、依存情報902は、depend(out:A[0])と、depend(in:A[0],B[0])とを含む。depend(out:A[0])は、A[0]に対する書き込みがあることを示す。depend(in:A[0],B[0])は、A[0],B[0]に対する読み込みがあることを示す。なお、図9に示した依存情報902の例では、1タスクとして実行される各stmt0b,stmt1の処理が記述されている。
また、ノードN0から分割したノードN0aは、先行するノードがなく、先行するノードがループ処理を持たない。この場合、更新部404は、ハードウェア情報に基づいて、ノードN0aが持つループ処理を複数のタスクに分割する際のタスク粒度を決定する。具体的には、例えば、更新部404は、キャッシュラインのサイズに収まるループ長となるようにタスク粒度を決定する。
ここでは、ノードN0aが持つループ処理を複数のタスクに分割する際のタスク粒度が「cache」に決定されたとする。この場合、更新部404は、ノードN0aに対して、決定したタスク粒度「cache」を設定するとともに、図9に示すような依存情報901を付与することによって、有向グラフ500を更新する。
依存情報901は、ノードN0aのデータアクセスパターンに基づく情報である。ノードN0aのデータアクセスパターンは、データアクセス情報701から特定される。具体的には、依存情報901は、depend(out:A[ii:cache])と、depend(in:A[ii:cache],B[ii:cache])とを含む。iiは、1~N-1の整数である。
cacheは、キャッシュラインのサイズに応じて決定されたタスク粒度である。このタスク粒度をもとに、ノードN0aが持つループ処理が複数のタスクに分割される。依存情報901の例では、例えば、iiの1から一つのキャッシュラインのサイズ分まで、一つ目のタスクが実行し、iiの1から一つのキャッシュラインのサイズ分ずらしたところから、一つのキャッシュラインのサイズ分まで、二つ目のタスクが実行する。
depend(out:A[ii:cache])は、A[ii:cache]に対する書き込みがあることを示す。depend(in:A[ii:cache],B[ii:cache])は、A[ii:cache],B[ii:cache]に対する読み込みがあることを示す。なお、図9に示した依存情報901の例では、設定されたタスク粒度「cache」や、1タスクごとに実行されるstmt0aのループ処理が記述されている。
これにより、依存付きタスク並列記述に変換するために必要となる情報(例えば、依存情報901,902)が各ノード(例えば、ノードN0a、融合後のノード(N0b+N1))に付与された有向グラフ500を得ることができる。
(先行するノードとデータアクセス範囲が揃うようなタスク粒度の決定例)
つぎに、図10および図11を用いて、先行するノードとデータアクセス範囲が揃うようなタスク粒度の決定例について説明する。
図10は、先行ノードの分割例を示す説明図である。図11は、後続ノードのタスク粒度の決定例を示す説明図である。図10において、プログラム1000は、変換対象となるプログラムPの一例である。この場合、stmt0を表すノード(「ノードN1」とする)と、stmt1を表すノード(「ノードN2」とする)とがエッジによって接続された有向グラフGが生成される。
stmt0を表すノードとstmt1を表すノードとの間には、変数A[0:6]の依存関係がある。すなわち、ノードN2に先行するノードN1がループ処理を持ち、かつ、ノードN1とノードN2との間で全てのループ処理に依存関係がある。ここで、ハードウェア情報をもとに、ノードN1が表すstmt0のループ処理を3タスクに分割する分割粒度が決定されたとする。
データアクセス情報1001は、ノードN1が有する情報であり、stmt0aのループ処理のアクセス範囲「loop:0<=i<2」と、書き込み先の変数「A[i]」を示す。stmt0aは、stmt0を3分割した場合の1つ目のタスクを示す。
また、データアクセス情報1002は、ノードN1が有する情報であり、stmt0bのループ処理のアクセス範囲「loop:2<=i<4」と、書き込み先の変数「A[i]」を示す。stmt0bは、stmt0を3分割した場合の2つ目のタスクを示す。
また、データアクセス情報1003は、ノードN1が有する情報であり、stmt0cのループ処理のアクセス範囲「loop:4<=i<6」と、書き込み先の変数「A[i]」を示す。stmt0cは、stmt0を3分割した場合の3つ目のタスクを示す。
ここで、図11の左側に示すように、ノードN2が表すstmt1のループ処理を2タスクに分割するとする。stmt1aは、stmt1を2分割した場合の1つ目のタスクを示す。stmt1bは、stmt1を2分割した場合の2つ目のタスクを示す。この場合、stmt1aについて、stmt0aとstmt0bとの間に依存関係が生じる。また、stmt1bについて、stmt0bとstmt0cとの間に依存関係が生じる。
一方、図11の右側に示すように、ノードN2が表すstmt1のループ処理を3タスクに分割するとする。stmt1aは、stmt1を3分割した場合の1つ目のタスクを示す。stmt1bは、stmt1を3分割した場合の2つ目のタスクを示す。stmt1cは、stmt1を3分割した場合の3つ目のタスクを示す。
この場合、stmt1aについて、stmt0aのみとの間に依存関係が生じる。また、stmt1bについて、stmt0bのみとの間に依存関係が生じる。また、stmt1cについて、stmt0cのみとの間に依存関係が生じる。このように、stmt1を3タスクに分割する場合、2タスクに分割する場合に比べて依存関係が減る。
換言すれば、stmt1を2タスクに分割する場合、3タスクに分割する場合に比べて依存関係が増えるため、性能が低下する可能性がある。そこで、更新部404は、ノードN2が持つループ処理を複数のタスクに分割する際のタスク粒度を、先行するノードN1と同じタスク粒度に決定する。
これにより、更新部404は、依存関係があるループ処理間のデータアクセス範囲を揃えて高速化を図ることができる。
つぎに、図12を用いて、変換後のプログラムPの具体例について説明する。
図12は、変換後のプログラムPの具体例を示す説明図である。図12において、プログラム1200は、依存付きタスク並列記述のプログラムPの一例であり、更新後の有向グラフ500に基づき変換された変換後のプログラム300である。プログラム1200では、各ステートメントの演算がタスク化され、タスク内で使用されるデータのread/write、例えば、depend(out:A[ii:cache])、depend(in:A[0],B[0],C[0])などが陽に記述されている。
(情報処理装置200の変換処理手順)
つぎに、実施の形態2にかかる情報処理装置200の変換処理手順について説明する。
図13は、実施の形態2にかかる情報処理装置200の変換処理手順の一例を示すフローチャートである。図13のフローチャートにおいて、まず、情報処理装置200は、変換対象となるプログラムPを受け付けたか否かを判断する(ステップS1301)。ここで、情報処理装置200は、変換対象となるプログラムPを受け付けるのを待つ(ステップS1301:No)。
そして、情報処理装置200は、変換対象となるプログラムPを受け付けた場合(ステップS1301:Yes)、プログラムP内のステートメント間の依存関係に基づいて、有向グラフGを生成する(ステップS1302)。有向グラフGは、プログラムP内のステートメントをノードとし、ステートメント間の依存関係をエッジとした情報である。
つぎに、情報処理装置200は、有向グラフGから選択されていない未選択のノードNiを選択する(ステップS1303)。選択元となる有向グラフGは、ステップS1302において生成された有向グラフG、または、ステップS1306において各ノードに依存情報が付与された更新後の有向グラフGである。
この際、情報処理装置200は、例えば、有向グラフGのルートノードを最初に選択し、その後、後続のノードを順次選択していく。後続のノードが複数存在する場合、情報処理装置200は、例えば、複数の後続のノードのうちプログラム上最も近いノードを選択する。また、後続のノードが存在しない場合には、情報処理装置200は、例えば、最上位の未選択のノードを選択する。
つぎに、情報処理装置200は、選択したノードNiがループ処理を持つか否かを判断する(ステップS1304)。ここで、ノードNiがループ処理を持たない場合(ステップS1304:No)、情報処理装置200は、ステップS1306に移行する。一方、ノードNiがループ処理を持つ場合(ステップS1304:Yes)、情報処理装置200は、分割・融合処理を実行する(ステップS1305)。
分割・融合処理は、ノードNiを分割して他ノードNjと融合する処理である。分割・融合処理の具体的な処理手順については、図14を用いて後述する。
そして、情報処理装置200は、各ノードに対してデータアクセスパターンに基づく依存情報を付与することによって、有向グラフGを更新する(ステップS1306)。依存情報の付与対象となるノードは、例えば、ステップS1303において選択されたノードNi、または、後述の図14に示すステップS1403において融合された融合後のノードである。また、依存情報には、例えば、後述の図14に示すステップS1405またはステップS1406において決定されたタスク粒度が設定される。
つぎに、情報処理装置200は、有向グラフGから選択されていない未選択のノードがあるか否かを判断する(ステップS1307)。ここで、未選択のノードがある場合(ステップS1307:Yes)、情報処理装置200は、ステップS1303に戻る。
一方、未選択のノードがない場合(ステップS1307:No)、情報処理装置200は、更新後の有向グラフGに基づいて、プログラムPを変換する(ステップS1308)。そして、情報処理装置200は、変換後のプログラムPを出力して(ステップS1309)、本フローチャートによる一連の処理を終了する。
これにより、情報処理装置200は、データ並列記述のプログラムPを、依存付きタスク並列記述のプログラムPに変換することができる。
つぎに、図14を用いて、ステップS1305の分割・融合処理の具体的な処理手順について説明する。
図14は、分割・融合処理の具体的処理手順の一例を示すフローチャートである。図14のフローチャートにおいて、まず、情報処理装置200は、選択したノードNiに接続されてエッジが表す依存関係に基づいて、ノードNiの一部のループ処理が先行または後続する他ノードNjと依存関係にあるか否かを判断する(ステップS1401)。
ここで、一部のループ処理が先行または後続する他ノードNjと依存関係にない場合(ステップS1401:No)、情報処理装置200は、ステップS1404に移行する。一方、一部のループ処理が先行または後続する他ノードNjと依存関係にある場合(ステップS1401:Yes)、情報処理装置200は、選択したノードNiを第1ノードと第2ノードとに分割する(ステップS1402)。
ここで、第1ノードは、ノードNiのループ処理のうち、他ノードNjと依存関係にある一部のループ処理のみを持つノードである。第2ノードは、ノードNiのループ処理のうち、他ノードNjと依存関係にある一部のループ処理以外のループ処理のみを持つノードである。
そして、情報処理装置200は、分割した第1ノードと他ノードNjとを融合する(ステップS1403)。つぎに、情報処理装置200は、選択したノードNi、または、分割した第2ノードに先行するノードがループ処理を持つか否かを判断する(ステップS1404)。
ここで、先行するノードがループ処理を持たない場合(ステップS1404:No)、情報処理装置200は、ハードウェア情報に基づいて、ノードNiまたは第2ノードが持つループ処理を複数のタスクに分割する際のタスク粒度を決定して(ステップS1405)、分割・融合処理を呼び出したステップに戻る。
一方、先行するノードがループ処理を持つ場合(ステップS1404:Yes)、情報処理装置200は、先行するノードとデータアクセス範囲が揃うように、ノードNiまたは第2ノードが持つループ処理を複数のタスクに分割する際のタスク粒度を決定して(ステップS1406)、分割・融合処理を呼び出したステップに戻る。
これにより、情報処理装置200は、ノードNiのループ処理の一部分にのみ先行または後続する他ノードNjと依存関係がある場合、該当箇所のみを別ノードに分割して、他ノードNjと融合することで、タスク生成数を抑えることができる。また、情報処理装置200は、ハードウェア情報や先行するノードのデータアクセス範囲をもとに、ループ処理を複数のタスクに分割する際の適切なタスク粒度を決定することができる。
以上説明したように、実施の形態2にかかる情報処理装置200によれば、データ並列記述のプログラムP内のステートメント間の依存関係に基づいて、プログラムP内のステートメントをノードとし、ステートメント間の依存関係をエッジとした有向グラフGを生成することができる。また、情報処理装置200によれば、生成した有向グラフG内のエッジが表す依存関係に基づいて、一部のループ処理が先行または後続する他ノードNjと依存関係にあるノードNiを有向グラフGから検出することができる。また、情報処理装置200によれば、検出したノードNiを、一部のループ処理を持つ第1ノードと、一部のループ処理以外のループ処理を持つ第2ノードとに分割し、分割した第1ノードと他ノードとを融合し、融合後のノードに対してデータアクセスパターンに基づく依存情報を付与することによって、有向グラフGを更新することができる。そして、情報処理装置200によれば、更新後の有向グラフGに基づいて、データ並列記述のプログラムPを、依存付きタスク並列記述のプログラムPに変換することができる。
これにより、情報処理装置200は、ノードNiのループ処理の一部分にのみ先行または後続する他ノードNjと依存関係がある場合に、その一部分のみを別ノードに分割して、他ノードNjと融合することができる。このため、タスク並列化にあたり、並列性を獲得しつつタスク生成数を抑えることができ、並列化効率を向上させることができる。
また、情報処理装置200によれば、第2ノードに先行するノードがループ処理を持たない場合、ハードウェア情報に基づいて、第2ノードが持つループ処理を複数のタスクに分割する際のタスク粒度を決定することができる。そして、情報処理装置200によれば、第2ノードに対して、決定したタスク粒度を設定するとともにデータアクセスパターンに基づく依存情報を付与することによって、有向グラフGを更新することができる。
これにより、情報処理装置200は、ハードウェア情報をもとに、ループ処理(複数の処理)を適切な粒度のタスクに分割して並列化効率を向上させることができる。例えば、情報処理装置200は、ハードウェア情報に含まれるキャッシュラインのサイズに基づいて、第2ノードが持つループ処理を複数のタスクに分割する際のタスク粒度を決定することができる。この場合、一回で処理できるデータ量に相当するキャッシュラインのサイズを考慮してタスク粒度を設定することができ、キャッシュメモリの利用効率を高めつつ、タスク生成数を抑えることができる。
また、情報処理装置200によれば、第2ノードに先行するノードがループ処理を持つ場合、当該先行するノードとデータアクセス範囲が揃うように、第2ノードが持つループ処理を複数のタスクに分割する際のタスク粒度を決定することができる。具体的には、例えば、情報処理装置200は、第2ノードに先行するノードがループ処理を持ち、かつ、先行するノードと全てのループ処理に依存関係がある場合に、当該先行するノードとデータアクセス範囲が揃うようにタスク粒度を決定する。そして、情報処理装置200によれば、第2ノードに対して、決定したタスク粒度を設定するとともにデータアクセスパターンに基づく依存情報を付与することによって、有向グラフGを更新することができる。
これにより、情報処理装置200は、依存関係があるループ処理間のデータアクセス範囲を揃えて、タスク間の依存関係が増えるのを防ぎ、高速化を図ることができる。
また、情報処理装置200によれば、プログラムP内のステートメント間のフロー依存、逆フロー依存および出力依存のいずれかのデータ依存に基づく依存関係に基づいて、有向グラフGを生成することができる。
これにより、情報処理装置200は、データ依存をもとにした有向グラフGを生成することができる。
また、情報処理装置200によれば、変換後のプログラムP(依存付きタスク並列記述のプログラムP)を出力することができる。
これにより、情報処理装置200は、変換後のプログラムPを、コンパイラのランタイムに渡したり、他のコンピュータ(例えば、実行装置)に送信したりすることができる。
これらのことから、実施の形態2にかかる情報処理装置200によれば、適切な粒度のタスクを設定して並列性を獲得しつつ、タスク生成数を減らしてオーバーヘッドを抑えることができ、ひいては、HPCプログラムの性能を向上させることができる。
なお、本実施の形態で説明した変換方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本変換プログラムは、ハードディスク、フレキシブルディスク、CD-ROM、DVD、USBメモリ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本変換プログラムは、インターネット等のネットワークを介して配布してもよい。
また、本実施の形態で説明した変換装置101(情報処理装置200)は、スタンダードセルやストラクチャードASIC(Application Specific Integrated Circuit)などの特定用途向けICやFPGAなどのPLD(Programmable Logic Device)によっても実現することができる。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)プログラム内のステートメント間の依存関係に基づいて、前記プログラム内のステートメントをノードとし、前記依存関係をエッジとした有向グラフを生成し、
生成した前記有向グラフ内のエッジが表す依存関係に基づいて、一部のループ処理が先行または後続する他ノードと依存関係にあるノードを前記有向グラフから検出し、
検出した前記ノードを、前記一部のループ処理を持つ第1ノードと、前記一部のループ処理以外のループ処理を持つ第2ノードとに分割し、分割した前記第1ノードと前記他ノードとを融合し、融合後のノードに対してデータアクセスパターンに基づく依存情報を付与することによって、前記有向グラフを更新し、
更新後の前記有向グラフに基づいて、前記プログラムを変換する、
処理をコンピュータに実行させることを特徴とする変換プログラム。
(付記2)前記更新する処理は、
前記第2ノードに先行するノードがループ処理を持たない場合、ハードウェア情報に基づいて、前記第2ノードが持つループ処理を複数のタスクに分割する際のタスク粒度を決定し、前記第2ノードに対して、決定した前記タスク粒度を設定するとともにデータアクセスパターンに基づく依存情報を付与することによって、前記有向グラフを更新する、ことを特徴とする付記1に記載の変換プログラム。
(付記3)前記更新する処理は、
前記第2ノードに先行するノードがループ処理を持つ場合、当該先行するノードとデータアクセス範囲が揃うように、前記第2ノードが持つループ処理を複数のタスクに分割する際のタスク粒度を決定し、前記第2ノードに対して、決定した前記タスク粒度を設定するとともにデータアクセスパターンに基づく依存情報を付与することによって、前記有向グラフを更新する、ことを特徴とする付記1または2に記載の変換プログラム。
(付記4)前記プログラムは、データ並列記述のプログラムであり、
前記変換する処理は、
更新後の前記有向グラフに基づいて、前記データ並列記述のプログラムを、依存付きタスク並列記述のプログラムに変換する、
ことを特徴とする付記1~3のいずれか一つに記載の変換プログラム。
(付記5)前記依存関係は、フロー依存、逆フロー依存および出力依存のいずれかのデータ依存に基づく関係である、ことを特徴とする付記1~4のいずれか一つに記載の変換プログラム。
(付記6)変換後の前記プログラムを出力する、処理を前記コンピュータに実行させることを特徴とする付記1~5のいずれか一つに記載の変換プログラム。
(付記7)前記ハードウェア情報は、キャッシュラインのサイズを含む、ことを特徴とする付記2に記載の変換プログラム。
(付記8)プログラム内のステートメント間の依存関係に基づいて、前記プログラム内のステートメントをノードとし、前記依存関係をエッジとした有向グラフを生成し、
生成した前記有向グラフ内のエッジが表す依存関係に基づいて、一部のループ処理が先行または後続する他ノードと依存関係にあるノードを前記有向グラフから検出し、
検出した前記ノードを、前記一部のループ処理を持つ第1ノードと、前記一部のループ処理以外のループ処理を持つ第2ノードとに分割し、分割した前記第1ノードと前記他ノードとを融合し、融合後のノードに対してデータアクセスパターンに基づく依存情報を付与することによって、前記有向グラフを更新し、
更新後の前記有向グラフに基づいて、前記プログラムを変換する、
処理をコンピュータが実行することを特徴とする変換方法。
101 変換装置
110,150,300,1200 プログラム
120,500 有向グラフ
130 ノード
140,901,902 依存情報
200 情報処理装置
201 CPU
202 メモリ
203 ディスクドライブ
204 ディスク
205 通信I/F
206 ディスプレイ
207 入力装置
208 可搬型記録媒体I/F
209 可搬型記録媒体
210 ネットワーク
220 バス
401 受付部
402 生成部
403 検出部
404 更新部
405 変換部
406 出力部
501,502,503,504,701,702,801,1001,1002,1003 データアクセス情報

Claims (6)

  1. プログラム内のステートメント間の依存関係に基づいて、前記プログラム内のステートメントをノードとし、前記依存関係をエッジとした有向グラフを生成し、
    生成した前記有向グラフ内のエッジが表す依存関係に基づいて、一部のループ処理が先行または後続する他ノードと依存関係にあるノードを前記有向グラフから検出し、
    検出した前記ノードを、前記一部のループ処理を持つ第1ノードと、前記一部のループ処理以外のループ処理を持つ第2ノードとに分割し、分割した前記第1ノードと前記他ノードとを融合し、融合後のノードに対してデータアクセスパターンに基づく依存情報を付与することによって、前記有向グラフを更新し、
    更新後の前記有向グラフに基づいて、前記プログラムを変換する、
    処理をコンピュータに実行させることを特徴とする変換プログラム。
  2. 前記更新する処理は、
    前記第2ノードに先行するノードがループ処理を持たない場合、ハードウェア情報に基づいて、前記第2ノードが持つループ処理を複数のタスクに分割する際のタスク粒度を決定し、前記第2ノードに対して、決定した前記タスク粒度を設定するとともにデータアクセスパターンに基づく依存情報を付与することによって、前記有向グラフを更新する、ことを特徴とする請求項1に記載の変換プログラム。
  3. 前記更新する処理は、
    前記第2ノードに先行するノードがループ処理を持つ場合、当該先行するノードとデータアクセス範囲が揃うように、前記第2ノードが持つループ処理を複数のタスクに分割する際のタスク粒度を決定し、前記第2ノードに対して、決定した前記タスク粒度を設定するとともにデータアクセスパターンに基づく依存情報を付与することによって、前記有向グラフを更新する、ことを特徴とする請求項1または2に記載の変換プログラム。
  4. 前記プログラムは、データ並列記述のプログラムであり、
    前記変換する処理は、
    更新後の前記有向グラフに基づいて、前記データ並列記述のプログラムを、依存付きタスク並列記述のプログラムに変換する、
    ことを特徴とする請求項1~3のいずれか一つに記載の変換プログラム。
  5. 前記依存関係は、フロー依存、逆フロー依存および出力依存のいずれかのデータ依存に基づく関係である、ことを特徴とする請求項1~4のいずれか一つに記載の変換プログラム。
  6. プログラム内のステートメント間の依存関係に基づいて、前記プログラム内のステートメントをノードとし、前記依存関係をエッジとした有向グラフを生成し、
    生成した前記有向グラフ内のエッジが表す依存関係に基づいて、一部のループ処理が先行または後続する他ノードと依存関係にあるノードを前記有向グラフから検出し、
    検出した前記ノードを、前記一部のループ処理を持つ第1ノードと、前記一部のループ処理以外のループ処理を持つ第2ノードとに分割し、分割した前記第1ノードと前記他ノードとを融合し、融合後のノードに対してデータアクセスパターンに基づく依存情報を付与することによって、前記有向グラフを更新し、
    更新後の前記有向グラフに基づいて、前記プログラムを変換する、
    処理をコンピュータが実行することを特徴とする変換方法。
JP2021198907A 2021-12-07 2021-12-07 変換プログラムおよび変換方法 Pending JP2023084609A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2021198907A JP2023084609A (ja) 2021-12-07 2021-12-07 変換プログラムおよび変換方法
US17/902,446 US20230176851A1 (en) 2021-12-07 2022-09-02 Computer-readable recording medium storing conversion program and conversion method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2021198907A JP2023084609A (ja) 2021-12-07 2021-12-07 変換プログラムおよび変換方法

Publications (1)

Publication Number Publication Date
JP2023084609A true JP2023084609A (ja) 2023-06-19

Family

ID=86607407

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2021198907A Pending JP2023084609A (ja) 2021-12-07 2021-12-07 変換プログラムおよび変換方法

Country Status (2)

Country Link
US (1) US20230176851A1 (ja)
JP (1) JP2023084609A (ja)

Family Cites Families (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP5045666B2 (ja) * 2006-02-20 2012-10-10 富士通株式会社 プログラム解析方法、プログラム解析装置およびプログラム解析プログラム
US8136104B2 (en) * 2006-06-20 2012-03-13 Google Inc. Systems and methods for determining compute kernels for an application in a parallel-processing computer system
US7814486B2 (en) * 2006-06-20 2010-10-12 Google Inc. Multi-thread runtime system
US8136102B2 (en) * 2006-06-20 2012-03-13 Google Inc. Systems and methods for compiling an application for a parallel-processing computer system
JP4339907B2 (ja) * 2007-10-24 2009-10-07 株式会社日立製作所 マルチプロセッサ向け最適コード生成方法及びコンパイル装置
JP5178852B2 (ja) * 2011-01-12 2013-04-10 株式会社東芝 情報処理装置およびプログラム
US20130318540A1 (en) * 2011-02-01 2013-11-28 Nec Corporation Data flow graph processing device, data flow graph processing method, and data flow graph processing program
RU2012127578A (ru) * 2012-07-02 2014-01-10 ЭлЭсАй Корпорейшн Анализатор применимости программного модуля для разработки и тестирования программного обеспечения для многопроцессорных сред
US9182957B2 (en) * 2012-07-10 2015-11-10 Loring Craymer Method and system for automated improvement of parallelism in program compilation
JP6427054B2 (ja) * 2015-03-31 2018-11-21 株式会社デンソー 並列化コンパイル方法、及び並列化コンパイラ
JP7225859B2 (ja) * 2019-02-04 2023-02-21 富士通株式会社 情報処理装置、情報処理プログラム、及び情報処理方法

Also Published As

Publication number Publication date
US20230176851A1 (en) 2023-06-08

Similar Documents

Publication Publication Date Title
US10871950B2 (en) Persistent annotation of syntax graphs for code optimization
JP5893038B2 (ja) ユーザ定義型のコンパイル時境界検査
US9152389B2 (en) Trace generating unit, system, and program of the same
JP2009129179A (ja) プログラム並列化支援装置およびプログラム並列化支援方法
US11068247B2 (en) Vectorizing conditional min-max sequence reduction loops
JP5478526B2 (ja) データ分析及び機械学習処理装置及び方法及びプログラム
US20210208954A1 (en) Lock-free reading of unitary value sets
JP5178852B2 (ja) 情報処理装置およびプログラム
US8478953B2 (en) Buffer snapshots from unmodifiable data piece tables
JP2019523942A (ja) Cpu利用およびコードリファクタリングのためのクエリオプティマイザー
Khatchadourian et al. [Engineering Paper] A Tool for Optimizing Java 8 Stream Software via Automated Refactoring
JP2023507709A (ja) 統合された参照及び二次のマーキング
JP6201788B2 (ja) ループ分割検出プログラム及びループ分割検出方法
US11226798B2 (en) Information processing device and information processing method
JP2023084609A (ja) 変換プログラムおよび変換方法
Vandierendonck et al. Deterministic scale-free pipeline parallelism with hyperqueues
US11714613B2 (en) Surfacing underutilized tool features
Qi et al. Smart contract parallel execution with fine-grained state accesses
Protze et al. Thread-local concurrency: a technique to handle data race detection at programming model abstraction
Jayalath et al. Efficient Geo-distributed data processing with rout
Yuan et al. Automatic enhanced CDFG generation based on runtime instrumentation
US8510342B1 (en) Automatic conversion of build processes to use streaming input
Scherer Hands-on JavaScript High Performance: Build Faster Web Apps Using Node. js, Svelte. js, and WebAssembly
US20240160442A1 (en) Working context transfer across development environments
US11972237B1 (en) Member invocation declarative interception