JP2018092383A - コンパイルプログラム、コンパイル方法および情報処理装置 - Google Patents

コンパイルプログラム、コンパイル方法および情報処理装置 Download PDF

Info

Publication number
JP2018092383A
JP2018092383A JP2016235497A JP2016235497A JP2018092383A JP 2018092383 A JP2018092383 A JP 2018092383A JP 2016235497 A JP2016235497 A JP 2016235497A JP 2016235497 A JP2016235497 A JP 2016235497A JP 2018092383 A JP2018092383 A JP 2018092383A
Authority
JP
Japan
Prior art keywords
array
code
vec
length
variable
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.)
Granted
Application number
JP2016235497A
Other languages
English (en)
Other versions
JP6718119B2 (ja
Inventor
貴之 松浦
Takayuki Matsuura
貴之 松浦
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 JP2016235497A priority Critical patent/JP6718119B2/ja
Priority to US15/785,480 priority patent/US10101980B2/en
Publication of JP2018092383A publication Critical patent/JP2018092383A/ja
Application granted granted Critical
Publication of JP6718119B2 publication Critical patent/JP6718119B2/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/44Encoding
    • G06F8/447Target code generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • 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/44Encoding
    • G06F8/443Optimisation
    • G06F8/4434Reducing the memory space required by the program code

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)

Abstract

【課題】配列を使用する実行プログラムの実行効率を向上させる。【解決手段】記憶部11は、可変長配列15を使用する配列処理13aと、配列処理13aの開始後に可変長配列15のサイズを変更するサイズ変更処理13bとが記述されたソースコード13を記憶する。処理部12は、可変長配列15に対応する固定長配列16を使用する配列処理13cと配列処理13aとを選択的に実行させるコード14aを生成し、また、コード14aの初期状態として配列処理13cが選択されるよう制御するコード14bを生成する。処理部12は、サイズ変更処理13bが記述された位置に対応させて、固定長配列16に格納されているデータを可変長配列15に移動させ、配列処理13cから配列処理13aに切り替えられるよう制御するコード14cを生成する。処理部12は、コード14a,14b,14cを含む実行プログラム14を生成する。【選択図】図1

Description

