[go: up one dir, main page]

JP6665720B2 - 情報処理装置、コンパイルプログラム、コンパイル方法、およびキャッシュ制御方法 - Google Patents

情報処理装置、コンパイルプログラム、コンパイル方法、およびキャッシュ制御方法 Download PDF

Info

Publication number
JP6665720B2
JP6665720B2 JP2016139830A JP2016139830A JP6665720B2 JP 6665720 B2 JP6665720 B2 JP 6665720B2 JP 2016139830 A JP2016139830 A JP 2016139830A JP 2016139830 A JP2016139830 A JP 2016139830A JP 6665720 B2 JP6665720 B2 JP 6665720B2
Authority
JP
Japan
Prior art keywords
loop
data
area
sector
array
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
JP2016139830A
Other languages
English (en)
Other versions
JP2018010540A (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 JP2016139830A priority Critical patent/JP6665720B2/ja
Priority to US15/639,811 priority patent/US10353682B2/en
Publication of JP2018010540A publication Critical patent/JP2018010540A/ja
Application granted granted Critical
Publication of JP6665720B2 publication Critical patent/JP6665720B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • G06F8/452Loops
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0862Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches with prefetch
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0875Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches with dedicated cache, e.g. instruction or stack
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • G06F8/4442Reducing the number of cache misses; Data prefetching
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3004Arrangements for executing specific machine instructions to perform operations on memory
    • G06F9/30047Prefetch instructions; cache control instructions
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30065Loop control instructions; iterative instructions, e.g. LOOP, REPEAT
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3802Instruction prefetching
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3824Operand accessing
    • G06F9/383Operand prefetching
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/45Caching of specific data in cache memory
    • G06F2212/452Instruction code
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/60Details of cache memory
    • G06F2212/6024History based prefetching

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Memory System Of A Hierarchy Structure (AREA)
  • Devices For Executing Special Programs (AREA)

Description

本発明は、情報処理装置、コンパイルプログラム、コンパイル方法、およびキャッシュ制御方法に関する。
従来、先の処理において利用が予測されるデータを、あらかじめキャッシュメモリに読み出しておくプリフェッチと呼ばれる機能がある。また、キャッシュメモリの一種として、メモリ領域を複数のセクタと呼ばれる単位に分割して、キャッシュラインごとに使用するセクタを選択することができるセクタキャッシュと呼ばれるものがある。
先行技術としては、キャッシュメモリを有効的に利用するための技術がある。例えば、セクタ機能付きキャッシュメモリを搭載する情報処理装置にて実行されるソースプログラムを解析して、各ループにて処理されるデータ集合のループ処理実行時における再利用性の有無を判定するコンパイラ装置がある。このコンパイラ装置は、再利用性の有無を判定したデータ集合を格納するために要するウェイ数とシステムの最大ウェイ数とから、セクタ分割比およびセクタ番号を決定して、ループにおいて、セクタ分割命令およびセクタ番号を付加した命令文を挿入する。
また、データの再利用度に応じて分割されるセクタ機能を備える共有キャッシュメモリと、共有キャッシュメモリのセクタの分割比を変更する制御ユニットと、を有する情報処理装置がある。この制御ユニットは、第1のジョブ、第2のジョブの実行中に、第2のジョブのプログラムの指定に応じて、第1、第2のジョブがアクセスするデータのサイズおよびアクセス回数を有するデータアクセス量と、共有キャッシュメモリの容量とに基づいて、セクタの分割比を算出し、算出したセクタの分割比に変更する。
特開2010−244205号公報 特開2015−222477号公報
しかしながら、従来技術では、ソースコード上で連続的に発生することが分かるメモリアクセスであっても、初めの一部分に対しては、その部分で使用するデータをプリフェッチすることが難しく、キャッシュミスが発生して性能低下を招くという問題がある。
一つの側面では、本発明は、キャッシュミスの発生を抑制して性能向上を図ることを目的とする。
本発明の一態様によれば、プログラムをコンパイルする際に、それぞれの繰り返しで配列のデータにアクセスするとともに、所定回先の繰り返しでアクセスする前記配列のデータのプリフェッチを行うループ処理を、先頭から前記所定回先の繰り返しの直前までの第1ループ処理と、前記所定回先の繰り返しから最後までの第2ループ処理とに分割し、前記第1ループ処理において、キャッシュメモリ内の第1領域を用いて前記配列のデータのアクセスを行うとともに、前記キャッシュメモリ内の第2領域を用いて前記配列のデータのプリフェッチを行い、前記第2ループ処理において、前記第2領域を用いて前記配列のデータのアクセスおよびプリフェッチを行う中間言語コードを生成する情報処理装置、コンパイルプログラム、およびコンパイル方法が提案される。
また、本発明の一態様によれば、プログラムを実行する際に、ループ処理の先頭から所定回先の繰り返しの直前までの第1ループ処理において、キャッシュメモリ内の第1領域を用いて、それぞれの繰り返しで配列のデータにアクセスするとともに、前記キャッシュメモリ内の第2領域を用いて、前記所定回先の繰り返しでアクセスする前記配列のデータのプリフェッチを行い、前記ループ処理の前記所定回先の繰り返しから最後までの第2ループ処理において、前記第2領域を用いて、それぞれの繰り返しで前記配列のデータにアクセスするとともに、前記所定回先の繰り返しでアクセスする前記配列のデータのプリフェッチを行うキャッシュ制御方法が提案される。
本発明の一側面によれば、キャッシュミスの発生を抑制して性能向上を図ることができる。
図1は、実施の形態にかかるコンパイル方法の一実施例を示す説明図である。 図2は、情報処理装置101のハードウェア構成例を示すブロック図である。 図3は、情報処理装置101の機能的構成例を示すブロック図である。 図4は、ループ変形後のソースプログラムscの具体例を示す説明図である。 図5は、情報処理装置101のコンパイル処理手順の一例を示すフローチャートである。 図6は、ループ変形処理の具体的処理手順の一例を示すフローチャート(その1)である。 図7は、ループ変形処理の具体的処理手順の一例を示すフローチャート(その2)である。 図8は、ライン数探索処理の具体的処理手順の一例を示すフローチャートである。
以下に図面を参照して、本発明にかかる情報処理装置、コンパイルプログラム、コンパイル方法、およびキャッシュ制御方法の実施の形態を詳細に説明する。
(実施の形態)
図1は、実施の形態にかかるコンパイル方法の一実施例を示す説明図である。図1において、情報処理装置101は、ソースプログラムscをコンパイルして実行可能ファイルfを生成するコンピュータである。情報処理装置101は、例えば、PC(パーソナル・コンピュータ)、タブレットPCなどの汎用演算装置であってもよく、また、サーバであってもよい。
ソースプログラムscは、プログラミング言語を用いて記述されたコンピュータプログラムであり、コンピュータを動作させる命令、手順などを記述したものである。コンパイルとは、プログラミング言語で記述されたソースコードを、コンピュータが解釈可能な機械語(マシン語)としてのオブジェクトコードに変換することである。実行可能ファイルfは、変換されたオブジェクトコードに、ライブラリなどを付け加えて生成される、実行形式のファイルである。プログラミング言語としては、例えば、C言語、Fortran、Java(登録商標)、C++などがある。
情報処理装置101によって生成される実行可能ファイルfは、セクタキャッシュと呼ばれるキャッシュメモリを有するコンピュータで実行される。セクタキャッシュは、メモリ領域を複数のセクタと呼ばれる単位に分割して、キャッシュラインごとに使用するセクタを選択することができるキャッシュメモリである。
なお、実行可能ファイルfは、情報処理装置101をターゲットとするものでもよいし、他のコンピュータをターゲットとするものでもよい。
ここで、キャッシュミスは、あるデータが必要となったときに、そのデータがキャッシュメモリ上に存在せず、キャッシュメモリからデータを読むことができないことである。キャッシュミスが発生すると、メインメモリからデータを転送してくる時間が待ち時間となるため性能上大きな問題となることがある。
なお、本実施の形態において、単に「キャッシュミス」と表記した場合、デマンドリクエストにより発生するキャッシュミス、すなわち、プリフェッチのときに発生するキャッシュミス以外のキャッシュミス(デマンドミス)を表すものとする。
キャッシュミスを防ぐには、データが必要になる前に、キャッシュメモリにデータを読み出しておくプリフェッチを行うことが有効である。例えば、ソースコード上でメモリアクセスが連続的に発生することが分かっていれば、先の処理で必要となるデータを、あらかじめキャッシュメモリに読み出しておくことができる。
ところが、ソースコード上で連続的に発生することが分かるメモリアクセスであっても、その初めの一部分のものについてはプリフェッチすることが難しい。例えば、データが必要になる十分前のプログラム上の位置が特定できない、もしくは、位置を特定できてもプリフェッチを行う命令を配置するのが難しい場合がある。
より具体的には、例えば、ループ処理の繰り返しの初めの部分で使用するデータをプリフェッチすることは難しい。ループ処理とは、何らかの条件下で処理を繰り返す処理である。例えば、ループ処理は、for文やwhile文によって表現される。また、繰り返しの初めの部分とは、例えば、ループ処理の繰り返しのi番目で(i+M)番目のデータをプリフェッチする場合、先頭からM番目までの繰り返しの部分のことである。
メインメモリからキャッシュメモリにデータを転送するのにかかる時間と、ループ処理の繰り返しがM回進む時間とが等しい場合、i番目の繰り返しのときに(i+M)番目のデータをプリフェッチすることが多い。したがって、この場合は、先頭からM番目までの繰り返しで使用するデータはプリフェッチされない。
例えば、図1に示すプログラム110は、ソースプログラムscの一例である。プログラム110は、ループAと、ループBと、ループCと、を含む。prefetch(a[i+M])は、その時点でa[i+M]のデータのメインメモリからキャッシュメモリへの転送を始める、すなわち、プリフェッチすることを意味する。
各ループA,B,Cでは、それぞれM1,M2,M3回先のデータをプリフェッチしている。メインメモリからキャッシュメモリへのデータ転送の時間と同じ時間がかかる各ループA,B,Cの繰り返しの数だけ事前にプリフェッチすることで、そのデータを実際に使う処理(a[i]=...;)の前にキャッシュメモリに用意しておくことができる。
しかし、各ループA,B,Cによってa[1]からそれぞれa[M1],a[M2],a[M3]までのデータはプリフェッチされない。これらのデータは、先のループで一旦キャッシュメモリに載るが、a[M1],a[M2],a[M3]以降のデータによって、次のループが始まる前に追い出される場合がある。このため、各ループA,B,Cにおいて、先頭からそれぞれM1,M2,M3回目までの繰り返しのときにキャッシュミスが起こる可能性がある。
そこで、本実施の形態では、セクタキャッシュを利用して、連続的に発生するメモリアクセスの初めの一部分に対して専用のセクタを割り当てることにより、その部分におけるキャッシュミスの発生を抑制して性能向上を図るコンパイル方法について説明する。以下、情報処理装置101の処理例について説明する。
(1)情報処理装置101は、ソースプログラムscをコンパイルする際に、ソースプログラムsc内のループ処理を、第1ループ処理と第2ループ処理とに分割する。ここで、分割対象となるループ処理は、それぞれの繰り返しで、配列のデータにアクセス(参照)するとともに、所定回先の繰り返しでアクセスする配列のデータのプリフェッチを行うループ処理である。配列とは、同じ種類の値を並べて記憶するデータ構造である。配列のデータは、例えば、メインメモリ上に順番に並べて記憶される。
第1ループ処理は、ループ処理の先頭からM回目(M回先の繰り返しの直前)までの処理の繰り返しを含む部分である。第2ループ処理は、ループ処理の(M+1)回目(M回先の繰り返し)から最後までの処理の繰り返しを含む部分である。また、Mは、プリフェッチする繰り返し番号の相対位置を示す整数であり、どれだけ先の繰り返しでアクセスする配列のデータをプリフェッチするのかを表す。
Mの値は、任意に設定することができる。例えば、Mの値として、ソースプログラムsc内の各ループ処理に定義されている値(プログラム110では、M1,M2,M3)がそれぞれ設定されることにしてもよい。また、Mの値として、ソースプログラムsc内の各ループ処理に定義されている値のうちの最大値(プログラム110では、M1,M2,M3のうちの最大値)が設定されることにしてもよい。
一例として、プログラム110のループAを例に挙げると、符号120に示すように、ループAが、先頭からM回目までの第1ループ処理と、(M+1)回目から最後までの第2ループ処理とに分割される。ただし、Mは、プログラム110内のループA,B,Cに定義されているM1,M2,M3のうちの最大値である。
(2)情報処理装置101は、第1ループ処理において、キャッシュメモリ内の第1領域を用いて配列のデータのアクセスを行うとともに、キャッシュメモリ内の第2領域を用いて配列のデータのプリフェッチを行う中間言語コードを生成する。また、情報処理装置101は、第2ループ処理において、第2領域を用いて配列のデータのアクセスおよびプリフェッチを行う中間言語コードを生成する。
ここで、第1領域は、キャッシュメモリを区切って分割した複数のセクタのうちのいずれかのセクタ(以下、「セクタA」という)である。また、第2領域は、キャッシュメモリ内の第1領域と重複しない領域であり、キャッシュメモリを区切って分割した複数のセクタのうちのセクタAとは異なる他のセクタ(以下、「セクタB」という)である。また、中間言語コードは、プログラミング言語で記述されるソースコードと、機械語としてオブジェクトコードとの中間にあたる中間表現の言語で表現されたコードである。
一例として、プログラム110のループAを例に挙げると、符号130に示すように、第1ループ処理において、セクタAを用いて配列のデータのアクセスを行うとともに、セクタBを用いて配列のデータのプリフェッチを行う中間言語コードが生成される。また、符号130に示すように、第2ループ処理において、セクタBを用いて配列のデータのアクセスおよびプリフェッチを行う中間言語コードが生成される。
なお、実際には、符号120のようにソースレベルでループ処理が変形されるのではなく、コンパイラ内部の表現に対する処理が行われる。例えば、符号120では、どちらのセクタを使用するかが、行ごとに括弧内に表現されているが、実際はコンパイラの内部で記録され、マシン語に変換される際にその情報に従って命令が選択される。
(3)情報処理装置101は、生成した中間言語コードに基づいて、ソースプログラムscの実行可能ファイルfを生成する。具体的には、例えば、情報処理装置101は、生成した中間言語コードを機械語の命令の列に変換することにより、ソースプログラムscの実行可能ファイルfを生成する。
生成された実行可能ファイルfは、例えば、情報処理装置101の記憶装置に記憶される、あるいは、他のコンピュータに出力される。
このように、情報処理装置101によれば、ソースプログラムsc上で連続的に発生するメモリアクセスの初めの一部分に対して専用のセクタを割り当てることにより、その部分におけるキャッシュミスの発生を抑制して性能向上を図ることができる。
プログラム110の例では、ループB,Cについても、符号120に示すループAのように変形することで、a[i]からa[M]のデータはループAでキャッシュミス(デマンドミス)するが、他のデータがセクタAを使わないため追い出されず、ループBとループCではデマンドミスが発生しないことになる。
(情報処理装置101のハードウェア構成例)
図2は、情報処理装置101のハードウェア構成例を示すブロック図である。図2において、情報処理装置101は、CPU(Central Processing Unit)201と、メモリ202と、I/F(Interface)203と、ディスクドライブ204と、ディスク205と、を有する。また、各構成部は、バス200によってそれぞれ接続される。
ここで、CPU201は、情報処理装置101の全体の制御を司る。メモリ202は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)およびフラッシュROMなどを有する。具体的には、例えば、フラッシュROMやROMが各種プログラムを記憶し、RAMがCPU201のワークエリアとして使用される。RAMは、例えば、メインメモリとキャッシュメモリ(セクタキャッシュ)とを含む。メモリ202に記憶されるプログラムは、CPU201にロードされることで、コーディングされている処理をCPU201に実行させる。また、メモリ202は、メインメモリと、CPU201とメインメモリとの間に置かれるキャッシュメモリとを含む。キャッシュメモリは、例えば、セクタキャッシュである。
I/F203は、通信回線を通じてネットワーク210に接続され、ネットワーク210を介して外部のコンピュータに接続される。ネットワーク210は、例えば、LAN(Local Area Network)、WAN(Wide Area Network)、インターネット、移動体通信網などを含む。そして、I/F203は、ネットワーク210と装置内部とのインターフェースを司り、外部のコンピュータからのデータの入出力を制御する。I/F203には、例えば、モデムやLANアダプタなどを採用することができる。
ディスクドライブ204は、CPU201の制御に従ってディスク205に対するデータのリード/ライトを制御する。ディスク205は、ディスクドライブ204の制御で書き込まれたデータを記憶する。ディスク205としては、例えば、磁気ディスク、光ディスクなどが挙げられる。
なお、情報処理装置101は、上述した構成部のほかに、例えば、SSD(Solid State Drive)、入力装置、ディスプレイ等を有することにしてもよい。
(情報処理装置101の機能的構成例)
図3は、情報処理装置101の機能的構成例を示すブロック図である。図3において、情報処理装置101は、取得部301と、解析部302と、第1の生成部303と、最適化部304と、第2の生成部305と、決定部306と、出力部307と、を含む構成である。取得部301〜出力部307は制御部となる機能であり、具体的には、例えば、図2に示したメモリ202、ディスク205などの記憶装置に記憶されたプログラムをCPU201に実行させることにより、または、I/F203により、その機能を実現する。各機能部の処理結果は、例えば、メモリ202、ディスク205などの記憶装置に記憶される。
取得部301は、ソースプログラムscを取得する。具体的には、例えば、取得部301は、不図示の入力装置を用いたユーザの操作入力により、ソースプログラムsc(例えば、図1に示したプログラム110)を取得する。また、例えば、取得部301は、I/F203により、外部のコンピュータからソースプログラムscを取得することにしてもよい。
解析部302は、ソースプログラムscの構文解析および意味解析を行う。ここで、構文解析とは、ソースプログラムscに記述された文や構造が言語仕様に沿っているか否かをチェックすることである。意味解析とは、ソースプログラムscに記述された変数の型や文が意味的に正しいか否かをチェックすることである。
具体的には、例えば、まず、解析部302は、ソースプログラムscの字句解析を行う。字句解析とは、ソースプログラムscを構成する文字の並びを、例えば、キーワード、変数、演算子などのトークンの並びに変換することである。そして、解析部302は、字句解析により得られるトークンの並びについて、トークン間の関係を解析することにより、ソースプログラムscの構文解析および意味解析を行う。
第1の生成部303は、ソースプログラムscの構文解析および意味解析により得られる中間言語コードに基づいて、ソースプログラムsc内のループ処理を、第1ループ処理と第2ループ処理とに分割する。ここで、分割対象となるループ処理は、それぞれの繰り返しで、配列のデータにアクセスするとともに、M回先の繰り返しでアクセスする配列のデータのプリフェッチを行うループ処理である。
また、第1ループ処理は、ループ処理の先頭からM回目までの処理の繰り返しを含む部分である。第2ループ処理は、ループ処理の(M+1)回目から最後までの処理の繰り返しを含む部分である。Mは、プリフェッチする繰り返し番号の相対位置を示す整数であり、どれだけ先の繰り返しでアクセスする配列のデータをプリフェッチするのかを表す。
以下の説明では、ソースプログラムsc内のループ処理であって、それぞれの繰り返しで配列のデータにアクセスするとともに、M回先の繰り返しでアクセスする配列のデータのプリフェッチを行うループ処理を「ループR」と表記する場合がある。
具体的には、例えば、第1の生成部303は、ループリストに登録されたループRそれぞれについて、第1ループR1と第2ループR2とに分割する。ループリストは、ソースプログラムsc内のループRがリスト構造で記録されたものである。
より詳細に説明すると、第1の生成部303は、例えば、ループRを複製して第1ループR1を生成する。つぎに、第1の生成部303は、第1ループR1の繰り返し開始番号として、ループRの繰り返し開始番号「B」を設定する。ここで、繰り返し開始番号とは、初めに処理を行うときの変数の値であり、例えば、for文におけるループ変数の初期値である。
また、第1の生成部303は、第1ループR1の繰り返し終了番号として、「B+M」を設定する。ここで、繰り返し終了番号とは、繰り返しの処理を終了するときの変数の値であり、例えば、for文におけるループ変数の上限値である。Mの値としては、例えば、全てのループRで最大の値が設定される。
つぎに、第1の生成部303は、第1ループR1がループRの直前に実行されるように、中間言語コードにおけるループRの直前に第1ループR1を挿入する。そして、第1の生成部303は、中間言語コードにおけるループRの繰り返し開始番号を「B+M+1」に変更することにより、第2ループR2(ループR)を生成する。
また、第1の生成部303は、第1ループR1において、キャッシュメモリ内のセクタAを用いて配列のデータにアクセスするとともに、キャッシュメモリ内のセクタBを用いて配列のデータのプリフェッチを行う中間言語コードを生成する。また、第1の生成部303は、第2ループR2において、セクタBを用いて、配列のデータにアクセスするとともに、配列のデータのプリフェッチを行う中間言語コードを生成する。
ここで、セクタAは、上述したように、キャッシュメモリ(セクタキャッシュ)を区切って分割した複数のセクタのうちのいずれかのセクタである。また、セクタBは、キャッシュメモリを区切って分割した複数のセクタのうちのセクタAとは異なる他のセクタである。
具体的には、例えば、第1の生成部303は、第1ループR1において、配列のデータへのアクセスに使用するセクタを「セクタA」とする情報を第1ループR1に付加する。すなわち、第1ループR1における全てのメモリアクセスに使用するセクタを「セクタA」とする。
より詳細に説明すると、例えば、メインメモリにはロードストア命令でアクセスすることになる。このロードストア命令には、どのセクタを使うかを指定するフィールドがある。第1の生成部303は、そのフィールドに「セクタA」を設定したマシン語を生成するように、中間言語コードにおいて情報を第1ループR1に付加する。
また、第1の生成部303は、第1ループR1において、先の繰り返しでアクセスする配列のデータのプリフェッチに使用するセクタを「セクタB」とする情報を第1ループR1に付加する。すなわち、第1ループR1における全てのプリフェッチに使用するセクタを「セクタB」とする。
また、第1の生成部303は、第2ループR2において、配列のデータへのアクセスおよび先の繰り返しでアクセスする配列のデータのプリフェッチに使用するセクタを「セクタB」とする情報を第2ループR2に付加する。すなわち、第2ループR2における全てのメモリアクセスおよびプリフェッチに使用するセクタを「セクタB」とする。
これにより、ソースプログラムsc内の各ループRについて、繰り返しの初めの一部分(第1ループR1)に対してセクタAを割り当て、残りの部分に対してセクタBを割り当てるように、各ループRを変形することができる。
一例として、図1に示したプログラム110を例に挙げると、第1の生成部303によって生成される中間言語コードをソースレベルで表現すると、図4のようになる。
図4は、ループ変形後のソースプログラムscの具体例を示す説明図である。図4において、プログラム400は、プログラム110内の各ループA,B,Cについてのループ変形をソースレベルで表現したものである。プログラム400のように、各ループA,B,Cを変形することにより、a[i]からa[M]のデータはループAでキャッシュミスするが、他のデータがセクタAを使わないため追い出されず、ループBとループCではデマンドミスが発生しないことになる。
なお、プログラム400において、どちらのセクタを使用するかを行ごとに括弧内に表現しているが、実際はコンパイラの内部で記録され、マシン語に変換される際にその情報に従って命令が選択される。すなわち、実際にはソースレベルでループRが変形されるのではなく、上述したように、コンパイラ内部の表現(中間言語コード)に対する処理が行われる。
ただし、ここでは、コンパイラ内部の表現(中間言語コード)に対して、ソースプログラムscの全てのループRがリスト構造で記録され操作できること、ループRの繰り返し開始/終了番号を操作できることを前提としている。また、ループRのメモリアクセスやプリフェッチの処理に、後のマシン語生成で参照する情報を付加できること、ループR中に新たな処理を追加することができることを前提としている。このようなことができることは、既存のコンパイラ技術では一般的である。
図3の説明に戻り、最適化部304は、第1の生成部303によって生成されたソースプログラムscの中間言語コードの最適化処理を行う。具体的には、例えば、最適化部304は、生成された中間言語コードから、どこからも呼び出しがないメソッドを不要なメソッドと見なして削除したりする。
なお、上述した第1の生成部303による処理は、最適化部304によって最適化処理が施されたソースプログラムscの中間言語コードに基づいて行われることにしてもよい。すなわち、最適化部304は、例えば、ソースプログラムscの構文解析および意味解析により得られる中間言語コードの最適化処理を行って、第1の生成部303に出力することにしてもよい。
第2の生成部305は、ソースプログラムscの中間言語コードに基づいて、ソースプログラムscの実行可能ファイルfを生成する。具体的には、例えば、第2の生成部305は、最適化部304または第1の生成部303から出力される中間言語コードを機械語の命令の列に変換することにより、ソースプログラムscの実行可能ファイルfを生成する。
決定部306は、キャッシュメモリ(セクタキャッシュ)内のセクタAのサイズと、セクタBのサイズとを決定する。ここで、セクタAおよびセクタBのサイズ(記憶容量)は、例えば、キャッシュラインのライン数によって表される。また、キャッシュメモリ内のセクタ数を「2」とすると、セクタBのサイズは、キャッシュメモリの全体サイズからセクタAのサイズを引くことで求めることができる。
具体的には、例えば、決定部306は、セクタAのサイズをある値に設定して、生成された実行可能ファイルfを実行することにより、セクタAについてのキャッシュミスの数(以下、「キャッシュミス数d」という)を測定する。つぎに、決定部306は、測定したキャッシュミス数dが、セクタAのサイズをキャッシュラインで割った値、すなわち、セクタAのライン数以下となるか否かを判断する。
決定部306は、セクタAのサイズ(ライン数)を変えながら、キャッシュミス数dが、セクタAのライン数以下となる最小のサイズ(ライン数)を探索する。そして、決定部306は、探索した最小のサイズを、セクタAのサイズに決定する。これにより、セクタAで発生するキャッシュミスの数が最小となる中で、最小のサイズとなるセクタAのサイズを求めることができる。
なお、セクタAのライン数をある値に設定したとき、キャッシュミス数dよりライン数が大きい場合は、探索したいライン数はそれ以下の値であり、キャッシュミス数dより小さい場合は、探索したいライン数はそれ以上の値である。このため、最小のサイズの探索については、二分法などを利用することができる。
また、セクタAのサイズが大きくなりすぎると、セクタAを設けないときはキャッシュメモリに載っていたデータが追い出されて処理時間が増加する可能性がある。このため、セクタAのサイズとして設定し得る最大サイズをあらかじめ設定することにしてもよい。例えば、不図示の入力装置を用いたユーザの操作入力により、セクタAの最大サイズを、セクタキャッシュ全体の2割程度に設定することにしてもよい。
そして、情報処理装置101は、探索したセクタAの最小サイズが、あらかじめ設定した最大サイズ以上となる場合には、本手法を適用せず、ソースプログラムscに対して既存のコンパイル処理を行うことにしてもよい。既存のコンパイル処理は、例えば、構文・意味解析処理、最適化処理およびコード生成処理を含む。
なお、セクタAのサイズ(最小サイズ)を探索する具体的な処理内容については、図8を用いて後述する。
出力部307は、生成されたソースプログラムscの実行可能ファイルfを出力する。出力部307の出力形式としては、例えば、メモリ202、ディスク205などの記憶装置への記憶、I/F203による外部のコンピュータへの送信などがある。
具体的には、例えば、出力部307は、ソースプログラムscの実行可能ファイルfと、決定されたセクタAおよびセクタBのライン数を示すライン情報とを対応付けて出力することにしてもよい。これにより、セクタキャッシュを有するコンピュータにおいて、ライン情報が示すセクタAおよびセクタBのライン数を設定して、ソースプログラムscの実行可能ファイルfを実行することができる。
例えば、情報処理装置101は、ソースプログラムsc内のループRそれぞれについて、先頭からM回目までの第1ループR1において、セクタAを用いて配列のデータにアクセスするとともに、セクタBを用いて配列のデータのプリフェッチを行うことができる。また、情報処理装置101は、(M+1)回目から最後までの第2ループR2において、セクタBを用いて配列のデータにアクセスするとともに配列のデータのプリフェッチを行うことができる。このため、既存のコンパイル処理を施した場合に比べて、ループRの繰り返しの初めの一部分のデータについてのキャッシュミスの発生を抑制して性能向上を図ることができる。
(情報処理装置101のコンパイル処理手順)
つぎに、情報処理装置101のコンパイル処理手順について説明する。
図5は、情報処理装置101のコンパイル処理手順の一例を示すフローチャートである。図5のフローチャートにおいて、まず、情報処理装置101は、ソースプログラムscを読み込む(ステップS501)。
つぎに、情報処理装置101、ソースプログラムscの字句解析を行う(ステップS502)。そして、情報処理装置101は、字句解析により得られるトークンの並びについて、トークン間の関係を解析することにより、ソースプログラムscの構文解析および意味解析を行う(ステップS503)。
つぎに、情報処理装置101は、ソースプログラムscの構文解析および意味解析により得られる中間言語コードに基づいて、ソースプログラムsc内のループRを第1ループR1と第2ループR2とに変形するループ変形処理を実行する(ステップS504)。ループ変形処理の具体的な処理手順については、図6および図7を用いて後述する。
つぎに、情報処理装置101は、ソースプログラムscの中間言語コードの最適化処理を行う(ステップS505)。なお、最適化処理は、例えば、ステップS504のループ変形処理の直前に実行することにしてもよい。そして、情報処理装置101は、ソースプログラムscの中間言語コードに基づいて、ソースプログラムscの実行可能ファイルfを生成する(ステップS506)。
つぎに、情報処理装置101は、キャッシュメモリ(セクタキャッシュ)内のセクタAのライン数(サイズ)を探索するライン数探索処理を実行する(ステップS507)。ライン数探索処理の具体的な処理手順については、図8を用いて後述する。そして、情報処理装置101は、セクタAのライン数が探索されたか否かを判断する(ステップS508)。
ここで、セクタAのライン数が探索された場合(ステップS508:Yes)、情報処理装置101は、ソースプログラムscの実行可能ファイルfと、セクタAおよびセクタBのライン数を示すライン情報とを対応付けて出力する(ステップS509)。そして、情報処理装置101は、本フローチャートによる一連の処理を終了する。
一方、ステップS508において、セクタAのライン数が探索されなかった場合(ステップS508:No)、情報処理装置101は、ソースプログラムscに対して、既存のコンパイル処理を実行する(ステップS510)。そして、情報処理装置101は、既存のコンパイル処理により得られるソースプログラムscの実行可能ファイルfを出力して(ステップS511)、本フローチャートによる一連の処理を終了する。
これにより、ソースプログラムsc内の各ループRにおいて連続的に発生するメモリアクセスの初めの一部分に対して専用のセクタAを割り当てて、プログラム実行時におけるキャッシュミスの発生を抑制する実行可能ファイルfを生成することができる。
<ループ変形処理手順>
つぎに、図5に示したステップS504のループ変形処理の具体的な処理手順について説明する。
図6および図7は、ループ変形処理の具体的処理手順の一例を示すフローチャートである。図6のフローチャートにおいて、まず、情報処理装置101は、ソースプログラムscのループリストに含まれる各ループRでプリフェッチする繰り返し番号の相対位置を示す整数Mを特定する(ステップS601)。
つぎに、情報処理装置101は、特定した各ループRの整数Mのうちの最大値Mmaxを、全ループRで共通の整数Mの値に設定する(ステップS602)。そして、情報処理装置101は、ループリストの先頭から未選択のループR(以下、「loop」という)を選択する(ステップS603)。
つぎに、情報処理装置101は、選択したloopの繰り返し開始番号Bを特定する(ステップS604)。そして、情報処理装置101は、選択したloopを複製してloop’を生成する(ステップS605)。
つぎに、情報処理装置101は、loop’の繰り返し開始番号に、特定したloopの繰り返し開始番号Bを設定する(ステップS606)。そして、情報処理装置101は、loop’の繰り返し終了番号に、「B+M」を設定する(ステップS607)。なお、整数Mの値は、ステップS602において設定されたMmaxである。
つぎに、情報処理装置101は、loop’の全てのメモリアクセスの使用セクタをセクタAとする情報をloop’に付加する(ステップS608)。そして、情報処理装置101は、loop’の全てのプリフェッチの使用セクタをセクタBとする情報をloop’に付加して(ステップS609)、図7に示すステップS701に移行する。
図7のフローチャートにおいて、まず、情報処理装置101は、loop’がloopの直前に実行されるように、loopの直前にloop’を挿入する(ステップS701)。つぎに、情報処理装置101は、loopの繰り返し開始番号に「B+M+1」を設定する(ステップS702)。
つぎに、情報処理装置101は、loopの全てのメモリアクセス、プリフェッチの使用セクタをセクタBとする情報をloopに付加する(ステップS703)。そして、情報処理装置101は、ループリストから選択されていない未選択のloopがあるか否かを判断する(ステップS704)。
ここで、未選択のloopがある場合(ステップS704:Yes)、情報処理装置101は、図6に示したステップS603に戻る。一方、未選択のloopがない場合(ステップS704:No)、情報処理装置101は、ループ変形処理を呼び出したステップに戻る。
これにより、ソースプログラムsc内の各ループRを、先頭からM回目までのloop’と、(M+1)回目から最後までのloopとに分割することができる。また、loop’において、キャッシュメモリ内のセクタAを用いて配列のデータのアクセスを行わせ、キャッシュメモリ内のセクタBを用いて配列のデータのプリフェッチを行わせることができる。また、loopにおいて、キャッシュメモリ内のセクタBを用いて配列のデータのアクセスおよびプリフェッチを行わせることができる。
<ライン数探索処理手順>
つぎに、図5に示したステップS507のライン数探索処理の具体的な処理手順について説明する。ここでは、二分法を利用して、キャッシュメモリ内のセクタAの最小のサイズ(ライン数)を探索する場合を例に挙げて説明する。
図8は、ライン数探索処理の具体的処理手順の一例を示すフローチャートである。図8において、まず、情報処理装置101は、変数l(left)を「l=0」とし(ステップS801)、変数r(right)を「r=LA_max+1」とする(ステップS802)。LA_maxは、セクタAのサイズとして設定し得る最大サイズを示す閾値である。
つぎに、情報処理装置101は、キャッシュメモリ内のセクタAのライン数LAを「LA=切り上げ((l+r)/2)」とし(ステップS803)、キャッシュメモリ内のセクタBのライン数LBを「LB=Ltotal−LA」とする(ステップS804)。なお、切り上げ()は、小数点以下を切り上げることを表す。Ltotalは、キャッシュメモリ全体のサイズ(ライン数)を示す。
つぎに、情報処理装置101は、図5に示したステップS506において生成されたソースプログラムscの実行可能ファイルdを実行して、セクタAについてのキャッシュミス数dを測定する(ステップS805)。そして、情報処理装置101は、測定したキャッシュミス数dがライン数LA以下であるか否かを判断する(ステップS806)。
ここで、キャッシュミス数dがライン数LA以下の場合(ステップS806:Yes)、情報処理装置101は、変数rを「r=切り上げ((l+r)/2)」として(ステップS807)、ステップS809に移行する。一方、キャッシュミス数dがライン数LAより大きい場合(ステップS806:No)、情報処理装置101は、変数lを「l=切り上げ((l+r)/2)」とする(ステップS808)。
そして、情報処理装置101は、「l+1=r」となったか否かを判断する(ステップS809)。ここで、「l+1=r」となっていない場合(ステップS809:No)、情報処理装置101は、ステップS803に戻る。一方、「l+1=r」となった場合(ステップS809:Yes)、情報処理装置101は、変数rが閾値LA_max以下であるか否かを判断する(ステップS810)。
ここで、変数rが閾値LA_max以下の場合(ステップS810:Yes)、情報処理装置101は、セクタAのライン数LAを「LA=r」に決定し(ステップS811)、セクタBのライン数LBを「LB=Ltotal−LA」に決定して(ステップS812)、ライン数探索処理を呼び出したステップに戻る。
一方、変数rが閾値LA_maxより大きい場合(ステップS810:No)、情報処理装置101は、ソースプログラムscに対して本手法を適用不可であると判断して(ステップS813)、ライン数探索処理を呼び出したステップに戻る。
これにより、セクタAで発生するキャッシュミスの数が最小となる中で、最小のサイズとなるセクタAのサイズを探索することができる。
以上説明したように、実施の形態にかかる情報処理装置101によれば、ソースプログラムsc内のループRを、先頭からM回先の繰り返しの直前までの第1ループR1と、M回先の繰り返しから最後までの第2ループR2とに分割することができる。また、情報処理装置101によれば、第1ループR1において、キャッシュメモリ内のセクタAを用いて配列のデータのアクセスを行うとともに、キャッシュメモリ内のセクタBを用いて配列のデータのプリフェッチを行い、第2ループR2において、セクタBを用いて、配列のデータのアクセスおよびプリフェッチを行う中間言語コードを生成することができる。そして、情報処理装置101によれば、生成した中間言語コードに基づいて、ソースプログラムscの実行可能ファイルfを生成することができる。
これにより、ソースプログラムsc内の各ループRにおいて連続的に発生するメモリアクセスの初めの一部分に対して、キャッシュメモリ(セクタキャッシュ)内の専用のセクタAを割り当てることができる。このため、その部分のデータがキャッシュメモリから追い出されにくくなり、プリフェッチしなくてもデマンドミスの発生を抑制して性能向上を図ることができる。
また、情報処理装置101によれば、セクタAのサイズを変えながら、生成した実行可能ファイルfを実行して、当該サイズに対応するセクタAについてのキャッシュミス数dを測定することができる。そして、情報処理装置101によれば、測定したキャッシュミス数dがライン数LA以下となる最小のサイズを、セクタAのサイズに決定して、決定したセクタAのサイズを示すライン情報を実行可能ファイルfと対応付けて出力することができる。ライン数LAは、セクタAのサイズをキャッシュラインで割った値である。
これにより、キャッシュメモリ内のセクタAで発生するキャッシュミスの数が最小となる中で、最小のサイズとなるセクタAのサイズを探索して、当該サイズをセクタAのサイズに設定することができる。
また、情報処理装置101によれば、ライン情報に基づいて、キャッシュメモリ内のセクタAおよびセクタBのサイズを設定して、実行可能ファイルfを実行することができる。具体的には、情報処理装置101は、ループRの先頭からM回先の繰り返しの直前までの第1ループR1において、セクタAを用いて、配列のデータにアクセスするとともに、セクタBを用いて、M回先の繰り返しでアクセスする配列のデータのプリフェッチを行う。また、情報処理装置101は、ループRのM回先の繰り返しから最後までの第2ループR2において、セクタBを用いて、配列のデータにアクセスするとともに、M回先の繰り返しでアクセスする配列のデータのプリフェッチを行う。
これにより、セクタAのサイズとして必要十分なサイズを割り当てることができ、ソースプログラムscの実行時に、セクタAのサイズが大きくなりすぎることにより生じるキャッシュミスを抑制して性能向上を図ることができる。
ここで、キャッシュ容量が「512[KiB/スレッド]」、ラインサイズ(キャッシュライン)が「128[B]」、メモリ帯域が「10[GiB/s/スレッド]」、メモリレイテンシが「100[ns]」であるコンピュータがあるとする。このコンピュータを使用して、ループ全体で128[KiB/スレッド]の配列1つを昇順にアクセスするソースプログラムscを実行する場合を想定する。
ループの開始時点で配列の一部もキャッシュメモリに載っていないが、デマンドミスによるメインメモリからのデータ転送待ち時間を無視した理想的な実行時間は、転送サイズとメモリ帯域より、「128[KiB]/10[GiB/s]=12[μs]」となる。なお、実際はキャッシュメモリからCPUにデータを転送する待ち時間が存在するが、メインメモリの待ち時間に比べて非常に小さいため無視できるものとする。
メモリレイテンシ分の100[ns]手前でプリフェッチをする必要があるため、プリフェッチを行うタイミングは、10[GiB/s]*100[ns]/128[B]=9ライン手前となる。したがって、図1に示したようなプログラム110のプリフェッチでは、繰り返しの最初の9ラインはデマンドミスすることになる。
理想的な実行時間12[μs]に対して、デマンドミスによる待ち時間を含めると、「12.9[μs](=9*100[ns]+12[μs])」かかるため、8%の影響がある。本手法を使うと、理想的な実行時間を達成でき、さらにそのために消費するキャッシュ容量も全体の「0.2%(9ライン*128[B/ライン]/512[KiB])」で済む。
なお、本実施の形態で説明したコンパイル方法およびキャッシュ制御方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本コンパイルプログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO(Magneto−Optical disk)、DVD(Digital Versatile Disk)、USB(Universal Serial Bus)メモリ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本コンパイルプログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)プログラムをコンパイルする際に、それぞれの繰り返しで配列のデータにアクセスするとともに所定回先の繰り返しでアクセスする前記配列のデータのプリフェッチを行うループ処理を、先頭から前記所定回先の繰り返しの直前までの第1ループ処理と、前記所定回先の繰り返しから最後までの第2ループ処理とに分割し、
前記第1ループ処理において、キャッシュメモリ内の第1領域を用いて前記配列のデータのアクセスを行うとともに、前記キャッシュメモリ内の第2領域を用いて前記配列のデータのプリフェッチを行い、前記第2ループ処理において、前記第2領域を用いて前記配列のデータのアクセスおよびプリフェッチを行う中間言語コードを生成する、
制御部を有することを特徴とする情報処理装置。
(付記2)前記制御部は、
生成した前記中間言語コードに基づいて、前記プログラムの実行可能ファイルを生成する、ことを特徴とする付記1に記載の情報処理装置。
(付記3)前記制御部は、
前記第1領域のサイズを変えながら、生成した前記実行可能ファイルを実行して、前記サイズに対応する前記第1領域についてのキャッシュミスの数を測定し、
測定した前記キャッシュミスの数が、前記サイズをキャッシュラインで割った値以下となる最小のサイズを前記第1領域のサイズに決定し、
決定した前記第1領域のサイズを示す情報を前記実行可能ファイルと対応付けて出力する、ことを特徴とする付記2に記載の情報処理装置。
(付記4)メモリ領域を第1領域と第2領域とに分割して、キャッシュラインごとに使用する領域を選択可能なキャッシュメモリを有し、
前記制御部は、
前記第1領域のサイズを示す情報に基づいて、前記キャッシュメモリ内の前記第1領域および前記第2領域のサイズを設定して、前記実行可能ファイルを実行する、ことを特徴とする付記3に記載の情報処理装置。
(付記5)コンピュータに、
プログラムをコンパイルする際に、それぞれの繰り返しで配列のデータにアクセスするとともに所定回先の繰り返しでアクセスする前記配列のデータのプリフェッチを行うループ処理を、先頭から前記所定回先の繰り返しの直前までの第1ループ処理と、前記所定回先の繰り返しから最後までの第2ループ処理とに分割し、
前記第1ループ処理において、キャッシュメモリ内の第1領域を用いて前記配列のデータのアクセスを行うとともに、前記キャッシュメモリ内の第2領域を用いて前記配列のデータのプリフェッチを行い、前記第2ループ処理において、前記第2領域を用いて前記配列のデータのアクセスおよびプリフェッチを行う中間言語コードを生成する、
処理を実行させることを特徴とするコンパイルプログラム。
(付記6)コンピュータが、
プログラムをコンパイルする際に、それぞれの繰り返しで配列のデータにアクセスするとともに所定回先の繰り返しでアクセスする前記配列のデータのプリフェッチを行うループ処理を、先頭から前記所定回先の繰り返しの直前までの第1ループ処理と、前記所定回先の繰り返しから最後までの第2ループ処理とに分割し、
前記第1ループ処理において、キャッシュメモリ内の第1領域を用いて前記配列のデータのアクセスを行うとともに、前記キャッシュメモリ内の第2領域を用いて前記配列のデータのプリフェッチを行い、前記第2ループ処理において、前記第2領域を用いて前記配列のデータのアクセスおよびプリフェッチを行う中間言語コードを生成する、
処理を実行することを特徴とするコンパイル方法。
(付記7)コンピュータが、
プログラムを実行する際に、ループ処理の先頭から所定回先の繰り返しの直前までの第1ループ処理において、キャッシュメモリ内の第1領域を用いて、それぞれの繰り返しで配列のデータにアクセスするとともに、前記キャッシュメモリ内の第2領域を用いて、前記所定回先の繰り返しでアクセスする前記配列のデータのプリフェッチを行い、
前記ループ処理の前記所定回先の繰り返しから最後までの第2ループ処理において、前記第2領域を用いて、それぞれの繰り返しで前記配列のデータにアクセスするとともに、前記所定回先の繰り返しでアクセスする前記配列のデータのプリフェッチを行う、
処理を実行することを特徴とするキャッシュ制御方法。
101 情報処理装置
110,400 プログラム
200 バス
201 CPU
202 メモリ
203 I/F
204 ディスクドライブ
205 ディスク
210 ネットワーク
301 取得部
302 解析部
303 第1の生成部
304 最適化部
305 第2の生成部
306 決定部
307 出力部

