(57)【要約】【課題】所要の実行性能を容易に得ることができるマルチコア分割のためのコンパイル技術を提供する。【解決手段】タスク化指示文を解析し、指定された箇所をタスク化する処理、および指定されたＣＰＵにタスクを配置する処理を採用する。このタスク分割コンパイル技術は、ユーザが指定した主要部分のタスク分割指示に従って、タスクを個別ＣＰＵに割当て、マルチコア分割を行なう。割当ＣＰＵの指示のない処理に関しては、主要タスクとの関連を呼出関係や依存関係から判断し、割当ＣＰＵを決定する。ＣＰＵ分割にあたっては、同一処理の複数ＣＰＵへの処理の複写配置も考慮し、処理速度と資源のバランスを考慮した効率的マルチコアタスク分割を実現する。【選択図】図５
2010204979.tif 000002
【特許請求の範囲】
【請求項１】
与えられた入力ソースコードプログラムを、コンピュータ装置に読み込んで、複数のＣＰＵで構成される並列計算機で並列実行可能なプログラムコードに変換するコンパイル方法であって、
前記入力ソースコードプログラム中に、独立して並列実行するプログラム部分であるタスク領域を指定するタスク化指示文を解析する処理と、
前記タスク化指示文の解析結果に基づいて前記タスク化指示文で指定されたプログラム領域であるタスク化領域をどの前記ＣＰＵに配置するかを決定すると共に、前記入力ソースコードプログラム中のタスク化指示文でタスク領域と指定されていないプログラム部分である非タスク化領域をどの前記ＣＰＵに配置するかを決定する、プログラム領域配置処理と、を含み、
前記プログラム領域配置処理は、タスク化領域と非タスク化領域の関係を解析した関連領域情報を生成する関連領域生成処理を含み、前記ＣＰＵへの前記非タスク化領域の配置を、前記関連領域情報を用いて行なう、コンパイル方法。
【請求項２】
前記タスク化指示文の解析結果に基づいて大域変数をどのＣＰＵに配置するかを決定する大域変数配置処理を更に含む、請求項１記載のコンパイル方法。
【請求項３】
前記タスク化指示文は、並列タスクとして実行すべきタスクと夫々のタスクを実行すべきＣＰＵの割り当てとを指示する記述を含む、請求項１記載のコンパイル方法。
【請求項４】
前記関連領域情報は、タスク化領域の関数と非タスク化領域の関数の呼出関係を特定する情報を持つ、請求項１記載のコンパイル方法。
【請求項５】
前記関連領域情報は、タスク化領域の大域変数使用状況と非タスク化領域の大域変数使用状況の関係を特定する情報を持つ、請求項２記載のコンパイル方法。
【請求項６】
前記プログラム領域配置処理は、一つの非タスク化領域を複数のＣＰＵに配置する複写配置処理を含む、請求項１記載のコンパイル方法。
【請求項７】
前記プログラム領域配置処理は、プログラム領域のＣＰＵ配置状況を解析し、前記複写配置を行なうことの優劣を判断する複写配置判断処理を含む請求項６記載のコンパイル方法。
【請求項８】
前記複写配置判断処理における優劣の判断は、前記非タスク化領域を配置しようとするＣＰＵのプログラム領域に配置余裕があるか否かによって行い、前記配置余裕がある場合に、複数のＣＰＵに一つの非タスク化領域を配置する、請求項７記載のコンパイル方法。
【請求項９】
入力ソースコードプログラムを複数のＣＰＵで構成される並列計算機で並列実行可能なプログラムコードに変換するコンパイラであって、
コンピュータ装置が前記コンパイラを読み込んで実行することにより、
前記入力ソースコードプログラム中に、独立して並列実行するプログラム部分であるタスク領域を指定するタスク化指示文を解析する処理と、
前記タスク化指示文の解析結果に基づいて前記タスク化指示文で指定されたプログラム領域であるタスク化領域をどの前記ＣＰＵに配置するかを決定すると共に、前記入力ソースコードプログラム中のタスク化指示文でタスク領域と指定されていないプログラム部分である非タスク化領域をどの前記ＣＰＵに配置するかを決定する、プログラム領域配置処理と、を制御し、
前記プログラム領域配置処理は、タスク化領域と非タスク化領域の関係を解析した関連領域情報を生成する関連領域生成処理を含み、前記ＣＰＵへの前記非タスク化領域の配置を、前記関連領域情報を用いて制御する、コンパイラ。
【請求項１０】
前記タスク化指示文の解析結果に基づいて大域変数をどのＣＰＵに配置するかを決定する大域変数配置処理を更に制御する、請求項９記載のコンパイラ。
【請求項１１】
前記タスク化指示文は、並列タスクとして実行すべきタスクと夫々のタスクを実行すべきＣＰＵの割り当てとを指示する記述を含む、請求項９記載のコンパイラ。
【請求項１２】
前記関連領域情報は、タスク化領域の関数と非タスク化領域の関数の呼出関係を特定する情報を持つ、請求項９記載のコンパイラ。
【請求項１３】
前記関連領域情報は、タスク化領域の大域変数使用状況と非タスク化領域の大域変数使用状況の関係を特定する情報を持つ、請求項１０記載のコンパイラ。
【請求項１４】
前記プログラム領域配置処理は、一つの非タスク化領域を複数のＣＰＵに配置する複写配置処理を含む、請求項９記載のコンパイラ。
【請求項１５】
前記プログラム領域配置処理は、プログラム領域のＣＰＵ配置状況を解析し、前記複写配置を行なうことの優劣を判断する複写配置判断処理を含む請求項１４記載のコンパイラ。
【請求項１６】
前記複写配置判断処理における優劣の判断は、前記非タスク化領域を配置しようとするＣＰＵのプログラム領域に配置余裕があるか否かによって行い、前記配置余裕がある場合に、複数のＣＰＵに一つの非タスク化領域を配置する、請求項１５記載のコンパイラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイル方法及びコンパイラに係わり、特に、逐次的に処理を行なうように記述されたプログラムを、自動的あるいはプログラマの指示に従って、並列に処理を行なうプログラムに変換する技術に関するものである。
【背景技術】
【０００２】
１台のコンピュータで同時に複数の処理を並行して行なうＯＳ（Operating System）の機能としてマルチタスクがある。マルチタスク向けシステム開発においては、独立した処理単位であるタスク単位で処理を行なう。タスクは、ＩＴＲＯＮ(非特許文献１)等のリアルタイムＯＳのカーネルを呼び出すことで実行される。
【０００３】
また、半導体プロセスの進歩により、１チップ内に複数ＣＰＵコアを搭載するマルチコアチップが登場しつつある(非特許文献２)。
【０００４】
また、逐次実行プログラムを並列化する技術として、プログラマが、逐次的に処理を行なうよう記述されたプログラムに対し、並列化を指示する指示文を挿入し、コンピュータが並列化コンパイラにより、その指示文を解析して並列処理を行なうプログラムに変換するものがある。例えば、共有メモリ型並列計算機向けの並列化言語であるOpenMP(非特許文献３)では、プログラマがループ並列化や変数のプライベート化等の指示文をプログラム中に挿入し、コンパイラはその指示に従って並列化変換を行なう。
【先行技術文献】
【非特許文献】
【０００５】
【非特許文献１】superHで学ぶμITRON仕様OS,鹿取祐二著(電波新聞社, ２００６, pp.３１−３７)
【非特許文献２】SH−２Aのマルチコア化とソフトウェアの対応, 吉永 健 (インターフェイス, ２００８年４月号, pp.１５４-１６３)
【非特許文献３】OpenMP C and C++ Application Program Interface Version ２.０ March ２００２，「平成２１年２月３日検索」、インターネット（http://www.openmp.org/）
【発明の概要】
【発明が解決しようとする課題】
【０００６】
マルチコアチップを想定したシステムにおいては、複数のＣＰＵでそれぞれ個別のマルチタスク処理が行なわれている場合がある。その場合、プログラマは、タスクを実行させるＣＰＵを意識し、タスク毎に実行するＣＰＵを決定する必要がある。
【０００７】
例えば、逐次実行プログラムをマルチタスク向けシステムに移植する場合、逐次実行プログラムの特定部分をタスクとして切出し、そのタスクを起動・実行させる必要がある。即ち、プログラムをタスクに分割し、個々のタスクを起動させるプログラムへと変換する必要があった。
【０００８】
また、マルチコアシステムへの移植の場合には、プログラムのタスク分割後、さらにタスクを実行するＣＰＵを決定する必要があり、タスクのマルチコア分割が必要となる。さらに、マルチコアシステムの場合には、大域変数の扱いも問題となる。タスクの分割の仕方によっては、別のＣＰＵで実行するタスクが同一の大域変数にアクセスする必要も生じる。システムが共通アクセス領域を備えており、共通アクセス領域に配置できれば問題ないが、特定のＣＰＵに大域変数を配置すると、別ＣＰＵで実行するタスクはアクセス出来ないシステムも存在する。共通アクセス領域を備えている場合でも、特定のＣＰＵからのアクセスしかない大域変数の場合は、そのＣＰＵに配置すればより高速なアクセスができるのが一般的であるので、大域変数をどのＣＰＵ(或いは共通領域)に配置するかの判断が重要になる。
【０００９】
逐次実行プログラムを、マルチタスク向けシステムに移植する場合、以上のような判断を行い、プログラマが手作業でプログラムする必要があった。
【００１０】
また、共有メモリ型並列計算機向けの並列化言語であるOpenMPでは、プログラマがループ並列化や変数のプライベート化等の指示文をプログラム中に挿入し、コンパイラはその指示に従って並列化変換を行なう必要があった。
【００１１】
以上のように、プログラムのタスク分割、及びタスクのマルチコア分割は、プログラムの実行性能に多大な影響を与えるが、何れの引用文献に記載された技術であっても、プログラマの経験に基づいた判断により、手作業で行なう必要があった。要するに、タスク分割されたプログラムに所要の実行性能を得るには、プログラマの能力に大きく依存し、且つ、プログラマに大きな負担がかかる。
【００１２】
本発明の目的は、マルチコアタスク分割を効率的に行なうことが出来るコンパイル方法およびコンパイラを提供することにある。
【００１３】
本発明の前記並びにその他の目的と新規な特徴は本明細書の記述及び添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１４】
本願において開示される発明のうち代表的なものの概要を簡単に説明すれば下記の通りである。
【００１５】
すなわち、コンパイル方法更にはそれを実現するためのコンパイラに、タスク化指示文を解析し、指定された箇所をタスク化する処理、および指定されたＣＰＵにタスクを配置する処理を採用する。このタスク分割コンパイル技術は、ユーザが指定した主要部分のタスク分割指示に従って、タスクを個別ＣＰＵに割当て、マルチコア分割を行なう。割当ＣＰＵの指示のない処理に関しては、主要タスクとの関連を呼出関係や依存関係から判断し、割当ＣＰＵを決定する。ＣＰＵ分割にあたっては、同一処理の複数ＣＰＵへの処理の複写配置も考慮し、処理速度と資源のバランスを考慮した効率的マルチコアタスク分割を実現する。
【発明の効果】
【００１６】
本願において開示される発明のうち代表的なものによって得られる効果を簡単に説明すれば下記のとおりである。
【００１７】
すなわち、本発明によれば、マルチコアタスク分割を効率的に行なうことが出来る。
【図面の簡単な説明】
【００１８】
【図１】本発明の実施形態を実施するコンパイラが動作する計算機システムを例示するブロック図である。
【図２】本発明の実施形態の適用を試みる逐次実行プログラムを例示する説明図である。
【図３】本発明の実施形態の入力となるタスク化指示文付きプログラムを例示する説明図である。
【図４】本発明の実施形態の出力となるタスク化並列実行プログラムを例示する説明図である。
【図５】本発明の一実施の形態であるタスク分割コンパイラの処理構成を例示する説明図である。
【図６】プログラム領域テーブルの構成を例示する説明図である。
【図７】プログラム領域配置テーブルの構成を例示する説明図である。
【図８】大域変数配置テーブルの構成を例示する説明図鵜である。
【図９】タスク分割コンパイラの全体的な処理手順を例示するフローチャートである。
【図１０】タスク化指示文解析処理を例示するフローチャートである。
【図１１】関連領域生成処理を例示するフローチャートである。
【図１２】プログラム領域配置候補生成処理を例示するフローチャートである。
【図１３】プログラム領域配置決定処理を例示するフローチャートである。
【図１４】関連変数生成処理を例示するフローチャートである。
【図１５】変数配置候補生成処理を零時知るフローチャートである。
【図１６】変数配置決定処理を例示するフローチャートである。
【図１７】タスク化変換処理を例示するフローチャートである。
【発明を実施するための形態】
【００１９】
１．実施の形態の概要
先ず、本願において開示される発明の代表的な実施の形態について概要を説明する。代表的な実施の形態についての概要説明で括弧を付して参照する図面中の参照符号はそれが付された構成要素の概念に含まれるものを例示するに過ぎない。
【００２０】
〔１〕本発明の実施形態に係るコンパイル方法は、与えられた入力ソースコードプログラムを、コンピュータ装置に読み込んで、複数のＣＰＵで構成される並列計算機で並列実行可能なプログラムコードに変換する方法である。この方法は、入力ソースコードプログラム中に、独立して並列実行するプログラム部分であるタスク領域を指定するタスク化指示文を解析する処理（９０１）と、タスク化指示文の解析結果に基づいてタスク化指示文で指定されたプログラム領域であるタスク化領域をどのＣＰＵに配置するかを決定すると共に、入力ソースコードプログラム中のタスク化指示文でタスク領域と指定されていないプログラム部分である非タスク化領域をどのＣＰＵに配置するかを決定する、プログラム領域配置処理（９０２）と、を含む。プログラム領域配置処理は、タスク化領域と非タスク化領域の関係を解析した関連領域情報を生成する関連領域生成処理（９０２１）を含み、ＣＰＵへの非タスク化領域の配置を、関連領域情報を用いて行なう。
【００２１】
〔２〕項１のコンパイル方法は更に、タスク化指示文の解析結果に基づいて大域変数をどのＣＰＵに配置するかを決定する大域変数配置処理（９０３）を含む。
【００２２】
〔３〕項１のコンパイル方法において、タスク化指示文は、並列タスクとして実行すべきタスクと夫々のタスクを実行すべきＣＰＵの割り当てとを指示する記述を含む。
【００２３】
〔４〕項１のコンパイル方法において、関連領域情報は、タスク化領域の関数と非タスク化領域の関数の呼出関係を特定する情報（４６，４７）を持つ。
【００２４】
〔５〕項２のコンパイル方法において、関連領域情報は、タスク化領域の大域変数使用状況と非タスク化領域の大域変数使用状況の関係を特定する情報（４８）を持つ。
【００２５】
〔６〕項１のコンパイル方法において、プログラム領域配置処理は、一つの非タスク化領域を複数のＣＰＵに配置する複写配置処理（１３０７，１３０８）を含む。
【００２６】
〔７〕項６のコンパイル方法において、プログラム領域配置処理は、プログラム領域のＣＰＵ配置状況を解析し、複写配置を行なうことの優劣を判断する。
【００２７】
〔８〕項７のコンパイル方法において、複写配置判断処理における優劣の判断は、非タスク化領域を配置しようとするＣＰＵのプログラム領域に配置余裕があるか否かによって行い、配置余裕がある場合に、複数のＣＰＵに一つの非タスク化領域を配置する。
【００２８】
〔９〕本発明の実施形態に係るコンパイラ（１０８）は、入力ソースコードプログラムを複数のＣＰＵで構成される並列計算機で並列実行可能なプログラムコードに変換するソフトウェアプログラムである。このコンパイラは、コンピュータ装置がコンパイラを読み込んで実行することにより、入力ソースコードプログラム中に、独立して並列実行するプログラム部分であるタスク領域を指定するタスク化指示文を解析する処理と、タスク化指示文の解析結果に基づいてタスク化指示文で指定されたプログラム領域であるタスク化領域をどのＣＰＵに配置するかを決定すると共に、入力ソースコードプログラム中のタスク化指示文でタスク領域と指定されていないプログラム部分である非タスク化領域をどのＣＰＵに配置するかを決定する、プログラム領域配置処理と、を制御する。プログラム領域配置処理は、タスク化領域と非タスク化領域の関係を解析した関連領域情報を生成する関連領域生成処理を含み、ＣＰＵへの非タスク化領域の配置を、関連領域情報を用いて制御する。
【００２９】
〔１０〕項９のコンパイラは更に、タスク化指示文の解析結果に基づいて大域変数をどのＣＰＵに配置するかを決定する大域変数配置処理を更に制御する。
【００３０】
〔１１〕項９のコンパイラにおいて、タスク化指示文は、並列タスクとして実行すべきタスクと夫々のタスクを実行すべきＣＰＵの割り当てとを指示する記述を含む。
【００３１】
〔１２〕項９のコンパイラにおいて、関連領域情報は、タスク化領域の関数と非タスク化領域の関数の呼出関係を特定する情報を持つ。
【００３２】
〔１３〕項１０のコンパイラにおいて、関連領域情報は、タスク化領域の大域変数使用状況と非タスク化領域の大域変数使用状況の関係を特定する情報を持つ。
【００３３】
〔１４〕項９のコンパイラにおいて、プログラム領域配置処理は、一つの非タスク化領域を複数のＣＰＵに配置する複写配置処理を含む。
【００３４】
〔１５〕項１４のコンパイラにおいて、プログラム領域配置処理は、プログラム領域のＣＰＵ配置状況を解析し、複写配置を行なうことの優劣を判断する複写配置判断処理を含む。
【００３５】
〔１６〕項１５のコンパイラにおいて、複写配置判断処理における優劣の判断は、非タスク化領域を配置しようとするＣＰＵのプログラム領域に配置余裕があるか否かによって行い、配置余裕がある場合に、複数のＣＰＵに一つの非タスク化領域を配置する。
【００３６】
２．実施の形態の詳細
実施の形態について更に詳述する。以下の説明では、逐次実行プログラムを、マルチタスク向けシステムに移植する場合を一例とする。
【００３７】
最初に、本発明の実施形態に係るコンパイラで生成されるプログラムを実行するデータ処理システムとしてのマルチコアシステムについて簡単に述べる。本マルチコアシステムは、複数のＣＰＵコアを持ち、全ＣＰＵがアクセス可能な共通領域を備えている。ここでは、簡単のため、ＣＰＵ１、ＣＰＵ２の２つのＣＰＵが存在するものとする。タスクはＣＰＵ１又はＣＰＵ２のうちの任意のＣＰＵが実行するプログラムに配置可能であり、同一内容のタスクを複数のＣＰＵのプログラム領域に配置することも可能である。また、タスクは、他ＣＰＵのタスクも呼び出すことも可能であるが、自ＣＰＵのプログラム領域に配置されたタスクの方が効率的である。共有領域に配置した大域変数へのアクセスは、全てのＣＰＵからアクセス可能であるが、個別ＣＰＵに配置した大域変数はそのＣＰＵからしかアクセスできないものとする。大域変数へのアクセスに関しても、自ＣＰＵのプログラム領域に配置された大域変数へのアクセスの方が、共通領域に配置された大域変数へのアクセスよりも効率的である。
【００３８】
図１は、本発明の実施形態のコンパイル方法を実施するコンパイラが実行される計算機システムの構成図である。計算機システムは、ＣＰＵ１０１、ディスプレイ装置１０２、キーボード１０３、主記憶装置１０４、外部記憶装置１０５より構成されている。
【００３９】
ＣＰＵ１０１はキーボード１０３より、ユーザからのコンパイラ起動命令を受け付ける。コンパイラ終了メッセージや、エラーメッセージは、ディスプレイ装置１０２に表示される。外部記憶装置１０５には、入力ソースプログラム１０６と出力プログラム１０７が格納される。入力ソースプログラムはコンパイルの対象とする逐次実行プログラムとしてのソースプログラムである。出力プログラム１０７は、入力ソースプログラム１０６をコンパイルして得られたマルチコアシステムのためにプログラムである。
【００４０】
主記憶装置１０４には、コンパイル方法を実現するためのソフトウェアプログラムとしてのコンパイラ１０８が格納されると共に、コンパイル過程で必要となる中間語３、プログラム領域テーブル４、プログラム領域配置テーブル５、大域変数配置テーブル６が格納される。
【００４１】
コンパイル処理は、ＣＰＵ１０１によって制御される。即ち、ＣＰＵ１０１がコンパイラ１０８を実行する。本実施形態のコンパイル方法によって生成された出力プログラム１０７は、マルチコア実行環境１０９で実行される。マルチコア実行環境１０９は上記マルチコアシステムである。以下の各図面においては、特に言及しない限りＣＰＵ１０１を動作主体として説明する。
【００４２】
図２は、本実施形態の適用を試みる逐次実行プログラム例である。
【００４３】
１０６行目のmain関数では、１１２行目のfuncA、１１８行目のfuncB、１２４行目のfuncCの各関数が順に呼ばれている。funcA、funcB、funCは、１３４行目のfuncD、１３５行目のfuncEを共通関数として呼び出すほか、１３０行目のfuncA１、１３１行目のfuncB１、１３２行目のfuncC１の各固有関数の呼び出しを行なっている。また、１０１行〜１０５行目では、gA〜gEの５つの大域変数が宣言され、それぞれfuncA１〜funcC１、funcD、funcEでアクセスされている。
【００４４】
図３は、図２の逐次プログラムに対し、タスク化指示を付与したタスク化指示付き逐次実行プログラムの例であり、これが、本実施の形態におけるタスク分割コンパイラ１０８の入力となるものである。即ち、これが入力ソースプログラム１０６になる。
【００４５】
２０８行目の「#pragma tsks」は、以降の{}で囲まれた部分を並列タスクとして実行することをコンパイラ１０８に指示する記述である。また、２０９行目の「#pragma tsk TskA cpu(１)」は、以降の{}で囲まれた部分を独立したタスクTskAとしてＣＰＵ１で実行することを指示するものである。２１２行目、２１５行目も同様である。その他の記述は図２と同じである。「#pragma tsks」とこれ以降の{}で囲まれた部分、すなわち、２０８行目から２１１６行目の記述は、独立して並列実行するプログラム部分であるタスク領域を指定するタスク化指示文として位置付けられる。
【００４６】
図４は、図３のプログラムに対し、本実施形態を適用した結果得られるタスク分割後のタスク化並列実行プログラムの例である。タスク分割後のプログラムは、オブジェクトプログラムでもソースプログラムでもよいが、図４では、代表してソースプログラムの形式で示している。タスク分割後のプログラムは出力プログラム１０７とされる。
【００４７】
本実施の形態では、上述の如く、独立して稼動する２つのＣＰＵ(ＣＰＵ１とＣＰＵ２)で実行されるマルチコア環境を想定している。図４では、ＣＰＵ１用プログラム(３０１行目から３２３行目)とＣＰＵ２用プログラム(４０１目行から４２７行目)の両者を例示している。
【００４８】
タスク化並列実行プログラムは、タスクが起動されることにより処理が実行される。図４の３０６行から３０８行目のact_tskは、それぞれタスクTskA、TskB、TskCの起動を表している。また、３１３行目のext_tsk（TskＡ）は、タスクTskAの終了を示している。同様に、４０６行目のext_tsk（TskＢ）は、タスクTskBの終了を示し、４１１行目のext_tsk（TskC）は、タスクTskCの終了を示している。
【００４９】
図５に、本発明の一つの実施の形態であるタスク分割コンパイラ１０８の処理構成を示す。
【００５０】
図５においてタスク分割指示付きソースプログラムは、図３で示したタスク分割指示付きソースプログラムの呼出関連等を図式化したもので、タスク指定、タスク関連処理、大域変数アクセスの状況を示している。図においては、理解を容易化するために一部の図示を省略している。
【００５１】
タスク指定されたのは、関数funcA、funcB、funcCの呼出処理で、それぞれ、タスクTskA、TskB、TskCのタスク名称がつけられている。関数funcAは固有の関数funcA１を呼び出すほか、共通関数funcD、funcEを呼び出している。関数funcB、funcも同様である。また、関数funcA〜funcCは、それぞれ大域変数gA〜gCへのアクセスがあることを示している。
【００５２】
タスク分割コンパイラ１０８は、タスク化指示文解析９０１、プログラム領域配置９０２、大域変数配置９０３の各処理を持つ。
【００５３】
タスク化指示文解析処理９０１は、入力となるタスク分割指示付きソースプログラム１０６の指示文を解析し、プログラム領域テーブル４を生成する。
【００５４】
プログラム領域配置処理９０２は、プログラム領域テーブル４を入力とし、プログラム領域のＣＰＵ配置を決定したプログラム領域配置テーブル５を生成する。
【００５５】
大域変数配置処理９０３は、プログラム領域テーブル４を入力とし、大域変数のＣＰＵ配置を決定した大域変数置テーブル６を生成する。
【００５６】
プログラム領域配置テーブル５と大域変数置テーブル６から最終的なＣＰＵ配置が決定され、マルチコア実行環境１０９へと出力される。
【００５７】
なお、中間語３は全般的に参照するため、タスク分割コンパイラ１０８内の入出力関係は、主要なもののみを示した。
【００５８】
マルチコア実行環境１０９においては、ＣＰＵ配置の状況を図示したもので、例えば、ＣＰＵ１にTskA,funcA,funcA１,funcD,funcE,gAが配置されることを示している。図からわかるように、ＣＰＵ配置は、タスク分割コンパイラ１０８のプログラム領域配置テーブル５と大域変数置テーブル６に従って配置されている。
【００５９】
図６は上記プログラム領域テーブル４の構成例を示し、図３で示された入力プログラムに対する生成例となっている。
【００６０】
プログラム領域テーブル４は、入力プログラムをタスク分割指示に従って分割したものであり、タスク名称や、ユーザ指定ＣＰＵ等の情報を保持している。
【００６１】
テーブルの各エントリは、領域番号４１、領域名称４２、行番号４３、ＣＰＵ指定４４、タスク番号４５、直接関連領域番号４６、関連領域番号４７、アクセス大域変数４８からなる。
【００６２】
領域番号４１、領域名称４２には、それぞれプログラム領域に与えられた領域番号とその領域名称が格納される。領域名称４２は、各領域に対して付与された一意な名称であり、タスク化指定領域に対してはユーザ指定のタスク名称、それ以外に関しては関数名称で表している。
【００６３】
行番号４３は、各プログラム領域を、入力ソースの行番号の開始行から終了行で表現している。
【００６４】
ＣＰＵ指定４４には、プログラム領域にユーザ指定ＣＰＵがある場合、指定されたＣＰＵ番号が格納されている。本実施例では、ユーザ指定ＣＰＵは、タスク化領域指定にのみ指定可能なので、図６では、タスク化領域である領域番号１から３(領域名称TskA,TskB,TskC)にのみＣＰＵ指定があり、その他のプログラム領域には指定なしを示す「-」で示している。要するに、この例では、入力ソースプログラム１０６においてタスクにはＣＰＵが指定され、ＣＰＵが指定されていない関数等の非タスクに対するＣＰＵの指定を後述の如く最適に行おうとするものである。
【００６５】
タスク番号４５は、プログラム領域がタスク化される場合のタスク番号が付与されている。プログラム領域がタスク化されない場合は、非タスク化領域となるため、タスクではないことを示すため、タスク番号は０で示されている。
【００６６】
直接関連領域番号欄４６は、プログラム領域の呼び出し関係を表しており、各プログラム領域が直接呼び出す呼出先のプログラム領域番号が格納されている。例えば、領域番号５の関数funcAは、領域番号８、１１、１２の関数funcA１、funcD、funcEを呼び出すので、関数funcAの直接関連領域には「８,１１,１２」が示されている。
【００６７】
関連領域番号欄４７は、プログラム領域の呼び出し関係を表しており、各プログラム領域の全ての呼出元のプログラム領域番号が格納されている。例えば、領域番号１のタスクTskAは、直接呼出しの関数funcA(領域番号５)の他に、関数funcAから呼び出される関数funcA１、funcD、funcEを間接的に呼び出すので、タスクTskAの関連領域には「５,８,１１,１２」が示されている。
【００６８】
アクセス大域変数４８は、各プログラム領域がアクセスする大域変数の情報が格納されている。なお、大域変数は大域配置テーブル６の変数番号で示されている。例えば、領域番号８の関数funcA１は、変数番号１のgAにアクセスする可能性があることを、アクセス大域変数欄の「１」が示している。
【００６９】
図７にはプログラム領域配置テーブル５の構成例が示され、これは図３に示された入力プログラムに対する生成例となっている。
【００７０】
プログラム領域配置テーブル５は、図６で示したプログラム領域の個別ＣＰＵへの配置方法を表したもので、各エントリは、領域番号５１、領域名称５２、ＣＰＵ配置候補集合５３、配置ＣＰＵ集合５４からなる。領域番号５１、領域名称５２は、プログラム領域に与えられた領域番号とその領域名称であり、図６の領域番号４１、領域名称４２域名称と同一の内容である。
【００７１】
ＣＰＵ配置候補集合５３は、各プログラム領域の配置ＣＰＵ候補を表しており、ユーザ指定ＣＰＵとプログラム領域の呼び出し関係に基づき、タスク分割コンパイラによって算出するものである。図７の例では、領域番号１１の関数funcDは、ＣＰＵ配置候補として、ＣＰＵ１とＣＰＵ２を挙げていることが分かる。
【００７２】
配置ＣＰＵ集合５４は、各プログラム領域の配置ＣＰＵを表しており、ＣＰＵ配置候補集合５３から、タスク分割コンパイラが最終的に配置するＣＰＵを選択した結果を示している。図７の例では、領域番号１２の関数funcEは、ＣＰＵ配置候補として、ＣＰＵ１とＣＰＵ２を挙げているが、ＣＰＵ１のみに配置することを決定したことが分かる。
【００７３】
図８には大域変数配置テーブル６の構成例が示され、これは図３で示された入力プログラムに対する生成例となっている。
【００７４】
大域変数配置テーブル６は、プログラム中に現れる大域変数の個別ＣＰＵへの配置方法を表したもので、各エントリは、変数番号６１、変数名称６２、関連領域集合６３、配置候補集合６４、配置領域６５からなる。変数番号６１と変数名称６２には、それぞれ大域変数に与えられた大域変数番号とその変数名称が格納される。関連領域集合６３は、当該大域変数に対するアクセスする可能性のあるプログラム領域を、プログラム領域番号の集合の形式で示している。
【００７５】
例えば、変数番号１のgAは、プログラム領域番号８(funcA１)、１(TskA)、４(main)の呼び出しでアクセスされる可能性があることを示している。なお、直接のアクセスがあるのは、プログラム領域番号８(funcA１)のみであるが、プログラム領域番号１(TskA)、４(main)もプログラム領域番号８(funcA１)を呼び出す可能性があるので、このような関連領域集合となっている。
【００７６】
配置候補集合６４は、各大域変数の配置ＣＰＵ候補を表しており、プログラム領域のアクセス大域変数、呼び出し関係に基づき、タスク分割コンパイラが算出するものである。図８の例では、変数番号５のgEは、ＣＰＵ配置候補として、ＣＰＵ１とＣＰＵ２を挙げていることが分かる。
【００７７】
配置領域６５は、各大域変数の配置ＣＰＵを表しており、配置候補集合６４から、タスク分割コンパイラが最終的に配置するＣＰＵを選択した結果を示している。図８の例では、変数番号５のgEは、配置候補として、ＣＰＵ１とＣＰＵ２を挙げているが、ＣＰＵ１に配置することを決定したことが分かる。
【００７８】
以下、それらのテーブルを生成／参照し、タスク分割を実現するタスク分割コンパイラの処理手順について説明する。
【００７９】
図９にはタスク分割コンパイラの全体的な処理手順が例示される。字句構文解析２０１では、入力ソースプログラム１０６を入力として字句構文解析を行ない、中間語３を出力する。
【００８０】
タスク化指示文解析９０１は中間後３を入力とし、タスク化指示文に従ってプログラム領域を分割したプログラム領域テーブル４生成する。
【００８１】
プログラム領域配置処理９０２は、中間語３とプログラム領域テーブル４を入力とし、各プログラム領域のＣＰＵ配置を決定するプログラム領域配置テーブル５を生成する。なお、プログラム領域配置処理９０２は、関連領域生成９０２１、プログラム領域配置候補生成９０２２、プログラム領域配置決定９０２３の各処理からなる。
【００８２】
大域変数配置処理９０３は、中間語３と大域変数テーブルを入力とし、各大域変数のＣＰＵ配置を決定する大域変数配置テーブル６を生成する処理である。なお、大域変数配置処理は、関連変数生成９０３１、変数配置候補生成９０３２、変数配置決定９０３３の各処理からなる。
【００８３】
タスク化変換処理９０４は、中間語３とプログラム領域テーブル４、プログラム領域配置テーブル５、及び大域変数配置テーブル６を入力とし、タスク化指定領域をタスク形式に変換後、プログラム領域配置テーブル５、大域変数配置テーブル６に従って中間語をＣＰＵに配置する処理である。
【００８４】
コード生成処理２０２は、中間語を最終的な出力プログラム１０７(オブジェクトプログラムないし、マルチコア実行環境用ソースファイル)の形式に変換する処理である。
【００８５】
図１０はタスク化指示文解析処理の処理手順を例示するフローチャートであり、図９のタスク化指示文解析処理９０１の手順を表している。
【００８６】
まず、ステップ１００１で、新規にプログラム領域Ｒを生成し、プログラム領域テーブルに登録する。次に、未処理中間語Ｎの有無を調べ(ステップ１００２)、存在しない場合は処理を終了し、存在する場合はステップ１００３以下の処理を行なう。ステップ１００３では、タスク化指示文か否かを判定し、そうであった場合は、プログラム領域ＲにＮを登録(ステップ１００４)し、次の未処理中間語を処理するために、ステップ１００２に進む。ステップ１００３でタスク化指示文と判定された場合は、未処理中間語ＮにユーザＣＰＵ指定Ｃがあるか否かを判定(ステップ１００５)し、ユーザＣＰＵの指定がある場合はプログラム領域Ｒのユーザ指定ＣＰＵにＣを登録後、ステップ１００７に進む。ステップ１００７では、後続の未処理中間語Ｍが存在するか否かを判定し、存在しない場合は処理を終了、存在した場合は、未処理中間語Ｍがタスク化指示の終端か否かを判定(ステップ１００８)する。終端であった場合は、ステップ１００１に進み、次のプログラム領域の処理に進む。
【００８７】
終端でなかった場合は、未処理中間語ＭをＲに登録(ステップ１００９)後、ステップ１００７に進み、後続の中間語の走査を続行する。
【００８８】
図１１は関連領域生成処理の処理手順を例示するフローチャートであり、図９の関連領域生成処理９０２１の手順を表している。
【００８９】
プログラム領域テーブルを走査し、未処理プログラム領域Ｒの有無を調べ(ステップ１１０１)、存在した場合は、中間語３のＲに対応する領域を調べ、未処理関数呼出があるか否かを判定する(ステップ１１０２)。未処理関数呼出Ｆが存在した場合は、プログラム領域テーブルからＦのプログラム領域ＦＲを求め(ステップ１１０３)、ＦＲの関連領域にＲを登録する(ステップ１１０４)。ステップ１１０２で未処理関数呼出がないと判定されるまで以上の処理を繰返し、ステップ１１０１に進み次のプログラム領域の走査に移る。全てのプログラム領域の走査終了時には、ステップ１１０１で未処理プログラム領域がないと判定され、ステップ１１０５に進む。
【００９０】
ステップ１１０５では、再度プログラム領域テーブルを走査し、未処理プログラム領域Ｑを判定する。Ｑが存在する場合は、Ｑの関連領域(ステップ１１０１からステップ１１０４で登録したもの)をＱＳとし、ＱＳに未処理関連領域ＱＳＲが存在するか否かを判定(ステップ１１０７)する。ＱＳＲが存在する場合は、ＱＳにＱＳＲを加える処理を、ステップ１１０７で未処理関連領域がなくなるまで反復実行後、ステップ１１０５に進み次のプログラム領域の走査に移る。全てのプログラム領域の走査が終わると、ステップ１１０５の判定後、終了となる。
【００９１】
図１１の処理により、あるプログラム領域から呼び出す(呼出先のさらに呼出先まで含めた)全ての関連領域を求めることができる。
【００９２】
図１２はプログラム領域配置候補生成処理の処理手順を例示するフローチャートであり、図９のプログラム領域配置候補生成９０２２の手順を表している。
【００９３】
プログラム領域テーブルを走査し、未処理プログラム領域Ｐの有無を調べ(ステップ１２０１)、存在した場合は、ＰにユーザＣＰＵ指定があるか否かを判定(ステップ１２０２)する。ＣＰＵ指定Ｕがある場合は、ＵをＰの配置候補に追加(ステップ１１０３)後、ステップ１２０１に進み、次のプログラム領域の処理を行なう。ＣＰＵ指定Ｕがない場合は、Ｐに未処理関連領域Ｑがあるか否かを調べ(ステップ１２０４)、存在する場合はＱのＣＰＵ指定の有無を調べる(ステップ１２０５)。ＱにＣＰＵ指定Ｃがある場合は、ＣをＰの配置候補に加え(ステップ１２０６)、ステップ１２０４に進み、次の関連領域の処理を行なう。以上の処理を、未処理関連領域がなくなるまで行い、全ての関連領域を処理し終わった後、ステップ１２０１に進み、次のプログラム領域の処理を行なう。全てのプログラム領域の処理が終了すると、ステップ１２０１の判定がNoとなり全処理が終了する。
【００９４】
図１２の処理により、あるプログラム領域の全ての関連領域のユーザＣＰＵ指定を網羅することができる。
【００９５】
図１３はプログラム領域配置決定処理の処理手順を例示するフローチャートであり、図９のプログラム領域配置決定９０２３の手順を表している。
【００９６】
プログラム領域テーブルを走査し、未処理プログラム領域Ｐの有無を調べ(ステップ１３０１)、存在した場合は、まず配置ＣＰＵ集合を空集合で初期化する(ステップ１３０２)。次にＰにＣＰＵ配置候補があるか否かを判定(ステップ１３０３)し、ない場合はＣＰＵ配置集合にデフォルト配置ＣＰＵを加えた(ステップ１３０４)後、ステップ１３０１で、次のプログラム領域の処理に移る。未処理プログラム領域ＰにＣＰＵ配置候補がある場合は、プログラム領域Ｐに未処理のＣＰＵ配置候補Ｃがあるか否かを判定し(ステップ１３０５)、ある場合は、未処理のＣＰＵ配置候補Ｃがユーザ指定ＣＰＵかどうかを調べる(ステップ１３０６)。未処理ＣＰＵ配置候補Ｃがユーザ指定ＣＰＵの場合はステップ１３０８に進み、配置ＣＰＵ集合にＣを加えた後、ステップ１３０５に進み、次のＣＰＵ配置候補の処理を行なう。未処理ＣＰＵ配置候補Ｃがユーザ指定ＣＰＵではない場合は、未処理のプログラム領域ＰをＣＰＵ配置候補Ｃに複写配置可能かどうか、即ち、未処理プログラム領域ＰのプログラムにもＣＰＵ配置候補ＣのＣＰＵを割当て可能かどうか、を調べ(ステップ１３０７)、複写配置可能な場合はステップ１３０８に進みＣＰＵ配置候補とするが、複写配置不能な場合は、Ｃでの配置をあきらめステップ１３０５へと進み他のＣＰＵ配置候補の処理を行なう。全てのＣＰＵ配置候補を処理し終えると、ステップ１３０５の判定がNoとなり、ステップ１３０１に進み、次のプログラム領域の処理を行なう。処理すべきプログラム領域がなくなるとステップ１３０１の判定がNoとなり、全ての処理が終了する。
【００９７】
図１３の処理により、個々のプログラム領域に対し、ＣＰＵ配置候補集合から配置すべきＣＰＵ集合であるＣＰＵ配置集合(複数ＣＰＵに配置可能な場合もある)が確定する。これにより、ユーザのプログラム領域に対するＣＰＵ配置指定に従って、関連するプログラム領域のＣＰＵ配置を行なうことができるプログラム領域配置テーブルが生成される。
【００９８】
なお、本実施の形態では、常に複写配置の方が高速であることを仮定している。すなわち、複数のＣＰＵがそれぞれ実行することになる非タスク処理についてはそれぞれのＣＰＵのプログラム領域に配置することが、それぞれのＣＰＵによるデータ処理の高速化に資することができる。そのため、ステップ１３０７では、プログラム領域の大きさを調べ、該当するＣＰＵにまだ配置余地があるかどうかによって判断することにしている。該当するＣＰＵにまだ配置余地があるかどうかとは、当該ＣＰＵのためのプログラム領域に空き容量があるか否か等を考慮して判定される。
【００９９】
図１４は関連変数生成処理の処理手順を例示するフローチャートであり、図９の関連変数生成９０３１の手順を表している。
【０１００】
プログラム領域テーブル４を走査し、未処理プログラム領域Ｐの有無を調べ(ステップ１４０１)、存在した場合は、Ｐに未処理大域変数Ｘのアクセスがあるか否かを判定(ステップ１４０２)する。存在する場合は、Ｘが大域変数テーブルに登録済みかどうかを判定(ステップ１４０３)し、未登録の場合は登録(ステップ１４０４)する。その後、Ｐの関連変数にＸを登録し、ステップ１４０２に進み、次の大域変数の処理を行なう。全ての大域変数の処理を終えたら、ステップ１４０１に進み、次のプログラム領域の処理を行なう。全てのプログラム領域の処理を終えると、ステップ１４０１の判定がNoとなり、ステップ１４０６以降の処理に移る。
【０１０１】
ステップ１４０６では、再度プログラム領域テーブル４を走査し、未処理プログラム領域Ｑの有無を調べ、存在した場合は、Ｑの関連領域をＱＲ(ステップ１４０７)とする。ＱＲに未処理関連領域ＱＲＣがあるかどうかを調べ(ステップ１４０８)、ＱＲＣがある場合はＱの関連変数にＱＲＣを登録(ステップ１４０９)する。全ての関連領域の処理を終えると、ステップ１４０８の判定がNoとなり、ステップ１４０６に進み次のプログラム領域の処理を行なう。また、全てのプログラム領域の処理を終えると、ステップ１４０６の判定がNoとなり、全処理が終了する。
【０１０２】
図１４の処理により、あるプログラム領域の全ての関連領域の大域変数アクセスを網羅する関連変数を生成することができる。
【０１０３】
図１５は変数配置候補生成処理の処理手順を例示するフローチャートであり、図９の変数配置候補生成９０３２の手順を表している。
【０１０４】
プログラム領域テーブル４を走査し、未処理プログラム領域Ｐの有無を調べ(ステップ１５０１)、存在した場合は、Ｐに未処理関連変数Ｘがあるか否かを判定(ステップ１５０２)する。未処理関連変数Ｘがある場合は、大域変数テーブルのＸのエントリにＰを登録(ステップ１５０３)する。全ての関連関数の処理を終えると、ステップ１５０２の判定がNoとなり、ステップ１５０１に進み、次のプログラム領域の処理に移る。以上の処理を全プログラム領域に対して行なうことにより、全プログラム領域に対する大域変数アクセス状況が、大域変数テーブルに登録される。その後、ステップ１５０４以降の処理を行なう。
【０１０５】
ステップ１５０４では、大域変数テーブルを走査し、未処理大域変数Ｙの有無を調べ、存在した場合は、まずＹの配置候補ＹＳを空集合で初期化(１５０５)する。そして、Ｙの関連変数集合をＹＰ(ステップ１５０６)とし、ＹＰに未処理関連領域ＹＰＰがあるかどうかを判定(１５０７)する。未処理関連領域ＹＰＰが存在するときは、ＹＰＰの配置候補ＣＳが存在するか否かを、プログラム領域テーブル４の対応エントリで調べる(ステップ１５０８)。配置候補ＣＳが存在する場合は、Ｙの配置候補にＣＳを追加してステップ１５０７で次の関連領域の処理に移る。全ての関連領域を処理すると、ステップ１５０７の判定がNoとなり、ステップ１５０４に進み、次の大域変数の処理を行なう。全ての大域変数の処理が終了したとき、全処理が終了する。
【０１０６】
図１５の処理により、大域変数毎にアクセスが存在するプログラム領域を網羅する変数配置候補を生成することができる。
【０１０７】
図１６は変数配置決定処理の処理手順を例示するフローチャートであり、図９の変数配置決定９０３３の手順を表している。
【０１０８】
大域変数テーブルを走査し、未処理大域変数Ｘの有無(１６０１)を調べ、存在した場合は、まずＸの配置候補集合をＸＳ(１６０２)とする。次に、ＸＳに配置候補が存在するかどうかを調べ(ステップ１６０３)、存在しない場合はＸをデフォルトＣＰＵに配置(ステップ１６０４)し、ステップ１６０１で次の大域変数の処理に進む。ＸＳに配置候補が存在する場合は、ＸＳが単一要素Ｃのみかどうかを調べ(ステップ１６０５)、単一要素の場合は、ＸをＣに配置(ステップ１６０６)し、ステップ１６０１で次の大域変数の処理に進む。ＸＳが単一要素でない場合は、ＣＰＵ共有アクセス領域に配置可能かどうかを調べ(ステップ１６０８)、配置可能な場合は、ＸをＣＰＵ共有アクセス領域に配置(ステップ１６０９)後、ステップ１６０１に進み、次の配置候補を処理する。ＣＰＵ共有アクセス領域に配置不能な場合は、ＸをデフォルトＣＰＵに配置(ステップ１６１０)し、ステップ１６０１で次の大域変数の処理に進む。全ての大域変数の処理が終わると、ステップ１６０１の判定がNoとなり、全処理が終了する。
【０１０９】
図１６の処理により、ユーザのプログラム領域に対するＣＰＵ配置指定に従って、関連する大域変数に対して効率的なにＣＰＵ配置を行なうことができる大域変数配置テーブルが生成される。
【０１１０】
図１７はタスク化変換処理の処理手順を例示するフローチャートであり、図９のタスク化変換９０４の手順を表している。
【０１１１】
プログラム領域テーブルを走査し、未処理プログラム領域Ｐの有無を調べ(ステップ１７０１)、存在した場合は、Ｐがタスク化領域か否かを調べる(ステップ１７０２)。タスク化領域のときは、Ｐをタスクに変換(ステップ１７０３)し、そうでない場合はそのままステップ１７０４に進む。ステップ１７０４では、ＰのＣＰＵ配置集合に未処理ＣＰＵ配置Ｃがあるかどうかを調べ、存在する場合は、ＰをＣに生成(ステップ１７０５)する。この処理を全てのＣＰＵ配置に対して終えると、ステップ１７０４の判定がNoとなり、ステップ１７０１に進み、次のプログラム領域の処理を行なう。全てのプログラム領域の処理が終わると、ステップ１７０１の判定がNoとなり、ステップ１７０６に進む。
【０１１２】
ステップ１７０６では、大域変数テーブルを走査し、未処理大域変数Ｖの有無を調べ、存在した場合は、まずＶの配置ＣＰＵをＶＣ(１７０７)とし、ＶをＶＣに生成(ステップ１７０８)する。全ての大域変数に対して、この処理を終えるとステップ１７０６の判定がNoとなり、全処理が終了する。
【０１１３】
図１７の処理により、プログラム領域配置テーブルと大域変数配置テーブルに従って、タスク化変換された中間語３が生成され、タスク化変換オブジェクトないしソースプログラムの生成が可能となる。
【０１１４】
以上説明したコンパイル方法によれば、ＣＰＵ分割にあたって、処理速度と資源のバランスを考慮した効率的マルチコアタスク分割を実現することができる。
【０１１５】
以上説明したコンパイル方法は、既存プログラムから、複数の独立した処理プログラムを、大域変数アクセスの干渉や処理の相互依存がないことを確認し、安全に切出す用途にも適用することができる。
【０１１６】
以上本発明者によってなされた発明を実施形態に基づいて具体的に説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能であることは言うまでもない。
【０１１７】
例えば、逐次実行プログラムと、これに対応するタスクか指示付き逐次実行プログラムについては、図２及び図３は単なる一例であり、種々のプログラムに適用可能である。タスク化指示文によってどのタスクにどのＣＰＵを割当てるかは予め一義に決めた場合について説明したが、その指定についてもタスクによるデータ処理量やリソースとの関係を考慮してタスクを配置するＣＰＵを決定するようにしてもよい。何れの場合であっても、タスク化指示文でタスク領域と指定されていないプログラム部分である非タスク化領域をどのＣＰＵに配置するかはコンパイラによるコンパイル処理によって決定する。
【０１１８】
以上のように、本発明の実施形態によれば、マルチコア分割のためのコンパイル方法さらにはコンパイラにおいて、プログラムの主要部分に対しマルチコア向けタスク分割指示を行なうだけで、コンパイラ解析結果を活用した効率的なタスク分割を実現でき、マルチコアタスク分割を効率的に行なうことが出来る。
【０１１９】
また、本発明の実施形態によれば、所要の実行性能を容易に得ることができるマルチコア分割のためのコンパイル方法の実現に資することができるコンパイラを提供することが出来る。
【符号の説明】
【０１２０】
１０１…ＣＰＵ
１０４…タスク分割コンパイラ
１０６…入力ソースプログラム
１０７…出力プログラム
１０８…コンパイラ
４…プログラム領域テーブル
５…プログラム領域配置テーブル
６…大域変数配置テーブル
９０１…タスク化指示文解析
９０２…プログラム領域配置
９０３…大域変数配置
１３０７…複写配置判断ステップ
【図１】
2010204979.tif 000003
【図２】
2010204979.tif 000004
【図３】
2010204979.tif 000005
【図４】
2010204979.tif 000006
【図５】
2010204979.tif 000007
【図６】
2010204979.tif 000008
【図７】
2010204979.tif 000009
【図８】
2010204979.tif 000010
【図９】
2010204979.tif 000011
【図１０】
2010204979.tif 000012
【図１１】
2010204979.tif 000013
【図１２】
2010204979.tif 000014
【図１３】
2010204979.tif 000015
【図１４】
2010204979.tif 000016
【図１５】
2010204979.tif 000017
【図１６】
2010204979.tif 000018
【図１７】
2010204979.tif 000019