本発明はコンパイルプログラム、コンパイル方法および情報処理装置に関する。
ソフトウェア開発においては、人間が理解容易な高級言語を用いてソースコードを作成し、コンパイラを用いてソースコードを機械可読な実行プログラムに変換することが多い。ソースコードでは、複数のデータ要素を体系的に管理するためのデータ構造として配列を使用することがある。配列は頻繁に使用されるデータ構造であるため、プログラム実行環境に用意された標準ライブラリの中で実装されていることがある。
配列の種類として、固定長配列と可変長配列が存在する。固定長配列は、ソースコードの変数宣言において配列サイズを固定することが要求され、演算中に動的に配列サイズを変更することが想定されていない配列である。一方、可変長配列は、変数宣言において配列サイズを固定しなくてもよく、動的に配列サイズを変更可能な配列である。固定長配列と可変長配列では、実行時におけるメモリ領域の管理方法が異なるため、その両方がプログラム実行環境や標準ライブラリなどに実装されていることがある。
なお、ソースコードから分散メモリ型並列計算機用の実行プログラムを生成するコンパイラが提案されている。提案のコンパイラは、ソースコードに現れる一次元配列を、それぞれが連続した区間である複数の部分配列に分割することで多次元化する。コンパイラは、変換された多次元配列に対して自動並列化を行う。
また、配列の入れ子(上位の配列の各要素が下位の配列であるデータ構造)として実装された多次元配列を使用する配列処理方法が提案されている。提案の配列処理方法では、コンパイル時に、最下位の配列が連続したメモリ領域に割り当てられていることを前提として最適化された最適化コードと、そのような最適化を行っていない非最適化コードとを生成しておく。実行時に、更新されたことのある配列にアクセスする場合は非最適化コードを実行し、それ以外の配列にアクセスする場合は最適化コードを実行する。
また、オブジェクト指向プログラミング言語における演算子のオーバーロード機能を利用して、複数のベクトル変数の間の代数演算を簡潔に記述できるようにした代数演算装置が提案されている。提案の代数演算装置は、複数のベクトル変数の間の代数演算の途中で生成される中間ベクトルデータを削減し、オーバヘッドを抑制する。
また、データ構造の1つとして、複数の構造体領域を連結リスト形式でリンクしたリストベクトルを扱うコンパイル装置が提案されている。提案のコンパイル装置は、ループ内で最初に領域確保要求が発行されるタイミングで、所定数の構造体領域が一括してメモリ上の連続領域に確保されるような実行プログラムを生成する。
特開2000−112901号公報 特開2000−222219号公報 特開2007−328692号公報 特開2008−3882号公報
可変長配列は、変数宣言の後に動的に配列サイズを変更することが可能であるため、ソースコードを作成する上で固定長配列より使いやすいという利点がある。一方で、可変長配列を実装した実行プログラムは、実行効率の点で次のような問題がある。
固定長配列は配列サイズが固定であるため、そのデータ要素をメモリ上に密に並べることが容易であり、コンパイルされた実行プログラムは連続したメモリ領域を使用することが多い。これに対し、可変長配列は配列サイズが可変であるため、可変長配列の使い方によっては全てのデータ要素をメモリ上に密に並べることができず、コンパイルされた実行プログラムは不連続なメモリ領域を使用することがある。例えば、列数が可変である可変長二次元配列では、ある行に対応するメモリ領域と次の行に対応するメモリ領域とが不連続になることがある。メモリ領域に連続性がないと、メモリ領域に連続性がある場合よりもキャッシュ効率が低下するなど実行効率が低くなるおそれがある。
1つの側面では、本発明は、配列を使用する実行プログラムの実行効率を向上させるコンパイルプログラム、コンパイル方法および情報処理装置を提供することを目的とする。
1つの態様では、コンピュータに以下の処理を実行させるコンパイルプログラムが提供される。可変長配列を使用する第1の配列処理と、第1の配列処理の開始後に可変長配列のサイズを変更するサイズ変更処理とが記述されたソースコードを取得する。第1の配列処理の記述に基づいて、可変長配列に対応する固定長配列を使用する第2の配列処理と第1の配列処理とを選択的に実行させる第1のコードを生成し、また、第1のコードの初期状態として第1および第2の配列処理のうち第2の配列処理が選択されるよう制御する第2のコードを生成する。サイズ変更処理が記述された位置に対応させて、固定長配列に格納されているデータを可変長配列に移動させ、第1のコードにおいて第2の配列処理から第1の配列処理に切り替えられるよう制御する第3のコードを生成する。第1、第2および第3のコードを含む実行プログラムを生成する。
また、1つの態様では、コンピュータが実行するコンパイル方法が提供される。また、1つの態様では、記憶部と処理部とを有する情報処理装置が提供される。
1つの側面では、配列を使用する実行プログラムの実行効率が向上する。
第1の実施の形態の情報処理装置の例を示す図である。 コンパイル装置のハードウェア例を示すブロック図である。 コンパイル装置の機能例を示すブロック図である。 固定長二次元配列の論理構造とメモリ配置の例を示す図である。 可変長二次元配列の論理構造とメモリ配置の例を示す図である。 固定長二次元配列と可変長二次元配列の切り替え例を示す図である。 第1のオリジナルのソースコード例を示す図である。 第1の最適化例をソースコード形式で説明する図である。 第2のオリジナルのソースコード例を示す図である。 第2の最適化例をソースコード形式で説明する図である。 コンパイルの手順例を示すフローチャートである。 二次元配列検索の手順例を示すフローチャートである。 フラグ変更処理挿入の手順例を示すフローチャートである。
以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
第1の実施の形態を説明する。
図1は、第1の実施の形態の情報処理装置の例を示す図である。
第1の実施の形態の情報処理装置10は、C++などの高級言語で記述されたソースコードをコンパイルし、プロセッサに実行させる実行プログラムを生成する。実行プログラムは、例えば、機械可読なオブジェクトコードで記述される。情報処理装置10をコンパイル装置と言うこともできる。情報処理装置10は、ソフトウェアとしてのコンパイラを実行するコンピュータであってもよい。また、情報処理装置10は、ユーザが操作するクライアント装置でもよいし、クライアント装置からアクセスされるサーバ装置でもよい。
情報処理装置10は、記憶部11および処理部12を有する。記憶部11は、例えば、RAM(Random Access Memory)などの揮発性の記憶装置、または、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性の記憶装置である。処理部12は、例えば、CPU(Central Processing Unit)やDSP(Digital Signal Processor)などのプロセッサである。ただし、処理部12は、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの特定用途の電子回路を含んでもよい。プロセッサは、RAMなどのメモリに記憶されたプログラムを実行する。例えば、プロセッサは、ソースコードをコンパイルするコンパイルプログラムを実行する。複数のプロセッサの集合を「マルチプロセッサ」または「プロセッサ」と呼ぶこともある。
記憶部11は、ソースコード13を記憶する。ソースコード13には、配列処理13a(第1の配列処理)とサイズ変更処理13bとが記述されている。配列処理13aでは可変長配列15が使用される。可変長配列15は、複数のデータ要素を格納する集合データのうち、格納可能なデータ要素の数(配列長)を変数宣言後に変更できるものである。可変長配列15は、例えば、標準ライブラリで定義されたvectorなどのデータ型をもつデータである。サイズ変更処理13bは、配列処理13aの開始後に可変長配列15のサイズ(配列長)を変更する処理である。可変長配列15のサイズの変更は、明示的なサイズの指定や可変長配列15へのデータ要素の追加などによって発生し得る。
処理部12は、ソースコード13を実行プログラム14に変換する。このとき、処理部12は、ソースコード13における配列処理13aの記述に基づいてコード14a(第1のコード)を生成する。コード14aは、可変長配列15に対応する固定長配列16を使用する配列処理13c(第2の配列処理)と、可変長配列15を使用する配列処理13aとを選択的に実行させる。固定長配列16は、複数のデータ要素を格納する集合データのうち、格納可能なデータ要素の数を変数宣言後に変更できないものである。固定長配列16は、例えば、言語仕様で定義されたarrayなどのデータ型をもつデータである。コード14aは、例えば、フラグがONである(例えば、フラグの値が「1」である)ときは配列処理13cを実行させ、フラグがOFFである(例えば、フラグの値が「0」である)ときは配列処理13aを実行させるコードである。
また、処理部12は、コード14aの初期状態として、配列処理13a,13cのうち配列処理13cが選択されるよう制御するコード14b(第2のコード)を生成する。コード14bは、例えば、コード14aの開始前に上記フラグをONに設定するコードである。これにより、コード14aの開始直後は、配列処理13a,13cのうち配列処理13cが実行されるようになる。すなわち、複数のデータ要素を格納するデータ構造として固定長配列16が優先的に使用されることになる。
また、処理部12は、サイズ変更処理13bが記述された位置に対応させてコード14c(第3のコード)を生成する。コード14cは、固定長配列16に格納されているデータ要素を可変長配列15に移動させると共に、コード14aにおいて配列処理13cから配列処理13aに切り替えられるよう制御する。コード14cは、例えば、上記フラグをOFFに更新する。サイズ変更処理13bは、例えば、固定長配列16から可変長配列15にデータ要素が移動した後に可変長配列15に対して行われる。コード14cが少なくとも1回実行されると、コード14aでは配列処理13a,13cのうち配列処理13aが実行されるようになる。すなわち、それ以降は、複数のデータ要素を格納するデータ構造として可変長配列15が使用されることになる。
そして、処理部12は、コード14a,14b,14cを含む実行プログラム14を生成する。コード14a,14b,14cは、例えば、上記の処理に対応するオブジェクトコードであり、プロセッサに実行させる命令の集合である。
第1の実施の形態の情報処理装置10によれば、コンパイル時に、可変長配列15を使用する配列処理13aの記述に基づいて、固定長配列16を使用する配列処理13cと配列処理13aとを選択的に実行させるコード14aが生成される。また、初期状態として配列処理13cが選択されるよう制御するコード14bが生成される。また、サイズ変更処理13bの際に、固定長配列16から可変長配列15にデータを移動させると共に、以降は配列処理13aが選択されるよう制御するコード14cが生成される。
これにより、ソースコード13において可変長配列15を使用するよう指定されていても、サイズ変更処理13bが実行される前までは可変長配列15に代えて固定長配列16が使用される。固定長配列16が使用されている限り、メモリ上に複数のデータ要素を密に配置することができ、固定長配列16に対して連続したメモリ領域が割り当てられる可能性が高い。よって、実行プログラム14の実行効率が向上する。例えば、固定長配列16に対して連続メモリ領域が割り当てられることで、キャッシュメモリに一度に格納できるデータ要素の数が多くなり、メモリアクセス効率が向上する。
また、コンパイル時に自動的に可変長配列15から固定長配列16に変換される。よって、変数宣言の際に配列サイズを固定しなくてよい可変長配列15を使ってソースコード13を作成することができ、ソースコード13の作成が容易になる。また、サイズ変更処理13bが実行されるときに固定長配列16から可変長配列15に戻され、それ以降は可変長配列15が使用される。よって、ソースコード13が意図した通りの情報処理を実現することができる。例えば、複数のデータ要素がメモリ上に密に配置された状態で新たなデータ要素を途中に挿入しようとすることによるデータ破壊を防止できる。このように、可能な範囲で可変長配列15に代えて固定長配列16を使用することで、安全に実行プログラム14の実行効率を向上させることができる。
[第2の実施の形態]
次に、第2の実施の形態を説明する。
第2の実施の形態のコンパイル装置100は、高級言語で記述されたソースコードをコンパイルし、機械可読なオブジェクトコードを生成する。コンパイル装置100は、ユーザが操作するクライアント装置(端末装置と言うこともある)でもよいし、クライアント装置からアクセスされるサーバ装置でもよい。コンパイル装置100はコンピュータであり、ソフトウェアとしてのコンパイラおよびリンカを実行する。
図2は、コンパイル装置のハードウェア例を示すブロック図である。
コンパイル装置100は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106および通信インタフェース107を有する。上記ユニットはバス108に接続される。
CPU101は、プログラムの命令を実行する演算回路を含むプロセッサである。CPU101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを備えてもよく、コンパイル装置100は複数のプロセッサを備えてもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列に実行してもよい。複数のプロセッサの集合を「マルチプロセッサ」または「プロセッサ」と言うことがある。
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、コンパイル装置100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。プログラムには、コンパイルプログラムやリンクプログラムが含まれる。なお、コンパイル装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
画像信号処理部104は、CPU101からの命令に従って、コンパイル装置100に接続されたディスプレイ111に画像を出力する。ディスプレイ111としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなどを用いることができる。
入力信号処理部105は、コンパイル装置100に接続された入力デバイス112から入力信号を取得し、CPU101に出力する。入力デバイス112としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、コンパイル装置100に複数の種類の入力デバイスが接続されていてもよい。
媒体リーダ106は、記録媒体113に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体113として、例えば、磁気ディスク、光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。磁気ディスクには、フレキシブルディスク(FD:Flexible Disk)やHDDが含まれる。光ディスクには、CD(Compact Disc)やDVD(Digital Versatile Disc)が含まれる。
媒体リーダ106は、例えば、記録媒体113から読み取ったプログラムやデータを、RAM102やHDD103などの他の記録媒体にコピーする。読み取られたプログラムは、例えば、CPU101によって実行される。なお、記録媒体113は可搬型記録媒体であってもよく、プログラムやデータの配布に用いられることがある。また、記録媒体113やHDD103を、コンピュータ読み取り可能な記録媒体と言うことがある。
通信インタフェース107は、ネットワーク114に接続され、ネットワーク114を介して他のコンピュータと通信を行うインタフェースである。通信インタフェース107は、スイッチなどの通信装置とケーブルで接続される有線通信インタフェースでもよいし、基地局と無線リンクで接続される無線通信インタフェースでもよい。
なお、コンパイル装置100は、第1の実施の形態の情報処理装置10に対応する。RAM102またはHDD103は、第2の実施の形態の記憶部11に対応する。CPU101は、第1の実施の形態の処理部12に対応する。
図3は、コンパイル装置の機能例を示すブロック図である。
コンパイル装置100は、ファイル記憶部120、コンパイラ130およびリンカ140を有する。ファイル記憶部120は、例えば、RAM102またはHDD103に確保した記憶領域を用いて実装される。コンパイラ130およびリンカ140は、例えば、CPU101が実行するプログラムモジュール(コンパイルプログラムおよびリンクプログラム)を用いて実装される。ただし、コンパイラ130およびリンカ140の機能の一部または全部を、ソフトウェアでなく電子回路として実装することも可能である。
ファイル記憶部120は、ソースファイル121、オブジェクトファイル122および実行ファイル123を記憶する。ソースファイル121は、C++などの高級言語で記述されたソースコードを含む。オブジェクトファイル122は、機械可読なオブジェクトコードを含む。実行ファイル123は、ターゲットのプロセッサが実行できる形式のファイルであり、生成されたオブジェクトコードとライブラリなどへのリンクを含む。なお、実行ファイル123は、CPU101が実行してもよいし、コンパイル装置100が備える他のCPUまたはコンパイル装置100以外のコンピュータのCPUが実行してもよい。
コンパイラ130は、ファイル記憶部120からソースファイル121を読み出し、ソースコードをオブジェクトコードに変換し、オブジェクトファイル122をファイル記憶部120に格納する。コンパイラ130は、入出力制御部131、ファイル入力部132、中間コード生成部133、中間コード記憶部134、最適化部135、アセンブリコード生成部138およびファイル出力部139を有する。
入出力制御部131は、ファイルの種類に応じた入出力方法を選択し、ファイル入力部132およびファイル出力部139を制御する。ファイル入力部132は、入出力制御部131からの指示に応じて、ソースファイル121をオープンし、ソースファイル121からソースコードを読み出す。中間コード生成部133は、ファイル入力部132が読み出したソースコードを解析して、コンパイラ130の内部で利用される中間言語で記述された中間コードに変換し、中間コードを中間コード記憶部134に格納する。ソースコードの解析には、字句解析、構文解析、意味解析などが含まれる。中間コード記憶部134は、RAM102に確保された記憶領域であり、中間コードを記憶する。
最適化部135は、中間コード記憶部134に記憶された中間コードを、実行速度が向上するように最適化する。最適化部135は、解析部136および最適化実行部137を有する。解析部136は、中間コードを解析して最適化方法を決定する。このとき、解析部136は、プログラムモジュール間の呼び出し関係を表す呼び出し関係グラフ(caller−calleeグラフ)を参照する。呼び出し関係グラフは、後述するリンク時最適化(LTO:Link Time Optimization)によって生成される。最適化実行部137は、解析部136が決定した最適化方法に従って中間コードを最適化する。最適化部135で行われる最適化には、可変長配列を利用する配列処理の最適化が含まれる。
アセンブリコード生成部138は、最適化部135によって最適化された中間コードを、低級言語であるアセンブリ言語で記述されたアセンブリコードに変換する。ファイル出力部139は、入出力制御部131からの指示に応じて、オブジェクトファイル122を生成し、アセンブリコード生成部138が生成したアセンブリコードをオブジェクトコードに変換し、オブジェクトコードをオブジェクトファイル122に書き込む。
リンカ140は、ファイル記憶部120からオブジェクトファイル122を読み出し、オブジェクトコードを解析して、参照されている他のオブジェクトファイルやライブラリを検出する。そして、リンカ140は、オブジェクトファイル122と、検出した他のオブジェクトファイルやライブラリとをリンクし、実行ファイル123を生成する。なお、コンパイラ130にリンカ140の機能が統合されていてもよい。
ここで、リンカ140は、コンパイル単位(翻訳単位)であるプログラムモジュールを超えた呼び出し関係を検出することができる。そこで、リンク時最適化では、リンカ140は、複数のプログラムモジュールの間の呼び出し関係を表す呼び出し関係グラフを生成し、呼び出し関係グラフをコンパイラ130にフィードバックする。
リンク時最適化では、ソースコードをオブジェクトコードに変換するコンパイルとオブジェクトコードのリンクとが2回繰り返される(2パス処理)。1パス目では、コンパイラ130は、コンパイル単位を超えた呼び出し関係を考慮せずに最適化を行い、コンパイル単位毎のオブジェクトコードを生成する。リンカ140は、それらオブジェクトコードをリンクすると共に呼び出し関係グラフを生成する。2パス目では、コンパイラ130は、コンパイル単位を超えた呼び出し関係を考慮して最適化を行い、再度オブジェクトコードを生成する。リンカ140は、再生成されたオブジェクトコードをリンクして実行ファイル123を生成する。2パス目においてコンパイラ130は、呼び出し先モジュールの処理内容を参照して呼び出し先モジュールを最適化することができる。
次に、データ構造としての二次元配列について説明する。
ソースコードには二次元配列が記述されることがある。特に、科学技術計算に用いるソースコードでは、大規模な二次元配列が記述されることがある。二次元配列は、同一種類の複数の単位データ(例えば、整数や浮動小数点型実数など)を体系的に格納するデータ構造であって、行番号と列番号によって各単位データを指定できるものである。二次元配列には、行数および列数が変数宣言時に固定される固定長二次元配列と、行数および列数を変数宣言後に変えることができる可変長二次元配列とが存在する。固定長二次元配列の典型例は、プログラミング言語の仕様で定義されているarray型二次元配列である。可変長二次元配列の典型例は、vectorライブラリを利用して作成するvector型二次元配列である。固定長二次元配列と可変長二次元配列とでは、ソースコードの記述方法やオブジェクトコード実行時のメモリ領域の使用方法が異なる。
図4は、固定長二次元配列の論理構造とメモリ配置の例を示す図である。
ソースコード151は、3行3列の固定長二次元配列array_matを宣言している。array_matの要素のデータ型は整数型である。ソースコード151に記述された固定長二次元配列は、論理構造161に対応する。論理構造161は、行番号0〜2および列番号0〜2によって特定される3行3列の行列である。(0,0)には整数#1が格納される。(0,1)には整数#2が格納される。(0,2)には整数#3が格納される。(1,0)には整数#4が格納される。(1,1)には整数#5が格納される。(1,2)には整数#6が格納される。(2,0)には整数#7が格納される。(2,1)には整数#8が格納される。(2,2)には整数#9が格納される。
ソースコード151をコンパイルして生成したオブジェクトコードを実行すると、多くの場合、メモリにarray_mat領域171が確保される。array_mat領域171は、固定長二次元配列の要素の個数に相当する長さをもつ連続領域である。array_mat領域171には、整数#1〜#9が連続して密に格納される。すなわち、整数#1の直後に整数#2が格納される。整数#2の直後に整数#3が格納される。整数#3の直後に整数#4が格納される。整数#4の直後に整数#5が格納される。整数#5の直後に整数#6が格納される。整数#6の直後に整数#7が格納される。整数#7の直後に整数#8が格納される。整数#8の直後に整数#9が格納される。
このように、行番号=0の行の末尾にある整数#3の後に、間隔を空けずに行番号=1の行の先頭にある整数#4が格納される。また、行番号=1の行の末尾にある整数#6の後に、間隔を空けずに行番号=2の行の先頭にある整数#7が格納される。固定長二次元配列では行数や列数が固定であるため、要素を密に配置できる。
図5は、可変長二次元配列の論理構造とメモリ配置の例を示す図である。
ソースコード152は、可変長二次元配列vec_matを宣言している。vec_matは、プログラミング言語の仕様で用意された標準ライブラリの中のvectorライブラリを利用して作成されたvector型二次元配列である。vectorライブラリによって定義されたvector型配列は一次元配列であるが、vector型配列の要素にvector型配列を代入することで二次元配列を作成することができる。
ここでは、ソースコード152は、vector型配列vec_x1,vec_x2,vec_x3を宣言している。vec_x1,vec_x2,vec_x3の要素のデータ型は整数型である。vec_x1には整数#1〜#3が挿入される。vec_x2には整数#4〜#6が挿入される。vec_x3には整数#7〜#9が挿入される。vec_matの要素のデータ型はvectorである。vec_matにはvec_x1,vec_x2,vec_x3が挿入される。これにより、3行3列の二次元配列を作成できる。また、変数宣言後に行数や列数を変更することができる。例えば、vec_matに別のvector型配列を挿入することで行数を増やすことができ、vec_x1,vec_x2,vec_x3に更に整数を挿入することで列数を増やすことができる。
ソースコード152に記述された可変長二次元配列は、論理構造162に対応する。論理構造162は、vec_x1である一次元配列と、vec_x2である一次元配列と、vec_x3である一次元配列と、vec_matである一次元配列とを含む。vec_matは、vec_x1,vec_x2,vec_x3の先頭を指すインデックスに相当する。vec_matの第0要素はvec_x1を指し、vec_matの第1要素はvec_x2を指し、vec_matの第2要素はvec_x3を指している。論理構造162は、実質的に論理構造161と同様の二次元配列として使用できる。vec_matの要素番号0〜2が二次元配列の行番号に相当し、vec_x1,vec_x2,vec_x3それぞれの要素番号0〜2が二次元配列の列番号に相当する。
ソースコード152をコンパイルして生成したオブジェクトコードを実行すると、例えば、メモリに以下の8個の領域が確保される。vec_matに関して、vec_mat管理領域172aおよびvec_mat実体領域172bが確保される。vec_x1に関して、vec_x1管理領域172cおよびvec_x1実体領域172fが確保される。vec_x2に関して、vec_x2管理領域172dおよびvec_x2実体領域172gが確保される。vec_x3に関して、vec_x3管理領域172eおよびvec_x3実体領域172hが確保される。これら8個の領域それぞれは連続したメモリ領域であるが、異なる領域の間では連続性は保証されない。例えば、vec_x1実体領域172fとvec_x2実体領域172gとの間では連続性は保証されない。
vec_mat管理領域172aは、vec_mat実体領域172bへのアクセスを容易にするための情報を格納する。vec_mat管理領域172aは、少なくともvec_mat実体領域172bの先頭要素を指すポインタとvec_mat実体領域172bの末尾要素を指すポインタとを格納する。
vec_mat実体領域172bは、vec_matの要素である実体データを格納する。ただし、ここではvec_matの要素がvector型配列であるため、vec_mat実体領域172bはこれらvector型配列へのポインタを格納する。具体的には、vec_mat実体領域172bは、vec_x1管理領域172cの先頭要素を指すポインタと、vec_x2管理領域172dの先頭要素を指すポインタと、vec_x3管理領域172eの先頭要素を指すポインタとを格納する。
vec_x1管理領域172cは、vec_x1実体領域172fへのアクセスを容易にするための情報を格納する。vec_x1管理領域172cは、少なくともvec_x1実体領域172fの先頭要素を指すポインタとvec_x1実体領域172fの末尾要素を指すポインタとを格納する。
同様に、vec_x2管理領域172dは、vec_x2実体領域172gへのアクセスを容易にするための情報を格納する。vec_x2管理領域172dは、少なくともvec_x2実体領域172gの先頭要素を指すポインタとvec_x2実体領域172gの末尾要素を指すポインタとを格納する。また、vec_x3管理領域172eは、vec_x3実体領域172hへのアクセスを容易にするための情報を格納する。vec_x3管理領域172eは、少なくともvec_x3実体領域172hの先頭要素を指すポインタとvec_x3実体領域172hの末尾要素を指すポインタとを格納する。
vec_x1実体領域172fは、vec_x1の要素である実体データを格納する。vec_x1実体領域172fはvec_x1の要素の個数に相当する長さをもつ連続領域であり、複数の要素が間隔を空けずに密に配置される。ここでは、vec_x1実体領域172fは整数#1〜#3を格納する。整数#1の直後に整数#2が格納され、整数#2の直後に整数#3が格納されることになる。
同様に、vec_x2実体領域172gは、vec_x2の要素である実体データを格納する。vec_x2実体領域172gはvec_x2の要素の個数に相当する長さをもつ連続領域であり、複数の要素が間隔を空けずに密に配置される。ここでは、vec_x2実体領域172gは整数#4〜#6を格納する。整数#4の直後に整数#5が格納され、整数#5の直後に整数#6が格納される。また、vec_x3実体領域172hは、vec_x3の要素である実体データを格納する。vec_x3実体領域172hはvec_x3の要素の個数に相当する長さをもつ連続領域であり、複数の要素が間隔を空けずに密に配置される。ここでは、vec_x3実体領域172hは整数#7〜#9を格納する。整数#7の直後に整数#8が格納され、整数#8の直後に整数#9が格納される。
このように、vec_mat管理領域172aから整数#1〜#9に到達するまでに何回もポインタを辿ることになる。また、行番号=0の行の末尾にある整数#3と行番号=1の行の先頭にある整数#4とが不連続に格納され、行番号=1の行の末尾にある整数#6と行番号=2の行の先頭にある整数#7とが不連続に格納される。可変長二次元配列では行数や列数が可変であるため、行数や列数が増える場合に備えて要素を密に配置することが難しい。その結果、メモリアクセス回数が増加し、また、ある行の要素と次の行の要素を纏めてキャッシュメモリに読み込むことが難しくなりキャッシュ効率が低下する。よって、固定長二次元配列と比べて実行効率が低くなるおそれがある。
ここで、固定長二次元配列を用いると変数宣言時に行数や列数を固定するのに対し、可変長配列を用いると変数宣言時には行数や列数を固定しなくてよく、ソースコード作成が容易になる。よって、コンパイル装置100がコンパイルするソースコードに、vector型二次元配列などの可変長二次元配列が記述されていることがある。しかし、そのようなソースコードを単純にコンパイルすると、上記のように固定長二次元配列を用いた場合と比べて実行効率の低いオブジェクトコードが生成されてしまう。
そこで、コンパイル装置100は、コンパイル中の最適化において、所定条件を満たす可変長二次元配列を固定長二次元配列に自動的に置換し、生成されるオブジェクトコードの実行効率を向上させる。ただし、可変長二次元配列のサイズを事後的に変更させる命令が存在する場合、その命令が実行されるとデータが破壊される可能性がある。
例えば、図5に示したメモリ配置では、列数を増やしてvec_x1の末尾に整数を追加する場合、vec_x1実体領域172fの整数#3の次に新たな整数を格納し、vec_x1管理領域172cのポインタを更新すればよい。vec_x1実体領域172fとvec_x2実体領域172gとは不連続であるため、新たな整数の挿入によってvec_x2実体領域172gの整数#4は破壊されない。これに対し、図4に示したメモリ配置では、array_mat領域171の整数#3の直後に整数#4が格納されている。よって、このまま列数を増やしてarray_mat[0][3]に整数を代入しようとすると、整数#3の直後にある整数#4が上書き消去されてしまう。
そこで、コンパイル装置100は、最初は可変長二次元配列に代えて固定長二次元配列を使用し、サイズを変更させる命令が実行される直前で固定長二次元配列から可変長二次元配列に戻すようなオブジェクトコードを生成する。これにより、可変長二次元配列の特徴である事後的なサイズ変更を許容しつつ、サイズ変更の前まではできる限り固定長二次元配列を使用させてオブジェクトコードの実行効率を向上させることができる。
図6は、固定長二次元配列と可変長二次元配列の切り替え例を示す図である。
コンパイル装置100は、次のような動作を行うオブジェクトコードを生成する。
ソースコード152に記述されたvector型二次元配列に対して、最初はメモリに以下の6個の領域が確保される。図5と同様、vec_mat実体領域172b、vec_x1管理領域172c、vec_x2管理領域172dおよびvec_x3管理領域172eが確保される。また、vec_mat管理領域173およびmatrix領域174が確保される。vec_x1実体領域172f、vec_x2実体領域172gおよびvec_x3実体領域172hは、最初は確保しなくてよい。
vec_mat管理領域173は、vec_matに関する基準位置からメモリアドレスが増加する方向(正方向)に、図5のvec_mat管理領域172aと同様のポインタを格納する。すなわち、vec_mat管理領域173は、vec_mat実体領域172bの先頭要素を指すポインタと末尾要素を指すポインタとを格納する。
また、vec_mat管理領域173は、vec_matに関する基準位置からメモリアドレスが減少する方向(負方向)に、matrixフラグおよびmatrixポインタを格納する。matrixフラグは、matrix領域174が使用されているか否かを示すフラグである。matrixフラグがONである(値が「1」である)ことは、matrix領域174が使用されていることを示す。matrixフラグがOFFである(値が「0」である)ことは、matrix領域174が使用されていないことを示す。matrixフラグの初期値はON(「1」)である。matrixポインタは、matrix領域174の先頭要素を指すポインタである。
matrix領域174は、図4のarray_mat領域171に相当する記憶領域である。matrix領域174は、複数の単位データをarray型二次元配列(固定長二次元配列)の形式で格納する。よって、matrix領域174は、二次元配列の行数×列数に相当する長さをもち、それら単位データを密に格納する。vec_mat管理領域173のmatrixフラグがONである間、vec_mat管理領域173のmatrixポインタおよびmatrix領域174が使用される。この間、vec_mat実体領域172b、vec_x1管理領域172c、vec_x2管理領域172dおよびvec_x3管理領域172eは、確保されているものの使用されない。二次元配列の初期値はmatrix領域174に書き込まれる。また、サイズが変更されない限り、単位データの参照や更新はmatrix領域174に対して行われる。
その後、二次元配列のサイズが変わる命令(例えば、vec_x1の末尾に整数を挿入することで列数が増える命令)に到達すると、その命令の実行前にvec_mat管理領域173のmatrixフラグがOFFに書き換えられる。また、メモリにvec_x1実体領域172f、vec_x2実体領域172gおよびvec_x3実体領域172hが確保される。そして、matrix領域174からvec_x1実体領域172f、vec_x2実体領域172gおよびvec_x3実体領域172hに単位データがコピーされ、メモリからmatrix領域174が削除される。
vec_mat管理領域173のmatrixフラグがOFFになると、それ以降はvec_mat実体領域172b、vec_x1管理領域172c、vec_x2管理領域172dおよびvec_x3管理領域172eが使用される。また、vec_x1実体領域172f、vec_x2実体領域172gおよびvec_x3実体領域172hが使用される。単位データの参照や更新、二次元配列のサイズ変更は、vec_x1実体領域172f、vec_x2実体領域172gおよびvec_x3実体領域172hに対して行われる。よって、サイズが変わる命令を実行してもデータは破壊されない。
次に、コンパイル装置100による最適化の例を、ソースコードを用いて説明する。なお、以下では説明を簡単にするためにソースコード形式で変換例を説明するが、実際にはコンパイル装置100は中間コードに対して最適化を行う。
図7は、第1のオリジナルのソースコード例を示す図である。
ソースコード153は、ユーザによって記述されたオリジナルのソースコードであり、最適化前の処理手順を示している。ソースコード153は、vectorライブラリをincludeすることでvectorライブラリを参照している。ソースコード153は、整数を格納可能なvector型配列vec_x1,vec_x2,vec_x3を宣言している。また、ソースコード153は、整数を格納可能なvector型配列を要素とするvector型配列vec_matを宣言している。
ソースコード153では、for文によってvec_x1,vec_x2,vec_x3に初期値が格納される。「1」がvec_x1に挿入され、「4」がvec_x2に挿入され、「7」がvec_x3に挿入される。また、「2」がvec_x1に挿入され、「5」がvec_x2に挿入され、「8」がvec_x3に挿入される。また、「3」がvec_x1に挿入され、「6」がvec_x2に挿入され、「9」がvec_x3に挿入される。そして、vec_matに、vec_x1,vec_x2,vec_x3が順に挿入される。これにより、vector型二次元配列が初期化される。
その後、ソースコード153では、for文によってvec_matを使用した配列演算が行われる。vec_matに格納された9個の整数は、行番号iと列番号jを指定することで参照できる。i=0はvec_x1を示し、i=1はvec_x2を示し、i=2はvec_x3を示している。また、j=0〜2はvec_x1,vec_x2,vec_x3それぞれの中での要素番号を示している。ここでは、上記の9個の初期値を足し合わせた結果を変数answerとして出力している。
図8は、第1の最適化例をソースコード形式で説明する図である。
ソースコード154は、前述のソースコード153を最適化した後の処理手順を示している。ソースコード154は、vec_x1,vec_x2,vec_x3,vec_matに加えて、array型二次元配列matrixを宣言している。matrixの行数および列数は、ソースコード153の記載からvector型二次元配列vec_matに初期値を格納する処理を静的に解析することで決定することができる。
ソースコード154では、vec_matに初期値を格納する代わりにmatrixに初期値が格納される。最初はvec_matは使用されないため、vec_matに初期値を格納しなくてよい。また、matrixに初期値を格納するときに、matrixフラグがONに初期化される。また、matrixに初期値を格納するときに、vec_matのメモリ領域が確保される。すなわち、ソースコード154では、matrixの宣言が挿入され、vec_matに初期値を格納する処理がmatrixに初期値を格納する処理に置換されている。また、matrixフラグをONに初期化する処理とvec_matのメモリ領域を確保する処理とが挿入されている。
また、ソースコード154では、vec_matを使用した配列演算に加えてmatrixを使用した配列演算が挿入されている。matrixに格納された9個の整数は、行番号iと列番号jを指定することで参照できる。matrixを使用した配列演算は、vec_matを使用した配列演算と同様に、9個の初期値を足し合わせた結果を変数answerとして出力するものである。そして、ソースコード154では、vec_matを使用した配列演算とmatrixを使用した配列演算とを、matrixフラグ(matrix_flg)に応じて選択する制御構造が挿入されている。matrixフラグがONである場合はmatrixを使用した配列演算が選択され、matrixフラグがOFFである場合はvec_matを使用した配列演算が選択される。
図9は、第2のオリジナルのソースコード例を示す図である。
ソースコード155,156は、ユーザによって記述されたオリジナルのソースコードであり、最適化前の処理手順を示している。ソースコード155は、図7に示したソースコード153とは異なる関数に含まれるものであり、ソースコード153と同じソースファイルに記載されてもよいし異なるソースファイルに記載されてもよい。ソースコード156は、ソースコード155から呼び出されるものであり、ソースコード155と同じソースファイルに記載されてもよいし異なるソースファイルに記載されてもよい。
ソースコード155は、vectorライブラリをincludeすることでvectorライブラリを参照している。ソースコード155は、ソースコード153で宣言されたvector型二次元配列vec_matを使用している。ソースコード155では、ある条件が満たされた場合にvec_matの行数が変更される。行数の変更には、vectorライブラリで定義されたライブラリ関数である関数resize()が使用される。また、別の分岐条件が満たされた場合に、ユーザ定義の関数call_resize()が呼び出される。このとき、vec_matが引数として渡される。
ソースコード156は、vectorライブラリをincludeすることでvectorライブラリを参照している。ソースコード156は、ユーザ定義の関数call_resize()を含む。ソースコード156では、call_resize()が呼び出されたときに参照渡しによって引数としてvec_matが取得される。call_resize()の中では、vec_matの行数が変更される。行数の変更には、vectorライブラリで定義されたライブラリ関数である関数resize()が使用される。
この場合、ソースコード155では、vec_matの行数を変更するライブラリ関数であるresize()が呼び出される可能性がある。ただし、ある条件が満たされない限りresize()は呼び出されず、resize()が呼び出されるタイミングは静的には確定しない。また、ソースコード155では、vec_matの行数を変更するユーザ定義関数であるcall_resize()が呼び出される可能性がある。ただし、ある条件が満たされない限りcall_resize()は呼び出されず、call_resize()が呼び出されるタイミングは静的には確定しない。
図10は、第2の最適化例をソースコード形式で説明する図である。
ソースコード157は、前述のソースコード155を最適化した後の処理手順を示している。ソースコード157では、resize()が呼び出される直前に、matrixフラグをOFFに書き換える処理が挿入されている。また、resize()が呼び出される直前に、matrixからvec_matに整数をコピーする処理が挿入されている。matrixとvec_matは共に3行3列の行列として扱うことができるため、matrixのi行j列の整数がvec_matのi行j列にコピーされる。
また、ソースコード157では、call_resize()が呼び出される直前に、matrixフラグをOFFに書き換える処理が挿入されている。また、call_resize()が呼び出される直前に、matrixからvec_matに整数をコピーする処理が挿入されている。なお、ソースコード157には、matrixフラグをOFFにする処理およびmatrixからvec_matにコピーする処理が、matrixフラグがONであるときのみ実行されるように制御構造が挿入されてもよい。
次に、コンパイル装置100のコンパイル手順について説明する。
図11は、コンパイルの手順例を示すフローチャートである。
(S10)コンパイラ130は、ソースファイル121からソースコードを読み出し、ソースコードの1回目のコンパイルを行い、生成したオブジェクトコードをオブジェクトファイル122に書き込む。1回目のコンパイルでは、コンパイラ130は、可変長二次元配列を固定長二次元配列に変換する最適化を行わなくてよい。
(S11)コンパイラ130は、複数のコンパイル単位(例えば、複数の関数)の間の呼び出し関係を示す呼び出し関係グラフを、リンカ140から取得する。呼び出し関係グラフは、リンカ140が複数のコンパイル単位をリンクするときに生成される。
コンパイラ130は、ソースファイル121から再びソースコードを読み出し、ソースコードの2回目のコンパイルを行い、生成したオブジェクトコードをオブジェクトファイル122に書き込む。2回目のコンパイルでは、コンパイラ130は、呼び出し関係グラフを参照して可変長二次元配列を固定長二次元配列に変換する最適化を行う。以下、可変長二次元配列を固定長二次元配列に変換する最適化について説明する。
(S12)最適化部135は、vector管理領域173が拡張されるようにvectorライブラリを書き換える。すなわち、最適化部135は、vector管理領域173の負方向の位置にmatrixフラグおよびmatrixポインタが格納されるようにvectorライブラリを書き換える。また、最適化部135は、matrix領域174にアクセスするときは、vector管理領域173のmatrixポインタからmatrix領域174を辿るようにvectorライブラリを書き換える。
(S13)最適化部135は、中間コード記憶部134に記憶された中間コードの中からvector型二次元配列を検索する。二次元配列検索の詳細は後述する。
(S14)最適化部135は、ステップS13で検索されたvector型二次元配列の中からvector型二次元配列を1つ選択する。
(S15)最適化部135は、ステップS14で選択したvector型二次元配列が所定の変換条件を満たすか判断する。所定の変換条件は、array型二次元配列に変換可能な条件であり、例えば、以下の(1)〜(5)の全てを満たすことである。
(1)vector型二次元配列とその要素である複数のvector型配列の全てが、同一関数内で宣言されていること。(2)複数のvector型配列の長さ(列数)が同一であり、ソースコードから静的に算出できること。(3)vector型二次元配列の長さ(行数)がソースコードから静的に算出できること。(4)各vector型配列に初期値を格納する処理では、メモリ領域の連続姓が維持されるライブラリ関数のみが使用され、メモリ領域の連続姓が維持されない可能性がある関数を使用していないこと。前者の例としてはpush_back()やpop_back()などが挙げられ、後者の例としてはinsert()などが挙げられる。(5)vector型二次元配列が宣言された関数内で、resize()などサイズを変える関数を使用していないこと。なお、図7のソースコード153は、上記の変換条件を満たしている。
上記の所定の変換条件が満たされる場合はステップS16に処理が進み、所定の変換条件が満たされない場合はステップS20に処理が進む。
(S16)最適化部135は、vector型二次元配列が宣言された位置に、メモリにmatrix領域174を確保するための命令およびmatrixフラグをONに設定する命令を挿入する。このとき、matrix領域174の先頭要素のアドレスが、vec_mat管理領域173にmatrixポインタとして格納される。なお、matrixフラグおよびmatrixポインタは、ソースコードで宣言されたvector型二次元配列1つにつき1つずつ用意される。複数の関数が1つのvector型二次元配列を共有する場合、同じmatrixフラグおよびmatrixポインタが参照される。
(S17)最適化部135は、vector型二次元配列に初期値を格納する命令を、matrix領域174に初期値を格納する命令に変換する。
(S18)最適化部135は、vector型二次元配列に初期値が格納された後、サイズを変更せずにvector型二次元配列を使用する配列演算の命令を検出する。最適化部135は、検出した配列演算の位置に、vector型二次元配列の代わりにmatrix領域174を使用する配列演算の命令を挿入する。また、最適化部135は、vec_mat管理領域173のmatrixフラグを確認し、matrixフラグに応じて上記2種類の配列演算を選択的に実行させる命令を挿入する。例えば、最適化部135は、matrixフラグがONの場合はmatrix領域174を使用し、matrixフラグがOFFの場合はvector型二次元配列を使用する分岐命令を挿入する。
(S19)最適化部135は、vector型二次元配列のサイズを変更する命令を検出し、直前にフラグ変更処理の命令を挿入する。フラグ変更処理挿入の詳細は後述する。
(S20)最適化部135は、ステップS14で全てのvector型二次元配列を選択したか判断する。全てのvector型二次元配列を選択した場合は処理が終了し、未選択のvector型二次元配列がある場合はステップS14に処理が進む。
図12は、二次元配列検索の手順例を示すフローチャートである。
この二次元配列検索は、前述のステップS13で実行される。
(S30)最適化部135は、コンパイル対象の関数を1つ選択する。
(S31)最適化部135は、ステップS30で選択した関数がvectorライブラリをincludeしているか(参照しているか)判断する。vectorライブラリをincludeしている場合はステップS32に処理が進み、vectorライブラリをincludeしていない場合はステップS37に処理が進む。
(S32)最適化部135は、ステップS30で選択した関数内に含まれている変数宣言の中から変数宣言を1つ選択する。
(S33)最適化部135は、ステップS32で選択した変数宣言のデータ型がvectorであるか判断する。データ型がvectorである場合、ステップS34に処理が進む。vectorでない場合、ステップS32で選択した変数宣言によって特定される変数がvector型二次元配列でないと判定され、ステップS36に処理が進む。
(S34)最適化部135は、ステップS33のvectorに格納される要素のデータ型がvectorであるか判断する。要素のデータ型がvectorである場合、ステップS35に処理が進む。vectorでない場合、ステップS32で選択した変数宣言によって特定される変数がvector型二次元配列でないと判定され、ステップS36に処理が進む。
(S35)最適化部135は、ステップS32で選択した変数宣言によって特定される変数が、vector型二次元配列であると判定する。
(S36)最適化部135は、ステップS32で関数内の全ての変数宣言を選択したか判断する。全ての変数宣言を選択した場合はステップS37に処理が進み、未選択の変数宣言がある場合はステップS32に処理が進む。
(S37)最適化部135は、ステップS30で全ての関数を選択したか判断する。全ての関数を選択した場合は二次元配列検索が終了し、未選択の関数がある場合はステップS30に処理が進む。
図13は、フラグ変更処理挿入の手順例を示すフローチャートである。
このフラグ変更処理挿入は、前述のステップS19で実行される。
(S40)最適化部135は、コンパイル単位(例えば、着目している関数)の中から、vector型二次元配列のサイズが変わるようなvectorライブラリ関数の呼び出しを検索する。vector型二次元配列のサイズが変わるとは、行数および列数の少なくとも一方が変わることであり、行数または列数が増加する場合と行数または列数が減少する場合とを含む。サイズが変わるようなvectorライブラリ関数には、サイズを明示的に指定するresize()、末尾に要素を追加するpush_back()、要素を削除するclear()、途中に要素を追加するinsert()などが含まれる。
(S41)最適化部135は、ステップS40で検索されたvectorライブラリ関数呼び出しの中からvectorライブラリ関数呼び出しを1つ選択する。
(S42)最適化部135は、ステップS41で選択したvectorライブラリ関数呼び出しの直前に、matrixフラグをOFFに設定する命令を挿入する。また、最適化部135は、vectorライブラリ関数呼び出しの直前に、matrix領域174からvector型二次元配列の領域に要素をコピーし、matrix領域174を削除する命令を挿入する。matrixフラグを書き換える命令と要素をコピーする命令は、何れを先に実行するようにしてもよい。matrixフラグを書き換える命令と要素をコピーする命令は、matrixフラグがONであるときに高々1回実行されるようにする。このために、最適化部135は、現在のmatrixフラグを確認しmatrixフラグに応じて分岐する制御構造を挿入するようにしてもよい。
(S43)最適化部135は、ステップS41で全てのvectorライブラリ関数呼び出しを選択したか判断する。全てのvectorライブラリ関数呼び出しを選択した場合はステップS44に処理が進み、それ以外の場合はステップS41に処理が進む。
(S44)最適化部135は、コンパイル単位の中から、標準ライブラリ関数以外のユーザ関数の呼び出しを検索する。ユーザ関数には、呼び出し元の関数と同じユーザによって作成された関数に加えて、呼び出し元の関数と異なるユーザによって作成されたライブラリ関数(標準ライブラリ関数を除く)が含まれる。ユーザ関数呼び出しは、例えば、ステップS11で取得した呼び出し関係グラフを参照して検索される。
(S45)最適化部135は、ステップS44で検索されたユーザ関数呼び出しの中からユーザ関数呼び出しを1つ選択する。
(S46)最適化部135は、ステップS45で選択したユーザ関数呼び出しの呼び出し先ユーザ関数を、ステップS11で取得した呼び出し関係グラフを参照して特定する。最適化部135は、呼び出し先ユーザ関数内でのvector型二次元配列の使用状況を示す情報を取得する。なお、呼び出し先ユーザ関数が更に別のユーザ関数を呼び出している場合、最適化部135は再帰的に呼び出し先ユーザ関数を追跡する。
(S47)最適化部135は、呼び出し先ユーザ関数内でvector型二次元配列のサイズが変化する可能性があるか判断する。具体的には、最適化部135は、呼び出し先ユーザ関数の中からステップS40と同様のvectorライブラリ関数呼び出しを検索する。呼び出し先ユーザ関数にresize()、push_back()、clear()、insert()などのライブラリ関数呼び出しが含まれている場合、最適化部135は、vector型二次元配列のサイズが変化する可能性があると判断する。vector型二次元配列のサイズが変わる可能性がある場合はステップS48に処理が進み、サイズが変わる可能性がない場合はステップS49に処理が進む。
(S48)最適化部135は、ステップS45で選択したユーザ関数呼び出しの直前に、matrixフラグをOFFに設定する命令を挿入する。最適化部135は、また、最適化部135は、ユーザ関数呼び出しの直前に、matrix領域174からvector型二次元配列の領域に要素をコピーし、matrix領域174を削除する命令を挿入する。matrixフラグを書き換える命令と要素をコピーする命令は、何れを先に実行するようにしてもよい。matrixフラグを書き換える命令と要素をコピーする命令は、matrixフラグがONであるときに高々1回実行されるようにする。このために、最適化部135は、現在のmatrixフラグを確認しmatrixフラグに応じて分岐する制御構造を挿入するようにしてもよい。
(S49)最適化部135は、ステップS45で全てのユーザ関数呼び出しを選択したか判断する。全てのユーザ関数呼び出しを選択した場合はフラグ変更処理挿入が終了し、それ以外の場合はステップS45に処理が進む。
なお、第2の実施の形態では最適化する可変長二次元配列を、行数と列数が共に可変であるvector型二次元配列に限定した。しかし、行数が固定であっても列数が可変である場合には、ある行の要素を格納するメモリ領域と次の行の要素を格納するメモリ領域とが不連続になる可能性がある。そこで、コンパイル装置100は、行数が固定で列数が可変である可変長二次元配列を最適化の対象としてもよい。すなわち、少なくとも列数が可変である可変長二次元配列を固定長二次元配列に変換することが考えられる。
第2の実施の形態のコンパイル装置100によれば、コンパイル時に可変長二次元配列を使用する命令が固定長二次元配列を使用する命令に自動的に変換される。よって、二次元配列の要素にアクセスするときポインタを辿る回数が減少し、メモリアクセス効率が向上する。また、二次元配列の全ての要素が連続メモリ領域に密に格納され、キャッシュメモリの使用効率が向上する。また、二次元配列のサイズを変更しようとする命令の直前で、固定長二次元配列から可変長二次元配列に戻される。よって、二次元配列のデータが破壊されることを抑止し、ソースコードが意図した処理を実現できる。
また、ユーザはオブジェクトコードの実行効率を向上させるために固定長二次元配列を明示的に使用しなくてもよく、変数宣言時にサイズを指定しなくてよい可変長二次元配列を使用でき、ソースコードの作成が容易となる。また、可変長二次元配列の管理用情報に隣接させて、管理用領域の負方向にmatrixフラグとmatrixポインタが格納される。これにより、matrixフラグやmatrixポインタを失わないように、メモリ上に安全に保持できる。例えば、可変長二次元配列の管理用情報が移動したときに、matrixフラグやmatrixポインタも合わせて移動させることが容易となり、可変長二次元配列に紐付けてmatrixフラグやmatrixポインタを保持できる。
10 情報処理装置
11 記憶部
12 処理部
13 ソースコード
13a,13c 配列処理
13b サイズ変更処理
14 実行プログラム
14a,14b,14c コード
15 可変長配列
16 固定長配列