Claims (6)

  1. プログラムをコンパイルする際に、それぞれの繰り返しで配列のデータにアクセスするとともに所定回先の繰り返しでアクセスする前記配列のデータのプリフェッチを行うループ処理を、先頭から前記所定回先の繰り返しの直前までの第1ループ処理と、前記所定回先の繰り返しから最後までの第2ループ処理とに分割し、
    前記第1ループ処理において、キャッシュメモリ内の第1領域を用いて前記配列のデータのアクセスを行うとともに、前記キャッシュメモリ内の第2領域を用いて前記配列のデータのプリフェッチを行い、前記第2ループ処理において、前記第2領域を用いて前記配列のデータのアクセスおよびプリフェッチを行う中間言語コードを生成する、
    制御部を有することを特徴とする情報処理装置。
  2. 前記制御部は、
    生成した前記中間言語コードに基づいて、前記プログラムの実行可能ファイルを生成する、ことを特徴とする請求項1に記載の情報処理装置。
  3. 前記制御部は、
    前記第1領域のサイズを変えながら、生成した前記実行可能ファイルを実行して、前記サイズに対応する前記第1領域についてのキャッシュミスの数を測定し、
    測定した前記キャッシュミスの数が、前記サイズをキャッシュラインで割った値以下となる最小のサイズを前記第1領域のサイズに決定し、
    決定した前記第1領域のサイズを示す情報を前記実行可能ファイルと対応付けて出力する、ことを特徴とする請求項2に記載の情報処理装置。
  4. コンピュータに、
    プログラムをコンパイルする際に、それぞれの繰り返しで配列のデータにアクセスするとともに所定回先の繰り返しでアクセスする前記配列のデータのプリフェッチを行うループ処理を、先頭から前記所定回先の繰り返しの直前までの第1ループ処理と、前記所定回先の繰り返しから最後までの第2ループ処理とに分割し、
    前記第1ループ処理において、キャッシュメモリ内の第1領域を用いて前記配列のデータのアクセスを行うとともに、前記キャッシュメモリ内の第2領域を用いて前記配列のデータのプリフェッチを行い、前記第2ループ処理において、前記第2領域を用いて前記配列のデータのアクセスおよびプリフェッチを行う中間言語コードを生成する、
    処理を実行させることを特徴とするコンパイルプログラム。
  5. コンピュータが、
    プログラムをコンパイルする際に、それぞれの繰り返しで配列のデータにアクセスするとともに所定回先の繰り返しでアクセスする前記配列のデータのプリフェッチを行うループ処理を、先頭から前記所定回先の繰り返しの直前までの第1ループ処理と、前記所定回先の繰り返しから最後までの第2ループ処理とに分割し、
    前記第1ループ処理において、キャッシュメモリ内の第1領域を用いて前記配列のデータのアクセスを行うとともに、前記キャッシュメモリ内の第2領域を用いて前記配列のデータのプリフェッチを行い、前記第2ループ処理において、前記第2領域を用いて前記配列のデータのアクセスおよびプリフェッチを行う中間言語コードを生成する、
    処理を実行することを特徴とするコンパイル方法。
  6. コンピュータが、
    プログラムを実行する際に、ループ処理の先頭から所定回先の繰り返しの直前までの第1ループ処理において、キャッシュメモリ内の第1領域を用いて、それぞれの繰り返しで配列のデータにアクセスするとともに、前記キャッシュメモリ内の第2領域を用いて、前記所定回先の繰り返しでアクセスする前記配列のデータのプリフェッチを行い、
    前記ループ処理の前記所定回先の繰り返しから最後までの第2ループ処理において、前記第2領域を用いて、それぞれの繰り返しで前記配列のデータにアクセスするとともに、前記所定回先の繰り返しでアクセスする前記配列のデータのプリフェッチを行う、
    処理を実行することを特徴とするキャッシュ制御方法。
