JP6500626B2 - 計算機、コンパイラプログラム、リンクプログラムおよびコンパイル方法 - Google Patents

計算機、コンパイラプログラム、リンクプログラムおよびコンパイル方法 Download PDF

Info

Publication number
JP6500626B2
JP6500626B2 JP2015121358A JP2015121358A JP6500626B2 JP 6500626 B2 JP6500626 B2 JP 6500626B2 JP 2015121358 A JP2015121358 A JP 2015121358A JP 2015121358 A JP2015121358 A JP 2015121358A JP 6500626 B2 JP6500626 B2 JP 6500626B2
Authority
JP
Japan
Prior art keywords
task
function
information
source program
cycles
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.)
Active
Application number
JP2015121358A
Other languages
English (en)
Other versions
JP2017010077A (ja
Inventor
邦憲 石井
邦憲 石井
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 JP2015121358A priority Critical patent/JP6500626B2/ja
Priority to US15/165,419 priority patent/US10089088B2/en
Publication of JP2017010077A publication Critical patent/JP2017010077A/ja
Application granted granted Critical
Publication of JP6500626B2 publication Critical patent/JP6500626B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

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/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • G06F8/452Loops

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Description

本発明は計算機、コンパイラプログラム、リンクプログラムおよびコンパイル方法に関する。
コンピュータソフトウェアを開発する場合、開発者はプログラミング言語としてC言語などの高級言語を使用することが多い。高級言語で記述されたソースコードは、コンパイラによりプロセッサが実行可能なオブジェクトコードに変換できる。また、リンカによって、オブジェクトコードを含むオブジェクトファイルと当該オブジェクトコードから参照される他のオブジェクトファイルやライブラリとを結合し、実行ファイルを生成できる。
ところで、プログラムに記述された幾つかの処理を並列に実行することで、処理を高速化することがある。例えば、実行分のループの制御構造とデータの依存関係に基づいて、並列実行可能と判定されるループ内の条件式を認識し、並列実行用タスクを生成する前に条件式が成立する条件を求め、当該ループをその実行条件化で並列実行するループに変形する提案がある。また、各並列処理タスクの単位時間当たりの処理データ量と単位時間当たりの入力データ量とを基に、各並列処理タスクの実行終了時間が均等になるようにプロセッサ数を各並列処理タスクに割り当てる提案もある。
更に、タスク全体の高速化を実現するために、タスクの実行順番や開始時間を制御するスケジューリングコードをオブジェクトコードに挿入する提案もある。
特開平6−250988号公報 特開平6−187309号公報 国際公開第2008/072334号
複数のタスクを並列に実行する場合、各タスクの実行に要するクロックサイクル数(単にサイクル数ということがある)を把握することが考えられる。例えば、サイクル数に応じて各タスクに対する処理能力(例えば、スレッド数)の割り当てを行い得る。ところが、タスクやタスクから呼び出される関数の定義が別個のソースファイルに記述されていることがある。この場合、コンパイルはソースファイル毎に行われるため、関数のサイクル数も含めた各タスクのサイクル数をコンパイラで判断することが難しい。
1つの側面では、本発明は、各タスクのサイクル数を適切に取得できる計算機、コンパイラプログラム、リンクプログラムおよびコンパイル方法を提供することを目的とする。
1つの態様では、コンパイルを行う計算機が提供される。この計算機は、記憶部と演算部とを有する。記憶部は、複数のタスクの定義を含む第1のソースプログラムと何れかのタスクで呼び出される複数の関数の定義を含む第2のソースプログラムとを記憶する。演算部は、第1および第2のソースプログラムのコンパイルの際に、第1のソースプログラムにおけるタスクの定義に応じた命令の実行に要する第1のサイクル数を示す情報と当該タスクで呼び出される関数を示す呼び出し関係情報とをタスク毎に生成し、第2のソースプログラムに含まれる関数の実行に要する第2のサイクル数を示す情報を関数毎に生成し、リンク処理の際に、呼び出し関係情報に基づくタスクで呼び出される関数の特定、および、タスクに対応する第1のサイクル数と特定した当該関数に対応する第2のサイクル数とに基づくタスクの実行に要するサイクル数算出を、タスク毎に実行する。
また、1つの態様では、コンパイラプログラムが提供される。このコンパイラプログラムは、コンピュータに、複数のタスクの定義を含む第1のソースプログラムのコンパイルの際に、第1のソースプログラムにおけるタスクの定義に応じた命令の実行に要する第1のサイクル数を示す情報と当該タスクで呼び出される関数を示す呼び出し関係情報とをタスク毎に出力し、何れかのタスクで呼び出される複数の関数の定義を含む第2のソースプログラムのコンパイルの際に、第2のソースプログラムに含まれる関数の実行に要する第2のサイクル数を示す情報を関数毎に出力する、処理を実行させる。
また、1つの態様では、リンクプログラムが提供される。このリンクプログラムは、コンピュータに、複数のタスクの定義を含む第1のソースプログラムのコンパイルの際に生成された、第1のソースプログラムにおけるタスクの定義に応じた命令の実行に要する第1のサイクル数を示す情報と当該タスクで呼び出される関数を示す呼び出し関係情報とをタスク毎に取得し、何れかのタスクで呼び出される複数の関数の定義を含む第2のソースプログラムのコンパイルの際に生成された、第2のソースプログラムに含まれる関数の実行に要する第2のサイクル数を示す情報を関数毎に取得し、呼び出し関係情報に基づくタスクで呼び出される関数の特定、および、タスクに対応する第1のサイクル数と特定した当該関数に対応する第2のサイクル数とに基づタスクの実行に要するサイクル数算出をタスク毎に実行する、処理を実行させる。
また、1つの態様では、コンパイル方法が提供される。このコンパイル方法では、コンピュータが、複数のタスクの定義を含む第1のソースプログラムのコンパイルの際に、第1のソースプログラムにおけるタスクの定義に応じた命令の実行に要する第1のサイクル数を示す情報と当該タスクで呼び出される関数を示す呼び出し関係情報とをタスク毎に生成し、何れかのタスクで呼び出される複数の関数の定義を含む第2のソースプログラムのコンパイルの際に、第2のソースプログラムに含まれる関数の実行に要する第2のサイクル数を示す情報を関数毎に生成し、リンク処理の際に、呼び出し関係情報に基づくタスクで呼び出される関数の特定、および、タスクに対応する第1のサイクル数と特定した当該関数に対応する第2のサイクル数とに基づくタスクの実行に要するサイクル数算出をタスク毎に実行する。
1つの側面では、各タスクのサイクル数を適切に取得できる。
第1の実施の形態の計算機を示す図である。 第1のソースプログラムの例を示す図である。 第2のソースプログラムの例を示す図である。 第2の実施の形態の情報処理装置のハードウェア例を示す図である。 情報処理装置のソフトウェア例を示す図である。 ファイルの例を示す図である。 ソースプログラムの例(その1)を示す図である。 ソースプログラムの例(その2)を示す図である。 関数に対する命令列の例を示す図である。 サイクル数テーブルの例を示す図である。 タスク範囲情報の例を示す図である。 関数コスト情報の例を示す図である。 関数呼び出し情報の例を示す図である。 オブジェクトファイルの例(その1)を示す図である。 オブジェクトファイルの例(その2)を示す図である。 タスクおよび関数の呼び出し関係の例を示す図である。 タスクコストテーブルの例を示す図である。 スレッド数の決定例を示す図である。 スレッド数の設定例を示す図である。 コンパイル処理の例を示すフローチャートである。 リンク処理の例を示すフローチャートである。 スレッド数決定処理の例を示すフローチャートである。 ソースプログラムの他の例を示す図である。 タスクと関数との入れ子構造の例を示す図である。
以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の計算機を示す図である。
計算機1は、ソースプログラム(ソースコードということもある)をコンパイルしてオブジェクトコードを生成する。例えば、計算機1は、第1のソースプログラム4をコンパイルして第1のオブジェクトファイル4aを生成する。第1のオブジェクトファイル4aは、第1のソースプログラム4に対するオブジェクトコードを含む。また、計算機1は、第2のソースプログラム5をコンパイルして第2のオブジェクトファイル5aを生成する。第2のオブジェクトファイル5aは、第2のソースプログラム5に対するオブジェクトコードを含む。第2のソースプログラム5は、第1のソースプログラム4とは異なるソースプログラムファイル(ソースファイルということもある)に含まれる。計算機1は、「コンピュータ」と呼ばれてもよい。
計算機1は、記憶部1aおよび演算部1bを有する。記憶部1aは、RAM(Random Access Memory)などの揮発性の記憶装置でもよいし、HDD(Hard Disk Drive)などの不揮発性の記憶装置でもよい。演算部1bは、例えば、プロセッサである。プロセッサは、CPU(Central Processing Unit)やDSP(Digital Signal Processor)であってもよく、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの集積回路を含んでもよい。プロセッサは、例えば、RAMに記憶されたプログラムを実行する。後述するコンパイル処理を実現するプログラムをコンパイラプログラムと呼んでもよい。また、後述するリンク処理を実現するプログラムをリンクプログラムと呼んでもよい。また、「プロセッサ」は、2以上のプロセッサの集合(マルチプロセッサ)であってもよい。
記憶部1aは、ソースプログラムを記憶する。ソースプログラムは、ユーザから計算機1に入力されたものでもよいし、計算機1がネットワークを介して他の計算機から受信したものでもよい。
演算部1bは、コンパイル処理を実行する。具体的には、演算部1bは、ソースプログラムを記憶部1aから取得し、コンパイルすることで、オブジェクトファイルを生成する。オブジェクトファイルは、ソースプログラムに応じたオブジェクトコードを含む。演算部1bは、生成したオブジェクトファイルを、記憶部1aに格納してもよいし、ネットワークを介して他の計算機や外部記憶装置に格納してもよい。演算部1bは、ソースファイル毎にコンパイルを行う。例えば、演算部1bは、コンパイラプログラムを実行することで、コンパイル処理を実行するコンパイラ2の機能を発揮し得る。
演算部1bは、リンク処理を実行する。具体的には、演算部1bは、生成したオブジェクトファイルと、当該オブジェクトコードから参照される他のオブジェクトファイルやライブラリとを結合し、実行ファイルを生成する。例えば、演算部1bは、リンクプログラムを実行することで、リンク処理を実行するリンカ3の機能を発揮し得る。
演算部1bは、ソースプログラムのコンパイルの際に、ソースプログラムに含まれる関数毎の実行に要するクロックサイクル数(単にサイクル数ということがある)とタスクおよび関数の呼び出し関係とを示す情報を生成する。関数は、ルーチン(メインルーチンがサブルーチンを呼び出すという呼び出し関係があり得る)と呼ばれるものでもよい。
例えば、演算部1bが第1のソースプログラム4をコンパイルする場合を考える。第1のソースプログラム4は、並列に実行可能なタスク(並列タスクと称することがある)であるタスクαおよびタスクβの定義を含む。例えば、演算部1bは、第1のソースプログラム4に含まれる定型の構文を特定することで、並列タスクα,βを特定し得る。例えば、タスクαは、関数func1の呼び出しを行うコード“call func1”を含む。例えば、タスクβは、関数func2の呼び出しを行うコード“call func2”を含む。関数func1,func2の定義は、第2のソースプログラム5に記述されている。
演算部1bは、タスクα,βそれぞれの定義箇所に含まれる命令の実行に要するサイクル数を取得する。例えば、記憶部1aは、オブジェクトコードにおける各命令の実行に要するサイクル数の情報を予め記憶してもよい。すると、演算部1bは、当該情報に基づいて、タスクαの直下に存在するタスク内命令のサイクル数の合計を求めることができる(ループが含まれる場合は、ループの回転数も考慮される)。ただし、関数func1の定義は第2のソースプログラム5に存在するため、関数func1のサイクル数をも合算したサイクル数を求められるわけではない。また、演算部1bは、タスクβの直下に存在するタスク内命令のサイクル数の合計を求めることができる。ただし、関数func2の定義は第2のソースプログラム5に存在するため、関数func2のサイクル数をも合算したサイクル数を求められるわけではない。
また、例えば、演算部1bは、タスクα,βおよび関数func1,func2の呼び出し関係を特定する。前述のように、タスクαには、関数func1を呼び出すコードが含まれる。よって、演算部1bは、タスクαが関数func1を呼び出すという呼び出し関係を得る。また、タスクβには、関数func2を呼び出すコードが含まれる。よって、演算部1bは、タスクβが関数func2を呼び出すという呼び出し関係を得る。演算部1bは、タスクα,β内の命令のサイクル数およびタスクα,βと関数func1,func2との呼び出し関係の情報を第1のオブジェクトファイル4aに含めてもよい。
次に、演算部1bが第2のソースプログラム5をコンパイルする場合を考える。第2のソースプログラム5は、関数func1,func2の定義を含む。例えば、演算部1bは、第2のソースプログラム5に含まれる定型の構文を特定することで、関数func1,func2の定義箇所を特定し得る。演算部1bは、関数func1の定義箇所に含まれる命令の実行に要するサイクル数を取得する。演算部1bは、関数func2の定義箇所に含まれる命令の実行に要するサイクル数を算出する。前述のように、演算部1bは、オブジェクトコードの各命令の実行に要するサイクル数の情報を基に、関数func1,func2のサイクル数を算出してもよい。関数func1,func2それぞれは、他の関数を呼び出すコードを含まないので、演算部1bは、呼び出し関係として、関数func1,func2それぞれからの他の関数の呼び出しはないという情報を得る。ただし、関数func1,func2それぞれから他の関数を更に呼び出すこともある。演算部1bは、関数func1,func2について取得したサイクル数および呼び出し関係の情報を第2のオブジェクトファイル5aに含めてもよい。
第1のソースプログラム4および第2のソースプログラム5に対する上記のコンパイル処理は、演算部1bにより実現されるコンパイラ2によって実行されてもよい。
演算部1bは、リンク処理の際に、コンパイル時に生成したサイクル数および呼び出し関係の情報に基づいて、タスク毎の実行に要するサイクル数を算出する。例えば、演算部1bが第1のオブジェクトファイル4aと第2のオブジェクトファイル5aとを結合して実行可能ファイルを生成する場合を考える。
例えば、演算部1bは、タスクα内命令のサイクル数を第1のオブジェクトファイル4aから取得する。また、演算部1bは、タスクαから関数func1を呼び出すという呼び出し関係を第1のオブジェクトファイル4aから取得する。すると、例えば、演算部1bは、関数func1のサイクル数を第2のオブジェクトファイル5aから取得する。演算部1bは、タスクαおよび関数func1について第1のオブジェクトファイル4aおよび第2のオブジェクトファイル5aから取得したサイクル数の合計をタスクαの実行に要するサイクル数(タスクα全体のサイクル数といってもよい)とする。
同様に、例えば演算部1bは、タスクβ内の命令のサイクル数を第1のオブジェクトファイル4aから取得する。また、演算部1bは、タスクβから関数func2を呼び出すという呼び出し関係を第1のオブジェクトファイル4aから取得する。すると、例えば、演算部1bは、関数func2のサイクル数を第2のオブジェクトファイル5aから取得する。演算部1bは、タスクβおよび関数func2について第1のオブジェクトファイル4aおよび第2のオブジェクトファイル5aから取得したサイクル数の合計をタスクβの実行に要するサイクル数(タスクβ全体のサイクル数といってもよい)とする。
第1のオブジェクトファイル4aおよび第2のオブジェクトファイル5aに対する上記のリンク処理は、演算部1bによって実現されるリンカ3によって実行されてもよい。こうして、演算部1bは、タスクαについて、呼び出し先関数func1のサイクル数を含めた全体のサイクル数を取得できる。また、演算部1bは、タスクβについて、呼び出し先関数func2のサイクル数を含めた全体のサイクル数を取得できる。
図2は、第1のソースプログラムの例を示す図である。
図2では、一例としてC言語を用いて第1のソースプログラム4を記述する場合を示している。ソースプログラムにおいて、タスクは、所定の指示文によって指定されることがある。指示文としては、例えば、OpenMP(登録商標)の構文を用いることが可能である。図2の例では、OpenMPで、それぞれスレッド数が4,4である2つの並列タスクを表現するサンプルコードを例示している。なお、図2において、左側に付されている番号は行番号である(以降の図でも同様にして行番号を図示することがある)。なお、3以上の並列タスクも同様に表現され得る。
例えば、10行目〜12行目はタスクαの定義箇所である。また、15行目〜17行目はタスクβの定義箇所である。各タスクの定義箇所は、実行文や実行文を内部にもつループ構文および関数呼び出しを含み得る。各タスクは関数内で定義される。また、関数内では別の関数が呼び出されることがあり入れ子構造になる。
図3は、第2のソースプログラムの例を示す図である。
図3でも、図2と同様に、一例としてC言語を用いて第2のソースプログラム5を記述する場合を示している。第2のソースプログラム5は、関数func1,func2それぞれの定義を含む。
ところで、実行可能ファイルによって並列タスクの実行を開始する際には、スレッドを立ち上げて実行する。ここでは、プロセッサの1コア当たり1つのスレッドを実行する場合を考える。このとき、並列に実行可能な各タスクに割り当てるコア数によっては、あるタスクの実行が他のタスクよりも早く終了することがある。すると、タスクの実行を終了したコアが、他のタスクの実行が終了するまで待機することになり、当該コアが処理を何も実行しない空き状態になり効率的ではない。
例えば、並列タスクを効率的に実行するには、各タスクの実行時間が均等になるように各タスクへのコア数の割り当てを行うことが望ましい。コア数の割り当てを行うための情報として、各タスクのコスト(サイクル数)と並列実行可能性が考えられる。しかし、プログラムは、一般的に複数のソースファイルを含み得る。この場合、コンパイル時には、タスク全体のサイクル数の情報を得ることが難しい。コンパイルはソースファイル毎に行われるため、あるタスクの呼び出し先の関数が異なるソースファイルに定義されていると、当該関数内のサイクル数がコンパイラ2には分からないためである。タスクから呼び出される関数を1つのファイルにまとめるために、複数のソースファイルを1つのファイルに結合してからコンパイルする方法も考えられる。しかし、この方法では、プログラムの一部に修正を行う度に、結合後のファイルを再コンパイルすることになり、手間が増える。更に、各ソースファイルを1つにまとめるとファイルサイズが大きくなり、コンパイル時のメモリ使用負荷も大きくなってしまう。
例えば、図2,3に示すように、並列タスクを含み、かつ、複数のソースファイルで構成されるプログラムでは、タスクのスレッド数を割り当てる部分とタスクの定義部分とが別のファイルに存在する。具体的には、タスクαは、関数func1を呼び出す。関数func1は、1000回転のループを含む。タスクβは、関数func2を呼び出す。関数func2は、10回転のループを含む。両者のコストには差がある。仮に、タスクα,βの両方を同じスレッド数で実行したならば、10回転のループを実行するタスクβが先に終わり、1000回転のループを実行するタスクαが終了するまで待ちが生じることになる。この場合、1000回転のループを含むタスクαに対して、タスクβよりも多くのスレッド数を割り当てれば、待ち時間が短くて済み効率的である。しかし、コンパイラは、1つのファイル毎にコンパイルを行うため、ファイル間を跨いだタスクのコストを解析することが難しい。このため、各タスクのコストに応じて自動的にスレッド数を調整することが難しい。
そこで、計算機1は、ソースプログラムのコンパイルの際に、ソースプログラムに含まれる関数毎の実行に要するサイクル数とタスクおよび関数の呼び出し関係とを示す情報を生成する。計算機1は、リンク処理の際に、サイクル数および呼び出し関係に基づいてタスク毎の実行に要するサイクル数を算出する。例えば、計算機1は、生成したサイクル数および呼び出し関係の情報を、オブジェクトファイルに追加する。計算機1は、リンク処理の際に、各オブジェクトファイルに含まれるサイクル数および呼び出し関係の情報に基づいて、タスク毎のサイクル数を適切に取得できる。その結果、計算機1は、取得したタスク毎のサイクル数を基に、各タスクへのスレッド数の割り当てを行えるようになる。
[第2の実施の形態]
第2の実施の形態の情報処理装置は、コンパイラおよびリンカを用いて、C言語などの高級言語で記述されたソースコードから実行コードを生成する。
図4は、第2の実施の形態の情報処理装置のハードウェア例を示す図である。
情報処理装置100は、CPU101,102、RAM103、HDD104、画像信号処理部105、入力信号処理部106、媒体リーダ107および通信インタフェース108を有する。これらのハードウェアユニットは、情報処理装置100内でバスに接続されている。CPU101,102は、第1の実施の形態の演算部1bの一例であり、RAM103またはHDD104は、第1の実施の形態の記憶部1aの一例である。
CPU101,102は、プログラムの命令を実行する1または2以上のコアを含むプロセッサである。例えば、CPU101は、コア101a,101bを含む複数のコアを有する。同一または異なるCPUに属する複数のコアは、互いに並列に命令を実行できる。CPU101,102は、HDD104に記憶されているプログラムやデータの少なくとも一部をRAM103にロードし、プログラムを実行する。なお、各コアを「プロセッサ」と呼んでもよいし、複数のプロセッサの集合を「プロセッサ」(マルチプロセッサ)と呼んでもよい。情報処理装置100は、CPU101,102に加えて、更に1以上のCPUを備えてもよい。また、第2の実施の形態の例では、1つのコア当たり同時に複数のスレッドを実行する場合ではなく、1つのコア当たり1つのスレッドを実行する場合を考える。
RAM103は、CPU101,102が実行するプログラムやCPU101,102が演算に用いるデータを一時的に記憶する揮発性メモリである。なお、情報処理装置100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
HDD104は、OS(Operating System)やアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、情報処理装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
画像信号処理部105は、CPU101,102からの命令に従って、情報処理装置100に接続されたディスプレイ11に画像を出力する。ディスプレイ11としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ(PDP:Plasma Display Panel)、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなどを用いることができる。
入力信号処理部106は、情報処理装置100に接続された入力デバイス12から入力信号を取得し、少なくとも1つのCPUに出力する。入力デバイス12としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、情報処理装置100に、複数の種類の入力デバイスが接続されていてもよい。
媒体リーダ107は、記録媒体13に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体13として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。媒体リーダ107は、例えば、記録媒体13から読み取ったプログラムやデータをRAM103またはHDD104に格納する。
通信インタフェース108は、ネットワーク14に接続され、ネットワーク14を介して他の情報処理装置と通信を行うインタフェースである。通信インタフェース108は、スイッチなどの通信装置とケーブルで接続される有線通信インタフェースでもよいし、基地局と無線リンクで接続される無線通信インタフェースでもよい。
なお、情報処理装置100が備えるCPUの数は1個でもよい。また、情報処理装置100は、媒体リーダ107を備えていなくてもよい。また、情報処理装置100は、ユーザが操作する端末装置からネットワーク14経由で制御される場合には、画像信号処理部105や入力信号処理部106を備えていなくてもよい。また、情報処理装置100は、通信インタフェース108を備えていなくてもよい。また、ディスプレイ11や入力デバイス12が、情報処理装置100の筐体と一体に形成されていてもよい。
図5は、情報処理装置のソフトウェア例を示す図である。
情報処理装置100は、ソースファイル記憶部110、オブジェクトファイル記憶部120、実行可能ファイル記憶部130、コンパイラ140およびリンカ150を有する。ソースファイル記憶部110、オブジェクトファイル記憶部120および実行可能ファイル記憶部130は、例えば、RAM103またはHDD104に確保された記憶領域として実装される。コンパイラ140およびリンカ150は、例えば、CPU101,102が実行するソフトウェアのモジュールとして実装される。
ソースファイル記憶部110は、ソースファイルを記憶する。ソースファイルは、C言語などの高級言語を用いて記述されたソースプログラム(ソースコードということもある)を含むファイルである。ソースファイルは、ユーザが入力デバイス12を用いて作成したものでもよいし、他の情報処理装置からネットワーク14経由で情報処理装置100に送信されたものでもよい。
オブジェクトファイル記憶部120は、オブジェクトファイルを記憶する。オブジェクトファイルは、CPUが直接理解できる機械語を用いて記述されたオブジェクトコードを含むファイルである。オブジェクトコードは、ソースプログラムをコンパイルすることで生成される。
実行可能ファイル記憶部130は、実行可能ファイルを記憶する。実行可能ファイルは、実行可能形式のプログラムモジュールであり、オブジェクトファイルから生成される。実行可能ファイルは、複数のオブジェクトファイルを結合することで生成されることもある。実行可能ファイルは、情報処理装置100で実行されてもよいし、他の情報処理装置に送信されて当該他の情報処理装置で実行されてもよい。
コンパイラ140は、ソースファイル記憶部110からソースファイルを取得し、ソースファイルに含まれるソースプログラムをコンパイルする。そして、コンパイラ140は、ソースプログラムに対応するオブジェクトコードを生成し、生成したオブジェクトコードを含むオブジェクトファイルをオブジェクトファイル記憶部120に格納する。コンパイラ140は、ループ並列性解析部141、タスク範囲抽出部142、関数コスト解析部143、関数呼び出し抽出部144および関数情報追加部145を有する。
ループ並列性解析部141は、ソースプログラムを解析して、ソースプログラムに含まれる演算命令および演算命令の実行順序に基づいて、関数内のループ処理を特定する。ループ並列性解析部141は、各ループが繰り返し毎に並列処理可能であるか否かを判定し、ループ毎に並列処理可能か否かを示すループ並列性情報を生成してRAM103に格納する。例えば、ループで繰り返し実行される各処理を独立に実行できる場合(例えば、前回以前の処理結果の影響を受けない、次回以降の処理結果に影響を与えないなど)、当該ループは並列に実行可能である。より具体的には、100回転のループがある場合、1から50回転分および51から50回転分を異なる2つのスレッドによって並列に実行可能である(3以上のスレッドで並列実行することもできる)。
タスク範囲抽出部142は、ソースプログラムを解析して、OpenMP指示文などで指定された並列に動作するタスクの開始・終了位置を把握する。また、タスク範囲抽出部142は、ソースプログラムに対して生成されたオブジェクトファイル内の命令列の、スレッド数指定命令の直前にラベルを挿入する。当該ラベルは、並列タスクの実行箇所をリンカ150により識別可能とするためのものである。タスク範囲抽出部142は、並列タスクの開始・終了位置およびラベル名をタスク範囲情報として抽出し、RAM103に格納する。
関数コスト解析部143は、関数のコストを見積もる。関数コスト解析部143は、タスク範囲抽出部142でタスクが検出された場合は検出した各タスク範囲のコストを見積もる。コストとは、ソースプログラムの関数またはタスク範囲に対応する命令列に含まれる各命令の実行に要するクロックサイクル数の総和である。クロックサイクル数を、単にサイクル数と称することがある。ここで、例えば、オブジェクトファイル記憶部120には、命令とサイクル数の対応関係の情報が予め格納される。関数コスト解析部143は、当該対応関係の情報を基に、各命令のサイクル数を特定できる。
ループの場合は、ループ内の命令列のコストにループの回転数を乗じたものが当該ループのコストである。なお、ループの回転数が不明の場合には、特開2006−293768号公報に開示の方法により、ループ内に現れる配列の要素数や固定値(例えば、100など)を用いてもよい。ループ並列性情報に、対象のループが並列化可能であることが示されている場合、関数コスト解析部143は、上記の方法で求めたコストをスレッド数で割った値をループのコストとする。このため、コストは割り当てられるスレッド数をパラメータとしてもつ。関数コスト解析部143は、求めたコストを関数コスト情報としてRAM103に格納する。
関数呼び出し抽出部144は、ソースプログラムを解析して、関数の呼び出し関係を抽出する。関数の呼び出し関係は、呼び出した関数名および呼び出し回数の情報を含む。タスク範囲抽出部142によりタスク範囲が検出されている場合は、検出したタスク毎に関数の呼び出し関係を抽出する。関数呼び出し抽出部144は、抽出した情報を関数呼び出し情報としてRAM103に格納する。
関数情報追加部145は、タスク範囲抽出部142によって生成されたタスク範囲情報、関数コスト解析部143によって生成された関数コスト情報、および、関数呼び出し抽出部144によって生成された関数呼び出し情報を、オブジェクトファイルに追加する。ただし、追加するタスク範囲情報は、スレッド数指定命令直前のラベル名のみでよい。オブジェクトファイルに追加されるこれらの各情報は、後述するように関数またはタスク単位に追加されることになる。
リンカ150は、オブジェクトファイル記憶部120からオブジェクトファイルを取得し、オブジェクトファイルに含まれるオブジェクトコードから参照される他のオブジェクトファイルやライブラリを検索する。そして、リンカ150は、オブジェクトファイルと他のオブジェクトファイルやライブラリとを結合し、実行可能ファイルを生成し、実行可能ファイル記憶部130に格納する。ここで、リンカ150は、以下に示す各部の処理が行われた後のオブジェクトファイルを用いて、リンク処理を行う。リンカ150は、関数情報取得部151、タスク範囲解析部152、関数呼び出し解析部153、タスクコスト解析部154、スレッド数判定部155およびスレッド数変更部156を有する。
関数情報取得部151は、結合対象の全てのオブジェクトファイルから、コンパイル時に埋め込まれたタスク範囲情報と関数コスト情報と関数呼び出し情報を取得する。
タスク範囲解析部152は、タスク範囲情報からタスクのラベル名を取得する。ラベル名が存在しない場合は、並列なタスクが存在しないため、以降の解析を実行しなくてよい(通常通り実行可能ファイルが生成されることになる)。
関数呼び出し解析部153は、関数呼び出し情報に基づいて、各タスクからの関数呼び出し関係を構築する。
タスクコスト解析部154は、各タスクのコストを解析する。タスクコスト解析部154は、関数呼び出し解析部153によって構築された関数呼び出し関係に基づいて、タスクから呼び出されている全ての関数のコストを集める。タスクコスト解析部154は、該当のタスクから呼び出されている全ての関数のコストを考慮に入れた当該タスクの総コストを、実行スレッド数をパラメータとして表わす。
具体的には、タスクまたは関数の名前をt、実行するスレッド数をnとして、当該タスクの総コストをAllC(t,n)で表わす。また、タスクまたは関数tから呼び出されている関数内のコストを含まないコストをC(t,n)で表わす。C(t,n)は、関数コスト情報である。このとき、タスクまたは関数tから直接呼び出される関数をfuncとすると、AllC(t,n)は、C(t,n)+Σ{AllC(func,n)×(tからfuncを呼び出す回数)}である。ここで、Σは、タスクまたは関数tから直接呼び出される全ての関数について総和をとることを意味する。
スレッド数判定部155は、タスクコスト解析部154によるタスク毎のコストの解析結果に基づいて、各タスクの終了時刻の差が小さくなるように各タスクに割り当てるスレッド数を求める。具体的には、スレッド数判定部155は、各タスクのスレッド数の初期値を1にする。タスクの総スレッド数が利用可能なコア数未満であれば、各タスクを現割り当てスレッド数で実行する際の総コストを求める。そして、スレッド数判定部155は、総コストが最も高いタスクに対してスレッド数を1増やす。これをスレッド総数が利用可能なコア数と等しくなるまで繰り返して各タスクのスレッド数を求める。
スレッド数変更部156は、オブジェクトファイルの中のスレッド数の設定を書き換える。スレッド数変更部156は、オブジェクトファイル内でラベル名を検索し、直後の命令(スレッド数を指定する命令)の内容を変更する。すなわち、スレッド数変更部156は、当該命令内でタスクを起動するスレッド数を定めるレジスタに対して、スレッド数判定部155が求めたスレッド数の値を代入するように命令を変更する。スレッド数変更部156は、変更対象の命令に対して、どのような変更を施せばスレッド数の値が変わるのかといった情報を予め把握している。
図6は、ファイルの例を示す図である。
第2の実施の形態では、以下のファイルを例示する。ソースファイル111,112,113,114は、ソースファイル記憶部110に記憶される。ソースファイル111のファイル名は、“main.c”である。ソースファイル112のファイル名は、“sub1.c”である。ソースファイル113のファイル名は、“sub2.c”である。ソースファイル114のファイル名は、“sub3.c”である。
コンパイラ140は、ソースファイル111,112,113,114をコンパイルして、オブジェクトファイル121,122,123,124を生成し、オブジェクトファイル記憶部120に格納する。オブジェクトファイル121は、ソースファイル111のコンパイル結果である。オブジェクトファイル121のファイル名は、“main.o”である。オブジェクトファイル122のファイル名は、“sub1.o”である。オブジェクトファイル123のファイル名は、“sub2.o”である。オブジェクトファイル124のファイル名は“sub3.o”である。
リンカ150は、オブジェクトファイル121,122,123,124を結合して、実行可能ファイル131を生成し、実行可能ファイル記憶部130に格納する。
次に、ソースファイル111,112,113,114に含まれるソースプログラムを例示する。以下では、一例としてC言語による記述を示す。
図7は、ソースプログラムの例(その1)を示す図である。
例えば、ソースファイル111には、関数mainが含まれる。ソースファイル111のコンパイルの際、ループ並列性解析部141は、関数main内で並列可能なループを探すが、関数mainには並列可能なループは存在していない。更に、タスク範囲抽出部142は、ソースファイル111内にタスクが定義されていることを検出し、開始位置と終了位置を記憶する。具体的には、ソースファイル111には、12行目〜14行目に1つ目のタスクが、17行目〜19行目に2つ目のタスクが記述されている。1つ目のタスクをタスクAとする。2つ目のタスクをタスクBとする。ソースファイル111の11行目の記述“#pragma omp parallel num_threads(4)”は、タスクAのスレッド数の指定である。同16行目の記述“#pragma omp parallel num_threads(2)”は、タスクBのスレッド数の指定である。
この例では、タスクA,Bを並列に実行可能であり、ソースプログラムを記述したユーザによって、タスクAのスレッド数を4、タスクBのスレッド数を2として実行することが記述されている。ただし、ユーザによって指定されたスレッド数は、情報処理装置100によって調整され得る。
タスクAは、関数func1の呼び出しを含む(13行目の“func1(input,a_out)”)。タスクBは、関数func2の呼び出しを含む(18行目の“func2(input,b_out)”)。
関数コスト解析部143は、タスクA,Bに含まれる各命令のコストの和を算出する。図7の例では、タスクA,Bの双方ともに関数呼び出し命令のコストのみである。また、関数呼び出し抽出部144は、タスクAから関数func1を呼び出すという関数呼び出し情報、および、タスクBから関数func2を呼び出すという関数呼び出し情報を生成する。
図8は、ソースプログラムの例(その2)を示す図である。
図8(A)は、ソースファイル112に含まれるソースプログラムの例を示す。図8(B)は、ソースファイル113に含まれるソースプログラムの例を示す。図8(C)は、ソースファイル114に含まれるソースプログラムの例を示す。
例えば、ソースファイル112は、関数func1の定義を含む。ソースファイル112のコンパイルの際、ループ並列性解析部141は、ソースファイル112から並列化可能なループを探す。関数func1は、並列化可能なループを含む。ループ並列性解析部141は、関数func1内の当該ループを並列化可能と特定する。
タスク範囲抽出部142は、タスクの定義を探すが、関数func1にはタスクの定義が存在しないことを検出する。関数コスト解析部143は、関数func1のコストを算出する。このとき、関数コスト解析部143は、スレッド数を表わすパラメータnを用いて、並列化可能ループのコストを、ループ内の命令コスト×回転数/nとする。関数func1は、他の関数の呼び出しを含まない。このため、関数呼び出し抽出部144は、関数func1から他の関数の呼び出しがないことを検出する。
ソースファイル113は、関数func2の定義を含む。関数func2は、並列化可能なループを含む。ソースファイル113のコンパイルの際、ループ並列性解析部141は、ソースファイル112の場合と同様に、関数func2内の当該ループを並列化可能と判断する。また、タスク範囲抽出部142は、タスクの定義を探すが、関数func2にはタスクの定義が存在しないことを検出する。関数コスト解析部143は、ソースファイル112の場合と同様に、関数func2のコストを算出する。更に、関数func2は、関数func3の呼び出しを含む。このため、関数呼び出し抽出部144は、関数func2から関数func3の呼び出しがあることを検出する。
ソースファイル114は、関数func3の定義を含む。関数func3は、並列化不可能なループを含む。ソースファイル114のコンパイルの際、ループ並列性解析部141は、関数func3内の当該ループを並列化不可能と特定する。タスク範囲抽出部142は、タスクの定義を探すが、関数func3にはタスクの定義が存在しないことを検出する。また、関数コスト解析部143は、関数func3のコストを算出する。関数func3内のループは並列化不可能であるので、ループのコストを、ループ内の命令コスト×回転数となる。更に、関数func3は、他の関数の呼び出しを含まない。このため、関数呼び出し抽出部144は、関数func3から他の関数の呼び出しがないことを検出する。
図9は、関数に対する命令列の例を示す図である。
図9(A)は、関数mainに対する命令列の例を示している。図9(B)は、関数func1に対する命令列の例を示している。これらの命令列は、コンパイラ140によって生成されるオブジェクトコードの一部と考えてもよい。
図9(A)において、例えば、関数mainに対する命令列は、タスクA,Bそれぞれの命令列を含む。例えば、タスクの先頭およびタスクの末尾は、タスクの先頭およびタスクの末尾を示す所定のコードによって特定され得る。1番目のタスク範囲(図9(A)の1行目から3行目まで)は、タスクAの命令列である。2番目のタスク範囲(図9(A)の4行目から6行目まで)は、タスクBの命令列である。この例では、タスクA,Bは、コストの計算対象となる命令として、関数呼び出し命令のみを含む。例えば、コンパイラ140内部での関数呼び出しがcall命令により表現される。すると、このcall命令のサイクル数が、タスクA,B内の命令のコストである。
図9(B)において、例えば、関数func1に対する命令列は、回転数が100のループ処理を示す。関数func1の当該ループは、並列化可能なループである。例えば、ループの先頭およびループの末尾は、ループの先頭およびループの末尾を示す所定のコードによって特定され得る。このループは、load命令とadd命令とstore命令の3つを繰り返し実行する。すると、関数func1のコストは、load命令のサイクル数とadd命令のサイクル数とstore命令のサイクル数の和にループ回転数100を乗じ、更にスレッド数nで割った値となる。
図10は、サイクル数テーブルの例を示す図である。
サイクル数テーブル125は、例えばオブジェクトファイル記憶部120に予め格納される。サイクル数テーブル125は、命令およびサイクル数の項目を含む。
命令の項目には、命令が登録される。サイクル数の項目には、命令の実行に要するサイクル数が登録される。例えば、サイクル数テーブル125には、命令が“store”、サイクル数が“10”という情報が登録される。これは、store命令の実行に要するサイクル数(クロックサイクル数)が10であることを示す。
図11は、タスク範囲情報の例を示す図である。
タスク範囲情報121aは、オブジェクトファイル121に追加されるタスク範囲情報を例示している。タスク範囲情報121aは、タスクAに対するラベル名、および、タスクBに対するラベル名を含む。ソースファイル111が3以上のタスクを含む場合には、タスク範囲情報121aは3以上のラベル名を含むことになる。
オブジェクトファイル122,123,124も同様のタスク範囲情報を含む。ただし、ソースファイル112,113,114において、タスクが検出されない場合は、タスク範囲情報には何れのラベル名も含まれないことになる(設定なしとなる)。
図12は、関数コスト情報の例を示す図である。
関数コスト情報121bは、オブジェクトファイル121に追加される関数コスト情報を例示している。関数コスト情報121bは、前述のように、タスクまたは関数において呼び出し先の関数のコストを含まないコストC(t,n)を含む。
C(t,n)=Sc1+Sc2+Sc3(n)である。Sc1は、ループ以外の命令のサイクル数の総和である。Sc2は、並列化不可能なループのループ内命令のサイクル数の総和×ループ回転数である。Sc3は、並列化可能なループのループ内命令のサイクル数の総和×ループ回転数/nである。nは、スレッド数を示すパラメータである。
前述のタスクAの例では、次のようになる。タスクAは、ループ以外の命令として、call命令を1つだけ含むので、Sc1=2である。タスクAは、並列化不可能なループを含まないのでSc2=0である。タスクAは、並列化可能なループを含まないのでSc3(n)=0である。よって、C(タスクA,n)=2+0+0/n=2である。
オブジェクトファイル122,123,124も同様の関数コスト情報を含む。例えば、図9(B)およびサイクル数テーブル125の例によれば、load命令のサイクル数が10、add命令のサイクル数が1、store命令のサイクル数が10である。したがって、関数func1では、Sc3(n)=(10+1+10)×100/n=2100/nである。また、Sc1=Sc2=0である。よって、関数コスト解析部143は、関数func1のコストをC(func1,n)=2100/nと見積もることになる。関数func1の関数コスト情報は、オブジェクトファイル122に追加される。
なお、関数コスト解析部143は、コストへの寄与の小さい項を無視してもよい(例えば、前述のSc1に相当する項がSc2やSc3(n)に相当する項に比べて微少であれば、Sc1に相当する項を0とみなしてもよい)。
図13は、関数呼び出し情報の例を示す図である。
関数呼び出し情報121cは、オブジェクトファイル121に追加される関数呼び出し情報を例示している。関数呼び出し情報121cは、呼び出し元のタスクまたは関数名、呼び出し先の関数名および呼び出し回数の情報を含む。例えば、タスクAでは、関数func1を1回呼び出す。したがって、関数呼び出し情報121cは、呼び出し元のタスク名が“タスクA”、呼び出し先の関数名が“func1”、呼び出し回数が“1”という情報を含むことになる。オブジェクトファイル122,123,124も同様の関数呼び出し情報を含む。ただし、他の関数の呼び出しを含まない場合は、関数呼び出し情報として、呼び出しがないという情報が登録されることになる。
図14は、オブジェクトファイルの例(その1)を示す図である。
オブジェクトファイル121は、通常時のmain.cに対するオブジェクト情報(オブジェクトコードの情報)に加えて、関数mainの関数情報を含む。関数mainの関数情報は、下記のタスク範囲情報(タスク範囲情報121a)、関数コスト情報(関数コスト情報121b)、および、関数呼び出し情報(関数呼び出し情報121c)を含む。
タスク範囲情報は、タスクAのラベル名“.global task 001”を含む。タスク範囲情報は、タスクBのラベル名“.global task 002”を含む。
関数コスト情報は、タスクAに関する関数コスト情報C(タスクA,n)を含む。関数コスト情報は、タスクBに関する関数コスト情報C(タスクB,n)を含む。
関数呼び出し情報は、“タスクAでfunc1を1回呼び出し”という情報を含む。これは、タスクAが関数func1を1回呼び出すことを示す。関数呼び出し情報は、“タスクBでfunc2を1回呼び出し”という情報を含む。これは、タスクBが関数func2を1回呼び出すことを示す。
図15は、オブジェクトファイルの例(その2)を示す図である。
オブジェクトファイル122は、通常時のsub1.cに対するオブジェクト情報に加えて、関数func1の関数情報を含む。関数func1の関数情報は、下記のタスク範囲情報、関数コスト情報、および、関数呼び出し情報を含む。
タスク範囲情報は、タスク範囲なしを示す情報(“なし”)を含む。関数コスト情報は、関数func1に関する関数コスト情報C(func1,n)を含む。関数呼び出し情報は、関数呼び出しなしを示す情報(“関数呼び出しなし”)を含む。
オブジェクトファイル123は、通常時のsub2.cに対するオブジェクト情報に加えて、関数func2の関数情報を含む。関数func2の関数情報は、下記のタスク範囲情報、関数コスト情報、および、関数呼び出し情報を含む。
タスク範囲情報は、タスク範囲なしを示す情報(“なし”)を含む。関数コスト情報は、関数func2に関する関数コスト情報C(func2,n)を含む。関数呼び出し情報は、“func2でfunc3を1回呼び出し”という情報を含む。これは、関数func2が関数func3を1回呼び出すことを示す。
オブジェクトファイル124は、通常時のsub3.cに対するオブジェクト情報に加えて、関数func3の関数情報を含む。関数func3の関数情報は、下記のタスク範囲情報、関数コスト情報、および、関数呼び出し情報を含む。
タスク範囲情報は、タスク範囲なしを示す情報(“なし”)を含む。関数コスト情報は、関数func3に関する関数コスト情報C(func3,n)を含む。関数呼び出し情報は、関数呼び出しなしを示す情報(“関数呼び出しなし”)を含む。
図16は、タスクおよび関数の呼び出し関係の例を示す図である。
関数呼び出し解析部153は、オブジェクトファイル121,122,123,124に追加された関数呼び出し情報に基づいて、タスクおよび関数の呼び出し関係を把握する。例えば、関数呼び出し解析部153は、オブジェクトファイル121に含まれる関数呼び出し情報に基づいて、タスクAから関数func1が1回呼び出されることを把握する。関数呼び出し解析部153は、オブジェクトファイル122に含まれる関数func1の関数呼び出し情報から、関数func1からは他の関数の呼び出しがないことを把握する。
更に、関数呼び出し解析部153は、オブジェクトファイル121に含まれる関数呼び出し情報に基づいて、タスクBから関数func2が1回呼び出されることを把握する。関数呼び出し解析部153は、オブジェクトファイル123に含まれる関数呼び出し情報に基づいて、関数func2から関数func3が1回呼び出されることを把握する。関数呼び出し解析部153は、オブジェクトファイル124に含まれる関数呼び出し情報に基づいて、関数func3からは他の関数の呼び出しがないことを把握する。
図17は、タスクコストテーブルの例を示す図である。タスクコストテーブル132は、タスクコスト解析部154によって作成され、オブジェクトファイル記憶部120に格納される。タスクコストテーブル132は、タスク毎に計算されたタスク全体のコスト(スレッド数を示すパラメータを含む)を管理するためのテーブルである。タスクコストテーブル132は、タスクおよびコストの項目を含む。
タスクの項目には、タスク名が登録される。コストの項目には、当該タスク全体のコストAllC(t,n)が登録される。例えば、タスクコストテーブル132には、タスクが“タスクA”、コストが“(2100/n)+2”という情報が登録される。これは、タスクAの全体のコストが、スレッド数nをパラメータとして、(2100/n)+2で表わされることを示す。なお、図17では、スレッド数を示すパラメータをn,mとしてタスク毎に区別して用いる。
ここで、前述のように、タスクA全体のコストAllC(タスクA,n)は、C(タスクA,n)+Σ{AllC(func1,n)×(タスクAからfunc1を呼び出す回数)}=C(タスクA,n)+AllC(func1,n)×1である。
C(タスクA,n)=2である。また、AllC(func1,n)=C(func1,n)=2100/nである。よって、AllC(タスクA,n)=(2100/n)+2となる。
タスクコストテーブル132には、タスクB全体のコストAllC(タスクB,m)として、(10000/m)+10という情報も登録されている。AllC(タスクB,m)は、C(タスクB,m)+C(func2,m)×1+C(func3,m)の計算結果である。
スレッド数判定部155は、タスクコストテーブル132に登録されたタスクA,Bのコストに基づいて、タスクA,Bを並列に実行する際の、タスクA,Bに割り当てるスレッド数を決定する。
図18は、スレッド数の決定例を示す図である。
利用可能なコア数を8個とする。スレッド数判定部155は、n=1、m=1を初期値として、AllC(タスクA,1)=2102およびAllC(タスクB,1)=10010を求める。コストの大きい方のタスクに割り当てるスレッド数を1追加し、AllC(タスクA,n)およびAllC(タスクB,m)を計算し直す。これを、n+m=8となるまで繰り返し、最終的な(n,m)の組(n,m)=(2,6)を取得する。この場合、スレッド数判定部155は、タスクAに割り当てるスレッド数を2とする。また、スレッド数判定部155は、タスクBに割り当てるスレッド数を6とする。
図19は、スレッド数の設定例を示す図である。
図19(A)は、スレッド数の設定前のオブジェクトファイル121を例示している。図19(B)は、スレッド数の設定後のオブジェクトファイル121を例示している。スレッド数変更部156は、スレッド数判定部155が求めた各タスクのスレッド数をオブジェクトファイル121に設定する。
例えば、オブジェクトファイル121内の命令列には、タスクAを示すラベル“.global task 001”、および、タスクBを示すラベル“.global task 002”が含まれる。スレッド数変更部156は、当該ラベルのラベル名を、オブジェクトファイル121のタスク範囲情報から取得できる。スレッド数変更部156は、各ラベルの直後の命令を、タスクを起動するスレッド数を定めるレジスタに、スレッド数判定部155が決定したスレッド数を代入するよう書き換える。
例えば、スレッド数変更部156は、ラベル直後の命令の第1引数の値を、第2引数に代入しており、第2引数の値がスレッド数を表わすものであることを予め把握している。スレッド数変更部156は、まず、オブジェクト内からラベルを探し、スレッド数を変更するために、“.global task 001”の直後の命令(2行目のmov命令)の第1引数(“%レジスタ1”と表記)を2に変更する。また、スレッド数変更部156は、“.global task 002”の直後の命令(7行目のmov命令)の第1引数(“%レジスタ1”と表記)を6に変更する。この場合、第1引数の即値を設定することで、即値の代入を表わすものとする。
次に、以上のような情報処理装置100による処理手順を例示する。
図20は、コンパイル処理の例を示すフローチャートである。以下、図20に示す処理をステップ番号に沿って説明する。以下の手順は、1つのソースファイルのコンパイル毎に実行される。
(S11)ループ並列性解析部141は、ソースファイルに含まれるソースプログラムの先頭の関数に進む。具体的には、ループ並列性解析部141は、ソースプログラムの構文を解析することで、先頭に記述された関数を特定する。
(S12)ループ並列性解析部141は、ソースプログラムの構文を解析して、着目する関数内のループが繰り返し毎に並列処理可能かを解析する。例えば、ループで繰り返し実行される各処理を独立に実行できる場合(例えば、前回以前の処理結果の影響を受けない、次回以降の処理結果に影響を与えないなど)、当該ループは並列に実行可能である。ループ並列性解析部141は、該当のループが並列処理可能か否かを示す情報をRAM103に格納する。なお、関数内にループが含まれない場合は、ステップS12をスキップしてステップS13に進めてよい。
(S13)ループ並列性解析部141は、ソースプログラム中にループ並列性を未解析の関数があるか否かを判定する。未解析の関数がある場合、処理をステップS14に進める。未解析の関数がない場合、処理をステップS15に進める。
(S14)ループ並列性解析部141は、解析対象を次の関数に進める(着目する関数が次の関数となる)。そして、処理をステップS12に進める。
(S15)コンパイラ140は、ソースプログラムに相当する命令列を生成する。
(S16)タスク範囲抽出部142は、先頭の関数に処理を進める。具体的には、タスク範囲抽出部142は、ソースプログラムにおける先頭の関数に対応する命令列に着目して、次の手順を実行する。
(S17)タスク範囲抽出部142は、着目する命令列においてタスクの開始・終了位置を抽出し、スレッド数指定命令の直前にラベルを挿入する。例えば、ソースファイル111のコンパイルの場合、タスク範囲抽出部142は、タスクAに対するラベルとして“.global task 001”をオブジェクトファイル121向けの命令列に挿入する。タスク範囲抽出部142は、タスクBに対するラベルとして“.global task 002”をオブジェクトファイル121向けの命令列に挿入する。なお、タスク範囲抽出部142は、タスク範囲を抽出しないこともある。その場合は、ラベルの挿入も行われない。タスク範囲抽出部142は、タスク範囲情報として挿入したラベルのラベル名をRAM103に格納する。挿入したラベルがない場合は、ラベル名がなしである旨をタスク範囲情報とする。
(S18)関数コスト解析部143は、サイクル数テーブル125に基づいて、タスクおよび関数について呼び出し先の関数のコストを含まないコストC(t,n)を抽出し、タスクおよび関数毎の関数コスト情報を生成する。関数コスト解析部143は、生成した関数コスト情報をRAM103に格納する。
(S19)関数呼び出し抽出部144は、ソースプログラムに基づいて、関数の呼び出し関係を抽出し、タスクおよび関数毎の関数呼び出し情報を生成する。関数の呼び出しがない場合、関数呼び出しなしである旨を関数呼び出し情報として生成する。関数呼び出し抽出部144は、生成した関数呼び出し情報をRAM103に格納する。
(S20)タスク範囲抽出部142は、ソースプログラム中にステップS17〜S19の手順を未処理の関数があるか否かを判定する。未処理の関数がある場合、処理をステップS21に進める。未処理の関数がない場合、処理をステップS22に進める。
(S21)タスク範囲抽出部142は、処理対象を次の関数に進める(着目する関数が次の関数となる)。そして、処理をステップS17に進める。
(S22)関数情報追加部145は、ステップS17,S18,S19で生成されたタスク範囲情報、関数コスト情報および関数呼び出し情報を、RAM103から読み出して、オブジェクトファイルの生成時に、オブジェクトファイルに埋め込む。
このようにして、コンパイラ140は、生成したオブジェクトファイルにタスク範囲情報、関数コスト情報および関数呼び出し情報を追加する。なお、コンパイラ140は、複数のソースファイルをコンパイルする際、上記ステップS11〜S22の一連の手順をソースファイル毎に繰り返し実行する。リンカ150は、コンパイラ140によって生成された上記オブジェクトファイルに基づいて、リンク処理を実行する。
図21は、リンク処理の例を示すフローチャートである。以下、図21に示す処理をステップ番号に沿って説明する。
(S31)関数情報取得部151は、結合対象の全てのオブジェクトファイル(例えば、オブジェクトファイル121,122,123,124)から、コンパイル時に埋め込まれた関数情報を取得する。関数情報は、タスク範囲情報、関数コスト情報および関数呼び出し情報を含む。
(S32)タスク範囲解析部152は、ステップS31で取得されたタスク範囲情報からタスクのラベル名を取得する(ラベル名を取得できる場合は、並列に実行可能な複数のタスクに対応する複数のラベル名を取得することになる)。なお、各オブジェクトファイル内に並列タスクが存在しない場合、タスク範囲解析部152は、ラベル名を取得しないことになる。
(S33)タスク範囲解析部152は、並列タスクがあるか否かを判定する。並列タスクがある場合、処理をステップS34に進める。並列タスクがない場合、処理をステップS38に進める。例えば、ステップS32でラベル名を取得できている場合、並列タスクがあることになる。一方、ステップS32でラベル名を取得できていない場合、並列タスクがないことになる。
(S34)関数呼び出し解析部153は、ステップS31で取得された関数呼び出し情報に基づいて、関数呼び出し関係を構築する。具体的には、関数呼び出し解析部153は、図16で例示したように、あるタスクから関数を呼び出す呼び出し関係、および、ある関数から他の関数を呼び出す呼び出し関係を構築する。
(S35)タスクコスト解析部154は、ステップS34で構築された関数呼び出し関係に基づいて、呼び出し先の関数も含めたタスク全体のコスト(スレッド数を示すパラメータを含むコスト)を見積もる。例えば、タスクAに対してAllC(タスクA,n)を見積もる。また、タスクBに対してAllC(タスクB,m)を見積もる。具体的な計算方法は、図17で例示した通りである。例えば、タスクコスト解析部154は、見積もり結果を、タスクコストテーブル132に登録する。
(S36)スレッド数判定部155は、タスク毎のスレッド数を決定する(詳細は後述される)。
(S37)スレッド数変更部156は、ステップS36で決定されたタスク毎のスレッド数を、オブジェクトファイルに埋め込む。オブジェクトファイルにスレッド数を埋め込む方法は、図19で例示した通りである。上記のオブジェクトファイル121,122,123,124に対する処理の場合、スレッド数変更部156は、これらのうちオブジェクトファイル121にスレッド数を埋め込むことになる。
(S38)リンカ150は、オブジェクトファイル121,122,123,124を用いて、実行可能ファイル131を生成し、実行可能ファイル記憶部130に格納する。ここで、ステップS37を実行している場合、オブジェクトファイル121には、タスク毎のスレッド数が埋め込まれており、当該スレッド数の変更結果が実行可能ファイル131に反映されることになる。
図22は、スレッド数決定処理の例を示すフローチャートである。以下、図22に示す処理をステップ番号に沿って説明する。以下の手順は、図21のステップS36に相当する。
(S41)スレッド数判定部155は、各タスクに割り当てるスレッド数を1にする。
(S42)スレッド数判定部155は、各タスクに割り当てているスレッド数の和(スレッド総数)が利用可能なコア数よりも小さいか(スレッド総数<コア数)否かを判定する。スレッド総数がコア数よりも小さい場合、処理をステップS43に進める。スレッド総数がコア数よりも小さい場合、各タスクに現在割り当てているスレッド数を各タスクへ割り当てるスレッド数として確定し、処理を終了する。
(S43)スレッド数判定部155は、各タスクに現在割り当てているスレッド数を用いて各タスクの総コストを求める。例えば、タスクAの総コストを求める場合、スレッド数判定部155は、現在のスレッド数をnに代入してAllC(タスクA,n)の値を求める。また、タスクBの総コストを求める場合、スレッド数判定部155は、現在のスレッド数をmに代入してAllC(タスクB,m)の値を求める。
(S44)スレッド数判定部155は、最も総コストの高いタスクのスレッド数を1増やす。そして、処理をステップS42に進める。
このようにして、スレッド数判定部155は、各タスクに対して割り当てるスレッド数を決定する。これにより、並列実行される各タスクの終了時刻の時間差を小さくすることができる。
図23は、ソースプログラムの他の例を示す図である。
第2の実施の形態では、並列タスクの数が2の場合を例示したが、並列タスクの数は3以上でもよい。例えば、図23では、割り当てスレッド数として、それぞれ6,4,2が指定された3つの並列タスク(図中“<タスク1>”、“<タスク2>”、“<タスク3>”と表記)を定義する場合を示している。
図24は、タスクと関数との入れ子構造の例を示す図である。
更に、第2の実施の形態では、各タスクが関数呼び出し命令を含む場合を例示したが、一部のタスクが関数呼び出し命令を含まないこともある。例えば、図24に示すように、並列実行可能な2つのタスクのうち、一方のタスクは、関数呼び出しを含む。もう一方のタスクは、ループ処理の記述を含むが、関数呼び出しを含まない。この場合、後者のタスク(関数呼び出しを含まないタスク)については、AllC(t,n)=C(t,n)となる。このように、並列タスクに、関数呼び出し命令を含むタスク、および、関数呼び出し命令を含まないタスクが混在する場合にも、第2の実施の形態の方法を適用して各タスクのスレッド数を決定できる。
以上で説明したように、コンパイラ140は、ソースファイル毎に、該当のソースファイル内で定義されている各タスクと各関数のサイクル数を、タスクまたは関数のコストとして個別に求める。また、コンパイラ140は、タスクと関数の呼び出し関係を求める。そして、コンパイラ140は、出力として、コストと呼び出し関係をオブジェクトファイルに埋め込む。リンカ150は、各オブジェクトファイルに含まれるコストと呼び出し関係を入力として受け取る。そして、リンカ150は、タスクと関数の呼び出し関係を構築し、タスクから呼び出される関数のコストを含めたタスク全体のコストを求める。
これにより、複数のソースファイルに跨ったタスクでも、タスク全体のコストを求めることができる。そして、求めたタスク全体のコストに応じて、並列に実行される各タスクの処理終了時刻ができる限り同じになるよう、各タスクへのスレッド数を調整できる。このため、コストを考慮せずにタスクへのスレッド数を割り当てるよりも、適切なスレッド数で各タスクを実行でき、全体の実行を短縮することができる。
コンパイラ140は、関数コスト情報や関数の呼び出し関係を、各オブジェクトファイルに埋め込むので、関数コスト情報や関数の呼び出し関係を別個のファイルで管理しなくてよい。リンカ150は、結合対象の各オブジェクトファイルを参照することで、関数コスト情報や関数の呼び出し関係の情報を取得することができる。
また、各タスクのコストを把握するために、実行可能ファイルを実行して各タスクのコストを測定しなくてもよい。更に、タスク全体を解析するために要するメモリ量は、ソースプログラム全体よりも少ない。そのため、ソースプログラムを一度にまとめて(例えば、1つのソースファイルにまとめて)解析するよりも、メモリ使用量が少なくて済む。
なお、第1の実施の形態の情報処理は、計算機1にプログラムを実行させることで実現できる。また、第2の実施の形態の情報処理は、情報処理装置100にプログラムを実行させることで実現できる。
プログラムは、コンピュータ読み取り可能な記録媒体13に記録できる。例えば、プログラムを記録した記録媒体13を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体13に記録されたプログラムまたは他のコンピュータから受信したプログラムを、RAM103やHDD104などの記憶装置に格納し(インストールし)、当該記憶装置からプログラムを読み込んで実行してもよい。
以上の第1,第2の実施の形態を含む実施形態に関し、更に以下の付記を開示する。
(付記1) ソースプログラムを記憶する記憶部と、
前記ソースプログラムのコンパイルの際に、前記ソースプログラムに含まれる関数毎の実行に要するサイクル数とタスクおよび関数の呼び出し関係とを示す情報を生成し、
リンク処理の際に、前記サイクル数および前記呼び出し関係に基づいてタスク毎の実行に要するサイクル数を算出する演算部、
を有するコンパイルを行う計算機。
(付記2) 前記演算部は、前記コンパイル時に生成された前記サイクル数および前記呼び出し関係の情報を前記コンパイルにより生成されたオブジェクトファイルに追加する、付記1記載の計算機。
(付記3) 前記演算部は、前記リンク処理の際に、結合対象の複数のオブジェクトファイルから前記コンパイル時に生成された前記サイクル数および前記呼び出し関係を取得する、付記1または2記載の計算機。
(付記4) 前記タスクおよび前記タスクから呼び出される前記関数は、異なるソースファイルに定義されている、付記1乃至3の何れか1つに記載の計算機。
(付記5) 前記コンパイル時に生成される前記サイクル数の情報は、前記タスクの定義に含まれる命令の実行に要するサイクル数を含む、付記1乃至4の何れか1つに記載の計算機。
(付記6) 前記記憶部は、命令とサイクル数との対応関係の情報を記憶し、
前記演算部は、前記コンパイルの際に、前記ソースプログラムから生成された命令列と前記対応関係に基づいて、前記サイクル数の情報を生成する、
付記1乃至5の何れか1つに記載の計算機。
(付記7) 前記演算部は、前記リンク処理の際に、前記呼び出し関係に基づいて前記タスクから呼び出される第1の関数および前記第1の関数から呼び出される第2の関数を特定し、前記第1の関数および前記第2の関数それぞれに関するサイクル数の和に基づいて前記タスクの実行に要するサイクル数を算出する、付記1乃至6の何れか1つに記載の計算機。
(付記8) 前記演算部は、前記リンク処理の際に、並列に実行可能な複数のタスクそれぞれのサイクル数に基づいて、前記複数のタスクそれぞれに割り当てるスレッド数を決定する、付記1乃至7の何れか1つに記載の計算機。
(付記9) 前記演算部は、前記複数のタスクそれぞれに割り当てるスレッド数の組み合わせの候補毎に前記複数のタスクそれぞれのサイクル数を算出し、前記複数のタスクそれぞれのサイクル数の差が最小になるスレッド数の組み合わせを選択する、付記8記載の計算機。
(付記10) 前記演算部は、決定したスレッド数の情報を前記コンパイルにより生成されたオブジェクトファイルに追加し、当該オブジェクトファイルを用いて実行可能ファイルを生成する、付記8または9記載の計算機。
(付記11) コンピュータに、
ソースプログラムのコンパイルの際に、前記ソースプログラムに含まれる関数毎の実行に要するサイクル数とタスクおよび関数の呼び出し関係とを示す情報を出力する、
処理を実行させるコンパイラプログラム。
(付記12) コンピュータに、
ソースプログラムのコンパイルの際に生成された、前記ソースプログラムに含まれる関数毎の実行に要するサイクル数とタスクおよび関数の呼び出し関係とを示す情報に基づいて、タスク毎の実行に要するサイクル数を算出する、
処理を実行させるリンクプログラム。
(付記13) コンピュータが、
ソースプログラムのコンパイルの際に、前記ソースプログラムに含まれる関数毎の実行に要するサイクル数とタスクおよび関数の呼び出し関係とを示す情報を生成し、
リンク処理の際に、前記サイクル数および前記呼び出し関係に基づいてタスク毎の実行に要するサイクル数を算出する、
コンパイル方法。
1 計算機
1a 記憶部
1b 演算部
2 コンパイラ
3 リンカ
4 第1のソースプログラム
4a 第1のオブジェクトファイル
5 第2のソースプログラム
5a 第2のオブジェクトファイル

Claims (9)

  1. 複数のタスクの定義を含む第1のソースプログラムと何れかのタスクで呼び出される複数の関数の定義を含む第2のソースプログラムとを記憶する記憶部と、
    前記第1および前記第2のソースプログラムのコンパイルの際に、前記第1のソースプログラムにおけるタスクの定義に応じた命令の実行に要する第1のサイクル数を示す情報と当該タスクで呼び出される関数を示す呼び出し関係情報とをタスク毎に生成し、前記第2のソースプログラムに含まれる関数の実行に要する第2のサイクル数を示す情報を関数毎に生成し、
    リンク処理の際に、前記呼び出し関係情報に基づく前記タスクで呼び出される関数の特定、および、前記タスクに対応する前記第1のサイクル数と特定した当該関数に対応する前記第2のサイクル数とに基づく前記タスクの実行に要するサイクル数算出を、タスク毎に実行する演算部、
    を有するコンパイルを行う計算機。
  2. 前記演算部は、前記第1のソースプログラムのコンパイル時に生成された前記第1のサイクル数を示す情報および前記呼び出し関係情報を前記第1のソースプログラムのコンパイルにより生成された第1のオブジェクトファイルに追加前記第2のソースプログラムのコンパイル時に生成された前記第2のサイクル数を示す情報を、前記第2のソースプログラムのコンパイルにより生成された第2のオブジェクトファイルに追加する、請求項1記載の計算機。
  3. 前記演算部は、前記リンク処理の際に、結合対象の前記第1のオブジェクトファイルから前第1のサイクル数および前記呼び出し関係情報を取得結合対象の前記第2のオブジェクトファイルから前記第2のサイクル数を取得する、請求項2記載の計算機。
  4. 前記演算部は、前記リンク処理の際に、並列に実行可能な複数のタスクそれぞれのサイクル数に基づいて、前記複数のタスクそれぞれに割り当てるスレッド数を決定する、請求項1乃至の何れか1項に記載の計算機。
  5. 前記演算部は、前記複数のタスクそれぞれに割り当てるスレッド数の組み合わせの候補毎に前記複数のタスクそれぞれのサイクル数を算出し、前記複数のタスクそれぞれのサイクル数の差が最小になるスレッド数の組み合わせを選択する、請求項記載の計算機。
  6. 前記演算部は、決定したスレッド数の情報を前記第1のソースプログラムのコンパイルにより生成された第1のオブジェクトファイルに追加し、前記第1のオブジェクトファイルを用いて実行可能ファイルを生成する、請求項または記載の計算機。
  7. コンピュータに、
    複数のタスクの定義を含む第1のソースプログラムのコンパイルの際に、前記第1のソースプログラムにおけるタスクの定義に応じた命令の実行に要する第1のサイクル数を示す情報と当該タスクで呼び出される関数を示す呼び出し関係情報とをタスク毎に出力し、
    何れかのタスクで呼び出される複数の関数の定義を含む第2のソースプログラムのコンパイルの際に、前記第2のソースプログラムに含まれる関数の実行に要する第2のサイクル数を示す情報を関数毎に出力する、
    処理を実行させるコンパイラプログラム。
  8. コンピュータに、
    複数のタスクの定義を含む第1のソースプログラムのコンパイルの際に生成された、前記第1のソースプログラムにおけるタスクの定義に応じた命令の実行に要する第1のサイクル数を示す情報と当該タスクで呼び出される関数を示す呼び出し関係情報とをタスク毎に取得し、
    何れかのタスクで呼び出される複数の関数の定義を含む第2のソースプログラムのコンパイルの際に生成された、前記第2のソースプログラムに含まれる関数の実行に要する第2のサイクル数を示す情報を関数毎に取得し、
    前記呼び出し関係情報に基づく前記タスクで呼び出される関数の特定、および、前記タスクに対応する前記第1のサイクル数と特定した当該関数に対応する前記第2のサイクル数とに基づく前記タスクの実行に要するサイクル数算出をタスク毎に実行する、
    処理を実行させるリンクプログラム。
  9. コンピュータが、
    複数のタスクの定義を含む第1のソースプログラムのコンパイルの際に、前記第1のソースプログラムにおけるタスクの定義に応じた命令の実行に要する第1のサイクル数を示す情報と当該タスクで呼び出される関数を示す呼び出し関係情報とをタスク毎に生成し、
    何れかのタスクで呼び出される複数の関数の定義を含む第2のソースプログラムのコンパイルの際に、前記第2のソースプログラムに含まれる関数の実行に要する第2のサイクル数を示す情報を関数毎に生成し、
    リンク処理の際に、前記呼び出し関係情報に基づく前記タスクで呼び出される関数の特定、および、前記タスクに対応する前記第1のサイクル数と特定した当該関数に対応する前記第2のサイクル数とに基づく前記タスクの実行に要するサイクル数算出をタスク毎に実行する、
    コンパイル方法。
JP2015121358A 2015-06-16 2015-06-16 計算機、コンパイラプログラム、リンクプログラムおよびコンパイル方法 Active JP6500626B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2015121358A JP6500626B2 (ja) 2015-06-16 2015-06-16 計算機、コンパイラプログラム、リンクプログラムおよびコンパイル方法
US15/165,419 US10089088B2 (en) 2015-06-16 2016-05-26 Computer that performs compiling, compiler program, and link program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2015121358A JP6500626B2 (ja) 2015-06-16 2015-06-16 計算機、コンパイラプログラム、リンクプログラムおよびコンパイル方法

Publications (2)

Publication Number Publication Date
JP2017010077A JP2017010077A (ja) 2017-01-12
JP6500626B2 true JP6500626B2 (ja) 2019-04-17

Family

ID=57588138

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015121358A Active JP6500626B2 (ja) 2015-06-16 2015-06-16 計算機、コンパイラプログラム、リンクプログラムおよびコンパイル方法

Country Status (2)

Country Link
US (1) US10089088B2 (ja)
JP (1) JP6500626B2 (ja)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114328168B (zh) * 2020-10-09 2024-07-02 腾讯科技(深圳)有限公司 异常检测方法、装置、计算机设备和存储介质
CN113778451B (zh) * 2020-11-17 2024-06-18 北京沃东天骏信息技术有限公司 文件加载方法、装置、计算机系统和计算机可读存储介质
CN113031961B (zh) * 2021-03-23 2023-04-07 北京百度网讯科技有限公司 编译方法、编译装置、电子设备、存储介质和程序产品
US11748155B1 (en) 2022-04-20 2023-09-05 Snowflake Inc. Declarative engine for workloads

Family Cites Families (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3039953B2 (ja) * 1989-04-28 2000-05-08 株式会社日立製作所 並列化装置
JPH06187309A (ja) 1992-12-21 1994-07-08 Hitachi Ltd プロセッサ割付制御方式
JPH06250988A (ja) 1993-02-26 1994-09-09 Nec Software Ltd 自動並列化処理方法
JPH0756723A (ja) * 1993-08-11 1995-03-03 Fujitsu Ltd コンパイラ装置
JPH11306026A (ja) * 1998-04-22 1999-11-05 Toshiba Corp コード最適化装置、コード最適化方法、及び、コード最適化プログラムを記録したコンピュータ読み取り可能な記録媒体
JP2003131888A (ja) * 2001-10-29 2003-05-09 Hitachi Ltd 手続き間命令スケジューリング方法
JP4132802B2 (ja) * 2001-12-07 2008-08-13 富士通株式会社 概略マルチタスクソフトウェアのシミュレーションを行う方法、装置及びプログラム
US7392366B2 (en) * 2004-09-17 2008-06-24 International Business Machines Corp. Adaptive fetch gating in multithreaded processors, fetch control and method of controlling fetches
US7886283B2 (en) * 2004-09-17 2011-02-08 The Regents Of The University Of California Phantom serializing compiler and method of operation of same
US7606694B1 (en) * 2006-03-24 2009-10-20 Xilinx, Inc. Framework for cycle accurate simulation
JP5040136B2 (ja) * 2006-03-27 2012-10-03 富士通セミコンダクター株式会社 チューニング支援装置、チューニング支援プログラム、チューニング支援プログラムを記録したコンピュータ読み取り可能な記録媒体およびチューニング支援方法
JP4784827B2 (ja) * 2006-06-06 2011-10-05 学校法人早稲田大学 ヘテロジニアスマルチプロセッサ向けグローバルコンパイラ
US20080271001A1 (en) * 2006-09-11 2008-10-30 Yo Nonomura Method of generating program, information processing device and microcomputer
US8032875B2 (en) * 2006-11-28 2011-10-04 Oracle America, Inc. Method and apparatus for computing user-specified cost metrics in a data space profiler
JPWO2008072334A1 (ja) 2006-12-14 2010-03-25 富士通株式会社 コンパイル方法及びコンパイラ
JP5353587B2 (ja) * 2009-09-11 2013-11-27 株式会社リコー 組み込み用プログラム開発装置及び組み込み用プログラム開発方法
US8887160B2 (en) * 2011-11-21 2014-11-11 Hewlett-Packard Development Company, L.P. Mapping tasks to execution threads
US8819653B2 (en) * 2012-01-30 2014-08-26 Cisco Technology, Inc. Automated improvement of executable applications based on evaluating independent execution heuristics
US20130227531A1 (en) * 2012-02-24 2013-08-29 Zynga Inc. Methods and Systems for Modifying A Compiler to Generate A Profile of A Source Code
US9134981B2 (en) * 2012-06-22 2015-09-15 Altera Corporation OpenCL compilation
RU2012127578A (ru) * 2012-07-02 2014-01-10 ЭлЭсАй Корпорейшн Анализатор применимости программного модуля для разработки и тестирования программного обеспечения для многопроцессорных сред
US20150363230A1 (en) * 2013-01-23 2015-12-17 Waseda University Parallelism extraction method and method for making program

Also Published As

Publication number Publication date
US10089088B2 (en) 2018-10-02
JP2017010077A (ja) 2017-01-12
US20160371068A1 (en) 2016-12-22

Similar Documents

Publication Publication Date Title
CN102165428B (zh) 软件应用性能增强
KR101559090B1 (ko) 이종 코어를 위한 자동 커널 마이그레이션
KR101759256B1 (ko) 사용자-주도 프로파일-구동 최적화들을 위한 프레임워크
US7882498B2 (en) Method, system, and program of a compiler to parallelize source code
US7877741B2 (en) Method and corresponding apparatus for compiling high-level languages into specific processor architectures
US8799881B2 (en) Program parallelization device and program product
US20130139137A1 (en) Systems and Methods for Customizing Optimization/Transformation/ Processing Strategies
JP6500626B2 (ja) 計算機、コンパイラプログラム、リンクプログラムおよびコンパイル方法
US10430191B2 (en) Methods and apparatus to compile instructions for a vector of instruction pointers processor architecture to enable speculative execution and avoid data corruption
US9195444B2 (en) Compiler method and compiler apparatus for optimizing a code by transforming a code to another code including a parallel processing instruction
US20180032320A1 (en) Computer-implemented method for allowing modification of a region of original code
KR20080093108A (ko) 프로그램 병렬 실행 시스템 및 방법
JP2019049843A (ja) 実行ノード選定プログラム、実行ノード選定方法及び情報処理装置
JP2012510661A (ja) 逐次コンピュータプログラムコードを並列処理する方法及びシステム
TWI743698B (zh) 解譯執行位元組碼指令流的方法及裝置
JP2008250838A (ja) ソフトウェア生成装置、方法、およびプログラム
US20210182041A1 (en) Method and apparatus for enabling autonomous acceleration of dataflow ai applications
JP2007080049A (ja) 組み込み用プログラム生成方法、組み込み用プログラム開発システム、及び情報テーブル部
CN113721899A (zh) 面向gpdsp的轻量级高效汇编代码编程方法及系统
Heid et al. Improved parallelization of legacy embedded software on soft-core MPSoCs through automatic loop transformations
JP2024118113A (ja) コンパイラ依存性抽出装置およびソースコード解析システム
Oliva et al. Speeding up thread-local storage access in dynamic libraries
Kavvadias et al. A portable specification of zero-overhead looping control hardware applied to embedded processors
Putkinen The operating environment of autovectorizing code generators
KR20110126504A (ko) 스택 풀기를 위한 방법 및 장치

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20180306

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20181127

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20181130

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20190124

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20190219

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20190304

R150 Certificate of patent or registration of utility model

Ref document number: 6500626

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150