Claims (6)

  1. コンピュータに、
    可変長配列を使用する第1の配列処理と、前記第1の配列処理の開始後に前記可変長配列のサイズを変更するサイズ変更処理とが記述されたソースコードを取得し、
    前記第1の配列処理の記述に基づいて、前記可変長配列に対応する固定長配列を使用する第2の配列処理と前記第1の配列処理とを選択的に実行させる第1のコードを生成し、また、前記第1のコードの初期状態として前記第1および第2の配列処理のうち前記第2の配列処理が選択されるよう制御する第2のコードを生成し、
    前記サイズ変更処理が記述された位置に対応させて、前記固定長配列に格納されているデータを前記可変長配列に移動させ、前記第1のコードにおいて前記第2の配列処理から前記第1の配列処理に切り替えられるよう制御する第3のコードを生成し、
    前記第1、第2および第3のコードを含む実行プログラムを生成する、
    処理を実行させるコンパイルプログラム。
  2. 前記第1のコードは、所定のメモリ領域に記憶されたフラグが第1の値のとき前記第1の配列処理を実行させ、前記フラグが第2の値のとき前記第2の配列処理を実行させ、
    前記第2のコードは、前記フラグを前記第2の値に設定し、
    前記第3のコードは、前記フラグを前記第1の値に変更する、
    請求項1記載のコンパイルプログラム。
  3. 前記所定のメモリ領域は、前記可変長配列に割り当てられる他のメモリ領域を基準として所定の相対位置に存在するメモリ領域である、
    請求項2記載のコンパイルプログラム。
  4. 前記可変長配列は、少なくとも1つの次元の要素数が可変である可変長多次元配列であり、前記固定長配列は、各次元の要素数が不変である固定長多次元配列である、
    請求項1記載のコンパイルプログラム。
  5. コンピュータが実行するコンパイル方法であって、
    可変長配列を使用する第1の配列処理と、前記第1の配列処理の開始後に前記可変長配列のサイズを変更するサイズ変更処理とが記述されたソースコードを取得し、
    前記第1の配列処理の記述に基づいて、前記可変長配列に対応する固定長配列を使用する第2の配列処理と前記第1の配列処理とを選択的に実行させる第1のコードを生成し、また、前記第1のコードの初期状態として前記第1および第2の配列処理のうち前記第2の配列処理が選択されるよう制御する第2のコードを生成し、
    前記サイズ変更処理が記述された位置に対応させて、前記固定長配列に格納されているデータを前記可変長配列に移動させ、前記第1のコードにおいて前記第2の配列処理から前記第1の配列処理に切り替えられるよう制御する第3のコードを生成し、
    前記第1、第2および第3のコードを含む実行プログラムを生成する、
    コンパイル方法。
  6. 可変長配列を使用する第1の配列処理と、前記第1の配列処理の開始後に前記可変長配列のサイズを変更するサイズ変更処理とが記述されたソースコードを記憶する記憶部と、
    前記第1の配列処理の記述に基づいて、前記可変長配列に対応する固定長配列を使用する第2の配列処理と前記第1の配列処理とを選択的に実行させる第1のコードを生成し、また、前記第1のコードの初期状態として前記第1および第2の配列処理のうち前記第2の配列処理が選択されるよう制御する第2のコードを生成し、前記サイズ変更処理が記述された位置に対応させて、前記固定長配列に格納されているデータを前記可変長配列に移動させ、前記第1のコードにおいて前記第2の配列処理から前記第1の配列処理に切り替えられるよう制御する第3のコードを生成し、前記第1、第2および第3のコードを含む実行プログラムを生成する処理部と、
    を有する情報処理装置。