JP2016139830A 2016-07-14 2016-07-14 情報処理装置、コンパイルプログラム、コンパイル方法、およびキャッシュ制御方法 Active JP6665720B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2016139830A JP6665720B2 (ja) 2016-07-14 2016-07-14 情報処理装置、コンパイルプログラム、コンパイル方法、およびキャッシュ制御方法
US15/639,811 US10353682B2 (en) 2016-07-14 2017-06-30 Information processing device, storage medium, and method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2016139830A JP6665720B2 (ja) 2016-07-14 2016-07-14 情報処理装置、コンパイルプログラム、コンパイル方法、およびキャッシュ制御方法

Publications (2)

Publication Number Publication Date
JP2018010540A JP2018010540A (ja) 2018-01-18
JP6665720B2 true JP6665720B2 (ja) 2020-03-13

Family

ID=60941013

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2016139830A Active JP6665720B2 (ja) 2016-07-14 2016-07-14 情報処理装置、コンパイルプログラム、コンパイル方法、およびキャッシュ制御方法

Country Status (2)

Country Link
US (1) US10353682B2 (ja)
JP (1) JP6665720B2 (ja)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10409614B2 (en) 2017-04-24 2019-09-10 Intel Corporation Instructions having support for floating point and integer data types in the same register
US10474458B2 (en) 2017-04-28 2019-11-12 Intel Corporation Instructions and logic to perform floating-point and integer operations for machine learning
CN113424148A (zh) 2019-03-15 2021-09-21 英特尔公司 用于检测跨分片访问、提供多分片推理缩放和提供最佳页迁移的多分片存储器管理
WO2020190796A1 (en) 2019-03-15 2020-09-24 Intel Corporation Systems and methods for cache optimization
CN112905241B (zh) 2019-03-15 2024-03-29 英特尔公司 用于矩阵加速器架构的稀疏优化
US11934342B2 (en) 2019-03-15 2024-03-19 Intel Corporation Assistance for hardware prefetch in cache access
JP7230719B2 (ja) * 2019-07-19 2023-03-01 富士通株式会社 情報処理装置及び情報処理方法
US11861761B2 (en) 2019-11-15 2024-01-02 Intel Corporation Graphics processing unit processing and caching improvements
US11663746B2 (en) 2019-11-15 2023-05-30 Intel Corporation Systolic arithmetic on sparse data

