本出願の実施形態において提供されるデータプリフェッチング方法、装置、およびシステムによれば、データプリフェッチング・フレキシビリティが改善される。
第1の態様によれば、データプリフェッチング方法が提供され、方法は、N個の関数と、N個の関数の第1のグローバル変数とを取得するステップであって、Nは1以上の整数であるステップと、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを決定するステップであって、それによって、プリフェッチエンジンが、N個の関数の開始アドレスと第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチしうる、ステップとを含む。
いくつかの実装態様では、上記の方法はコンピュータシステムに適用される。コンピュータシステムは、プリフェッチエンジン、メモリ、およびコンパイラを含む。コンパイラは、上記の方法を行い得る。具体的には、コンパイラは、コンパイルプロセスの中で上記の方法を行い得る。
いくつかの実装態様では、N個の関数の開始アドレスは、N個の関数によって共有される開始アドレスであってよい。N個の関数の開始アドレスは、メモリの中のデータをキャッシュの中にプリフェッチするためのプリフェッチング時間であってよい。プリフェッチング時間は、N個の関数のうちの1つの開始アドレスであってよい。プリフェッチング時間は、通常、コンパイラによってN個の関数からパースアウト(parse out)され一番先のアドレスを有する関数の開始アドレスであってよく、または確かに、特定の場所における関数の開始アドレスであってよい。プリフェッチエンジンがN個の関数の開始アドレスを読み出すとき、N個の関数の開始アドレスは、プリフェッチエンジンが、メモリの中にあり第1のグローバル変数に関連付けられたデータをキャッシュの中にプリフェッチすることをトリガするために使用される。
いくつかの実装態様では、第1のグローバル変数の開始アドレスは、第1のグローバル変数のものでありコンパイラによってパースアウトされる開始アドレスであってよい。第1のグローバル変数のものでありコンパイラによってパースアウトされる開始アドレスと、メモリの中にあり第1のグローバル変数に関連付けられたデータがそこにおいて記憶される開始アドレスとの間に、アドレスマッピング関係がある。第1のグローバル変数のものでありコンパイラによってパースアウトされる開始アドレスを取得するとき、プリフェッチエンジンは、アドレスマッピング関係と、第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータがそこにおいて記憶される開始アドレスを決定する。さらに、プリフェッチエンジンは、メモリの中にあり第1のグローバル変数に関連付けられたデータがそこにおいて記憶される開始アドレスに従って、メモリの中にあり第1のグローバル変数のものであるデータを、キャッシュの中にプリフェッチする。第1のグローバル変数の開始アドレスは、あるいは、メモリの中にあり第1のグローバル変数に関連付けられたデータの、コンパイラによって直接コンパイルされる開始アドレスであってよい。
本出願の本実施形態では、コンパイラは最初に、N個の関数と、N個の関数の第1のグローバル変数とを取得し、次いで、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを決定する。プリフェッチエンジンは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、Cacheの中にプリフェッチする。N個の関数の開始アドレスは、データをプリフェッチするためのプリフェッチング時間として理解されてよい。プリフェッチエンジンおよびコンパイラは、並列に実行を行い得る。プリフェッチング時間は、N個の関数の開始アドレスであり、従来技術におけるソフトウェアプリフェッチ命令に依存せず、それによって、プリフェッチング・フレキシビリティが改善される。
いくつかの実装態様では、プリフェッチエンジンがN個の関数の開始アドレスを読み出すとき、またはプリフェッチエンジンがN個の関数の開始アドレスを読み出した後の第2の時間期間の後、またはプリフェッチエンジンがN個の関数の開始アドレスを読み出す前の第1の時間期間において、プリフェッチエンジンは、第1のグローバル変数の開始アドレスに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、Cacheの中にプリフェッチし、N個の関数の開始アドレスに従ってプリフェッチング時間をフレキシブルに決定し得る。
いくつかの実装態様では、コンパイラは、2つの方式でN個の関数の開始アドレスを決定し得る。方式1:コンパイラは、N個の関数をパースするときにN個の関数の開始アドレスをパースアウトする。方式2:コンパイラは、初期コンパイル段階においてすべての関数の開始アドレスをパースアウトし、N個の関数をパースするとき、コンパイラは、以前にパースアウトされている開始アドレスを探索してN個の関数の開始アドレスを決定する。このようにして、プログラム実行時間が短縮され得る。同様に、コンパイラは、2つの方式で第1のグローバル変数の開始アドレスを決定し得る。方式1:コンパイラは、第1のグローバル変数をパースするときに第1のグローバル変数の開始アドレスをパースアウトする。方式2:コンパイラは、初期コンパイル段階においてすべてのグローバル変数の開始アドレスをパースアウトし、第1のグローバル変数をパースするとき、コンパイラは、グローバル変数のものであり以前にパースアウトされている開始アドレスを探索して、第1のグローバル変数の開始アドレスを決定する。
Nが1に等しいとき、すなわち、1つの関数が1つの開始アドレスに対応するとき、コンパイラは、関数の第1のグローバル変数に関連付けられたデータをプリフェッチする。
Nが1よりも大きいとき、すなわち、複数の関数が1つの開始アドレスを共有し得るとき、プリフェッチエンジンは、メモリの中にあり1つの関数の第1のグローバル変数に対応するデータをCacheの中にプリフェッチしてもよいだけでなく、メモリの中にあり複数の関数の第1のグローバル変数に対応するデータをCacheの中にプリフェッチしてもよい。任意選択で、複数の関数は、特定のサービスに関係する複数の関数であってよい。たとえば、特別なサービスを実施するために、サービスは複数の関数を使用する必要がある。このようにして、メモリの中にあり複数の関数の第1のグローバル変数に対応するデータは、1つの開始アドレスを使用することによってCacheの中にプリフェッチされ得、それによって、データプリフェッチング効率がさらに改善される。
いくつかの実装態様では、コンパイラは、N個の関数の決定された開始アドレスと、第1のグローバル変数の決定された開始アドレスとを、プリフェッチエンジンへ直接送ってもよく、それによって、プリフェッチエンジンはメモリの中のデータをキャッシュの中にプリフェッチする。さらに、コンパイラは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを、テキストの形式またはバイナリファイルの形式で記憶してもよく、それによって、プリフェッチエンジンは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを読み出す。任意選択で、コンパイラは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、プリフェッチング時間の識別情報とを、テキストの形式またはバイナリ形式で記憶してもよく、それによって、プリフェッチエンジンは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、プリフェッチング時間の識別情報とを読み出す。たとえば、プリフェッチング時間の識別情報は、第1の識別子、第2の識別子、または第3の識別子であってよい。第1の識別子は、プリフェッチエンジンが、N個の関数の開始アドレスを読み出すとき、第1のグローバル変数に関連付けられたデータをCacheの中にプリフェッチすることを示すために使用される。第2の識別子は、プリフェッチエンジンがN個の関数の開始アドレスを読み出す第1の時間期間の前に、プリフェッチエンジンが、第1のグローバル変数に関連付けられたデータをCacheの中にプリフェッチすることを示すために使用される。第3の識別子は、プリフェッチエンジンがN個の関数の開始アドレスを読み出す第2の時間期間の後、プリフェッチエンジンが、第1のグローバル変数に関連付けられたデータをCacheの中にプリフェッチすることを示すために使用される。
いくつかの実装態様では、N個の関数と、N個の関数の第1のグローバル変数とは、同時に取得されてよく、または別個に取得されてもよい。
いくつかの実装態様では、第1のグローバル変数はM個の構造体メンバー変数を含み、Mは1以上の整数である。
このようにして、プリフェッチ命令を関数の中に挿入することによってM個の構造体メンバー変数に関連付けられたデータをプリフェッチする従来技術動作が回避され得る。加えて、従来技術では、メモリの中にありM個の構造体メンバー変数に関連付けられたデータをプリフェッチするために、M個のプリフェッチ命令が必要とされる。このようにして、プログラム実行時間が増加する。加えて、M個の構造体メンバー変数のプリフェッチング時間は、プログラマーによってのみ指定され、コンパイラのコンパイルおよびスケジューリング時間が、プログラマーによって指定されるM個の構造体メンバー変数のプリフェッチング時間と協調することを保証するのは困難である。したがって、Cacheのヒット率は保証され得ない。たとえば、M個の構造体メンバー変数のプリフェッチ命令が過度に早く挿入され、データが過度に早くCacheの中にプリフェッチされるとき、データは、CPUがCacheにアクセスする前に置換されることがある。M個の構造体メンバー変数のプリフェッチ命令が過度に遅く挿入されるとき、CPUがCacheにアクセスするときに遅延が引き起こされる。
いくつかの実装態様では、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを決定するステップであって、それによって、プリフェッチエンジンが、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、Cacheの中にプリフェッチするステップは、N個の関数の中で使用される少なくとも1つの構造体メンバー変数をパースするステップであって、M個の構造体メンバー変数は少なくとも1つの構造体メンバー変数を含むステップと、第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットを決定するステップであって、それによって、プリフェッチエンジンが、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、少なくとも1つの構造体メンバー変数の各々のアドレスオフセットとに従って、メモリの中にあり少なくとも1つの構造体メンバー変数に関連付けられたデータを、キャッシュの中にプリフェッチする、ステップとを含む。
このようにして、N個の関数の中で使用される構造体メンバー変数は、N個の関数の実際の要件に従ってパースアウトされ得る。プリフェッチエンジンは、第1のグローバル変数のすべてのM個の構造体メンバー変数に関連付けられたデータをCacheの中にやみくもにプリフェッチする代わりに、N個の関数の中で使用される構造体メンバー変数に関連付けられたデータをプリフェッチし、それによって、プリフェッチング効率が改善され得、Cacheのヒット率がさらに改善され得る。
いくつかの実装態様では、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを決定するステップであって、それによって、プリフェッチエンジンが、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、Cacheの中にプリフェッチする、ステップは、N個の関数の中で使用される少なくとも1つの構造体メンバー変数をパースするステップであって、M個の構造体メンバー変数は少なくとも1つの構造体メンバー変数を含む、ステップと、第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットを決定するステップと、
メモリの中の少なくとも1つの構造体メンバー変数の各々のCache lineインデックス番号を、少なくとも1つの構造体メンバー変数の各々のアドレスオフセットに従って決定するステップであって、それによって、プリフェッチエンジンが、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、メモリの中の各構造体メンバー変数のCache lineインデックス番号とに従って、メモリの中のデータをプリフェッチする、ステップとを含む。
本出願の本実施形態では、コンパイラは、各構造体メンバー変数のアドレスオフセットをCache lineインデックス番号にさらにマッピングし得る。コンパイラは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、Cache lineインデックス番号とを、テキストまたはバイナリファイルの中に記憶する。プリフェッチエンジンは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、Cache lineインデックス番号とに従って、メモリの中にあり少なくとも1つの構造体メンバー変数に関連付けられたデータを、キャッシュの中にプリフェッチする。
いくつかの実装態様では、第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットを決定するステップの前に、方法は、第1のグローバル変数の開始アドレスに対するM個の構造体メンバー変数の各々のアドレスオフセットを取得するために、M個の構造体メンバー変数をコンパイラによってパースするステップをさらに含む。第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットを決定するステップは、第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットを、第1のグローバル変数の開始アドレスに対するM個の構造体メンバー変数の各々のアドレスオフセットから決定するステップを含む。
本出願の本実施形態では、コンパイラは、第1のグローバル変数の開始アドレスに対するM個の構造体メンバー変数の各々のアドレスオフセットを予めパースし得る。パースすることを通じて、M個の構造体メンバー変数のうちの少なくとも1つしかN個の関数の中で使用されないことを知ると、コンパイラは、少なくとも1つの構造体メンバー変数のアドレスオフセットを求めて、M個の構造体メンバー変数の各々のアドレスオフセットを探索し得る。確かに、コンパイラは、あるいは、N個の関数の中で使用される少なくとも1つの構造体メンバー変数をパースするとき、第1のグローバル変数に対する少なくとも1つの構造体メンバー変数のアドレスオフセットをパースしてもよい。
いくつかの実装態様では、N個の関数と、N個の関数の第1のグローバル変数とを取得する前に、コンパイラは、コンパイルプロセスの中で以下の動作、すなわち、P個の関数と、P個の関数の各々の少なくとも1つのグローバル変数とを取得することであって、P個の関数はN個の関数を含み、Pは1以上であり、PはN以上の整数であることと、P個の関数の各々の開始アドレスをパースすることと、P個の関数の各々の少なくとも1つのグローバル変数の各々の開始アドレスをパースすることとを行う。N個の関数と、N個の関数の第1のグローバル変数とを取得することは、P個の関数からN個の関数を決定することと、N個の関数の少なくとも1つのグローバル変数から第1のグローバル変数を決定することとを含む。N個の関数の開始アドレスを決定することは、P個の関数の各々の開始アドレスからN個の関数の開始アドレスを決定することを含む。第1のグローバル変数の開始アドレスを決定することは、各グローバル変数の開始アドレスから第1のグローバル変数の開始アドレスを決定することを含む。
本出願の本実施形態では、プログラム実行プロセス全体の中で、P個の関数が含まれてよく、P個の関数の各々は、少なくとも1つのグローバル変数を含む。コンパイラは、P個の関数の各々の開始アドレスをパースし、各関数のものでありパースアウトされる開始アドレスからN個の関数の開始アドレスを決定する。コンパイラは、P個の関数の少なくとも1つのグローバル変数の各々のN個の関数の開始アドレスをパースすることと、マッチングを通じて各グローバル変数の開始アドレスからN個の関数の第1のグローバル変数の開始アドレスを取得することとをさらに必要とする。コンパイラは、初期コンパイル段階において、P個の関数と、P個の関数の各々に対応する少なくとも1つのグローバル変数の開始アドレスとをパースアウトして、マッピングテーブルを形成し得る。N個の関数をパースするとき、コンパイラは、N個の関数の中で使用される第1のグローバル変数をパースし、第1のグローバル変数の開始アドレスを求めてマッピングテーブルを探索する。
いくつかの実装態様では、N個の関数と、N個の関数の第1のグローバル変数とを取得することは、
コンパイル指示情報をコンパイラによってコンパイルプロセスの中で受信することと、コンパイル指示情報に従って、N個の関数と、N個の関数の第1のグローバル変数とを取得することとを含み、コンパイル指示情報は、N個の関数と、N個の関数の第1のグローバル変数を示すために使用され、および/またはコンパイル指示情報は、N個の関数と、N個の関数の中で使用されないグローバル変数とを示すために使用される。
コンパイル指示情報がN個の関数とN個の関数の第1のグローバル変数とを示すとき、コンパイラは、N個の関数と、N個の関数の第1のグローバル変数とをパースする。コンパイル指示情報がN個の関数とN個の関数の中で使用されないグローバル変数とを示すとき、コンパイラは、N個の関数と、N個の関数の中で使用されないグローバル変数以外のグローバル変数とをパースする。コンパイル指示情報が、N個の関数だけでなく、N個の関数の第1のグローバル変数およびN個の関数の中で使用されないグローバル変数も示すとき、コンパイラは、N個の関数の第1のグローバル変数をパースする。すなわち、コンパイル指示情報は、N個の関数の中で使用される第1のグローバル変数を示し得、また、N個の関数の中で使用されないグローバル変数を示し得る。具体的には、ユーザは、N個の関数の中で使用される第1のグローバル変数と、N個の関数の中で使用されないグローバル変数とを構成し得る。
任意選択で、コンパイル指示情報はまた、P個の関数と、P個の関数の各々の中で使用されるグローバル変数とを示し得、および/または、コンパイル指示情報は、P個の関数と、P個の関数の各々の中で使用されないグローバル変数とを示し得る。
あるいは、関数とグローバル変数との間の対応関係を示すことに加えて、コンパイル指示情報は、関数と構造体メンバー変数との間の対応関係を示し得る。たとえば、コンパイル指示情報は、N個の関数の中で使用される構造体メンバー変数と、N個の関数の中で使用されない構造体メンバー変数とを示し得る。このようにして、コンパイラは、パースプロセスの中で、関数の中で使用され、グローバル変数に対する構造体メンバー変数のアドレスオフセット等のみをパースする。
任意選択で、コンパイル指示情報は、コマンドラインの形式で関数ヘッダの前に挿入され得る。たとえば、コンパイル指示情報は、関数ヘッダの前に挿入され、コンパイラによって分析される必要がある関数と関数のグローバル変数とを示すために使用される。コンパイル指示情報は、1つの関数と関数のグローバル変数とを示し得るか、または複数の関数によって共有されるグローバル変数を示し得る。具体的には、ユーザは、コンパイル指示情報が1つの関数を示すのかそれとも複数の関数を示すのかを設定し得る。ユーザが、コンパイル指示情報が1つの関数を示すように設定するとき、関数は1つの開始アドレスに対応する。ユーザが、コンパイル指示情報が複数の関数を示すように設定するとき、複数の関数が1つの開始アドレスに対応する。
加えて、コンパイル指示情報はまた、関数とグローバル変数との間の、または関数と構造体メンバー変数との間の対応関係を示し得る。たとえば、1つの関数に対して1つ以上のグローバル変数が設定され、または1つの関数に対して1つ以上の構造体メンバー変数が設定され、または1つのグローバル変数に対して1つ以上の構造体メンバー変数が設定される。コンパイラは、対応関係に従って、関数と、関数に対応するグローバル変数または関数に対応する構造体メンバー変数とをパースする。任意選択で、コンパイル指示情報はユーザによって決定され得る。
いくつかの実装態様では、N個の関数と、N個の関数の第1のグローバル変数とを取得するステップは、
コンパイラによってコンパイルプロセスの中で、テキストファイルから第1の対応関係および/または第2の対応関係を読み出すことと、第1の対応関係および/または第2の対応関係に従ってN個の関数と、N個の関数の第1のグローバル変数とを取得することとを含み、第1の対応関係は、N個の関数と、N個の関数の第1のグローバル変数を示すために使用され、および/または第2の対応関係は、N個の関数と、N個の関数の中で使用されないグローバル変数を示すために使用される。
本出願の本実施形態では、複数の関数と、分析される必要がある複数の関数のグローバル変数とは、リストの形式でテキストファイルの中に記憶され得る。関数と、分析される必要があるグローバル変数または分析される必要がないグローバル変数との間に対応関係があり得る。分析される必要があるN個の関数の第1のグローバル変数は、第1の対応関係を使用することによって表され、分析される必要がないN個の関数の変数は、第2の対応関係を使用することによって表される。N個の関数をパースするとき、コンパイラは、第1の対応関係および/または第2の対応関係に従って、N個の関数の第1のグローバル変数を求めてテキストファイルの中のリストを探索する。確かに、コンパイラは、複数の関数のものである、リストの中の開始アドレスと、複数の関数に対応するグローバル変数の開始アドレスとを、予めパースし得る。N個の関数の実行中、予めパースアウトされた開始アドレスは、N個の関数の開始アドレスについて探索される。このようにして、集中管理が実施され得、動作複雑性が低減され得る。
任意選択で、関数とグローバル変数との間の対応関係およびグローバル変数と構造体メンバー変数との間の対応関係も、リストの形式でテキストファイルの中に記憶され得る。すなわち、N個の関数の第1のグローバル変数と、第1のグローバル変数のものでありN個の関数の中で使用される構造体メンバー変数との両方が、リストの形式でテキストファイルの中に予め記憶され得る。N個の関数をパースするとき、コンパイラは、N個の関数と、N個の関数の第1のグローバル変数と、第1のグローバル変数のものでありN個の関数の中で使用される構造体メンバー変数とを、テキストファイルから読み出す。
具体的には、第1の対応関係は、関数の中で使用されるグローバル変数を含むリストであってよい。たとえば、グローバル変数aは第1の関数の中で使用され、グローバル変数aは第2の関数の中で使用される。第1の関数および第2の関数の中で使用される変数は、リストの形式で記憶される。プリフェッチエンジンは、メモリの中にあり第1の関数および第2の関数の中で使用されるグローバル変数aに関連付けられたデータを、Cacheの中にプリフェッチする必要があり、たとえば、aは第1のグローバル変数であってよい。コンパイラは、リストを探索することによって、第1の関数と、第2の関数と、2つの関数のグローバル変数aとを見つける。同様に、第2の対応関係は、関数の中で使用されないグローバル変数を含むリストであってよい。このようにして、集中管理が実施され得、動作複雑性が低減され得る。
いくつかの実装態様では、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを決定するステップの後、方法は、コンパイラによって、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとをテキストファイルまたはバイナリファイルに出力するステップであって、それによって、プリフェッチエンジンが、テキストファイルまたはバイナリファイルの中にあるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを読み出し、プリフェッチエンジンが、読み出されるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチする、ステップをさらに含む。
コンパイラは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを、テキストファイルまたはバイナリファイルの中に記憶する。プリフェッチエンジンは、テキストファイルまたはバイナリファイルからN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを読み出し、N個の関数の開始アドレスに従ってデータプリフェッチング時間を決定し、決定されたプリフェッチング時間において、メモリの中にあり第1のグローバル変数の開始アドレスに対応するデータをプリフェッチする。確かに、構造体メンバー変数のCache lineインデックス番号またはアドレスオフセットなどのプリフェッチング情報が、テキストファイルまたはバイナリファイルの中に記憶され、それによって、プリフェッチエンジンが、テキストファイルまたはバイナリファイルの中のプリフェッチング情報に従って、メモリの中のデータをプリフェッチする。
いくつかの実装態様では、プリフェッチエンジンが、読み出されるN個の関数の開始アドレスと第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータをCacheの中にプリフェッチすることは、以下のことを含む。すなわち、N個の関数の開始アドレスを読み出すとき、プリフェッチエンジンが、メモリの中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをCacheの中にプリフェッチすること、またはプリフェッチエンジンがN個の関数の開始アドレスを読み出す第1の時間期間の前に、プリフェッチエンジンが、メモリの中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをCacheの中にプリフェッチすること、またはプリフェッチエンジンがN個の関数の開始アドレスを読み出す第2の時間期間の後に、プリフェッチエンジンが、メモリの中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをCacheの中にプリフェッチすることである。
メモリの中にあり第1のグローバル変数に関連付けられたデータは、プリフェッチエンジンが第1のグローバル変数の開始アドレスを読み出すときに、またはプリフェッチエンジンが第1のグローバル変数の開始アドレスを読み出す前の第1の時間期間において、またはプリフェッチエンジンがグローバル変数の開始アドレスを読み出した後の第2の時間期間において、Cacheの中にプリフェッチされ得、それによって、データプリフェッチング・フレキシビリティがさらに改善される。
いくつかの実装態様では、N個の関数の第1のグローバル変数を取得することは、N個の関数の区画をパースすることであって、区画はホット区画およびコールド区画を含むことと、ホット区画から第1のグローバル変数を取得することとを含む。
本出願の本実施形態では、コンパイラは、N個の関数の区画をパースし得、N個の関数の区画は、ホット区画およびコールド区画を含む。コンパイラは、コールド区画をスクリーンアウト(screen out)し得、ホット区画の中の第1のグローバル変数を取得し得る。このようにして、データプリフェッチング効率が改善され得る。関数の頻繁に使用される区画の中のグローバル変数に対応するデータのみがCacheの中にプリフェッチされる必要があり、したがって、データプリフェッチング効率がさらに改善され得る。
任意選択で、ホット区画は、N個の関数の区画が頻繁にアクセスされることを示すために使用され、コールド区画は、N個の関数の区画が比較的少量の時間にわたってアクセスされることを示すために使用される。たとえば、特定の時間期間において、N個の関数の第1の区画がその間にアクセスされる回数が、予め設定されたしきい値を超えるとき、第1の区画がホット区画であるものと考えられる。特定の時間期間において、N個の関数の第2の区画がその間にアクセスされる回数が、予め設定されたしきい値よりも少ないとき、第2の区画がコールド区画であるものと考えられる。
いくつかの実装態様では、N個の関数の第1のグローバル変数が取得された後、コンパイラは、コンパイルプロセスの中で以下の動作、すなわち、N個の関数の第2のグローバル変数を取得することと、第1のグローバル変数および第2のグローバル変数のアクセスシーケンスを決定することであって、それによって、プリフェッチエンジンが、アクセスシーケンスに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、Cacheの中にプリフェッチすることと、を行う。
本出願の本実施形態では、コンパイラは、N個の関数の第1のグローバル変数と第2のグローバル変数とをパースアウトし得るだけでなく、コンパイル制御フロー情報を参照して、プログラム実行プロセスの中での第1のグローバル変数と第2のグローバル変数とのシーケンスもパースアウトし得る。プリフェッチエンジンは、シーケンスに従って、第1のグローバル変数に関連付けられたデータをCacheの中にプリフェッチし得る。第1のグローバル変数が第2のグローバル変数の前にアクセスされる場合、プリフェッチエンジンは、第1のグローバル変数に関連付けられたデータを最初にCacheの中にプリフェッチし、第1のグローバル変数が第2のグローバル変数の後にアクセスされる場合、プリフェッチエンジンは、第2のグローバル変数に関連付けられたデータを最初にCacheの中にプリフェッチし、次いで、第1のグローバル変数に関連付けられたデータをCacheの中にプリフェッチする。このようにして、Cacheの中に最初に記憶されたデータがCPUによって最初にアクセスされ、それによって、プリフェッチング効率が改善され得、Cacheの記憶効率がさらに改善され得、Cacheのヒット率も改善され得る。
いくつかの実装態様では、コンパイラは、コンパイルプロセスの中で以下の動作、すなわち、N個の関数の第3のグローバル変数を取得することと、
メモリの中の第1のグローバル変数のCache lineインデックス番号およびメモリの中の第3のグローバル変数のCache lineインデックス番号を決定することであって、それによって、プリフェッチエンジンが、Cache lineインデックス番号に従って、メモリの中にあり第1のグローバル変数に関連付けられたデータと、メモリの中にあり第3のグローバル変数に関連付けられたデータとを、Cacheの中にプリフェッチすることと、を行う。
2つのグローバル変数が1つのCache lineインデックス番号に属する場合、2つのグローバル変数に関連付けられたデータをプリフェッチするために1つのCache lineのみが必要とされる。しかしながら、従来技術では、2つのグローバル変数が1つのCache lineインデックス番号に属する場合でも、2つのグローバル変数に関連付けられたデータをプリフェッチするために2つのCache lineが必要とされる。したがって、プリフェッチング回数さらに減少され得、プリフェッチング効率が改善され得る。
いくつかの実装態様では、N個の関数はホットスポット関数であり、第1のグローバル変数はホットスポットグローバル変数である。
本出願の本実施形態では、ホットスポット関数は、頻繁に使用される関数を示すために使用される。たとえば、特定の時間期間において、N個の関数が呼び出される回数が第1のしきい値を超えるとき、N個の関数はホットスポット関数であるものと考えられる。ホットスポットグローバル変数は、頻繁に使用されるグローバル変数を示すために使用される。たとえば、特定の時間期間において、第1のグローバル変数が呼び出される回数が第2のしきい値を超えるとき、第1のグローバル変数はホットスポットグローバル変数であるものと考えられる。すなわち、本出願の本実施形態では、コンパイラは、ホットスポット関数と、ホットスポットグローバル変数とをパースする。このようにして、プリフェッチエンジンによってプリフェッチされるデータは、ホットスポット関数の中の頻繁に呼び出されるホットスポットグローバル変数に関連付けられたデータであり、それによって、プリフェッチング効率が改善され得、Cacheのヒット率がさらに改善され得る。
いくつかの実装態様では、プリフェッチエンジンは、プリフェッチ命令を実行し得る。たとえば、コンパイラは、コード生成プロセスの中でプリフェッチングアドレスを決定し得、プリフェッチングアドレスをテキストファイルまたはバイナリファイルに出力し得る。プリフェッチングアドレスを読み出すとき、プリフェッチエンジンは、メモリの中にありプリフェッチングアドレスに対応するデータをプリフェッチする。このようにして、コンパイラは、プリフェッチングアドレスをプリフェッチエンジンに通知し、プリフェッチエンジンは、プリフェッチングアドレスに従ってメモリの中のデータを精密にプリフェッチすることができる。コンパイラおよびプリフェッチエンジンは、並列に実行を行い、データはハードウェアと協働してソフトウェアを使用することによってプリフェッチされる。このようにして、コンパイラの実行複雑性が低減され得、データプリフェッチング効率が改善され得、Cacheのヒット率がさらに改善され得る。
第2の態様によれば、データプリフェッチング方法が提供され、方法は、N個の関数の開始アドレスと、N個の関数の第1のグローバル変数の開始アドレスを取得するステップであって、開始アドレスはコンパイラによって決定され、Nは1以上の整数である、ステップと、N個の関数の開始アドレスと、N個の関数の第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチすることとを含む。
いくつかの実装態様では、N個の関数の開始アドレスと、N個の関数の第1のグローバル変数の開始アドレスとを取得することは、コンパイラによってテキストファイルまたはバイナリファイルの中に入力されるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを読み出すことを含み、N個の関数の開始アドレスとN個の関数の第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチすることは、読み出されるN個の関数の開始アドレスと第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチすることを含む。
いくつかの実装態様では、読み出されるN個の関数の開始アドレスと第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチすることは、テキストファイルもしくはバイナリファイルの中にあるN個の関数の開始アドレスが読み出されるとき、メモリの中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをキャッシュの中にプリフェッチすること、またはテキストファイルもしくはバイナリファイルの中にあるN個の関数の開始アドレスが読み出される第1の時間期間の前に、メモリの中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをキャッシュの中にプリフェッチすること、またはテキストファイルもしくはバイナリファイルの中にあるN個の関数の開始アドレスが読み出される第2の時間期間の後に、メモリの中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをキャッシュの中にプリフェッチすることを含む。
いくつかの実装態様では、プリフェッチエンジンは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、少なくとも1つの構造体メンバー変数の各々のアドレスオフセットとに従って、メモリの中にあり少なくとも1つの構造体メンバー変数に関連付けられたデータを、Cacheの中にプリフェッチするよう、さらに特に構成される。
いくつかの実装態様では、プリフェッチエンジンは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、メモリの中の各構造体メンバー変数のCache lineインデックス番号とに従って、メモリの中のデータをプリフェッチするよう、特に構成される。
いくつかの実装態様では、プリフェッチエンジンは、テキストファイルまたはバイナリファイルの中にあるN個の関数の開始アドレスと第1のグローバル変数の開始アドレスとを読み出し、読み出されるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、Cacheの中にプリフェッチするよう、さらに特に構成される。
いくつかの実装態様では、プリフェッチエンジンは、アクセスシーケンスに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、Cacheの中にプリフェッチし、アクセスシーケンスは、コンパイラによって決定される第1のグローバル変数および第2のグローバル変数のアクセスシーケンスであるよう、さらに特に構成される。
第3の態様によれば、データプリフェッチング方法が提供され、方法は、N個の関数と、N個の関数の第1のグローバル変数とをコンパイラによって取得するステップであって、Nは1以上の整数である、ステップと、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとをコンパイラによって決定するステップと、コンパイラによって決定されるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを、プリフェッチエンジンによって取得し、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチするステップとを含む。
いくつかの実装態様では、プリフェッチエンジンは、ハードウェアを使用することによって実装され、データをメモリからキャッシュの中にプリフェッチするよう構成されるエンジンである。
いくつかの実装態様では、N個の関数と、N個の関数の第1のグローバル変数とをコンパイラによって取得するステップは、N個の関数の中で使用される少なくとも1つの構造体メンバー変数をコンパイラによってパースすることであって、M個の構造体メンバー変数は少なくとも1つの構造体メンバー変数を含むことと、第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットをコンパイラによって決定することとを含む。コンパイラによって決定されるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとをプリフェッチエンジンによって取得し、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチすることは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、少なくとも1つの構造体メンバー変数の各々のアドレスオフセットとに従って、メモリの中にあり少なくとも1つの構造体メンバー変数に関連付けられたデータを、キャッシュの中にプリフェッチエンジンによってプリフェッチすることを含む。
いくつかの実装態様では、コンパイラは、N個の関数と、N個の関数の第1のグローバル変数とを取得し、N個の関数の中で使用される少なくとも1つの構造体メンバー変数をパースし、M個の構造体メンバー変数が少なくとも1つの構造体メンバー変数を含み、第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットを決定し、少なくとも1つの構造体メンバー変数の各々のアドレスオフセットに従って、メモリの中の少なくとも1つの構造体メンバー変数の各々のCache lineインデックス番号を決定する。プリフェッチエンジンによって、コンパイラによって決定されるN個の関数の開始アドレスと第1のグローバル変数の開始アドレスとを取得し、N個の関数の開始アドレスと第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチすることは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、メモリの中の各構造体メンバー変数のCache lineインデックス番号とに従って、メモリの中にあり少なくとも1つの構造体メンバー変数に関連付けられたデータを、キャッシュの中にプリフェッチエンジンによってプリフェッチすることを含む。
いくつかの実装態様では、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとをコンパイラによって決定した後、方法は、コンパイラによって、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとをテキストファイルまたはバイナリファイルに出力するステップと、プリフェッチエンジンによって、テキストファイルまたはバイナリファイルの中にあるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを読み出すステップと、読み出されるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチするステップとをさらに含む。
いくつかの実装態様では、方法は以下のことをさらに含む。すなわち、コンパイラは、コンパイルプロセスの中で以下の動作、すなわち、N個の関数の第2のグローバル変数を取得することと、第1のグローバル変数および第2のグローバル変数のアクセスシーケンスを決定することとを行う。プリフェッチエンジンは、アクセスシーケンスに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチする。
第4の態様によれば、第1の態様または第1の態様の可能な実装態様のうちのいずれか1つによる方法を行うための、データプリフェッチング装置が提供される。
第5の態様によれば、第2の態様または第2の態様の可能な実装態様のうちのいずれか1つによる方法を行うための、データプリフェッチング装置が提供される。
第6の態様によれば、第4の態様または第4の態様の可能な実装態様のうちのいずれか1つによる装置、および第5の態様または第5の態様の可能な実装態様のうちのいずれか1つによる装置を含む、データプリフェッチングシステムが提供される。
第6の態様の第1の可能な実装態様では、プリフェッチエンジンは、ハードウェアを使用することによって実装されメモリからキャッシュの中にデータをプリフェッチするよう構成されたエンジンである。
いくつかの実装態様では、プリフェッチエンジンは、テキストファイルもしくはバイナリファイルの中にあるN個の関数の開始アドレスが読み出されるとき、メモリの中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをCacheの中にプリフェッチするか、またはテキストファイルもしくはバイナリファイルの中にあるN個の関数の開始アドレスが読み出される第1の時間期間の前に、メモリの中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをCacheの中にプリフェッチするか、またはテキストファイルもしくはバイナリファイルの中にあるN個の関数の開始アドレスが読み出される第2の時間期間の後、メモリの中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをCacheの中にプリフェッチするよう、特に構成される。
第7の態様によれば、データプリフェッチング装置が提供され、装置は、少なくとも1つのプロセッサ、ストレージ、および通信インターフェースを含む。少なくとも1つのプロセッサ、ストレージ、および通信インターフェースはすべて、バスを使用することによって接続され、ストレージは、コンピュータ実行可能命令を記憶するよう構成され、少なくとも1つのプロセッサは、ストレージの中に記憶されたコンピュータ実行可能命令を実行するよう構成され、それによって、装置は、通信インターフェースを使用することによって他の装置とデータを交換して、第1の態様または第1の態様の可能な実装態様のうちのいずれか1つによる方法を行うことができる。
第8の態様によれば、データプリフェッチング装置が提供され、装置は、少なくとも1つのプロセッサ、ストレージ、および通信インターフェースを含む。少なくとも1つのプロセッサ、ストレージ、および通信インターフェースはすべて、バスを使用することによって接続され、ストレージは、コンピュータ実行可能命令を記憶するよう構成され、少なくとも1つのプロセッサは、ストレージの中に記憶されたコンピュータ実行可能命令を実行するよう構成され、それによって、装置は、通信インターフェースを使用することによって他の装置とデータを交換して、第2の態様または第2の態様の可能な実装態様のうちのいずれか1つによる方法を行うことができる。
第9の態様によれば、コンピュータプログラムを記憶するためのコンピュータ可読媒体が提供され、コンピュータプログラムは、第1の態様または第1の態様の可能な実装態様のうちのいずれか1つによる方法を行うために使用される命令を含む。
第10の態様によれば、コンピュータプログラムを記憶するためのコンピュータ可読媒体が提供され、コンピュータプログラムは、第2の態様または第2の態様の可能な実装態様のうちのいずれか1つによる方法を行うために使用される命令を含む。
コンパイラが、最初に、N個の関数と、N個の関数の第1のグローバル変数とを取得し、次いで、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを決定することがわかり得る。プリフェッチエンジンは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、Cacheの中にプリフェッチする。N個の関数の開始アドレスは、データをプリフェッチするためのプリフェッチング時間として理解されてよい。プリフェッチエンジンおよびコンパイラは、並列に実行を行い得る。プリフェッチング時間は、N個の関数の開始アドレスであり、従来技術におけるソフトウェアプリフェッチ命令に依存せず、それによって、プリフェッチング・フレキシビリティが改善される。
本出願の実施形態におけるデータプリフェッチング方法は、シングルコアまたはマルチコアのコンピュータシステムに適用されてよく、マルチコアコンピュータシステムは、汎用マルチコアコンピュータシステムであってよいことを理解されたい。マルチコアコンピュータシステムの中のCPUは複数のコアを含んでよく、複数のコアはシステムバスまたはクロスバーを使用することによって互いに通信し得る。マルチコアコンピュータシステムは、CPUの中の複数のコアによって共有されるキャッシュを含んでよい。
図1は、本出願の一実施形態によるコンピュータシステムアーキテクチャ100の概略図である。コンピュータシステムアーキテクチャ100は、中央処理装置(CPU)110、キャッシュ120、およびメモリ130を含む。
CPU110は、処理のために、頻繁に使用されるデータをキャッシュ120から取得するよう構成されるか、または処理のために、データをメモリ130から直接取得し得る。CPUがメモリの中のデータにアクセスする必要があるとき、CPUは最初に、CPUによってアクセスされる必要があるデータがキャッシュ120の中にあるかどうか、およびアクセスされる必要があるデータが期限切れであるかどうかを問い合わせる。アクセスされる必要があるデータがキャッシュ120の中にあり期限切れになっていない場合、データはキャッシュ120から読み出される。CPUによってアクセスされる必要があるデータがキャッシュ120の中にあることはヒットと呼ばれ、CPUによってアクセスされる必要があるデータがキャッシュ120の中にないことはミスと呼ばれる。
キャッシュ120は、メモリ130からプリフェッチされたデータを記憶し、それによって、CPU110がデータを取得し、CPU110によってメモリ130からデータを取得する際の遅延が減少されるよう、構成される。
メモリ130は、データを記憶するよう構成され、メモリ130の中の頻繁に使用されるデータはキャッシュ120の中に記憶される。
キャッシュ120のより高いヒット率は、より良好なデータプリフェッチング効果を示す。加えて、Cacheは、命令CacheおよびデータCacheを含み得る。
図2は、本出願の一実施形態によるアプリケーションシナリオ200の概略図である。アプリケーションシナリオ200は、コンパイラ210、テキストファイルまたはバイナリファイル220、プリフェッチエンジン230、およびメモリ130を含む。
コンパイラ210は、関数と関数のグローバル変数とを取得し、関数の開始アドレスと関数のグローバル変数の開始アドレスとをパースするよう構成される。コンパイラ210は、関数のコールド区画およびホット区画をさらにパースし得る。コンパイラ210は、関数の変数のアクセスシーケンスをさらにパースし得る。コンパイラによってパースアウトされる開始アドレス、コールド区画およびホット区画、ならびにアクセスシーケンスなどの情報は、プリフェッチング情報と呼ばれることがある。コンパイラ210は、プリフェッチング情報をテキストファイルもしくはバイナリファイル220に出力し得るか、または確かに、コンパイラ210は、プリフェッチエンジン230が、プリフェッチング情報に従って、メモリ130の中のデータをCache120の中にプリフェッチするよう、プリフェッチング情報をプリフェッチエンジン230に直接出力し得る。
テキストファイルまたはバイナリファイル220は、コンパイラ210によって出力されるプリフェッチング情報を受信および記憶し、それによって、プリフェッチエンジン230がプリフェッチング情報を読み出すよう、構成される。
プリフェッチエンジン230は、テキストファイルまたはバイナリファイル220の中に記憶されたプリフェッチング情報を読み出し、読み出されたプリフェッチング情報に従ってメモリ130からデータをプリフェッチするよう構成される。
メモリ130は、変数に関連付けられたデータを記憶し、それによって、プリフェッチエンジン230がデータを読み出すよう構成される。
したがって、本出願の本実施形態では、コンパイラ210は、関数のプリフェッチング情報を分析し、プリフェッチエンジン230は、プリフェッチング情報に従って、メモリ130の中のデータをプリフェッチする。コンパイラ210とプリフェッチエンジン230とは、並列に実行を行ってもよく、それによって、データプリフェッチング効率がさらに改善され得る。加えて、データプリフェッチング時間は、コンパイラ210によってパースアウトされるプリフェッチング情報である。このようにして、プリフェッチング時間は、従来技術におけるソフトウェアプリフェッチ命令に依存せず、プリフェッチング・フレキシビリティが改善される。
図3は、本出願の一実施形態によるデータプリフェッチング方法300の概略図である。方法300はコンピュータシステムに適用される。たとえば、コンピュータシステムは組込みシステムであってよい。コンピュータシステムは、プリフェッチエンジン230、メモリ130、およびコンパイラ210を含む。方法300は、S310、S320、およびS330を含む。コンパイラ210は、コンパイルプロセスの中でS310およびS320を行い、プリフェッチエンジン230がS330を行う。詳細は以下の通りである。
S310。N個の関数と、N個の関数の第1のグローバル変数とを取得し、Nは1以上の整数である。
S320。N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを決定する。
S330。プリフェッチエンジン230が、コンパイラ210によって決定されるN個の関数の開始アドレスと第1のグローバル変数の開始アドレスとに従って、メモリ130の中にあり第1のグローバル変数に関連付けられたデータを、キャッシュ120の中にプリフェッチする。
任意選択で、S310およびS320はリンクプロセスの中で完了され得る。S310において、N個の関数と、N個の関数の第1のグローバル変数とが、同時に取得され得るかまたは別に取得され得る。同様に、S320において、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとが、同時に決定され得るかまたは別に決定され得る。N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとが別に決定されるとき、N個の関数の開始アドレスが最初に決定されてもよく、次いで第1のグローバル変数の開始アドレスが決定されるか、または第1のグローバル変数の開始アドレスが最初に決定されてもよく、次いでN個の関数の開始アドレスが決定される。このことは、本出願の本実施形態において限定されない。
N個の関数の開始アドレスは、N個の関数によって共有される開始アドレスであってよいことが理解されるべきであり、N個の関数の開始アドレスは、N個の関数のうちの1つの開始アドレスとして理解されてよい。N個の関数の開始アドレスは、メモリ130の中のデータをキャッシュ120の中にプリフェッチするようにプリフェッチエンジン230をトリガするためのデータプリフェッチング時間として使用される。第1のグローバル変数の開始アドレスは、メモリ130の中にあり第1のグローバル変数に関連付けられたデータをキャッシュ120の中にプリフェッチするために、プリフェッチエンジンによって使用されるアドレスである。すなわち、第1のグローバル変数の開始アドレスは、メモリ130の中にあり第1のグローバル変数に関連付けられたデータの、コンパイラによってパースアウトされる開始アドレスであってよく、またはプログラムの中の第1のグローバル変数のものでありコンパイラによってパースアウトされる開始アドレスであってよい。プログラムの中の第1のグローバル変数の開始アドレスと、第1のグローバル変数に関連付けられたデータの、メモリ130の中の開始アドレスとの間に、マッピング関係がある。プリフェッチエンジン230は、プログラムの中の第1のグローバル変数の開始アドレスと、マッピング関係とに従って、第1のグローバル変数に関連付けられたデータのメモリ130の中の開始アドレスを決定し、次いで、メモリ130の中にあり第1のグローバル変数に関連付けられたデータをキャッシュ120の中にプリフェッチする。
具体的には、プログラム要員は、開発プロセスの中で、N個の関数が特定のサービスに関係する関数であり得ることを決定し得る。したがって、N個の関数のすべての変数は、データプリフェッチングプロセスの中で、メモリ130からキャッシュ120の中にプリフェッチされうる。コンパイラ210は、コンパイルプロセスの中で、N個の関数と、N個の関数の第1のグローバル変数とを取得し得る。次いで、コンパイラ210は、N個の関数と、第1のグローバル変数とに従って、メモリ130の中のN個の関数の開始アドレスと第1のグローバル変数の開始アドレスとを取得する。N個の関数の開始アドレスは、プリフェッチエンジン230のプリフェッチング時間として理解されてよい。プリフェッチエンジン230およびコンパイラ210は、並列に実行を行い得る。プリフェッチング時間は、N個の関数の開始アドレスに依存し得る。このようにして、プリフェッチング時間は従来技術におけるソフトウェアプリフェッチ命令に依存せず、プリフェッチング・フレキシビリティが改善される。
N個の関数の開始アドレスを読み出す前または読み出した後、プリフェッチエンジン230は、prefetch命令を使用することによって関数からプリフェッチングを行うことによって引き起こされる制限を回避するよう、第1のグローバル変数の開始アドレスに従って、メモリ130の中のデータをプリフェッチする。加えて、従来技術では、prefetch命令におけるデータプリフェッチング時間は、開発者によって関数の中で指定される。本出願の本実施形態では、データは、関数が実行され始める前の予め設定された時間においてプリフェッチされてよく、またはデータは、N個の関数のアドレスがパースアウトされるときにプリフェッチされてよく、またはデータは、N個の関数のアドレスがパースアウトされた後の予め設定された時間においてプリフェッチされてよい。プリフェッチング時間は関数に限定されず、特定のプリフェッチング時間は、特定の規則に従って決定され得る。このようにして、データプリフェッチング・フレキシビリティがさらに改善され得る。
より具体的には、いったんプリフェッチエンジン230がN個の関数の開始アドレスと第1のグローバル変数の開始アドレスとを取得すると、プリフェッチエンジン230は、メモリ130の中のデータをキャッシュ120の中にプリフェッチすることができる。たとえば、プリフェッチエンジン230は、現在のプログラム実行速度に従ってプリフェッチング時間を決定し得る。現在のプログラム実行速度が比較的速い場合、データは、N個の関数の開始アドレスが読み出される第1の時間期間の前にプリフェッチされ始めてよく、または現在のプログラム実行速度が比較的遅い場合、データは、N個の関数の開始アドレスが読み出される第2の時間期間の後にプリフェッチされ始めてよく、またはプリフェッチエンジン230は、N個の関数の開始アドレスが読み出されるときにデータをプリフェッチし始めてよい。他の例として、プリフェッチエンジン230は、キャッシュ120のサイズと、キャッシュ120の中のデータのライフサイクルとに従って、データプリフェッチング時間を決定し得る。さらに他の例として、コンパイラ210は、プリフェッチング時間をプリフェッチエンジン230に通知し得、プリフェッチエンジン230は、コンパイラ210によって送られるプリフェッチング時間に従ってデータをプリフェッチする。したがって、従来技術と比較して、プリフェッチング・フレキシビリティがさらに改善され得る。
任意選択で、Nが1に等しいとき、すなわち、1つの関数が1つの開始アドレスに対応するとき、プリフェッチエンジン230は、関数の第1のグローバル変数に関連付けられたデータをプリフェッチする。Nが1よりも大きいとき、すなわち、複数の関数が1つの開始アドレスを共有し得るとき、プリフェッチエンジン230は、複数の関数の第1のグローバル変数に関連付けられたデータをプリフェッチする。すなわち、プリフェッチエンジン230は、メモリ130の中にあり1つの関数のグローバル変数に対応するデータをキャッシュ120の中にプリフェッチしてもよいだけでなく、メモリ130の中にあり複数の関数のグローバル変数に対応するデータをキャッシュ120の中にプリフェッチしてもよい。任意選択で、複数の関数は、特定のサービスに関係する複数の関数であってよい。たとえば、特別なサービスを実施するために、サービスは複数の関数を使用する必要がある。このようにして、メモリ130の中にあり複数の関数の第1のグローバル変数に対応するデータは、1つの開始アドレスを使用することによってキャッシュ120の中にプリフェッチされ得、それによって、プリフェッチング効率がさらに改善される。
さらに、S320は以下のことを含む。すなわち、コンパイラ210は、N個の関数をパースするときにN個の関数の開始アドレスをパースする。あるいは、S320は以下のことを含む。すなわち、コンパイラ210は、初期コンパイル段階においてすべての関数の開始アドレスをパースし、第1の関数をパースするとき、コンパイラ210は、以前にパースアウトされている開始アドレスを探索してN個の関数の開始アドレスを決定する。このようにして、プログラム実行時間が短縮され得る。S320は以下のことを含む。すなわち、コンパイラ210は、第1のグローバル変数をパースするときに第1のグローバル変数の開始アドレスをパースする。あるいは、S320は以下のことを含む。すなわち、コンパイラ210は、初期コンパイル段階においてすべてのグローバル変数の開始アドレスをパースし、第1のグローバル変数をパースするとき、コンパイラ210は、以前にパースアウトされている開始アドレスを探索して第1のグローバル変数の開始アドレスを決定する。
任意選択の実施形態では、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを決定した後、方法300は以下のことをさらに含む。すなわち、コンパイラ210は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを、テキストファイルまたはバイナリファイル220に出力し、プリフェッチエンジン230は、テキストファイルまたはバイナリファイル220の中にあるN個の関数の開始アドレスと第1のグローバル変数の開始アドレスとを読み出し、読み出されるN個の関数の開始アドレスと第1のグローバル変数の開始アドレスとに従って、メモリ130の中にあり第1のグローバル変数に関連付けられたデータを、キャッシュ120の中にプリフェッチする。
コンパイラ210は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを、テキストファイルまたはバイナリファイル220の中に記憶する。プリフェッチエンジン230は、テキストファイルまたはバイナリファイル220からN個の関数の開始アドレスと第1のグローバル変数の開始アドレスとを読み出し、N個の関数の開始アドレスに従ってデータプリフェッチング時間を決定し、メモリ130の中にあり第1のグローバル変数の開始アドレスに対応するデータを、決定されたプリフェッチング時間においてプリフェッチする。確かに、構造体メンバー変数のCache lineインデックス番号またはアドレスオフセットなどのプリフェッチング情報は、テキストファイルまたはバイナリファイルの中に記憶され、それによって、プリフェッチエンジン230が、テキストファイルまたはバイナリファイル220の中のプリフェッチング情報に従ってメモリ130の中のデータをプリフェッチする。
任意選択の実施形態では、プリフェッチエンジン230が、読み出されるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリ130の中にあり第1のグローバル変数に関連付けられたデータを、キャッシュ120の中にプリフェッチすることは、テキストファイルもしくはバイナリファイル220の中にあるN個の関数の開始アドレスを読み出すとき、プリフェッチエンジン230が、メモリ130の中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをキャッシュ120の中にプリフェッチすること、またはプリフェッチエンジン230がテキストファイルもしくはバイナリファイル220の中にあるN個の関数の開始アドレスを読み出す第1の時間期間の前に、プリフェッチエンジン230が、メモリ130の中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをキャッシュ120の中にプリフェッチすること、またはプリフェッチエンジン230が、テキストファイルもしくはバイナリファイル220の中にあるN個の関数の開始アドレスを読み出す第2の時間期間の後、プリフェッチエンジン230が、メモリ130の中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをキャッシュ120の中にプリフェッチすることを含む。
具体的には、コンパイラ210は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを出力し、テキストの形式で、またはバイナリファイルの中に、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを記憶し得る。プリフェッチエンジン230が、テキストまたはバイナリファイルからN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを取得し、プリフェッチエンジン230が、N個の関数の開始アドレスを読み出すとき、プリフェッチエンジン230は、第1のグローバル変数の開始アドレスに従って、第1のグローバル変数に関連付けられたデータをメモリ130からキャッシュ120の中にプリフェッチする。したがって、ソフトウェアを使用することによって分析を行うとともにハードウェアを使用することによって取得を行う協調プリフェッチング方式では、データプリフェッチング・フレキシビリティが改善され得る。ソフトウェアは、実際のプログラム実行ステータスをパースアウトし、次いで、実際のプログラム実行ステータスをテキストまたはバイナリファイルに出力し、それによって、ハードウェアが実際のプログラム実行ステータスを読み出す。ハードウェアは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリ130の中のデータをプリフェッチする。加えて、ハードウェアは、キャッシュ120のメモリ130を拡張してよい。このようにして、キャッシュ120のヒット率がさらに改善され得る。
さらに、コンパイラ210は、プリフェッチング時間の識別情報をテキストファイルまたはバイナリファイル230の中に記憶し得る。プリフェッチング時間の識別情報を読み出すとき、プリフェッチエンジン230は、プリフェッチング時間の識別情報に従って、メモリ130の中にあり第1のグローバル変数に関連付けられたデータを、キャッシュ120の中にプリフェッチする。たとえば、プリフェッチング時間の識別情報は、第1の識別子、第2の識別子、または第3の識別子であってよい。第1の識別子は、プリフェッチエンジン230が、N個の関数の開始アドレスを読み出すとき、第1のグローバル変数に関連付けられたデータをキャッシュ120の中にプリフェッチすることを示すために使用される。第2の識別子は、プリフェッチエンジン230がN個の関数の開始アドレスを読み出す第1の時間期間の前に、プリフェッチエンジン230が、第1のグローバル変数に関連付けられたデータをキャッシュ120の中にプリフェッチすることを示すために使用される。第3の識別子は、プリフェッチエンジン230がN個の関数の開始アドレスを読み出す第2の時間期間の後に、プリフェッチエンジン230が、第1のグローバル変数に関連付けられたデータをキャッシュ120の中にプリフェッチすることを示すために使用される。
本出願の本実施形態では、コンパイラ210がN個の関数の開始アドレスと第1のグローバル変数の開始アドレスとを決定した後、プリフェッチング時間が、コンパイラ210によって決定され得るか、もしくはプリフェッチエンジン230によって決定され得るか、または特定の規則に従って決定され得るか、もしくはプロトコルに従って指定され得ることを理解されたい。このことは、本出願の本実施形態において限定されない。
N個の関数の第1のグローバル変数が1つのグローバル変数または複数のグローバル変数であってよいことも理解されたい。このことは、本出願の本実施形態において限定されない。確かに、第1のグローバル変数は、N個の関数のグローバル変数のみに限定されるとは限らない。すなわち、2つの異なる関数が同じグローバル変数を有してよく、または2つの異なる関数が異なるグローバル変数を有してよい。このことは、本出願の本実施形態において限定されない。
さらに、メモリ130の中にあり第1のグローバル変数に対応するデータがプリフェッチされ、第1のグローバル変数がN個の関数以外の第2の関数の中でも呼び出されるとき、CPUは、データが他の関数によって必要とされるときにデータが再び取得される必要があるという従来技術問題を回避するように、第1のグローバル変数に対応するデータをキャッシュ120から直接取得し得、シグナリングオーバーヘッドを低減し得る。
本出願の本実施形態では、N個の関数の第1のグローバル変数が取得されてよく、メモリ130の中にありN個の関数の第1のグローバル変数に対応するデータがプリフェッチされるか、またはN個の関数のみが取得されてよく、メモリ130の中にありN個の関数のすべての変数に対応するデータがプリフェッチされるか、または第1のグローバル変数のみが取得されてよく、メモリ130の中にあり第1のグローバル変数に対応するデータがプリフェッチされる。このことは、本出願の本実施形態において限定されない。
たとえば、実際のアプリケーションプロセスの中で、ユーザは、コンパイラ210のインターフェースを使用することによって、分析される必要がある関数をコンパイラ210に通知し得る。コンパイラ210は、それを使用することによってコンパイラ210がユーザおよびハードウェアと相互作用する相互作用インターフェースを指定し、関数の中で使用されるグローバル変数をパースアウトし、識別されたグローバル変数のデータが属する先のCache lineに対して統計的分類を行い、グローバルシンボルを自動的に生成し、Cache line情報および関数をシンボルの中に記憶してよく、それによって、ハードウェアがCache line情報および関数を読み出す。ハードウェアは、プリフェッチエンジン230の周辺装置をカスタマイズし、プリフェッチエンジン230の周辺装置は、データをキャッシュ120の中にプリフェッチするよう構成される。あるいは、ハードウェアは、プリフェッチングを行うようにプリフェッチエンジン230をトリガするようにコンパイル命令をカスタマイズしてもよく、プリフェッチエンジン230は、コンパイラ210によって自動的に生成されるグローバルシンボルからプリフェッチング情報を読み出す。
任意選択の実施形態では、第1のグローバル変数はM個の構造体メンバー変数を含み、Mは1以上である。
具体的には、第1のグローバル変数がグローバル構造体メンバー変数であるとき、グローバル構造体メンバー変数はM個の構造体メンバー変数を含む。プリフェッチエンジン230は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリ130の中にありM個の構造体メンバー変数に関連付けられたデータを、予めメモリ130の中にプリフェッチし得る。このようにして、プリフェッチ命令を関数の中に挿入することによってM個の構造体メンバー変数に関連付けられたデータをプリフェッチする、従来技術動作が回避され得る。加えて、従来技術では、メモリ130の中にありM個の構造体メンバー変数に関連付けられたデータをプリフェッチするために、複数のプリフェッチ命令が必要とされる。このようにして、プログラム実行時間が増加する。加えて、M個の構造体メンバー変数のプリフェッチング時間は、プログラマーによってのみ指定され、コンパイラ210のコンパイルおよびスケジューリング時間が、プログラマーによって指定されるM個の構造体メンバー変数のプリフェッチング時間と協調することを保証するのは困難である。したがって、キャッシュ120のヒット率もまた保証され得ない。たとえば、M個の構造体メンバー変数のプリフェッチ命令が過度に早く挿入され、データが過度に早くキャッシュ120の中にプリフェッチされるとき、データは、CPUがキャッシュ120にアクセスする前に置換されることがある。M個の構造体メンバー変数のプリフェッチ命令が過度に遅く挿入されるとき、CPUがキャッシュ120にアクセスするときに遅延が引き起こされる。
任意選択の実施形態では、S320は、N個の関数の中で使用される少なくとも1つの構造体メンバー変数をパースすることを含み、M個の構造体メンバー変数は少なくとも1つの構造体メンバー変数を含む。S330は以下のことを含む。すなわち、プリフェッチエンジン230は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、少なくとも1つの構造体メンバー変数の各々のアドレスオフセットとに従って、メモリ130の中にあり少なくとも1つの構造体メンバー変数に関連付けられたデータを、キャッシュ120の中にプリフェッチする。
具体的には、第1のグローバル変数はM個の構造体メンバー変数を含むが、M個の構造体メンバー変数のうちの少なくとも1つがN個の関数の中で使用され得る。したがって、コンパイラ210は、N個の関数の中で使用される構造体メンバー変数をパースする必要がある。コンパイラ210は、パースすることを通じて、M個の構造体メンバー変数のうちの少なくとも1つがN個の関数の中で使用されることを知り、第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットを決定し、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、第1のグローバル変数の開始アドレスに対する各構造体メンバー変数のアドレスオフセットとを、テキストまたはバイナリファイルの中に記憶し、それによって、プリフェッチエンジン230が、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、第1のグローバル変数の開始アドレスに対する各構造体メンバー変数のアドレスオフセットとを読み出す。N個の関数の開始アドレスを読み出すとき、プリフェッチエンジン230は、第1のグローバル変数の開始アドレスに対するアドレスオフセットに従って、各構造体メンバー変数に関連付けられたデータを、キャッシュ120の中にプリフェッチし得る。このようにして、N個の関数の中で使用される構造体メンバー変数は、N個の関数の実際の要件に従ってパースアウトされ得る。CPUが、キャッシュ120の中にあり少なくとも1つの構造体メンバー変数に関連付けられたデータにアクセスする前に、プリフェッチエンジン230は、N個の関数の中で使用される構造体メンバー変数に関連付けられたデータをキャッシュ120の中にプリフェッチし得、それによって、プリフェッチング効率が改善され得、CPUがキャッシュ120にアクセスするとき、キャッシュ120は、構造体メンバー変数に対応しCPUによって必要とされるデータを記憶し、それによって、キャッシュ120のヒット率がさらに改善され得る。
任意選択の実施形態では、N個の関数はホットスポット関数であり、第1のグローバル変数はホットスポットグローバル変数である。
ホットスポット関数は、頻繁に使用される関数を示すために使用されることを理解されたい。たとえば、特定の時間期間において、N個の関数が呼び出される回数が第1のしきい値を超えるとき、N個の関数はホットスポット関数であるものと考えられる。ホットスポットグローバル変数は、頻繁に使用されるグローバル変数を示すために使用される。たとえば、特定の時間期間において、第1のグローバル変数が呼び出される回数が第2のしきい値を超えるとき、第1のグローバル変数はホットスポットグローバル変数であるものと考えられる。すなわち、本出願の本実施形態では、コンパイラ210は、ホットスポット関数と、ホットスポットグローバル変数とをパースする。このようにして、プリフェッチエンジン230によってプリフェッチされるデータは、ホットスポット関数の中の頻繁に呼び出されるホットスポットグローバル変数に関連付けられたデータであり、それによって、プリフェッチング効率が改善され得、キャッシュ120のヒット率がさらに改善され得る。
任意選択で、コンパイラ210は、パースすることを通じて、関数がホット関数であるかまたはコールド関数であるかを知り得る。ホット関数は、コンパイラ210によって頻繁にコンパイルされる必要がある関数であってよく、コールド関数は、コンパイラ210によって比較的少ない回数だけコンパイルされる関数であってよい。たとえば、コールド関数とホット関数との分類は以下の通りでありうる。すなわち、特定の時間範囲内で、指定された第3のしきい値よりも多くの回数だけコンパイルされる関数がホット関数であり、指定された第3のしきい値よりも少ない回数だけコンパイルされる関数がコールド関数である。
任意選択の実施形態では、S320は、変数が少なくとも1つの構造体メンバー変数を含むことと、第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットを決定することと、少なくとも1つの構造体メンバー変数の各々のアドレスオフセットに従って、メモリ130の中の少なくとも1つの構造体メンバー変数の各々のCache lineインデックス番号を決定することとを含む。S330は以下のことを含む。すなわち、プリフェッチエンジン230は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、メモリ130の中の各構造体メンバー変数のCache lineインデックス番号とに従って、メモリ130の中のデータを、プリフェッチする。
具体的には、コンパイラ210が第1のグローバル変数に対する第1のグローバル変数の少なくとも1つの構造体メンバー変数の各々のアドレスオフセットを取得しうる後、コンパイラ210は、チップのCache line長と、各構造体メンバー変数のオフセットアドレスと、第1のグローバル変数の開始アドレスとを参照し、メモリ130の中の各構造体メンバー変数のCache lineインデックス番号をマッピングする。コンパイラ210は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、Cache lineインデックス番号とを、テキストまたはバイナリファイルの中に記憶する。2つの構造体メンバー変数が同じCache lineインデックス番号を有するとき、コンパイラ210は、1つのCache lineインデックス番号をプリフェッチエンジン230に戻す。プリフェッチエンジン230は、Cache lineインデックス番号に従ってメモリ130の中のデータをプリフェッチし、それによって、プリフェッチング効率がさらに改善され、prefetch命令を使用することによって特定のデータしか一度にフェッチされ得ず2つの構造体メンバー変数のデータが一度にプリフェッチされ得ないという従来技術問題が回避される。
たとえば、(別個に1、2、3、4、5、6、7、および8という番号が付けられた)8個の構造体メンバー変数がN個の関数の中で使用される場合、8個の構造体メンバー変数に対応するデータのものである、メモリ130の中のCache lineインデックス番号は、第1のグローバル変数の開始アドレスに対する各構造体メンバー変数のオフセットアドレスに従って決定される。すなわち、1および2という番号が付けられている構造体メンバー変数のCache lineインデックス番号は1であり、3、4、5、および6という番号が付けられている構造体メンバー変数のCache lineインデックス番号は2であり、7という番号が付けられている構造体メンバー変数のCache lineインデックス番号は3であり、8という番号が付けられている構造体メンバー変数のCache lineインデックス番号は4である。コンパイラ210は、そのインデックス番号が1、2、3、および4であるCache lineの、メモリ130の中の開始アドレスを、テキストファイルまたはバイナリファイル220に出力する。プリフェッチエンジン230は、テキストファイルまたはバイナリファイル220の中のインデックス番号を読み出す。プリフェッチエンジン230は、4本のCache lineを使用することによって、第8の構造体メンバー変数に対応するデータをメモリ130からプリフェッチすることができる。しかしながら、従来技術では、8個の構造体メンバー変数に対応するデータをプリフェッチするために8本のCache lineが必要とされる。したがって、本出願の本実施形態では、データプリフェッチングの回数が減少され得、データプリフェッチング効率が改善され得、データプリフェッチング遅延が短縮され得る。
任意選択の実施形態では、方法300は以下のことをさらに含む。すなわち、コンパイラ210は、コンパイルプロセスの中で以下の動作を行う。すなわち、N個の関数の第3のグローバル変数を取得することと、メモリ130の中の第1のグローバル変数のCache lineインデックス番号およびメモリ130の中の第3のグローバル変数のCache lineインデックス番号を決定することとであり、それによって、プリフェッチエンジン230が、Cache lineインデックス番号に従って、メモリ130の中にあり第1のグローバル変数に関連付けられたデータと、メモリ130の中にあり第3のグローバル変数に関連付けられたデータとを、キャッシュ120の中にプリフェッチする。
具体的には、複数のグローバル変数がある場合、コンパイラ210は、複数のグローバル変数に従って、メモリ130の中の各グローバル変数のCache lineインデックス番号を決定し、プリフェッチエンジン230は、メモリ130の中の各グローバル変数のCache lineインデックス番号に従って、メモリ130の中のデータをプリフェッチする。
任意選択の実施形態では、第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットを決定する前に、方法300は以下のことをさらに含む。すなわち、コンパイラ210は、第1のグローバル変数の開始アドレスに対するM個の構造体メンバー変数の各々のアドレスオフセットを取得するために、M個の構造体メンバー変数をパースする。第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットを決定することは、第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットを、第1のグローバル変数の開始アドレスに対するM個の構造体メンバー変数の各々のアドレスオフセットから決定することを含む。
具体的には、第1のグローバル変数がM個の構造体メンバー変数を含むとき、コンパイラ210は、第1のグローバル変数の開始アドレスに対するM個の構造体メンバー変数の各々のアドレスオフセットをパースする必要がある。パースすることを通じて、M個の構造体メンバー変数のうちの少なくとも1つしかN個の関数の中で使用されないことを知ると、コンパイラ210は、少なくとも1つの構造体メンバー変数のアドレスオフセットを求めて、M個の構造体メンバー変数の各々のアドレスオフセットを探索し得る。
任意選択で、コンパイラ210は、アドレスをパースアウトし得るだけでなく、グローバル構造体メンバー変数の中の少なくとも1つの構造体メンバー変数のレイヤ、たとえば、構造体メンバー変数が、第1のグローバル変数の第1のレイヤの構造体メンバー変数であるのか、第2のレイヤの構造体メンバー変数であるのかなどもパースし得る。たとえば、グローバル変数Aは、3つの構造体メンバー変数A1、A2、およびA3を含み、A1も構造体変数であり4つの構造体メンバー変数A11、A12、A13、およびA14を含む。A11をパースするとき、コンパイラ210は、A11が第2のレイヤの構造体メンバー変数であるという情報をテキストファイルまたはバイナリファイルに出力し得る。
任意選択の実施形態では、N個の関数と、N個の関数の第1のグローバル変数とを取得する前に、コンパイラ210は、コンパイルプロセスの中で以下の動作、すなわち、P個の関数と、P個の関数の各々の少なくとも1つのグローバル変数とを取得することであって、P個の関数はN個の関数を含み、Pは1以上であり、PはN以上であることと、P個の関数の各々の開始アドレスをパースすることと、各関数の少なくとも1つのグローバル変数の各々の開始アドレスをパースすることとを行う。N個の関数と、N個の関数の第1のグローバル変数とを取得することは、P個の関数からN個の関数を決定することと、N個の関数の少なくとも1つのグローバル変数から第1のグローバル変数を決定することとを含む。N個の関数の開始アドレスを決定することは、P個の関数の各々の開始アドレスからN個の関数の開始アドレスを決定することを含む。第1のグローバル変数の開始アドレスを決定することは、各グローバル変数の開始アドレスから第1のグローバル変数の開始アドレスを決定することを含む。
具体的には、プログラム実行プロセス全体の中で、P個の関数が含まれてよく、P個の関数の各々は少なくとも1つのグローバル変数を含む。コンパイラ210は、P個の関数の各々の開始アドレスをパースし、パースした後に取得される少なくとも1つの開始アドレスからN個の関数の開始アドレスを決定する。コンパイラ210は、N個の関数の少なくとも1つのグローバル変数の各々の開始アドレスをパースすることと、マッチングを通じて各グローバル変数の開始アドレスから第1のグローバル変数の開始アドレスを取得することとをさらに必要とする。コンパイラ210は、初期コンパイル段階において、P個の関数と、P個の関数の各々に対応する少なくとも1つのグローバル変数の開始アドレスとをパースアウトして、マッピングテーブルを形成し得る。N個の関数をパースするとき、コンパイラ210は、N個の関数の中で使用される第1のグローバル変数をパースし、第1のグローバル変数の開始アドレスを求めてマッピングテーブルを探索する。
任意選択で、プログラム開発者は、ユーザ動作傾向に従って、P個の関数と、P個の関数の各々の少なくとも1つのグローバル変数とを決定し得る。P個の関数と、P個の関数の各々の少なくとも1つのグローバル変数とは、テーブルの形式で記憶され得、たとえば、グローバル変数ライブラリが生成される。またさらに、P個の関数と、P個の関数の各々の少なくとも1つのグローバル変数とは、キーワードを使用することによって指定され得る。たとえば、P個の関数と、P個の関数の各々の少なくとも1つのグローバル変数とは、キーワードattribute属性smar_prefetch_varを使用することによって指定される。
たとえば、ワイヤレスL2サービスにおいて多くのグローバル構造体メンバー変数が使用される。たとえば、コード1382の中のMUM_RefreshRlcSharePam関数の中で使用されるグローバル構造体メンバー変数g_dMACUserTableの構造体メンバー変数のアドレスオフセット情報は以下の通りである。
q_dMACUserTable→stDmacPublicInfo→dMACCfgCommonPara→u8MacActiveFlag→offset 26080
q_dMACUserTable→stDmacPublicInfo→stCaCfgPara→ucSCellIndex→offset 1184
q_dMACUserTable→stDmacPublicInfo→dMACCfgCommonPara→u8CellId→offset 26112
q_dMACUserTable→stDmacPerformanceUsrInfo→dMACMeasAllowInfo→ulDlUserTpRbNum→offset 214464
q_dMACUserTable→stDmacDlschUsrInfo→DlFluxInnerPara→ulAmbrSumBytes→offset 165408
q_dMACUserTable→stDmacPublicInfo→dMACCfgCommonPara→ucActiveDrbNum→offset 26328
q_dMACUserTable→stDmacDlschUsrInfo→DlFluxInnerPara→adMacRlcFluxInner→ulSendDataBytes→offset 165440
q_dMACUserTable→stDmacDlschUsrInfo→stDlschUsrInfo→astDMACRlcInfo→stMacRlcMeasureStru→ulTPWinByteNum→offset 134368
上記の構造体メンバー変数は、メモリ130の中の異なった場所において散在される。関数を使用することによってデータが呼び出されると、データは比較的離散してメモリ130の中に記憶され、異なった関数は異なった構造体メンバー変数にアクセスする。上記の構造体メンバー変数に関連付けられたデータが従来技術に従ってプリフェッチされるとき、各関数の中にプリフェッチ命令が挿入される必要があり、したがって、複数の構造体メンバー変数は複数のプリフェッチ命令を必要とする。加えて、各構造体メンバー変数のデータプリフェッチング時間はプログラム開発者によって指定され、コンパイラ210のコンパイルおよびスケジューリング時間が、プログラム開発者によって指定される時間に整合することは保証され得ない。CPUがキャッシュ120の中のデータにアクセスする必要があるとき、データがキャッシュ120の中にプリフェッチされていないことがあるか、またはデータがキャッシュ120の中に過度に早くプリフェッチされるとともにデータがCPUによってアクセスされる前に置換され、したがって、キャッシュ120のヒット率が低減される。本出願の本実施形態では、関数によって使用されるデータは、関数が実行され始めるときにキャッシュ120の中にプリフェッチされるか、または構造体メンバー変数のデータは、データが使用される前にキャッシュ120の中にプリフェッチされる。加えて、コンパイラ210は、構造体メンバー変数のシーケンスをパースアウトし得、データは、データプリフェッチング効率をさらに改善するとともにキャッシュ120のヒット率を改善するよう、構造体メンバー変数の降順でキャッシュ120の中にプリフェッチされる。
任意選択の実施形態では、N個の関数と、N個の関数の第1のグローバル変数とを取得することは、
コンパイラ210によってコンパイルプロセスの中でコンパイル指示情報を受信することと、コンパイル指示情報に従ってN個の関数と、N個の関数の第1のグローバル変数とを取得することとを含み、コンパイル指示情報は、N個の関数と、N個の関数の第1のグローバル変数とを示すために使用され、および/またはコンパイル指示情報は、N個の関数と、N個の関数の中で使用されないグローバル変数とを示すために使用される。
具体的には、N個の関数と、N個の関数の第1のグローバル変数とは、コンパイル指示情報を設定することによって示される。たとえば、コンパイル指示情報は、N個の関数の中にありプログラムの前にある、関数の関数ヘッダの前に準備され得る。コンパイル指示情報は、N個の関数と、N個の関数の第1のグローバル変数とを示す。このようにして、N個の関数と、N個の関数の第1のグローバル変数とは、1つのコンパイル指示情報のみを使用することによって示され得る。具体的には、コンパイル指示情報は、キーワードattribute属性smar_prefetch_varであってよい。
確かに、コンパイル指示情報はまた、N個の関数と、N個の関数の中で使用されないグローバル変数とを示すために使用され得る。このようにして、N個の関数のグローバル変数をパースするとき、コンパイラ210は、N個の関数の中で使用されないグローバル変数をパースせず、それによって、パースすることのためのリソースオーバーヘッドが低減され得る。コンパイル指示情報は、あるいは、N個の関数の中で使用されるグローバル変数と、N個の関数の中で使用されないグローバル変数とを示してもよい。
任意選択で、コンパイル指示情報は、コマンドラインの形式で関数ヘッダの前に挿入され得る。
任意選択で、コンパイル指示情報は、少なくとも1つのグローバル変数を示し得るだけでなく、少なくとも1つのグローバル変数の各々の中に含まれる構造体メンバー変数も示し得る。すなわち、特別な焦点を必要とするグローバル変数が、コンパイル指示情報を使用することによって識別される。コンパイラ210は、コンパイル指示情報によって示される構造体メンバー変数をパースし得る。
たとえば、関数ヘッダの前のコンパイル指示情報をプリフェッチするものとして、以下のプログラムが使用され得る。たとえば、コンパイル指示情報はキーワードであってよく、グローバル変数はキーワードを使用することによって指定される。
_attribute_((smart_prefetch_var("qx_aDLSynUsrLink")))
_attribute_((smart_prefetch_var("q_dMACUserTable")))
Void MUX_RefreshRlcSharePam(UINT32 ulCellId)
任意選択の実施形態では、N個の関数と、N個の関数の第1のグローバル変数とを取得することは、コンパイラ210によってコンパイルプロセスの中でテキストファイルから第1の対応関係および/または第2の対応関係を読み出すことと、第1の対応関係および/または第2の対応関係に従ってN個の関数と、N個の関数の第1のグローバル変数とを取得することとを含み、第1の対応関係は、N個の関数と、N個の関数の第1のグローバル変数とを示すために使用され、および/または第2の対応関係は、N個の関数と、N個の関数の中で使用されないグローバル変数とを示すために使用される。
本出願の本実施形態では、複数の関数と、分析される必要がある複数の関数のグローバル変数とは、リストの形式でテキストファイルの中に記憶され得る。関数と、分析される必要があるグローバル変数または分析される必要がないグローバル変数との間に対応関係があり得る。分析される必要があるN個の関数の第1のグローバル変数は、第1の対応関係を使用することによって表され、分析される必要がないN個の関数の変数は、第2の対応関係を使用することによって表される。N個の関数をパースするとき、コンパイラ210は、第1の対応関係および/または第2の対応関係に従って、N個の関数の第1のグローバル変数を求めてテキストファイルの中のリストを探索する。確かに、コンパイラは、複数の関数のものである、リストの中の開始アドレスと、複数の関数に対応するグローバル変数の開始アドレスとを、予めパースし得る。N個の関数の実行中、予めパースアウトされた開始アドレスは、N個の関数の開始アドレスを得るために探索される。第1のグローバル変数がM個の構造体メンバー変数を含み、M個の構造体メンバー変数のうちの一部のみがN個の関数の中で使用されるとき、一部の構造体メンバー変数とN個の関数との間の対応関係も、テキストファイルの中に記憶され得、それによって、コンパイラ210が対応関係を取得する。このようにして、コンパイラは、N個の関数の中で使用される少なくとも1つの構造体メンバー変数をパースする必要はないが、テキストファイルの中の対応関係に従って、少なくとも1つの構造体メンバー変数を直接探索する。このようにして、集中管理が実施され得、動作複雑性が低減され得る。
具体的には、第1の対応関係は、関数の中で使用されるグローバル変数を含むリストであってよい。たとえば、グローバル変数aは第1の関数の中で使用され、グローバル変数aは第2の関数の中で使用される。第1の関数および第2の関数の中で使用される変数は、リストの形式で記憶される。プリフェッチエンジンは、メモリの中にあり第1の関数および第2の関数の中で使用されるグローバル変数aに関連付けられたデータをCacheの中にプリフェッチする必要があり、たとえば、aは第1のグローバル変数であってよい。コンパイラは、リストを探索することによって、第1の関数、第2の関数、および2つの関数のグローバル変数aを見つける。同様に、第2の対応関係は、関数の中で使用されないグローバル変数を含むリストであってよい。このようにして、集中管理が実施され得、動作複雑性が低減され得る。
任意選択の実施形態では、N個の関数の第1のグローバル変数を取得することは、N個の関数の区画をパースすることであって、区画がホット区画およびコールド区画を含むことと、ホット区画から第1のグローバル変数を取得することとを含む。
具体的には、コンパイラ210は、コンパイル中にN個の関数のコールド区画およびホット区画をパースアウトすることができる。N個の関数のコールド区画をパースアウトするとき、コンパイラ210は、実行されないコールド区画によってアクセスされるグローバル変数情報をスクリーンアウトし得る。このようにして、ホット区画の中のグローバル変数に対応するデータがプリフェッチされ得、コールド区画の中のグローバル変数に対応するデータは、キャッシュ120の中にプリフェッチされることを防止される。したがって、不必要なプリフェッチングが回避され得、プリフェッチング効率が改善され得る。
さらに、ホット区画は、N個の関数の区画が頻繁にアクセスされることを示すために使用され、コールド区画は、N個の関数の区画が比較的少ない回数だけアクセスされることを示すために使用される。たとえば、特定の時間期間において、N個の関数の第1の区画がその間にアクセスされる回数が、予め設定されたしきい値を超えるとき、第1の区画がホット区画であるものと考えられる。特定の時間期間において、N個の関数の第2の区画がその間にアクセスされる回数が、予め設定されたしきい値よりも少ないとき、第2の区画がコールド区画であるものと考えられる。
任意選択の実施形態では、N個の関数の第1のグローバル変数を取得した後、方法300は以下のことをさらに含む。すなわち、コンパイラ210は、コンパイルプロセスの中で以下の動作、すなわち、N個の関数の第2のグローバル変数を取得することと、第1のグローバル変数および第2のグローバル変数のアクセスシーケンスを決定することとを行う。S330は以下のことを含む。すなわち、プリフェッチエンジン230は、メモリ130の中にあり第1のグローバル変数に関連付けられたデータを、アクセスシーケンスに従ってキャッシュ120の中にプリフェッチする。
具体的には、コンパイラ210は、N個の関数の第1のグローバル変数および第2のグローバル変数をパースアウトし得るだけでなく、コンパイル制御情報フローを参照して、プログラム実行プロセスの中での第1のグローバル変数および第2のグローバル変数のシーケンスもパースアウトし得る。プリフェッチエンジン230は、シーケンスに従って、第1のグローバル変数に関連付けられたデータを、キャッシュ120の中にプリフェッチし得る。キャッシュ120の中に最初に記憶されたデータが、CPUによって最初にアクセスされる。たとえば、パースすることを通じて、第1のグローバル変数が第2のグローバル変数の前にあることをコンパイラ210が知ると、プリフェッチエンジン230は、メモリ130の中にあり第1のグローバル変数に対応するデータを最初にプリフェッチする。パースすることを通じて、第2のグローバル変数が第1のグローバル変数の前にあることをコンパイラ210が知ると、プリフェッチエンジン230は、メモリ130の中にあり第2のグローバル変数に対応するデータを最初にプリフェッチし、次いで、第1のグローバル変数に対応するデータをプリフェッチする。このようにして、不必要なデータをキャッシュ120の中に過度に早くプリフェッチすることによって引き起こされる不必要な記憶空間の占有を回避し、その後に実行されるべきデータが過度に早くプリフェッチされデータがCPUによって読み出される前に過度に置換される状況を回避するよう、プリフェッチエンジン230のプリフェッチングシーケンスは、プログラム実行シーケンスである。したがって、キャッシュ120のヒット率がさらに改善され、システム性能が改善される。
任意選択で、第1のグローバル変数がM個の構造体メンバー変数を含み、M個の構造体メンバー変数のうちの少なくとも1つがN個の関数の中で使用されるとき、コンパイラ210は、コンパイル制御情報フローを参照して、少なくとも1つの構造体メンバー変数の各々の実行順位をパースし得る。プリフェッチエンジン230は、メモリ130の中にあり構造体メンバー変数に対応するデータを、各構造体メンバー変数の実行順位に従ってプリフェッチする。
任意選択で、第1のグローバル変数および第2のグローバル変数が、N個の関数の中で呼び出される。第1のグローバル変数がM個の構造体メンバー変数を含み、第2のグローバル変数がQ個の構造体メンバー変数を含む場合、コンパイラ210は、N個の関数の中で使用されるL個の構造体メンバー変数をパースし得、L個の構造体メンバー変数は、M個の構造体メンバー変数のうちのいくつか、およびQ個の構造体メンバー変数のうちのいくつかを含む。このようにして、コンパイラ210は、第1のグローバル変数の開始アドレスに対するL個の構造体メンバー変数の各々のオフセット、または第2のグローバル変数の開始アドレスに対するL個の構造体メンバー変数の各々のオフセットをパースアウトし得る。コンパイラ210はまた、L個の構造体メンバー変数の呼出しシーケンスをパースし、L個の構造体メンバー変数の呼出しシーケンスをテキストファイルまたはバイナリファイル220の中に記憶してもよく、それによって、プリフェッチエンジン230が、L個の構造体メンバー変数に関連付けられたデータをキャッシュ120の中にプリフェッチする。Qは1以上の整数であり、Lは1以上の整数であるとともにM+Q以下である。すなわち、N個の関数の中で使用される少なくとも1つの構造体メンバー変数は、1つのグローバル変数からの、または異なるグローバル変数からのものである。このことは、本出願の本実施形態において限定されない。
任意選択の実施形態では、S330は、テキストファイルもしくはバイナリファイル220の中にあるN個の関数の開始アドレスを読み出すとき、メモリ130の中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータを、プリフェッチエンジン230によってキャッシュ120の中にプリフェッチすること、または
テキストファイルもしくはバイナリファイル220の中にあるN個の関数の開始アドレスが読み出される第1の時間期間の前に、メモリ130の中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをキャッシュ120の中にプリフェッチすること、または
テキストファイルもしくはバイナリファイル220の中にあるN個の関数の開始アドレスが読み出される第2の時間期間の後、メモリ130の中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをキャッシュ120の中にプリフェッチすることを含む。
任意選択の実施形態では、プリフェッチエンジン230はプリフェッチ命令を実行し得る。たとえば、コンパイラ210は、コード生成プロセスの中でプリフェッチングアドレスを決定し、プリフェッチングアドレスをテキストファイルまたはバイナリファイル220に出力し得る。プリフェッチングアドレスを読み出すとき、プリフェッチエンジン230は、メモリ130の中にありプリフェッチングアドレスに対応するデータをプリフェッチする。このようにして、コンパイラ210は、プリフェッチングアドレスをプリフェッチエンジン230に通知し、プリフェッチエンジン230は、メモリ130の中のデータをプリフェッチングアドレスに従って精密にプリフェッチすることができる。コンパイラ210およびプリフェッチエンジン230は並列に実行を行い、データはハードウェアと協働してソフトウェアを使用することによってプリフェッチされる。このようにして、コンパイラ210の実行複雑性が低減され得、データプリフェッチング効率が改善され得、キャッシュ120のヒット率がさらに改善され得る。
任意選択の実施形態では、本出願の本実施形態はマルチコアコンピュータシステムに適用され得る。従来技術におけるデータプリフェッチング方法が使用される場合、ソフトウェア命令は、ユーザが、メモリ130の中の複数のコアの各々に対応するコア番号を、データプリフェッチングプロセスの中で通知する必要があることを示し、次いで、メモリ130の中にありコア番号に対応するデータがプリフェッチされる。本出願の本実施形態では、複数のコンピュータシステムにおいて、各コアはプリフェッチエンジン230を有してよく、各コアのプリフェッチエンジン230はコアのコア番号を取得し得る。すなわち、ユーザはデータプリフェッチングプロセスの中で特定のコア番号を通知する必要がなく、プリフェッチエンジン230がメモリ130の中の対応する場所におけるデータを取得し得る。
本出願の本実施形態で述べられるキャッシュ120が、レベル1キャッシュ、レベル2キャッシュ、レベル3キャッシュなどであってよく、またはレベル1キャッシュ、レベル2キャッシュ、もしくはレベル3キャッシュのうちの少なくとも1つであってよいことを理解されたい。このことは、本出願の本実施形態において限定されない。
任意選択の実施形態では、以下のことは、本出願の本実施形態によるデータプリフェッチング方法を示し、方法は以下のステップを含む。
Step1:コンパイラ210がP個の関数と、P個の関数の各々の少なくとも1つのグローバル変数とを取得する。
任意選択で、P個の関数と、P個の関数の各々の少なくとも1つのグローバル変数とは、コンパイル指示情報を使用することによって取得され得るか、またはP個の関数と、P個の関数の各々の少なくとも1つのグローバル変数とは、P個の関数の各々の少なくとも1つのグローバル変数とP個の関数との間の予め設定された対応関係(たとえば、テキストファイルの中の上記の第1の対応関係および/または第2の対応関係)に従って取得され得る。
Step2:コンパイラ210は、P個の関数の各々をパースして各関数の開始アドレスを取得する。
Step3:コンパイラ210は、各関数の少なくとも1つのグローバル変数の開始アドレスをパースする(少なくとも1つのグローバル変数がグローバル構造体メンバー変数である場合、コンパイラ210は、グローバル変数に対するグローバル構造体メンバー変数のアドレスオフセットをパースする)。
任意選択で、Step2およびStep3のシーケンスは限定されない。Step2がStep3の前にあってよく、またはStep3がStep2の前にあってよい。このことは、本出願の本実施形態において限定されない。
Step4:指定されたN個の関数を分析するとき、コンパイラ210は、N個の関数を求めてP個の関数を探索し、Step2において取得された開始アドレスからN個の関数の開始アドレスを決定する。
確かに、Step1〜Step3は必要とされないことがある。N個の関数を分析するとき、コンパイラは、N個の関数の開始アドレスを直接パースアウトし得る。
Step5:コンパイラ210は、N個の関数の区画をパースし、コールド区画をスクリーンアウトし、ホット区画を保持し、コンパイラ210は、N個の関数の中で使用される第1のグローバル変数および第2のグローバル変数をパースし、ホット区画の中の第1のグローバル変数および第2のグローバル変数をパースする(第1のグローバル変数および第2のグローバル変数がグローバル構造体メンバー変数である場合、コンパイラ210は、N個の関数の中で使用される第1の構造体メンバー変数および第2の構造体メンバー変数をパースする)。
Step6:コンパイラ210は、コンパイル制御フロー情報を参照して、第1のグローバル変数および第2のグローバル変数の呼出しシーケンスを決定する(第1のグローバル変数および第2のグローバル変数がグローバル構造体メンバー変数である場合、コンパイラ210は、第1の構造体メンバー変数および第2の構造体メンバー変数のアクセスシーケンスを決定する)。
Step7:少なくとも1つのグローバル変数のものでありStep3において取得される開始アドレスから、第1のグローバル変数の開始アドレスと、第2のグローバル変数の開始アドレスとを取得する(第1のグローバル変数および第2のグローバル変数がグローバル構造体メンバー変数である場合、グローバル変数に対する第1の構造体メンバー変数のアドレスオフセットと、グローバル変数に対する第2の構造体メンバー変数のアドレスオフセットとが取得されるか、またはメモリ130の中の第1の構造体メンバー変数のCache lineインデックス番号と、メモリ130の中の第2の構造体メンバー変数のCache lineインデックス番号とが取得される)。
確かに、Step1〜Step3は必要とされないことがある。N個の関数を分析するとき、コンパイラは、第1のグローバル変数の開始アドレスと、第2のグローバル変数の開始アドレスとを直接パースすることによって、開始アドレスを取得し得る。
Step8:コンパイラ210は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、第2のグローバル変数の開始アドレスと、第1のグローバル変数および第2のグローバル変数のアクセスシーケンスとを、ファイルまたはバイナリファイルの中に記憶する(第1のグローバル変数が構造体メンバー変数を含む場合、コンパイラ210は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、第1の構造体メンバー変数および第2の構造体メンバー変数の呼出しシーケンスと、グローバル変数に対する第1の構造体メンバー変数のアドレスオフセットと、グローバル変数に対する第2の構造体メンバー変数のアドレスオフセットとを、テキストまたはバイナリファイルの中に記憶する)。
Step9:プリフェッチエンジン230は、メモリ130の中のデータを、テキストまたはバイナリファイルの中に記憶された情報に従ってキャッシュ120の中にプリフェッチする。
このようにして、コンパイラ210は、予め設定されたコンパイル指示情報または対応関係に従って、P個の関数と、P個の関数の各々に対応する少なくとも1つのグローバル変数とを決定し得る。少なくとも1つのグローバル変数がグローバル構造体メンバー変数である場合、各グローバル構造体メンバー変数の構造体メンバー変数が決定される。加えて、コンパイラ210は、P個の関数の各々の開始アドレス、各関数に対応するグローバル変数の開始アドレス、または各構造体メンバー変数のアドレスオフセットをパースして、マッピングテーブルを形成する。特定のN個の関数をパースするとき、コンパイラ210は、最初にN個の関数の区画をパースし、コールド区画をスクリーンアウトし、N個の関数の中で使用されるグローバル変数もしくはグローバル構造体メンバー変数をホット区画の中でパースし、マッチングテーブルの中のN個の関数を整合させてN個の関数の開始アドレスを取得し、N個の関数の中で使用される第1のグローバル変数を整合させて第1のグローバル変数の開始アドレス取得し、またはN個の関数の中で使用される構造体メンバー変数を整合させて構造体メンバー変数のアドレスオフセットを取得する。次いで、コンパイラ210は、N個の関数の中で使用されるグローバル変数のシーケンスをパースアウトするか、またはN個の関数の中で使用される構造体メンバー変数のシーケンスをパースアウトする。コンパイラ210は、開始アドレス情報およびシーケンス情報をテキストまたはバイナリファイルの中に記憶し、それによって、プリフェッチエンジン230がデータをキャッシュ120の中にプリフェッチする。
本出願の実施形態において提供されるデータプリフェッチング方法が、図3を参照して説明されている。本出願の実施形態において提供されるデータプリフェッチング装置およびシステムが、図4〜図6を参照して以下で説明される。
図4は、本出願の一実施形態によるデータプリフェッチング装置400を示す。たとえば、装置400はコンパイラ210であってよい。コンピュータシステムは、装置400、プリフェッチエンジン230、およびメモリ130を含む。装置400は、
N個の関数と、N個の関数の第1のグローバル変数とを取得するよう構成された取得モジュール410であって、Nは1以上の整数である、取得モジュール410と、
N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを決定するよう構成された決定モジュール420であって、それによって、プリフェッチエンジンが、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュ120の中にプリフェッチできる、決定モジュール420とを含む。
任意選択の実施形態では、第1のグローバル変数はM個の構造体メンバー変数を含み、Mは1以上である。
任意選択の実施形態では、決定モジュール420は、N個の関数の中で使用される少なくとも1つの構造体メンバー変数をパースすることであって、M個の構造体メンバー変数が少なくとも1つの構造体メンバー変数を含むことと、第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットを決定することであって、それによって、プリフェッチエンジン230が、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、少なくとも1つの構造体メンバー変数の各々のアドレスオフセットとに従って、メモリ130の中にあり少なくとも1つの構造体メンバー変数に関連付けられたデータを、キャッシュ120の中にプリフェッチできることと、を行うよう、特に構成される。
任意選択の実施形態では、決定モジュール420は、N個の関数の中で使用される少なくとも1つの構造体メンバー変数をパースすることであって、M個の構造体メンバー変数が少なくとも1つの構造体メンバー変数を含むことと、第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットを決定することと、少なくとも1つの構造体メンバー変数の各々のアドレスオフセットに従って、メモリ130の中の少なくとも1つの構造体メンバー変数の各々のCache lineインデックス番号を決定することであって、それによって、プリフェッチエンジン230が、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、メモリ130の中の各構造体メンバー変数のCache lineインデックス番号とに従って、メモリ130の中にあり少なくとも1つの構造体メンバー変数に関連付けられたデータを、キャッシュ120の中にプリフェッチできることとを行うよう、さらに特に構成される。
任意選択の実施形態では、装置400は、第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットが決定される前に、第1のグローバル変数の開始アドレスに対するM個の構造体メンバー変数の各々のアドレスオフセットを取得するために、M個の構造体メンバー変数をパースするよう構成されたパースモジュールをさらに含む。決定モジュール420は、第1のグローバル変数の開始アドレスに対する少なくとも1つの構造体メンバー変数の各々のアドレスオフセットを、第1のグローバル変数の開始アドレスに対するM個の構造体メンバー変数の各々のアドレスオフセットから決定するよう、さらに特に構成される。
任意選択の実施形態では、取得モジュール410は、N個の関数と、N個の関数の第1のグローバル変数とを取得する前に、P個の関数と、P個の関数の各々の少なくとも1つのグローバル変数とを取得し、P個の関数はN個の関数を含み、Pは1以上であり、PはN以上であるよう、さらに構成される。パースモジュールは、P個の関数の各々の開始アドレスをパースし、P個の関数の各々の少なくとも1つのグローバル変数の各々の開始アドレスをパースするようにさらに構成される。取得モジュール410は、P個の関数からN個の関数を決定し、N個の関数の少なくとも1つのグローバル変数から第1のグローバル変数を決定するよう、特に構成される。決定モジュール420は、P個の関数の各々の開始アドレスからN個の関数の開始アドレスを決定し、各グローバル変数の開始アドレスから第1のグローバル変数の開始アドレスを決定するよう、さらに特に構成される。
任意選択の実施形態では、取得モジュール410は、装置400のコンパイルプロセスの中で、コンパイル指示情報を受信し、コンパイル指示情報に従ってN個の関数と、N個の関数の第1のグローバル変数とを取得し、コンパイル指示情報は、N個の関数と、N個の関数の第1のグローバル変数とを示すために使用され、および/またはコンパイル指示情報は、N個の関数と、N個の関数の中で使用されないグローバル変数とを示すために使用されるよう、特に構成される。
任意選択の実施形態では、取得モジュール410は、装置400のコンパイルプロセスの中で、テキストファイルから第1の対応関係および/または第2の対応関係を読み出し、第1の対応関係および/または第2の対応関係に従ってN個の関数と、N個の関数の第1のグローバル変数とを取得し、第1の対応関係は、N個の関数と、N個の関数の第1のグローバル変数を示すために使用され、および/または第2の対応関係は、N個の関数と、N個の関数の中で使用されないグローバル変数を示すために使用されるよう、さらに特に構成される。
任意選択の実施形態では、装置400は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとが決定された後、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスをテキストファイルまたはバイナリファイル220に出力し、それによって、プリフェッチエンジン230が、テキストファイルまたはバイナリファイルの中にあるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを読み出し、読み出されるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリ130の中にあり第1のグローバル変数に関連付けられたデータを、キャッシュ120の中にプリフェッチするよう構成された出力モジュールをさらに含む。
任意選択の実施形態では、取得モジュール410は、N個の関数の区画をパースすることであって、区画はホット区画およびコールド区画を含むことと、ホット区画から第1のグローバル変数を取得することとを行うよう、特に構成される。
任意選択の実施形態では、取得モジュール410は、N個の関数の第2のグローバル変数を取得するようにさらに構成される。決定モジュール420は、第1のグローバル変数および第2のグローバル変数のアクセスシーケンスを決定し、それによって、プリフェッチエンジン230が、アクセスシーケンスに従って、メモリ130の中にあり第1のグローバル変数に関連付けられたデータを、キャッシュ120の中にプリフェッチできるよう、さらに構成される。
任意選択の実施形態では、取得モジュール410は、N個の関数の第3のグローバル変数を取得するようにさらに構成される。決定モジュール420は、メモリ130の中の第1のグローバル変数のCache lineインデックス番号と、メモリ130の中の第3のグローバル変数のCache lineインデックス番号とを決定し、それによって、プリフェッチエンジン230が、Cache lineインデックス番号に従って、メモリ130の中にあり第1のグローバル変数に関連付けられたデータを、キャッシュ120の中にプリフェッチできるよう、さらに構成される。
任意選択の実施形態では、N個の関数はホットスポット関数であり、第1のグローバル変数はホットスポットグローバル変数である。
本明細書における装置400は、機能モジュールの形で実装されることを理解されたい。本明細書における「モジュール」という用語は、1つ以上のソフトウェアもしくはファームウェアプログラムを実行するよう構成されたASIC、電子回路、プロセッサ(たとえば、共有プロセッサ、専用プロセッサ、またはグループプロセッサ)、ストレージ、または組合せ論理回路、および/あるいは説明された機能をサポートする他の適切な構成要素であってよい。任意選択の一例では、装置400は特に上記の実施形態におけるコンパイラ210であってよく、装置400は上記の方法実施形態におけるコンパイラ210に対応するプロシージャおよび/またはステップを実行するよう構成され得ることを、当業者は理解し得る。繰返しを避けるために、詳細は本明細書で再び説明しない。
図5は、本出願の一実施形態によるデータプリフェッチング装置500を示す。たとえば、装置500はプリフェッチエンジン230であってよい。装置500は、
N個の関数の開始アドレスと、N個の関数の第1のグローバル変数の開始アドレスとを取得するよう構成された取得モジュール510であって、Nは1以上の整数である、取得モジュール510と、
N個の関数の開始アドレスと、N個の関数の第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチするよう構成されたプリフェッチングモジュール520とを含む。
任意選択の実施形態では、取得モジュール510は、コンパイラによってテキストファイルまたはバイナリファイルの中に入力されるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを読み出すよう特に構成される。プリフェッチングモジュール520は、読み出されるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチするよう特に構成される。
任意選択の実施形態では、プリフェッチングモジュール510は、テキストファイルもしくはバイナリファイルの中にあるN個の関数の開始アドレスが読み出されるとき、メモリの中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをキャッシュの中にプリフェッチするか、またはテキストファイルもしくはバイナリファイルの中にあるN個の関数の開始アドレスが読み出される第1の時間期間の前に、メモリの中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをキャッシュの中にプリフェッチするか、またはテキストファイルもしくはバイナリファイルの中にあるN個の関数の開始アドレスが読み出される第2の時間期間の後、メモリの中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをキャッシュの中にプリフェッチするようさらに特に構成される。
図6は、本出願の一実施形態によるデータプリフェッチングシステム600を示す。システム600は、装置400および装置500を含む。装置500は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリ130の中にあり第1のグローバル変数に関連付けられたデータを、キャッシュ120の中にプリフェッチするよう構成される。
任意選択の実施形態では、装置500は、テキストファイルもしくはバイナリファイル220の中にあるN個の関数の開始アドレスが読み出されるとき、メモリ130の中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをキャッシュ120の中にプリフェッチするか、または
テキストファイルもしくはバイナリファイル220の中にあるN個の関数の開始アドレスが読み出される第1の時間期間の前に、メモリ130の中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをキャッシュ120の中にプリフェッチするか、または
テキストファイルもしくはバイナリファイル220の中にあるN個の関数の開始アドレスが読み出される第2の時間期間の後、メモリ130の中にあり第1のグローバル変数の開始アドレスにおいて第1のグローバル変数に関連付けられたデータをキャッシュ120の中にプリフェッチするよう特に構成される。
したがって、装置400は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを決定し、装置400は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとをテキストファイルまたはバイナリファイル220に出力する。装置500は、テキストファイルまたはバイナリファイル220の中にあるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを読み出す。装置400および装置500は、N個の関数の開始アドレスに従ってデータプリフェッチング時間を決定するために互いに協調し得る。たとえば、データは、装置500がN個の関数の開始アドレスを読み出す前の第1の時間期間において、または装置500がN個の関数の開始アドレスを読み出すとき、または装置500がN個の関数の開始アドレスを読み出した後の第2の時間期間において、プリフェッチされる。たとえば、第1の時間期間は3つのcycleであり、第2の時間期間は4つのcycleである。N個の関数の開始アドレスの前の3つのcycleの中でデータがプリフェッチされるという事象は、第1の識別情報を使用することによって識別され、N個の関数の開始アドレスの後の4つのcycleの中でデータがプリフェッチされるという事象は、第2の識別情報を使用することによって識別され、N個の関数の開始アドレスが読み出されるときにデータがプリフェッチされるという事象は、第3の識別情報を使用することによって識別される。3つの識別情報のうちの1つは、テキストファイルまたはバイナリファイル220の中に記憶される。装置500は、識別情報に従ってデータプリフェッチング時間を決定し、それによって、データプリフェッチング・フレキシビリティがさらに改善され得る。
任意選択の実施形態では、装置500は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、少なくとも1つの構造体メンバー変数の各々のアドレスオフセットとに従って、メモリ130の中にあり少なくとも1つの構造体メンバー変数に関連付けられたデータを、キャッシュ120の中にプリフェッチするよう、さらに特に構成される。
任意選択の実施形態では、装置500は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、メモリ130の中の各構造体メンバー変数のCache lineインデックス番号とに従って、メモリ130の中のデータをプリフェッチするよう、さらに特に構成される。
任意選択の実施形態では、装置500は、テキストファイルまたはバイナリファイルの中にあるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを読み出し、読み出されるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリ130の中にあり第1のグローバル変数に関連付けられたデータを、キャッシュ120の中にプリフェッチするよう、さらに特に構成される。
任意選択の実施形態では、装置500は、アクセスシーケンス番号に従って、メモリ130の中にあり、より高いアクセス順位の高いグローバル変数に関連付けられたデータを、キャッシュ120の中にプリフェッチするよう、さらに特に構成される。
装置400はまた、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、メモリ130の中にありN個の関数の中で使用される複数のグローバル変数に対応するデータのものであるCache lineインデックス番号とを、バイナリファイルまたはテキストファイルに出力し得る。装置500は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、メモリ130の中のグローバル変数のCache lineインデックス番号とに従って、メモリ130の中にあり複数のグローバル変数に関連付けられたデータを、キャッシュ120の中にプリフェッチする。装置400は、あるいは、複数のグローバル変数のアクセスシーケンスをパースしてよく、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、複数のグローバル変数のアクセスシーケンスとについての情報を、テキストファイルまたはバイナリファイル220に出力する。装置500は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、複数のグローバル変数のアクセスシーケンスとに従って、メモリの中のデータを、キャッシュ120の中にプリフェッチする。
第1のグローバル変数が構造体メンバー変数であるとき、装置400は、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、N個の関数の中で使用される構造体メンバー変数のアドレスオフセットとを、テキストファイルまたはバイナリファイル220に出力し得、プリフェッチエンジン230は、テキストファイルまたはバイナリファイル220の中のN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、構造体メンバー変数のアドレスオフセットとに従って、メモリ130の中のデータを、キャッシュ120の中にプリフェッチする。装置400は、あるいは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、メモリ130の中にありN個の関数の中で使用される構造体メンバー変数のものであるCache lineインデックス番号とを、テキストファイルまたはバイナリファイル220に出力してもよい。装置500は、テキストファイルまたはバイナリファイル220の中のN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスと、Cache lineインデックス番号とに従ってメモリ130の中のデータを、キャッシュ120の中にプリフェッチする。装置400は、あるいは、複数の構造体メンバー変数のアクセスシーケンスをパースしてよく、複数の構造体メンバー変数のアクセスシーケンスと、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとについての情報を、テキストファイルまたはバイナリファイル220に出力してよい。プリフェッチエンジン230は、複数の構造体メンバー変数のアクセスシーケンスと、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリ130の中にあり複数の構造体メンバー変数に関連付けられたデータを、キャッシュ120の中にプリフェッチする。
テキストファイルまたはバイナリファイル220はまた、複数のグローバル変数のアクセスシーケンスと、複数の構造体メンバー変数のアクセスシーケンスと、複数のグローバル変数のCache lineインデックス番号と、複数の構造体メンバー変数のCache lineインデックス番号と、複数の構造体メンバー変数のアドレスオフセットのうちの少なくとも1つと、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとについての情報を記憶し得ることを理解されたい。装置500は、情報に従って、メモリ130の中のデータをキャッシュ120の中にプリフェッチする。あるいは、テキストファイルまたはバイナリファイル220は、関数と開始アドレスとの間の対応関係を記憶してもよい。たとえば、1つの開始アドレスが1つの関数の中で使用されるか、または1つの開始アドレスが複数の関数の中で使用される。このことは、本出願の本実施形態において限定されない。
図7は、本出願の一実施形態によるデータプリフェッチング装置700を示す。たとえば、装置700はコンピュータであってよい。コンピュータは、上記の実施形態におけるコンパイラの機能を実施するよう構成され得る。
具体的には、装置700は、プロセッサ710およびストレージ720を含む。任意選択で、装置700は、通信インターフェース730をさらに含む。プロセッサ710、ストレージ720、および通信インターフェース730は、バス740を使用することによって接続される。ストレージ720は、メモリ130、外部ストレージなどを含む。1つ以上のプロセッサ710があってよく、各プロセッサ710は1つ以上のプロセッサコアを含む。
バス接続方式は一例にすぎず、プロセッサおよびストレージなどのデバイスはまた、他の接続方式で接続されてもよい。たとえば、プロセッサが中心であり、ストレージなどの他のデバイスがプロセッサに接続される。
ストレージ720は、コンピュータ実行可能命令を記憶するよう構成され、プロセッサ710は、コンピュータ可読命令を読み出し、本出願の上記の実施形態において提供された方法を実施するよう構成される。具体的には、プロセッサ710は、N個の関数と、N個の関数の第1のグローバル変数とを取得することであって、Nは1以上の整数であることと、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを決定し、それによって、プリフェッチエンジンが、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチしうることとを行うよう構成される。Nは1以上の整数である。本明細書におけるキャッシュは、プロセッサ710と統合されてよく、または独立して配設されてもよいことに留意されたい。
より具体的な方法実装態様については、上記の方法実施形態を参照されたい。詳細は本明細書で再び説明しない。プリフェッチエンジンの特定のデータプリフェッチング方法は本出願の本実施形態において限定されないことに留意されたい。
図8は、本出願の一実施形態によるデータプリフェッチング装置800を示す。装置800はコンピュータであってよい。装置800は、少なくとも1つのプロセッサ810、ストレージ820、およびプリフェッチエンジン230を含む。任意選択で、装置800は、通信インターフェース830をさらに含む。少なくとも1つのプロセッサ810、ストレージ820、プリフェッチエンジン230、および通信インターフェース830は、バス840を使用することによって接続される。
バス接続方式は一例にすぎず、プロセッサおよびストレージなどのデバイスはまた、他の接続方式で接続されてもよい。たとえば、プロセッサが中心であり、ストレージなどの他のデバイスはプロセッサに接続される。
ストレージ820は、コンピュータ実行可能命令、たとえば、上記の実施形態におけるコンパイラを記憶するよう構成される。プロセッサ810は、ストレージ820の中に記憶されたコンピュータ実行可能命令を読み出して、N個の関数の開始アドレスと、N個の関数の第1のグローバル変数の開始アドレスとを決定し、次いで、N個の関数の開始アドレスと、N個の関数の第1のグローバル変数の開始アドレスとを取得するよう、プリフェッチエンジン230に命令する。プリフェッチエンジン230は、関数の開始アドレスと、N個の関数の第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチする。Nは1以上の整数である。
プリフェッチエンジン230のより具体的な実装態様については、上記の方法実施形態を参照されたい。詳細は本明細書で再び説明しない。N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを、コンパイラまたは他のプログラムもしくはハードウェアモジュールによって取得する方法は、本出願の本実施形態において限定されないことに留意されたい。
図9は、本出願の一実施形態によるデータプリフェッチングコンピュータシステム900を示す。システム900は、プロセッサ910、外部ストレージ920、プリフェッチエンジン940、キャッシュ950、メモリ960、およびバス930を含む。たとえば、プロセッサ910、プリフェッチエンジン940、外部ストレージ920、キャッシュ950、およびメモリ960は、バス930を使用することによって接続される。外部ストレージ920は、コンパイラのソフトウェアプログラムを記憶する。プロセッサ910は、上記の実施形態で上述したコンパイラによって実施される方法を実施するために、ソフトウェアプログラムをメモリ960の中に読み出す。
具体的には、コンパイラは、N個の関数と、N個の関数の第1のグローバル変数とを取得し、Nは1以上の整数である。コンパイラは、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを決定する。プリフェッチエンジンは、コンパイラによって決定されるN個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとを取得し、N個の関数の開始アドレスと、第1のグローバル変数の開始アドレスとに従って、メモリの中にあり第1のグローバル変数に関連付けられたデータを、キャッシュの中にプリフェッチする。コンパイラがソフトウェアとして実装されるとき、コンパイラによって行われるアクションが実際にはプロセッサ910によって行われることを、当業者は理解するはずである。
バス接続方式は一例にすぎず、プロセッサおよびストレージなどのデバイスはまた、他の接続方式で接続されてもよい。たとえば、プロセッサが中心であり、ストレージなどの他のデバイスはプロセッサに接続される。
いくつかの他の実装態様では、外部ストレージ920およびメモリ960はストレージと総称されることがあり、ストレージはまたキャッシュ950を含んでよい。図9に示す方式に加えて、キャッシュ950はまた、プロセッサ910の中に統合されてもよい。
他の特定の実装態様について、上記の実施形態を参照されたい。詳細は本明細書で再び説明しない。
したがって、本出願の本実施形態では、コンパイラは、関数のプリフェッチング情報を分析し、プリフェッチエンジンは、プリフェッチング情報に従って、メモリの中のデータをプリフェッチする。データプリフェッチング効率をさらに改善するように、コンパイラおよびプリフェッチエンジンは並列に実行を行い得る。加えて、データプリフェッチング時間は、コンパイラ210によってパースアウトされるプリフェッチング情報である。このようにして、プリフェッチング時間は従来技術におけるソフトウェアプリフェッチ命令に依存せず、プリフェッチング・フレキシビリティが改善される。
本明細書における「および/または」という用語は、関連付けられた対象物を表すための関連付け関係のみを表し、3つの関係が存在し得ることを表すことを理解されたい。たとえば、Aおよび/またはBとは、以下の3つの場合、すなわち、Aのみが存在すること、AとBの両方が存在すること、およびBのみが存在することを表し得る。加えて、本明細書における「/」という文字は、概して、関連付けられた対象物間の「または」関係を示す。
本明細書で開示する実施形態において上述した例と組み合わせて、方法ステップおよびユニットが電子ハードウェア、コンピュータソフトウェア、またはそれらの組合せによって実施され得ることに、当業者は気づき得る。ハードウェアとソフトウェアとの間の互換性を明確に表すために、上記のことは、概して、機能に従って各実施形態のステップおよび組成物を説明している。機能がハードウェアによって行われるのかまたはソフトウェアによって行われるのかは、特定の適用例および技術的解決策の設計制約条件に依存する。当業者は、様々な方法を使用して、特定の適用例ごとに上述の機能を実施し得るが、実装態様が本出願の範囲を越えるものと考えられるべきでない。
便利かつ簡潔な説明の目的のために、上記のシステム、装置、およびユニットの詳細な作業プロセスに関して、上記の方法実施形態における対応するプロセスを参照すべきであることが当業者によって明確に理解されてよく、詳細は本明細書で再び説明しない。
本出願において提供されるいくつかの実施形態では、開示するシステム、装置、および方法は他の方式で実施され得ることを理解されたい。たとえば、上述の装置実施形態は一例にすぎない。たとえば、ユニット分割は論理的な機能分割にすぎず、実際の実装態様では他の分割であってよい。たとえば、複数のユニットまたは構成要素は組み合わせられてよく、もしくは他のシステムの中に統合されてよく、またはいくつかの特徴は無視されてよく、もしくは行われなくてよい。加えて、表示されまたは検討された相互結合もしくは直接結合または通信接続は、装置もしくはユニットの間のいくつかのインターフェース、間接結合、もしくは通信接続、または電気的接続、機械的接続、あるいは他の形での接続を通じて実施されてよい。
別個の部分として上述したユニットは、物理的に別個であってもなくてもよく、ユニットとして表示した部分は、物理ユニットであってもなくてもよく、1つの位置に配置されてよく、または複数のネットワークユニット上に分散されてもよい。ユニットの一部または全部は、本出願における実施形態の解決策の目的を達成するための実際の要件に従って選択され得る。
加えて、本出願の実施形態における機能ユニットは1つの処理ユニットの中に統合されてよく、もしくはユニットの各々は物理的に単独で存在してよく、または2つ以上のユニットが1つのユニットの中に統合される。統合されたユニットは、ハードウェアの形で実装されてよく、またはソフトウェア機能ユニットの形で実装されてもよい。
統合されたユニットがソフトウェア機能ユニットの形で実装され、独立した製品として販売または使用されるとき、統合されたユニットは、コンピュータ可読記憶媒体の中に記憶され得る。そのような理解に基づくと、本出願の技術的解決策は本質的に、あるいは従来技術に寄与する部分、または技術的解決策の全部もしくは一部は、ソフトウェア製品の形で実装され得る。ソフトウェア製品は、記憶媒体の中に記憶され、本出願の実施形態で上述した方法のステップの全部または一部を行うように、(パーソナルコンピュータ、サーバ、またはネットワークデバイスであってよい)コンピュータデバイスに命令するためのいくつかの命令を含む。上記の記憶媒体は、USBフラッシュドライブ、リムーバブルハードディスク、読取り専用メモリ(ROM)、ランダムアクセスメモリ(RAM)、磁気ディスク、または光ディスクなどの、プログラムコードを記憶できる任意の媒体を含む。
上記の説明は、本出願の特定の実施形態にすぎず、本出願の保護範囲を限定することを意図しない。本出願で開示する技術範囲内の当業者によって容易に見つけ出されるいかなる修正または置換も、本出願の保護範囲内に入るものとする。したがって、本出願の保護範囲は、特許請求の範囲の保護範囲に従うものとする。