JP2016235497A 2016-12-05 2016-12-05 コンパイルプログラム、コンパイル方法および情報処理装置 Active JP6718119B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2016235497A JP6718119B2 (ja) 2016-12-05 2016-12-05 コンパイルプログラム、コンパイル方法および情報処理装置
US15/785,480 US10101980B2 (en) 2016-12-05 2017-10-17 Compilation method and information processing apparatus

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2016235497A JP6718119B2 (ja) 2016-12-05 2016-12-05 コンパイルプログラム、コンパイル方法および情報処理装置

Publications (2)

Publication Number Publication Date
JP2018092383A true JP2018092383A (ja) 2018-06-14
JP6718119B2 JP6718119B2 (ja) 2020-07-08

Family

ID=62243852

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2016235497A Active JP6718119B2 (ja) 2016-12-05 2016-12-05 コンパイルプログラム、コンパイル方法および情報処理装置

Country Status (2)

Country Link
US (1) US10101980B2 (ja)
JP (1) JP6718119B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2019219912A (ja) * 2018-06-20 2019-12-26 富士通株式会社 情報処理装置、コンパイラプログラム及びコンパイル方法

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10509653B2 (en) * 2017-02-10 2019-12-17 Intel Corporation Vector processing system
KR20210100335A (ko) 2020-02-06 2021-08-17 삼성전자주식회사 멀티 디바이스 기반 추론 방법 및 장치
CN111580828B (zh) * 2020-04-30 2021-08-27 腾讯科技(深圳)有限公司 机器学习模型的编译优化方法和装置
US11899588B2 (en) * 2020-09-14 2024-02-13 Samsung Electronics Co., Ltd. Systems, methods, and devices for discarding inactive intermediate render targets
US11748251B2 (en) * 2021-01-08 2023-09-05 Microsoft Technology Licensing, Llc Storing tensors in memory based on depth
US11847435B2 (en) * 2021-12-20 2023-12-19 International Business Machines Corporation Feedback-directed pass pipeline optimization in static compilation

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH09179759A (ja) * 1995-10-19 1997-07-11 Nec Corp 可変長オブジェクトのデータベース処理装置、データベ ース処理方法、およびデータベース処理プログラムを記 憶する記憶媒体
JPH10177566A (ja) * 1996-10-18 1998-06-30 Fujitsu Ltd メモリアクセスの高速化処理装置および記録媒体
US20150067225A1 (en) * 2013-08-30 2015-03-05 Nec Laboratories America, Inc. Automatic communication and optimization of multi-dimensional arrays for many-core coprocessor using static compiler analysis

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3551353B2 (ja) 1998-10-02 2004-08-04 株式会社日立製作所 データ再配置方法
JP3355602B2 (ja) 1999-01-27 2002-12-09 インターナショナル・ビジネス・マシーンズ・コーポレーション 多次元配列オブジェクトの処理方法及び装置
JP2007328692A (ja) 2006-06-09 2007-12-20 Canon Inc 代数演算方法及びその装置、プログラム
JP2008003882A (ja) 2006-06-23 2008-01-10 Fujitsu Ltd コンパイラプログラム,リストベクトルの領域割当て最適化方法,コンパイル処理装置およびコンパイラプログラムを記録したコンピュータ読み取り可能な記録媒体
US8782613B2 (en) * 2008-08-12 2014-07-15 Hewlett-Packard Development Company, L.P. Optimizing applications using source code patterns and performance analysis

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH09179759A (ja) * 1995-10-19 1997-07-11 Nec Corp 可変長オブジェクトのデータベース処理装置、データベ ース処理方法、およびデータベース処理プログラムを記 憶する記憶媒体
JPH10177566A (ja) * 1996-10-18 1998-06-30 Fujitsu Ltd メモリアクセスの高速化処理装置および記録媒体
US20150067225A1 (en) * 2013-08-30 2015-03-05 Nec Laboratories America, Inc. Automatic communication and optimization of multi-dimensional arrays for many-core coprocessor using static compiler analysis

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2019219912A (ja) * 2018-06-20 2019-12-26 富士通株式会社 情報処理装置、コンパイラプログラム及びコンパイル方法