Family Cites Families (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003108386A (ja) * 2001-09-28 2003-04-11 Hitachi Ltd 間接参照データプリフェッチ方法
US20070083730A1 (en) * 2003-06-17 2007-04-12 Martin Vorbach Data processing device and method
US7657880B2 (en) * 2003-01-31 2010-02-02 Intel Corporation Safe store for speculative helper threads
JPWO2005078579A1 (ja) * 2004-02-12 2007-10-18 松下電器産業株式会社 プログラム変換装置およびプログラム変換方法
US7168070B2 (en) * 2004-05-25 2007-01-23 International Business Machines Corporation Aggregate bandwidth through management using insertion of reset instructions for cache-to-cache data transfer
US8706964B1 (en) * 2007-09-28 2014-04-22 The Mathworks, Inc. Automatic generation of cache-optimized code
US8239841B2 (en) * 2008-04-04 2012-08-07 International Business Machines Corporation Prefetching irregular data references for software controlled caches
JP5251689B2 (ja) 2009-04-02 2013-07-31 富士通株式会社 コンパイラプログラムおよびコンパイラ装置
US8893103B2 (en) * 2012-08-16 2014-11-18 Nec Laboratories America, Inc. Automatic asynchronous offload to many-core coprocessors
JP6248808B2 (ja) 2014-05-22 2017-12-20 富士通株式会社 情報処理装置、情報処理システム、情報処理装置の制御方法、及び、情報処理装置の制御プログラム

Also Published As

Publication number Publication date
US20180018153A1 (en) 2018-01-18
JP2018010540A (ja) 2018-01-18
US10353682B2 (en) 2019-07-16

Similar Documents

Publication Publication Date Title
JP6665720B2 (ja) 情報処理装置、コンパイルプログラム、コンパイル方法、およびキャッシュ制御方法
US9798528B2 (en) Software solution for cooperative memory-side and processor-side data prefetching
US8886887B2 (en) Uniform external and internal interfaces for delinquent memory operations to facilitate cache optimization
US6721943B2 (en) Compile-time memory coalescing for dynamic arrays
US6148439A (en) Nested loop data prefetching using inner loop splitting and next outer loop referencing
US20040093591A1 (en) Method and apparatus prefetching indexed array references
JP5966509B2 (ja) プログラム、コード生成方法および情報処理装置
CN101273332A (zh) 使用编译器的线程数据亲和性优化
US9483244B2 (en) Compiling method and compiling device
US20030088863A1 (en) Method and apparatus for selecting references for prefetching in an optimizing compiler
JP4177681B2 (ja) コンパイル方法、コンパイラ、およびコンパイル装置
US7257810B2 (en) Method and apparatus for inserting prefetch instructions in an optimizing compiler
Hong et al. Improving simd parallelism via dynamic binary translation
JP7060803B2 (ja) 情報処理装置、コンパイラプログラム及びコンパイル方法
US7313787B2 (en) Compiler and method for optimizing object codes for hierarchical memories
US20050086651A1 (en) Compiler apparatus and linker apparatus
JP2023045347A (ja) プログラムおよび情報処理方法
US9552197B2 (en) Computer-readable recording medium storing information processing program, information processing apparatus, and information processing method
US20220405110A1 (en) Non-transitory computer-readable recording medium and compilation method
JP6898556B2 (ja) 情報処理装置、コンパイル方法及びコンパイルプログラム
CN114041116A (zh) 数据移动任务优化的方法和装置
JP2014099108A (ja) 実行時間算出装置、実行時間算出方法、およびプログラム
Larrea et al. An in-depth evaluation of GCC’s OpenACC implementation on Cray systems
JPH05265770A (ja) 計算機言語処理方法
JP2019164704A (ja) コンパイラ

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20190409

TRDD Decision of grant or rejection written
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20200115

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20200121

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20200203

R150 Certificate of patent or registration of utility model

Ref document number: 6665720

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150