Also Published As

Publication number Publication date
US20180157470A1 (en) 2018-06-07
US10101980B2 (en) 2018-10-16
JP6718119B2 (ja) 2020-07-08

Similar Documents

Publication Publication Date Title
JP6718119B2 (ja) コンパイルプログラム、コンパイル方法および情報処理装置
JP6572610B2 (ja) 情報処理装置、コンパイル方法およびコンパイルプログラム
KR100384905B1 (ko) 컴퓨터 메모리에서 데이터 관리 방법, 장치 및 기록매체
US8181170B2 (en) Unwind information for optimized programs
US9977759B2 (en) Parallel computing apparatus, compiling apparatus, and parallel processing method for enabling access to data in stack area of thread by another thread
US9841953B2 (en) Pluggable components for runtime-image generation
US8205192B2 (en) Compiler device, program, and recording medium
US8423589B2 (en) Copy collector with efficient abort-on-copy transition to mark collector
JPH0519173B2 (ja)
JP6398725B2 (ja) コンパイルプログラム、コンパイル方法およびコンパイラ装置
JP2013206291A (ja) プログラム、コード生成方法および情報処理装置
Strumpen Compiler technology for portable checkpoints
CN112889026A (zh) 用户界面资源文件优化
Barua et al. Ompmemopt: Optimized memory movement for heterogeneous computing
Liu et al. Improving the performance of OpenMP by array privatization
JP2022140995A (ja) 情報処理装置、コンパイルプログラムおよびコンパイル方法
JP2019144857A (ja) 情報処理装置、コンパイル方法およびコンパイルプログラム
KR100763199B1 (ko) 가상 머신 환경에서의 메소드 호출 방법 및 상기 방법을수행하는 가상 머신이 탑재된 시스템
US20150278089A1 (en) Execution control method and execution control apparatus
CN107562430B (zh) 一种针对移动π演算语言的文件处理功能的编译方法
Hnat et al. A modular and extensible macroprogramming compiler
JPH10275088A (ja) リンク最適化方法
JP7225900B2 (ja) コンパイラ装置、プログラム、及び情報処理方法
van der Spek et al. Automatic restructuring of linked data structures
KR20060092728A (ko) 프리-프로세스에서 파일 검색 시간 단축을 통한 컴파일러의컴파일 속도 향상 방법

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20190807

RD02 Notification of acceptance of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7422

Effective date: 20190815

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20190815

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20200416

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: 20200512

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20200525

R150 Certificate of patent or registration of utility model

Ref document number: 6718119

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150