JP2012247827A - プログラム生成装置、プログラム生成方法及びプログラム - Google Patents
プログラム生成装置、プログラム生成方法及びプログラム Download PDFInfo
- Publication number
- JP2012247827A JP2012247827A JP2011116755A JP2011116755A JP2012247827A JP 2012247827 A JP2012247827 A JP 2012247827A JP 2011116755 A JP2011116755 A JP 2011116755A JP 2011116755 A JP2011116755 A JP 2011116755A JP 2012247827 A JP2012247827 A JP 2012247827A
- Authority
- JP
- Japan
- Prior art keywords
- memory
- program
- data
- address
- access
- 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.)
- Withdrawn
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
- Memory System (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
【課題】コンパイル及びリンクによりプログラムを生成する際に、複数のメモリにおけるアクセス速度の違いを考慮した最適化を実現するプログラム生成装置、プログラム生成方法及びプログラムを提供する。
【解決手段】アクセス速度の異なる複数のメモリを有するコンピュータで動作されるプログラムを生成するプログラム生成装置であって、1回目のコンパイル及びリンクによりプログラムを生成し、そのプログラムをコンピュータ上で動作させた際のメモリに対するアクセスの監視結果と、複数のメモリのアクセス速度を示す情報とに基づいて、頻繁にアクセスされるデータを優先的にアクセス速度が速い方のメモリに配置するようにして、2回目のコンパイル及びリンクによりプログラムを生成することを特徴とする。
【選択図】図1
【解決手段】アクセス速度の異なる複数のメモリを有するコンピュータで動作されるプログラムを生成するプログラム生成装置であって、1回目のコンパイル及びリンクによりプログラムを生成し、そのプログラムをコンピュータ上で動作させた際のメモリに対するアクセスの監視結果と、複数のメモリのアクセス速度を示す情報とに基づいて、頻繁にアクセスされるデータを優先的にアクセス速度が速い方のメモリに配置するようにして、2回目のコンパイル及びリンクによりプログラムを生成することを特徴とする。
【選択図】図1
Description
本発明は、コンパイル、リンクを行ってプログラムを生成するプログラム生成装置、プログラム生成方法及びプログラムに関する。
所定のプログラムを生成する際に、ソースコードからオブジェクトファイルを生成するコンパイル、オブジェクトファイルから実行可能ファイルを生成するリンクを行うプログラム生成装置(例えば情報処理装置、コンピュータ)が知られている。プログラム生成装置では、コンパイラと呼ばれるソフトウェアによりコンパイルが実行され、リンカと呼ばれるソフトウェアによりリンクが実行される。
このようなプログラム生成装置において、プログラムのコンパイル、リンクが行われるときに、そのプログラムのパフォーマンスに関する最適化が行われるようにすることは難しい。なぜならば、プログラムを実際にコンピュータ上で動作させてみないことには、どのような最適化を行えばよいかの情報が得られないからである。
そこで、プログラム生成装置においてコンパイラ及びリンカが、コンパイル及びリンクを行って一旦プログラムを生成し、そのプログラムをコンピュータ(プログラム生成装置自身又は他の情報処理装置)上で実際に動作させることで得られたデータ(プロファイルデータという)を取得し、そのプロファイルデータに基づいて望ましい最適化を行いつつコンパイル及びリンクを行ってプログラムを生成する技術が知られている。
このような技術は、例えば特許文献1に開示されている。特許文献1には、一旦プログラムを生成し、そのプログラムについてベンチマーク試験を行ってパフォーマンスを測定し、その測定結果を用いて再度プログラムを生成することにより、プログラムの最適化を実現する構成が開示されている。
しかしながら、上述した「プロファイルデータに基づいて望ましい最適化を行いつつコンパイル及びリンクを行ってプログラムを生成する技術」では、最適化の範囲が限定されており、メモリアクセス(メモリに対するアクセス)に関する最適化は行われていなかった。
例えば、マルチコアシステムの一形態であるNUMAにおいては、アクセス速度が速いローカルメモリと、アクセス速度が遅いリモートメモリとが存在するが、このアクセス速度の違いを考慮して最適化を行うコンパイラ及びリンカは存在しない。また、キャッシュメモリを有するシステムにおいても、キャッシュメモリとメインメモリとではアクセス速度の違いがあるが、このアクセス速度の違いを考慮して最適化を行うコンパイラ及びリンカは存在しない。
このように従来では、コンパイル及びリンクにおいて動的なプロファイルデータを用いた最適化が行われる際に、複数のメモリにおけるアクセス速度の違いを考慮した最適化が行われていなかった。
本発明は、上記事情に鑑みてなされたものであり、コンパイル及びリンクによりプログラムを生成する際に、複数のメモリにおけるアクセス速度の違いを考慮した最適化を実現するプログラム生成装置、プログラム生成方法及びプログラムを提供することを目的とする。
かかる目的を達成するために、本発明の第1の態様は、アクセス速度の異なる複数のメモリを有するコンピュータで動作されるプログラムを生成するプログラム生成装置であって、1回目のコンパイル及びリンクによりプログラムを生成し、そのプログラムをコンピュータ上で動作させた際のメモリに対するアクセスの監視結果と、複数のメモリのアクセス速度を示す情報とに基づいて、頻繁にアクセスされるデータを優先的にアクセス速度が速い方のメモリに配置するようにして、2回目のコンパイル及びリンクによりプログラムを生成することを特徴とする。
本発明の第2の態様は、アクセス速度の異なる複数のメモリを有するコンピュータで動作されるプログラムを生成するプログラム生成方法であって、1回目のコンパイル及びリンクによりプログラムを生成し、プログラムをコンピュータ上で動作させた際のメモリに対するアクセスの監視結果と、複数のメモリのアクセス速度を示す情報とに基づいて、頻繁にアクセスされるデータを優先的にアクセス速度が速い方のメモリに配置するようにして、2回目のコンパイル及びリンクによりプログラムを生成することを特徴とする。
本発明の第3の態様は、アクセス速度の異なる複数のメモリを有するコンピュータで動作されるプログラムを生成するプログラムであって、1回目のコンパイル及びリンクによりプログラムを生成する処理と、プログラムをコンピュータ上で動作させた際のメモリに対するアクセスの監視結果と、複数のメモリのアクセス速度を示す情報とに基づいて、頻繁にアクセスされるデータを優先的にアクセス速度が速い方のメモリに配置するようにして、2回目のコンパイル及びリンクによりプログラムを生成する処理と、をコンピュータに実行させることを特徴とする。
本発明によれば、コンパイル及びリンクによりプログラムを生成する際に、複数のメモリにおけるアクセス速度の違いを考慮した最適化を実現することによって、生成されるプログラムの更なるパフォーマンス向上を実現できる。
以下、本発明を実施するための形態(実施形態)について添付図面を参照して詳細に説明する。なお、以下に記載する各実施形態の説明はあくまで一例であり、本発明を限定するものではない。
〔第1の実施形態〕
図1は、本実施形態のプログラム生成装置におけるメモリアクセスの最適化の一例の概要について説明する図である。本実施形態のプログラム生成装置は、例えばPC(Personal Computer)などの、コンパイラ及びリンカが動作する情報処理装置、コンピュータである。なお、以下の説明では、コンパイラ及びリンカをまとめて「コンパイラ・リンカ」と表記し、別体として扱うときはそれぞれ「コンパイラ」、「リンカ」と表記する(コンパイル及びリンクについても同様)。
図1は、本実施形態のプログラム生成装置におけるメモリアクセスの最適化の一例の概要について説明する図である。本実施形態のプログラム生成装置は、例えばPC(Personal Computer)などの、コンパイラ及びリンカが動作する情報処理装置、コンピュータである。なお、以下の説明では、コンパイラ及びリンカをまとめて「コンパイラ・リンカ」と表記し、別体として扱うときはそれぞれ「コンパイラ」、「リンカ」と表記する(コンパイル及びリンクについても同様)。
図1に示すように、本実施形態のプログラム生成装置(例えば開発用PC)において、コンパイラ・リンカは、ソースコードを入力として受け取り、通常のコンパイル・リンク(1回目のコンパイル・リンク)を行い、一旦プログラムを生成する。
上記生成されたプログラムは、動作コンピュータ(例えば組み込み用ボード)上で動作させられる。このとき、動作コンピュータでは、その動作の際のメモリアクセスについてのプロファイルデータが得られる。プロファイルデータの詳細は後述する。なお、動作コンピュータは、必ずしもプログラム生成装置と別体である必要はなく、プログラム生成装置と同一であってもよい。
コンパイラ・リンカは、動作コンピュータからプロファイルデータを取得する。
また、コンパイラ・リンカは、これから最適化を行って生成するプログラムが実行される情報処理装置に備えられる複数のメモリについてのメモリデバイス情報を取得する。メモリデバイス情報の詳細は後述する。
そして、コンパイラ・リンカは、プロファイルデータ、メモリデバイス情報、ソースコードを入力として受け取り、メモリアクセスが最適に行われるように、再度プログラムの生成を行う。つまり、2回目のコンパイル・リンクが行われる。この際、頻繁にアクセスされるデータはアクセス速度が速いメモリに配置されるように決定され、そうでないデータはアクセス速度が速くないメモリに配置されるように決定される。このように本実施形態では、2回目のコンパイル・リンクのときにデータの再配置が実行されることで、メモリアクセスの最適化が実現される。
上述した本実施形態のプログラム生成装置の概要を整理すると、図2に示すフローチャートの流れとなる。
まず、プログラム生成装置において、1回目のコンパイル・リンクが行われる。すなわち、コンパイラ・リンカは、ソースコードを入力として受け取り、通常のコンパイル・リンクを行ってプログラムを生成する(ステップ1)。このとき、メモリアクセスの最適化は行われない。すなわちリンカは、メモリアクセスの対象となるデータを適当なアドレスに配置する。なお、ここでいう「配置する」とは、「未確定であったアドレスを確定する」という意味である。よって、「リンカがデータを所定のアドレス(メモリ)に配置する」ということは、「リンクの実行時に、プログラムが実行された際にデータが所定のアドレス(メモリ)に配置されるように決定する」という意味である。この意味は以下の説明においても同様とする。
次に、動作コンピュータにおいて、1回目のコンパイル・リンクにより生成されたプログラムを動作させ、動作コンピュータ上のメモリプロファイラを使用して実行中のプログラムのメモリアクセスを逐一監視し、ストレージデバイス上のファイルにアクセス記録をログする(ステップ2)。このログが、プロファイルデータとなる。動作コンピュータにおいてプログラムを十分な時間動作させたら、ログを終了させる。
次に、プログラム生成装置において、2回目のコンパイル・リンクが行われる。まず、コンパイラ・リンカは、ソースコード、プロファイルデータ及びメモリデバイス情報を入力として受け取る(ステップ3−1)。
次に、コンパイラは、ソースコードから、通常のコンパイルを行って、プログラムを生成する(ステップ3−2)。もしも、ステップ1でプログラムを生成した際のオブジェクトファイルがプログラム生成装置上に残っている場合、このステップは省略して構わない。
リンカは、ステップ3−2(又はステップ1)で生成したオブジェクトファイルをベースに最適化を行う。プロファイルデータには、プログラムの動作時にアクセスされたメモリのアドレスとその頻度が含まれている。また、メモリデバイス情報には、動作コンピュータ上に搭載されているメモリデバイス毎に、アドレス範囲、読み出し(READ)時のアクセス速度及び書き込み(WRITE)時のアクセス速度が含まれている。リンカは、これらのプロファイルデータ及びメモリデバイス情報に基づいて、ベースとなるオブジェクトファイル上のデータについて再配置を行う(ステップ3−3)。このとき、頻繁にアクセスされるデータはアクセス速度が速いメモリに配置されるように決定され、そうでないデータはアクセス速度が速くないメモリに配置されるように決定される。このようにして決定された再配置情報に基づき、リンカは、オブジェクトファイルを結合して、プログラムを生成する。
なお、通常、アクセス速度が速いメモリは総容量が少ないケースが多いため、全てのデータをアクセス速度が速いメモリ上に配置できるとは限らない。その場合は、アクセス頻度の高いデータから優先的にアクセス速度が速いメモリ上に配置されていくように決定される。
ここで、上記図2のステップ2の具体例について図3を用いて説明する。図3は、動作コンピュータ上でプログラムのメモリアクセスを監視する仕組みについて説明する図である。
図3に示すように、動作コンピュータには、ハードウェアとして、CPU(Central Processing Unit)、メモリ1(第1メモリの一例)、メモリ2(第2メモリの一例)、ストレージデバイスが備えられており、ソフトウェアとして、メモリプロファイラが備えられている。
このような構成において、1回目のコンパイル・リンクで生成されたプログラムが実行される。その際、プログラム(CPU)のメモリ1、2に対するアクセスは、メモリプロファイラにより逐次監視され、その監視結果がログとしてストレージデバイスのファイルに蓄えられる。この蓄えられたデータがプロファイルデータである。このプロファイルデータは後に、ストレージデバイスから取り出され、コンパイラ・リンカへ出力される。
なお、本明細書において「プログラムのメモリアクセス」とは、「CPUが、プログラムを実行する際に、メモリの所定アドレスに配置されたデータ(プログラム上のデータ)に対してアクセスすること」を意味する。
メモリプロファイラは、プログラム中の命令コードを1命令ずつ解釈しながらプログラムを実行するソフトウェアである。このような動作をするソフトウェアは、DBA(Dynamic Binary Analysis)ツールとして知られている技術である。DBAツールは、プログラムの挙動を完全に把握することが可能であり、従ってメモリアクセスに関してもプログラムからの各アクセスについて、完全に掌握することができる。このように、メモリプロファイラは、DBA技術を使用して実現することができる。
次に、動作コンピュータにて得られたプロファイルデータの具体例を説明する。図4は、プロファイルデータ(第1プロファイルデータの一例)の一部の例を示す図である。
図4において、各データエントリ(項目)は、開始アドレス、終端アドレス、読み出し回数、書き込み回数、の4つの情報から成る。図4の例では、1つのエントリがカバーするアドレス範囲(開始アドレスから終端アドレスまで)は、16バイトである。
なお、アドレス範囲は、4バイトでも32バイトでも、あるいは1Kバイトでも構わない。1エントリがカバーするアドレス範囲をあまりに狭くしてしまうと、プロファイルデータのデータ量が多くなってしまうが、2回目のコンパイル・リンクにおいて精度よく最適化を行うことができる。逆に、1エントリがカバーするアドレス範囲をあまりに広くしてしまうと、プロファイルデータのデータ量は少なくなるが、2回目のコンパイル・リンクにおいてあまり精度の良い最適化は行えない。
このようなことから、アドレス範囲はデフォルトとして16バイトに設定しておき、ユーザが必要に応じてメモリプロファイラにおいてその設定を変更できるようにしてもよい。
メモリプロファイラは、例えばアドレス0x80000000(に配置されたデータ)に対する読み出しのメモリアクセスを検知したとすると、図4において、開始アドレスが0x80000000のエントリの読み出し回数を1増加させる。また、メモリプロファイラは、例えばアドレス0x80000014(に配置されたデータ)に対する書き込みのアクセスを検知したとすると、図4において、開始アドレスが0x80000010のエントリの書き込み回数を1増加させる。
このようにしてプロファイルデータは、図3に示す動作コンピュータ上のストレージデバイス上にファイルとして作成される。その後、プロファイルデータは、ストレージデバイスから取り出され、最適化コンパイル・リンク処理、すなわち2回目のコンパイル・リンクで使用される。
次に、上記プロファイルデータと同様に2回目のコンパイル・リンクで使用される、メモリデバイス情報の例について説明する。図5は、メモリデバイス情報(第1メモリデバイス情報の一例)の一例を示す図である。
メモリデバイス情報は、動作コンピュータ上に搭載されているメモリデバイス(プログラムが使用可能なメモリデバイス)に関する情報であり、動作コンピュータ毎に固有のものである。ユーザは、2回目のコンパイル・リンクにより生成されるプログラムを動作させたい動作コンピュータ(例えば図1、図3に示すもの)の仕様書やOS(Operating System)の仕様書を参照して、メモリデバイス情報を作成しておく。
図5において、各データエントリは、メモリデバイス、開始アドレス、終端アドレス、読み出し速度、書き込み速度、の5つの情報から成る。図5では、2つのメモリデバイス(例えば図3に示すメモリ1、2)を例としている。開始アドレス、終端アドレスの間の領域が、プログラムからアクセスできるメモリ領域である。
これらのアドレスが物理アドレスであるか、仮想アドレスであるかは、プログラムが動作するコンピュータのCPUアーキテクチャおよびOSに依存する。仮想アドレスである場合は、アドレスマッピングは基本的にはOSが行うものと想定するが、部分的にプログラムからOS APIを通じてマッピングさせることも可能である。読み出し速度、書き込み速度は、メモリデバイスに読み出し要求もしくは書き込み要求を発行してから、その要求が完了するまでの時間である。
図5では、メモリ2がメモリ1よりもメモリアクセスが速い例としている。なお、図5では、メモリ1、2のそれぞれにおいて、読み出し速度と書き込み速度を同じ値としたが、異なる値であってもよい。
次に、上記図2のステップ3−3の具体例について図6を用いて説明する。図6は、リンカがデータの再配置を行うときに用いる表の一例を示す図である。
リンカは、ステップ3−3におけるデータの再配置を行うにあたり、まず、図2のステップ3−1にて入力されたプロファイルデータ(例えば図4に示すもの)及びメモリデバイス情報(例えば図5に示すもの)から、図6に示す表を作成する。
例えば、図4に示すプロファイルデータから、開始アドレス0x80000000〜終端アドレス0x80000010のエントリの読み出し回数が280204回、書き込み回数が5439回という情報が得られたとする。また、図5に示すメモリデバイス情報から、メモリ1の読み込み時間が200ns、書き込み時間が200ns、メモリ2の読み込み時間が10ns、書き込み時間が10nsという情報が得られたとする。このときリンカは、アドレス範囲(0x80000000〜0x80000010)に置かれていたデータを仮にメモリ1に配置した場合と仮にメモリ2に配置した場合のそれぞれにおける、読み出し及び書き込みにかかる合計時間(読み書き合計時間)の算出を行う。
仮にデータをメモリ1に配置したとするならば、280204×200+5439×200により、読み書き合計時間は57128600nsとなる。また、仮にデータをメモリ2に配置したとするならば、280204×10+5439×10により、読み書き合計時間は2856430nsとなる。よって、リンカは、図6に示すように、0x80000000〜0x80000010のエントリにおいて読み書き合計時間57128600nsと2856430nsを記録する。
このようにして、リンカは、プロファイルデータに記載されている全てのアドレス範囲に対して、メモリ1に配置された場合、メモリ2に配置された場合の各々の読み書き合計時間を算出し、図6に示すように記録していく。
次に、リンカは、アドレス範囲のエントリ毎に、メモリ1に配置した場合とメモリ2に配置した場合の読み書き合計時間の差分を計算していく。例えば0x80000000〜0x80000010のエントリの場合、57128600−2856430により、差分は54272170nsとなる。
そして、リンカは、算出した差分の値が大きい順に、アクセス速度の速いメモリ2にデータを配置していく。例えば、0x80000000〜0x80000010における差分が他よりも大きいために、リンカが、0x80000000〜0x80000010に置かれていたデータをメモリ2に配置することを決定した場合、実際の配置アドレスを、図5に示されているメモリ2の開始アドレス0x84000000〜終端アドレス0x84008000の間のアドレスになるように再配置を行う。
容量の問題でメモリ2に配置できなくなったら、リンカは、残りのデータをメモリ1に配置するようにする。このようにリンカが、図6の表に基づいてデータを再配置していき、プログラムを生成する。このようにして生成されたプログラムは、メモリアクセス時間が最短となる最適化されたプログラムとなる。
以上説明したように、本実施形態によれば、コンパイル及びリンクによりプログラムを生成する際に、複数のメモリにおけるアクセス速度の違いを考慮した最適化を実現できる。その結果、生成されるプログラムの更なるパフォーマンス向上を実現できる。
〔第2の実施形態〕
本実施形態では、速度差の異なるキャッシュメモリとメインメモリを備えたコンピュータでの動作を想定したプログラムを生成する場合に、キャッシュメモリのヒット率を向上させるメモリアクセスの最適化を実現する例について説明する。
本実施形態では、速度差の異なるキャッシュメモリとメインメモリを備えたコンピュータでの動作を想定したプログラムを生成する場合に、キャッシュメモリのヒット率を向上させるメモリアクセスの最適化を実現する例について説明する。
プログラム生成装置は、まず1回目のコンパイル・リンクを行う。つまり、コンパイラ・リンカは、第1の実施形態における図2のステップ1と同様に、ソースコードを入力として受け取り、通常のコンパイル・リンク(メモリアクセスの最適化は行わない)を行ってプログラムを生成する。
上記生成されたプログラムは、第1の実施形態における図2のステップ2と同様に、動作コンピュータにおいて実行され、メモリプロファイラによってメモリアクセス(読み出し、書き込み)を監視され、ログとしてプロファイルデータが取得される。本実施形態における動作コンピュータの構成は、図3において、メモリ1がRAM(Random Access Memory。メインメモリの一例)、メモリ2がキャッシュメモリとなる。高速なキャッシュメモリは、アドレス空間にマップされることなく、低速なRAMの一部をコピーとして保持し、メモリアクセスを高速化させる。
そして、プログラム生成装置は、2回目のコンパイル・リンクを行う。つまり、コンパイラは、第1の実施形態における図2のステップ3−1、3−2と同様に、上記プロファイルデータと、ユーザにより予め作成されたメモリデバイス情報とを入力として受け取り、通常のコンパイルを行い、オブジェクトファイルを生成する(上述したように、前に生成したオブジェクトファイルがある場合、この動作は省略されてもよい)。
その後、プログラム生成装置は、リンカによりキャッシュメモリのヒット率を向上させるためのメモリアクセスの最適化を行うことになるが、ここで、本実施形態におけるプロファイルデータ及びメモリデバイス情報の具体例について以下にそれぞれ説明する。
まず、図7を用いてプロファイルデータ(第2プロファイルデータの一例)の例について説明する。図7は、アドレス空間において、1回目のコンパイル・リンクで生成されたプログラム(CPU)がどのような順序で、どのようなアドレスにアクセスを行ったかについて、メモリプロファイラが記録した例を示している。
動作コンピュータにおいて1回目のコンパイル・リンクで生成されたプログラムの動作が開始されると、メモリプロファイラは、そのプログラムの実行によるメモリアクセスを監視する。そして、メモリプロファイラは、メモリアクセスを検知すると、アクセス先のアドレス(アクセスアドレス)、アクセスのサイズ(アクセスサイズ)、アクセスが読み出しであるか書き込みであるか(READ/WRITE)を、時系列に逐次記録する。
ここで、アクセスされたアドレスは実際にはRAMかキャッシュメモリになるわけであるが、メモリプロファイラは、それを関知せず、アクセスアドレス、アクセスサイズ、READ/WRITEのみを記録する。図7の例では、最初にアドレス0x8049000に4バイトのサイズで読み出しアクセスがあり、次にアドレス0x8049020に2バイトの読み出しアクセスがあったことが記録されている。
このように、実行されたメモリアクセスは、順次記録されていく。キャッシュメモリのヒット率を向上させるためのメモリアクセスの最適化には、図7に示すプロファイルデータが必要となる。
なお、第1の実施形態における図4のプロファイルデータと、本実施形態における図7のプロファイルデータは、どちらもメモリプロファイラが取得したデータであるが、性格がかなり異なる。図4では、アドレス範囲毎の読み書き総数が記録されているが、読み書きの順番は記録されていない。一方、図7では、読み書きの順番を記録すべく、読み書き毎に逐一記録を行っている。すなわち、1つのメモリアクセスにつき記録が1行増えることになる。よって、図7は、図4に比べて、データ量が膨大になる。
このようなことから、動作コンピュータ上のストレージデバイスでは容量が不足するおそれもある。よって、図7のプロファイルデータは、動作コンピュータの外部のストレージデバイスに蓄えられるようにしてもよい。
次に、図8を用いてメモリデバイス情報(第2メモリデバイス情報の一例)の例について説明する。図8に示すメモリデバイス情報も、第1の実施形態における図5のメモリデバイス情報と同様にして、ユーザにより予め作成される。
図8に示すように、本実施形態におけるメモリデバイス情報は、メモリデバイス毎に、開始アドレス、終端アドレス、キャッシュサイズ、キャッシュライン数、キャッシュウェイ数、読み出し速度、書き込み速度の情報を持つ。
図8において、RAMは、キャッシュサイズ、キャッシュライン数、キャッシュウェイ数の情報は持たない。読み出し速度は、キャッシュメモリ上にキャッシュライン単位でRAMからリフィルされる時の速度である。書き込み速度は、キャッシュメモリ上からキャッシュライン単位でRAMへ書き出される時の速度である。
図8において、キャッシュメモリは、開始アドレス、終端アドレスの情報は持たない。キャッシュサイズは、キャッシュメモリ全体の容量である。このキャッシュサイズをキャッシュライン数で割った値が、1つのキャッシュラインのサイズとなる。図8の例では、16KB/512=32バイトが1つのキャッシュラインのサイズになる。読み出し速度は、書き込み速度は、キャッシュヒットした場合の読み書きの速度である。
ここで、図8に示すキャッシュウェイ数について以下に説明する。キャッシュは、メモリアクセスが行われる際に、アドレスからタグと呼ばれる情報を生成して、アドレスがどのキャッシュラインに対応するかを判別する。タグは、キャッシュヒットかキャッシュミスかを高速に判別する目的で使用され、アドレスから一意に決まる。
例えば、アドレスと0xF0のマスクを以てタグとする。タグに一致するキャッシュラインに紐付けされているアドレスが、アクセスアドレスと一致すればキャッシュヒットとなる一方で、アクセスアドレスと一致しなければキャッシュミスとなる。キャッシュミスの場合は、キャッシュライン上にあるデータをRAMに戻しキャッシュラインから追い出して、新しいアクセスに対応してRAMからデータを読み出して、そのデータをキャッシュラインにフィルする。キャッシュミスはパフォーマンス上のペナルティになるので、できるだけキャッシュミスが起こらないような方式が考案されている。
例えば、1つのタグで複数のキャッシュラインを持たせる方式が考案されており、nウェイセットアソシアティブ方式と呼ばれている。このnウェイセットアソシアティブ方式では、タグが一致するキャッシュラインが、n個同時に存在できる。キャッシュヒット・キャッシュミスは、タグに一致するキャッシュラインをウェイごとに調べ、キャッシュラインに紐付されたアドレスとアクセスアドレスが一致するかどうかを、最大n回比較する。このように、同一タグで複数のキャッシュラインを持つとき、その数をキャッシュウェイ数と言う。
以上説明した図7のプロファイルデータ及び図8のメモリデバイス情報を使用することで、リンカは、キャッシュメモリのヒット率を向上させるためのメモリアクセス最適化を行う。この概要について以下に説明する。
リンカは、プロファイルデータ及びメモリデバイス情報から、メモリアクセスにかかった総計時間(メモリアクセス総計時間)を算出する。この算出は、キャッシュサイズ、キャッシュライン数、キャッシュウェイ数を考慮してキャッシュの動作をシミュレートすることによって可能である。この際、リンカは、ライン毎のキャッシュヒット率も算出しておく。キャッシュヒット率とは、メモリアクセスが行われた際に、データがキャッシュメモリ上にあった場合の割合である。
なお、メモリアクセス総計時間が最短となるように理論的に最適化するのは非常に困難であるので、データのアドレス配置を入れ替えながら試行し、メモリアクセス総計時間が最短となるようなアドレス配置を探していく手法をとることが好ましい。
ここで、上述した概要の具体例について図9を用いて説明する。図9は、リンカによって行われる、キャッシュメモリのヒット率を向上させるためのメモリアクセス最適化の動作例の一例を示すフローチャートである。図9に示すフローは、図2においてステップ3−3の代わりに行われる。
リンカは、まず、プロファイルデータを基に、キャッシュメモリの動作をシミュレートし、キャッシュヒット率が最も低いラインを求める(S11)。このステップの例として、図7のプロファイルデータを用いた、キャッシュメモリ動作のシミュレートについて以下に説明する。ここで、タグはアドレスと0xF0のマスクで求められるとし、キャッシュラインサイズを16バイトとする。
リンカは、0x8049000のタグ0x00(0x8049000 & 0xF0 = 0x00)のウェイ0-ウェイ3に、0x8049000がヒットするか確認する。ヒットしなければ、リンカは、ウェイ0-ウェイ3が空いているか確認する。初めてのメモリアクセスなので、ヒットはせず、ウェイはすべて空いており、リンカは、タグ0x00のウェイ0に0x8049000を紐付する。このアクセスはキャッシュミスとして記録される。
リンカは、0x8049020のタグ0x20(0x4809020 & 0xF0 = 0x20)のウェイ0-ウェイ3に、0x8049020がヒットするか確認する。ヒットしなければ、リンカは、ウェイ0-ウェイ3が空いているか確認する。タグ0x20のウェイはすべて空いており、リンカは、ウェイ0に0x8049020を紐付する。このアクセスはキャッシュミスとして記録される。
リンカは、0x8050048のタグ0x40のウェイ0-ウェイ3に、0x8050048がヒットするか確認する。ヒットしなければ、リンカは、ウェイ0-ウェイ3が空いているか確認する。タグ0x40のウェイはすべて空いており、リンカは、ウェイ0に0x8050040(0x8050048が入るキャッシュラインの先頭アドレス)を紐付する。このアクセスはキャッシュミスとして記録される。
リンカは、0x8049424のタグ0x20のウェイ0-ウェイ3に、0x8049424がヒットするか確認する。ヒットしなければ、リンカは、ウェイ0-ウェイ3が空いているか確認する。タグ0x20はウェイ0が0x8049020に紐付けられて使用中であり、ウェイ1-ウェイ3が空いているため、リンカは、ウェイ1に0x8049420(0x8049424が入るキャッシュラインの先頭アドレス)を紐付する。このアクセスはキャッシュミスとして記録される。
リンカは、0x8050120のタグ0x20がウェイ0-ウェイ3にヒットするか確認する。ヒットしなければ、リンカは、ウェイ0-ウェイ3が空いているか確認する。タグ0x20はウェイ0、ウェイ1が使用中であり、残りのウェイは空いているため、リンカは、ウェイ2に0x8050120を紐付する。このアクセスはキャッシュミスとして記録される。
リンカは、0x8050121のタグ0x20がウェイ0-ウェイ3にヒットするか確認する。ウェイ2にヒットするので、キャッシュヒットである。この場合は、紐付に関しては、リンカは、何もしない。このアクセスはキャッシュヒットとして記録される。
このようにリンカは、1アクセス毎に、タグを生成し、キャッシュにヒットするかどうか、ヒットしないならばウェイが空いているかどうか、逐一調べていく。この後、同様にアクセスを追跡していくと、キャッシュヒット、キャッシュミスが起こる。ウェイ0-ウェイ3がすべて紐付されている状態でキャッシュミスが起こると、ウェイ0-ウェイ3のいずれかがRAMに戻され、キャッシュラインから追い出される。このように、メモリアクセスを順に追っていくことによって、キャッシュヒット、キャッシュミスをシミュレートすることができる。
以上のシミュレートを図7に示される全アクセスに対して行うと、キャッシュライン毎のキャッシュヒット率が求められる。また、リンカは、どのデータがどのアドレスに配置されるかを知っているので、どのデータが何回キャッシュヒットしたか、何回キャッシュミスしたか、どのデータアクセスによってキャッシュから追い出されたかを知ることができる。また、図8を用いることによって、アクセス時間の総計(メモリアクセス総計時間)も算出することができる。
次に、リンカは、キャッシュヒット率が最も低いラインにキャッシュされるデータのうち、アクセス数が最も多いデータAをキャッシュから追い出した回数が最も多いデータBを探す(S12)。リンカは、上述したようにどのデータがどのアドレスに配置されるかを知っているので、S11で求めたキャッシュヒット率が最も低いキャッシュラインに属するデータはどれなのかを、知ることができる。
そして、リンカは、それら複数のデータのうち、アクセス数が最も多いデータをデータAとして特定する。リンカは、上述したようにどのデータアクセスによってキャッシュから追い出されたかを知ることができるので、特定したデータAがどのアクセスにより最もキャッシュから追い出されたかを知ることができる。よって、リンカは、データAをキャッシュから追い出した回数の最も多いアクセスによるデータをデータBとして特定する。
次に、リンカは、データBのアドレス配置を、データAの近傍のデータと入れ替え、データAとデータBが同一キャッシュ上に載るようにする(S13)。ここでいう「データAの近傍のデータ」とは、「データAが配置されたアドレスの近傍にあるアドレスに配置されたデータ」のことである。また、ここでいう「同一キャッシュ上に載る」とは、「キャッシュラインが一致する」ことである。
タグは一致するが、アドレスが一致しない場合、キャッシュラインが追い出される可能性がある。同じキャッシュライン上にデータA、データBが存在すれば、お互いを追い出してしまうことはない。例えば、キャッシュラインサイズが16バイトの時、データAのアドレスが0x8049000で、データBのアドレスが0x8049004であれば、データAとデータBは同一キャッシュライン上に存在する。このような状態を「同一キャッシュ上に載る」という。
次に、リンカは、キャッシュメモリの動作をシミュレートしながら、新しいデータ配置でのアクセス時間の総計(メモリアクセス総計時間)を計算し、それと同時にライン毎のキャッシュヒット率も計算しておく(S14)。ここでのシミュレートは、上述したS11の方法と同様である。また、メモリアクセス総計時間の計算には、図8のメモリデバイス情報が用いられる。また、ここでいう「新しいデータ配置」とは、S13で行ったデータBのアドレス配置をデータAの近傍に入れ替えた状態である。
ここで、S14におけるメモリアクセス総計時間の計算について説明する。リンカは、キャッシュヒットをシミュレートし、アクセス毎にキャッシュヒットかキャッシュミスかを判定し、その都度アクセスにかかる時間を加算していく。1アクセスにつき、以下の時間がかかる。なお、以下の各時間は、図8に示す読み出し速度及び書き込み速度を基に算出される。
読み出しキャッシュヒット⇒キャッシュメモリの読み出し時間
書き込みキャッシュヒット⇒キャッシュメモリの書き込み時間
読み出しキャッシュミス⇒RAMの読み出し時間
書き込みキャッシュミス⇒RAMの書き込み時間
読み出しキャッシュヒット⇒キャッシュメモリの読み出し時間
書き込みキャッシュヒット⇒キャッシュメモリの書き込み時間
読み出しキャッシュミス⇒RAMの読み出し時間
書き込みキャッシュミス⇒RAMの書き込み時間
図7のプロファイルデータには全てのアクセスについて読み出しアクセスなのか、書き込みアクセスなのかが記録されており、また、上記キャッシュメモリ動作のシミュレートではキャッシュヒット/キャッシュミスの判別がつくので、上記アクセスにかかる時間を加算していけば、リンカは、全てのアクセスに要した時間、すなわちメモリアクセス総計時間を算出することができる。
なお、S14におけるライン毎のキャッシュヒット率の計算は、上述したS11の方法と同様のキャッシュメモリ動作のシミュレートによって実現される。ここでの計算結果は、このS14以降において再度S12に戻った場合に、キャッシュヒット率が最も低いラインの特定に用いられる。
次に、リンカは、データAの近傍で入れ替えを試していない箇所がないかを判断する(S15)。ここでいう「近傍」とは、「データAと同一キャッシュラインに載る範囲」である。例えば、データA、データBの大きさを4バイト、キャッシュラインサイズを16バイトとすると、データAの近傍は12バイト分になる。よって、データBの置き換え(入れ替え)は、3回行われる。すなわち、図9において、S15/NO〜S13〜S14というループが3回行われることになる。
例として、データAの近傍の12バイトを4バイトずつ、仮にA2、A3、A4とした場合、リンカは、A2とBを置き換えてキャッシュシミュレートを行い、キャッシュヒット率及びメモリアクセス総計時間を算出する。次に、リンカは、A3とBを置き換えて同様にキャッシュシミュレートを行い、キャッシュヒット率及びメモリアクセス総計時間を算出する。最後に、リンカは、A4とBを置き換えて同様にキャッシュシミュレートを行い、キャッシュヒット率及びメモリアクセス総計時間を算出する。この最後の計算が終わると、リンカは、データAの近傍で全ての入れ替えを試したと判断する(S15/YES)。
次に、リンカは、アクセス時間最短となった時の、データBとデータAの近傍とのアドレス入れ替えを採用する(S16)。すなわち、リンカは、データBを、データAの近傍のアドレス(アクセス時間が最短となったもの)に配置するようにし、かつ、そのデータAの近傍のアドレスに配置されていたデータを、データBが配置されていたアドレスに配置するようにする。
例えば、上記S15で例示したように、データAの近傍がA2、A3、A4であり、それらA2、A3、A4とBとを置き換えてメモリアクセス総計時間をそれぞれ算出した場合、リンカは、置き換えを行わなかった場合のメモリアクセス総計時間と、置き換えを行ってシミュレートした3回それぞれのメモリアクセス総計時間とを比較し、メモリアクセス総計時間が最も短くなる置き換え方法を採用する。つまり、リンカは、A2とBの置き換え、A3とBの置き換え、A4とBの置き換えのうち、メモリアクセス総計時間が最も短くなる置き換えを採用する。
リンカは、S16による置き換え(入れ替え)の結果、メモリアクセス総計時間が短縮したかを判断する(S17)。メモリアクセス総計時間が短縮しなかった場合(置き換えた方が逆にメモリアクセス総計時間が長くなってしまった場合)(S17/NO)、一連のステップを終了する。
メモリアクセス総計時間が短縮した場合(S17/YES)、リンカは、キャッシュヒット率が最も低いラインは、データAが載っているラインとは異なるラインになったかを判断する(S18)。キャッシュヒット率が最も低いキャッシュラインが変わらない場合は(S18/NO)、一連のステップを終了する。
キャッシュヒット率が最も低いキャッシュラインが変わった場合は(S18/YES)、リンカは、S12以降のステップを、予め定められた所定回数繰り返したかどうかを判断する(S19)。リンカは、S12以降のステップを所定回数繰り返したら(S19/YES)、一連のステップを終了する。
上述した図9のフローに従えば、メモリアクセス総計時間の短縮が見込まれる。データのアドレス入れ替え試行数が多ければ多いほど、より短いアクセス総計時間が見つかる可能性が高いが、上記説明では実装し易い単純な例を示した。
以上説明したように、本実施形態によれば、コンパイル及びリンクによりプログラムを生成する際に、キャッシュメモリとメインメモリにおけるアクセス速度の違いを考慮した最適化を実現できる。その結果、キャッシュヒット率を向上させ、生成されるプログラムの更なるパフォーマンス向上を実現できる。
〔第3の実施形態〕
上記第2の実施形態では、アクセス速度の異なるキャッシュメモリとメインメモリとしてのRAMを備えた動作コンピュータでの動作を想定したプログラムを生成する場合について説明した。本実施形態では、キャッシュメモリとRAMの他に、SRAM(Static RAM。第3メモリの一例)を追加した動作コンピュータでの動作を想定したプログラムを生成する場合について説明する。アクセス速度は、キャッシュメモリが最も速く、その次にSRAMが速く、RAMが最も遅いとする。
上記第2の実施形態では、アクセス速度の異なるキャッシュメモリとメインメモリとしてのRAMを備えた動作コンピュータでの動作を想定したプログラムを生成する場合について説明した。本実施形態では、キャッシュメモリとRAMの他に、SRAM(Static RAM。第3メモリの一例)を追加した動作コンピュータでの動作を想定したプログラムを生成する場合について説明する。アクセス速度は、キャッシュメモリが最も速く、その次にSRAMが速く、RAMが最も遅いとする。
本実施形態におけるプログラム生成の際のメモリアクセスの最適化の概要について説明する。SRAMはキャッシュメモリと違い、プログラム空間にマップされ自由にデータを配置できる。そこでまず、アクセス頻度(アクセス回数)の高いデータを、頻度の高い順にSRAMに配置するよう、再配置を行う。その上で、上述の第2の実施形態で説明した図9のフローを行うようにする。これにより、キャッシュメモリとRAMの他にSRAMを備えた動作コンピュータでの動作を想定したプログラムを生成する際にメモリアクセスの最適化を行うことができる。
上記概要について具体例を用いて説明する。本実施形態ではまず、上記第1の実施形態で説明した図2のステップ1〜3−2までが行われる。
なお、ステップ3−1において、プロファイルデータは例えば図7に示すものとし、メモリデバイス情報は例えば図5に示すもの及び図8に示すものの両方とする。
そして、ステップ3−2の後、リンカは、ステップ3−3の代わりとして、以下の動作を行う。
なお、本実施形態でのメモリデバイス情報については、説明の便宜上図5と図8を分けて説明するが、それら両方を統合したものであってもよい。また、本実施形態でのメモリデバイス情報(第3メモリデバイス情報の一例)は、図5及び図8において、「メモリデバイス」の欄に「SRAM」が追加され、そのSRAMについて各種情報(開始アドレス、終端アドレス、読み出し速度、書き込み速度)が追加されているとする。
まず、リンカは、全てのデータがどのアドレスに配置されるかを知っているので、図7のプロファイルデータの1行1行において、どのデータに対するアクセスが行われたかを知ることができる。そのようにして図7のプロファイルデータを全て調べることにより、リンカは、データ毎のアクセス頻度を知ることができる。よって、リンカは、アクセス頻度の高いデータを特定できる。
次に、リンカは、図7のプロファイルデータ及び図5のメモリデバイス情報を基に、上記第1の実施形態において図6を用いて説明した動作を行う。この動作において、リンカはまず、図7に示すデータ(アクセスアドレス)毎に、読み出し回数及び書き込み回数を集計する。
次にリンカは、その集計の結果と図5に示される読み出し速度及び書き込み速度を基に、図7に示すデータ毎に、そのデータが仮にRAMに配置された場合と仮にSRAMに配置された場合それぞれの読み書き合計時間を算出する。この算出には、図5の読み出し速度、書き込み速度が用いられる(読み書き合計時間=読み出し回数×読み出し速度+書き込み回数×書き込み速度)。
次にリンカは、図7に示すデータ毎に、算出した2つの読み書き合計時間(仮にRAMに配置された場合の読み書き合計時間と仮にSRAMに配置された場合の読み書き合計時間)の差を算出する。
そして、リンカは、図7に示すデータのうち、差が大きいデータから順にSRAMに配置するようにする。このようにして、アクセス頻度の高いデータを、頻度の高い順にSRAMに配置する再配置が行われる。なお、SRAMに配置されなかったデータは、RAMに配置される。
次に、リンカは、上記再配置後の全てのデータ、すなわちSRAMに配置するようにしたデータ及びRAMに配置するようにしたデータの両方を対象に、上記第2の実施形態で説明した図9のフローを行う。なお、図9のフローを行う対象を全てのデータとする理由は、キャッシュメモリは、アクセスが、RAMに対するものであろうが、SRAMに対するものであろうが、分け隔てなくキャッシュヒット、キャッシュミスの処理を行う為である。
図9のフローは、上記第2の実施形態で説明したのと同様に行われる。ただし、S14においてアクセス時間の総計を計算する際には、キャッシュメモリ、SRAM、RAMそれぞれについての算出が必要となる。そのため、その算出に用いられる図8のメモリデバイス情報には、SRAMについての情報(少なくとも読み出し速度及び書き込み速度を含む)が追加されている必要がある。
以上説明したように、本実施形態によれば、コンパイル及びリンクによりプログラムを生成する際に、キャッシュメモリ、メインメモリ及びSRAMにおけるアクセス速度の違いを考慮した最適化を実現できる。その結果、SRAMの有効利用及びキャッシュヒット率の向上によって、生成されるプログラムの更なるパフォーマンスの向上を実現できる。
なお、本実施形態では、データの再配置を行うにあたり、図7のプロファイルデータを用いるものとしたが、図4を用いるようにしてもよい。ただし、図4はアドレス範囲毎のアクセス回数を記録したものであるので、図4を用いる場合は、図7を用いたときの1バイト/2バイト/4バイト単位での再配置ではなく、16バイト単位での再配置となる。また、図4を用いる場合、データ毎のアクセス頻度は特定できないため、リンカは、図4に示すアドレス範囲毎に、読み出し回数及び書き込み回数を集計したり、所定のアドレス範囲に置かれていたデータが仮にRAMに配置された場合と仮にSRAMに配置された場合それぞれの読み書き合計時間を算出したりする(この点は第1の実施形態と同様)。
〔第4の実施形態〕
本実施形態では、NUMA(Non-Uniform Memory Access)を採用したコンピュータでの動作を想定したプログラムを生成する場合について説明する。
本実施形態では、NUMA(Non-Uniform Memory Access)を採用したコンピュータでの動作を想定したプログラムを生成する場合について説明する。
図10にNUMAの構成例を示す。図10のように、NUMAにおいては、CPUとメモリの対から成るノードが複数存在する。図10の例では、ノード1(第1ノードの一例)、ノード2(第2ノードの一例)のそれぞれにおいて、メモリ1とCPU1(第1プロセッサの一例)とが対、メモリ2とCPU2(第2プロセッサの一例)とが対となっている。あるCPUから見た場合、同じノードにあるメモリは速くアクセスできるが、他のノードにあるメモリへのアクセスは遅い。
まず本実施形態の概要について説明する。NUMA環境においてメモリアクセスを最適化するために、本実施形態では、プログラムが動作するCPUを固定した上で、頻繁にアクセスされるデータは、そのプログラムが動作しているのと同じノードのメモリに配置するようにする。CPUを固定しないとすると、他のノード上のCPUで動作してしまう可能性があり、この場合は逆にメモリアクセスが遅くなってしまう。そのため、NUMA環境における最適化は、プログラムが動作するCPUを固定する。例えば、プログラムが動作するCPUをノード1のCPUに固定し、頻繁にアクセスされるデータはメモリ1に配置し、そうではないデータはメモリ2に配置するようにする。
上記概要について具体例を用いて説明する。本実施形態ではまず、上記第1の実施形態で説明した図2のステップ1〜3−2までが行われる。
なお、ステップ1の1回目のコンパイル・リンクのときは、特にプログラムを実行するCPUを固定しない。よって、ステップ2で1回目のコンパイル・リンクで生成されたプログラムは、図10に示すNUMAを採用した動作コンピュータにおいて、CPUを固定されないまま実行、動作される。
また、ステップ3−1において、プロファイルデータは例えば図7に示すものとし、メモリデバイス情報は例えば図5に示すものとする。
また、ステップ3−2において、コンパイラは、プログラムが動作するCPUが実行中に変わらないようにするために、CPUの固定を行う。すなわちコンパイラは、複数あるCPUのうちいずれかを選択し、プログラムの先頭において、選択したCPUを固定する専用命令を発行するようにした上でコンパイルを行い、リンカに渡す。これにより、リンカは、メモリ1又はメモリ2のどちらが、コンパイラにより固定されたCPUと同じノードにあるメモリであるかを知ることができる。
そして、ステップ3−2の後、リンカは、ステップ3−3の代わりとして、以下の動作を行う。基本的には、上記第3の実施形態と同様である。
まず、リンカは、全てのデータがどのアドレスに配置されるかを知っているので、図7のプロファイルデータの1行1行において、どのデータに対するアクセスが行われたかを知ることができる。そのようにして図7のプロファイルデータを全て調べることにより、リンカは、データ毎のアクセス頻度を知ることができる。よって、リンカは、アクセス頻度の高いデータを特定できる。
次に、リンカは、図7のプロファイルデータ及び図5のメモリデバイス情報を基に、上記第1の実施形態において図6を用いて説明した動作を行う。この動作において、リンカはまず、図7に示すデータ(アクセスアドレス)毎に、読み出し回数及び書き込み回数を集計する。
次にリンカは、その集計の結果と図5に示される読み出し速度及び書き込み速度を基に、図7に示すデータ毎に、そのデータが仮にメモリ1に配置された場合と仮にメモリ2に配置された場合それぞれの読み書き合計時間を算出する。この算出には、図5の読み出し速度、書き込み速度が用いられる(読み書き合計時間=読み出し回数×読み出し速度+書き込み回数×書き込み速度)。
次にリンカは、図7に示すデータ毎に、算出した2つの読み書き合計時間(仮にメモリ1に配置された場合の読み書き合計時間と仮にメモリ2に配置された場合の読み書き合計時間)の差を算出する。
そして、リンカは、図7に示すデータのうち、差が大きいデータから順に、コンパイラにより固定されたCPUと同じノードにあるメモリ(同一ノードにおいて、固定されたCPUと対となっているメモリ)に配置するようにする。メモリ1又はメモリ2のどちらが、コンパイラにより固定されたCPUと同じノードにあるメモリであるかは、リンカが、コンパイラにより発行された専用命令を参照することで認識できる。
このようにして、アクセス頻度の高いデータを、頻度の高い順に、プログラムが実行されるノードのメモリに配置する再配置が行われる。なお、プログラムが実行されるノードのメモリに配置されなかったデータは、別のノードのメモリに配置される。
以上説明したように、本実施形態によれば、コンパイル及びリンクによりプログラムを生成する際に、NUMAにおける複数のメモリのアクセス速度の違いを考慮した最適化を実現できる。その結果、生成されるプログラムの更なるパフォーマンスの向上を実現できる。
なお、本実施形態では、データの再配置を行うにあたり、図7のプロファイルデータを用いるものとしたが、図4を用いるようにしてもよい。図4を用いる場合、リンカは、図4に示すアドレス範囲毎に、読み出し回数及び書き込み回数を集計したり、所定のアドレス範囲に置かれていたデータが仮にメモリ1に配置された場合と仮にメモリ2に配置された場合それぞれの読み書き合計時間を算出したりする(この点は第1の実施形態と同様)。
〔第5の実施形態〕
本実施形態では、NUMAを採用したコンピュータでの動作を想定したプログラムとして、マルチスレッドプログラムを生成する場合について説明する。
本実施形態では、NUMAを採用したコンピュータでの動作を想定したプログラムとして、マルチスレッドプログラムを生成する場合について説明する。
まず本実施形態の概要について説明する。本実施形態では、スレッド間で共有される共有データは、その共有データにアクセスする回数が最も多いスレッドが動作するCPUと同じノードのメモリに配置するようにし、また、あるスレッドのみからアクセスされる非共有データは、なるべくそのスレッドが動作するCPUと同じノードのメモリに配置するようにする。このようにすることによって、NUMAで動作するマルチスレッドプログラムのメモリアクセスを最適化する。
上記概要について具体例を用いて説明する。本実施形態ではまず、上記第1の実施形態で説明した図2のステップ1〜3−2までが行われる。
なお、ステップ1の1回目のコンパイル・リンクのときは、マルチスレッドプログラムが生成される。このとき、そのプログラムを実行するCPUは固定されない。よって、ステップ2で1回目のコンパイル・リンクで生成されたマルチスレッドプログラムは、図10に示すNUMAを採用した動作コンピュータにおいて、CPUを固定されないまま実行、動作される。
また、ステップ3−1において、プロファイルデータは例えば図11に示すものとし、メモリデバイス情報は例えば図5に示すものとする。
図11に示すプロファイルデータは、動作コンピュータ上のメモリプロファイラがメモリアクセスを監視することで得られるのは、これまで説明した各実施形態と同様である。ただし、図11のプロファイルデータは、図4や図7で例示したものと中身が異なる。すなわち、図11のプロファイルデータでは、開始アドレスと終端アドレスとで示されるアドレス範囲毎に、各スレッドの読み出し回数と書き込み回数が対応付けられて記録された情報となっている。
また、ステップ3−2では、第4の実施形態と同様に、コンパイラは、プログラムが動作するCPUが実行中に変わらないようにするために、CPUの固定を行う。ただし、本実施形態では、コンパイラは、図11のプロファイルデータを基に、共有データをアクセスする回数が最も高いスレッドを特定した上で、そのスレッドが動作するCPUを固定する。スレッドの特定について以下に説明する。
コンパイラは、図11において、アドレス範囲毎に、全てのスレッドがアクセスしているか調べる。図11の例では、アドレス範囲0x80000000-0x80000010のデータが、スレッド0xA0、0xC0、0xF0の全部からアクセスされているので、コンパイラは、そのデータを共有データとみなす。
次に、コンパイラは、図11において、その共有データに対する読み出し回数と書き込み回数を参照し、最もアクセス回数の多いスレッドを特定する。図11の例では、アドレス範囲0x80000000-0x80000010の共有データに最もアクセスが多いのはスレッドID 0xC0のスレッドである。
次に、コンパイラは、特定したスレッド0xC0が動作するCPUを、図10のCPU1又はCPU2のいずれかに固定する。
また、コンパイラは、アドレス範囲毎に、特定のスレッドのみがアクセスしているかも調べる。図11の例では、アクセス範囲0x80000010-0x80000020のデータは、スレッド0xA0のみからアクセスされているため、非共有データとみなされ、スレッド0xA0が動作するCPUを、図10のCPU1又はCPU2のいずれかに固定する。
以上のようなステップ3−2の後、リンカは、ステップ3−3の代わりとして、以下の動作を行う。
リンカは、図11のプロファイルデータ及び図5のメモリデバイス情報を基に、上記第1の実施形態において図6を用いて説明した動作を行う。この動作において、リンカはまず、図11に示すアドレス範囲毎に、読み出し回数及び書き込み回数を集計する。このとき、読み出し回数は、全てのスレッド(図11では0xA0、0xC0、0xF0)の読み出し回数の合計となり、書き込み回数も、全てのスレッドの書き込み回数の合計となる。
次にリンカは、その集計の結果と図5に示される読み出し速度及び書き込み速度を基に、図11に示すアドレス範囲毎に、そのアドレス範囲に置かれていたデータが仮にメモリ1に配置された場合と仮にメモリ2に配置された場合それぞれの読み書き合計時間を算出する。この算出には、図5の読み出し速度、書き込み速度が用いられる(読み書き合計時間=読み出し回数×読み出し速度+書き込み回数×書き込み速度)。
次にリンカは、図11に示すアドレス範囲毎に、算出した2つの読み書き合計時間(仮にメモリ1に配置された場合の読み書き合計時間と仮にメモリ2に配置された場合の読み書き合計時間)の差を算出する。
そして、リンカは、図11に示すアドレス範囲のうち、差が大きいアドレス範囲に置かれていたデータ(共有データ及び非共有データ)から順に、コンパイラにより固定されたCPUと同じノードにあるメモリ(同一ノードにおいて、固定されたCPUと対となっているメモリ)に配置するようにする。メモリ1又はメモリ2のどちらが、コンパイラにより固定されたCPUと同じノードにあるメモリであるかは、リンカが、コンパイラにより発行された専用命令を参照することで認識できる。
このようにして、アクセス頻度の高いデータ共有データ及び非共有データについて、頻度の高い順に、プログラムが実行されるノードのメモリに配置する再配置が行われる。なお、プログラムが実行されるノードのメモリに配置されなかったデータは、別のノードのメモリに配置される。
以上説明したように、本実施形態によれば、コンパイル及びリンクによりNUMAで動作するマルチスレッドプログラムを生成する際に、共有データ、非共有データに対するメモリアクセスの最適化を実現できる。その結果、生成されるプログラムのパフォーマンス向上を実現できる。
〔第6の実施形態〕
本実施形態では、NUMAを採用した図10に示す構成において、ノード1及びノード2のそれぞれにキャッシュメモリを備えたコンピュータでの動作を想定したプログラムを生成する場合について説明する。
本実施形態では、NUMAを採用した図10に示す構成において、ノード1及びノード2のそれぞれにキャッシュメモリを備えたコンピュータでの動作を想定したプログラムを生成する場合について説明する。
本実施形態では、まず、上述した第4の実施形態の動作又は第5の実施形態の動作を行う。次に、ノード毎に、上述した第2の実施形態の動作(図9のフロー)を行い、キャッシュメモリのヒット率を向上させる。ただし、先行する第4の実施形態の動作又は第5の実施形態の動作の際に、後続の第2の実施形態の動作で必要な情報(プロファイルデータ及びメモリデバイス情報)をコンパイラ・リンカが取得できた場合は、第2の実施形態の動作において、先行動作と重複するステップ(例えば、図3のステップ1〜ステップ3−2)を省略してもよい。
第2の実施形態の動作を行うにあたり、ノード1においては、メモリ1に配置されるようにした以外のデータ(リモートメモリ(メモリ2)に配置されるようにしたデータ)と、メモリ1に配置されるようにしたデータ(ローカルメモリ(メモリ1)に配置されるようにしたデータ)の両方を対象にする必要がある。また、第2の実施形態の動作を行うにあたり、ノード2においては、メモリ2に配置されるようにした以外のデータ(リモートメモリ(メモリ1)に配置されるようにしたデータ)と、メモリ2に配置されるようにしたデータ(ローカルメモリ(メモリ2)に配置されるようにしたデータ)の両方を対象にする必要がある。これは、第3の実施形態で説明したキャッシュメモリ、RAM、SRAMの関係と同じである。
すなわち、キャッシュメモリは、アクセスがローカルメモリに対するものであろうが、リモートメモリに対するものであろうが、分け隔てなくキャッシュヒット、ミスの処理を行うため、ローカルメモリへ配置するようにしたデータと、リモートメモリへ配置するようにしたデータの両方を、第2の実施形態の動作を行う対象にする必要がある。
なお、本実施形態で行われる第2の実施形態の動作として図9のフローの流れに変わりはないが、アクセス時間の総計を計算する際には、キャッシュ、ローカルメモリ、リモートメモリの読み書きアクセス時間が必要になる。従って、図8のメモリデバイス情報では、キャッシュメモリ、ローカルメモリ、リモートメモリの情報が必要になる。例えば、図8において、「RAM」の代わりに「メモリ1」、「メモリ2」とし、それぞれについて各種情報(開始アドレス、終端アドレス、読み出し速度、書き込み速度)が定義されればよい。
以上説明したように、本実施形態によれば、コンパイル及びリンクによりプログラムを生成する際に、NUMAにおいて各ノードにキャッシュメモリを含む場合の、複数のメモリのアクセス速度の違いを考慮した最適化を実現できる。その結果、キャッシュヒット率を向上させ、生成されるプログラムの更なるパフォーマンス向上を実現できる。
以上、本発明の各実施形態について説明したが、上記各実施形態に限定されるものではなく、その要旨を逸脱しない範囲において種々の変形が可能である。
例えば、上述した実施形態における動作は、ハードウェア、または、ソフトウェア、あるいは、両者の複合構成によって実行することも可能である。
ソフトウェアによる処理を実行する場合には、処理シーケンスを記録したプログラムを、専用のハードウェアに組み込まれているコンピュータ内のメモリにインストールして実行させてもよい。あるいは、各種処理が実行可能な汎用コンピュータにプログラムをインストールして実行させてもよい。
例えば、プログラムは、記録媒体としてのハードディスクやROM(Read Only Memory)に予め記録しておくことが可能である。あるいは、プログラムは、CD−ROM(Compact Disc Read Only Memory)、MO(Magneto Optical)ディスク、DVD(Digital Versatile Disc)、USB(Universal Serial Bus)メモリ、磁気ディスク、半導体メモリなどのリムーバブル記録媒体に、一時的、あるいは、永続的に格納(記録)しておくことが可能である。このようなリムーバブル記録媒体は、いわゆるパッケージソフトウエアとして提供することが可能である。
なお、プログラムは、上述したようなリムーバブル記録媒体からコンピュータにインストールする他、ダウンロードサイトから、コンピュータに無線転送してもよい。または、LAN(Local Area Network)、インターネットといったネットワークを介して、コンピュータに有線で転送してもよい。コンピュータでは、転送されてきたプログラムを受信し、内蔵するハードディスク等の記録媒体にインストールすることが可能である。
また、上記実施形態で説明した処理動作に従って時系列的に実行されるのみならず、処理を実行する装置の処理能力、あるいは、必要に応じて並列的にあるいは個別に実行するように構築することも可能である。
Claims (9)
- アクセス速度の異なる複数のメモリを有するコンピュータで動作されるプログラムを生成するプログラム生成装置であって、
1回目のコンパイル及びリンクによりプログラムを生成し、
当該プログラムを前記コンピュータ上で動作させた際のメモリに対するアクセスの監視結果と、前記複数のメモリのアクセス速度を示す情報とに基づいて、頻繁にアクセスされるデータを優先的にアクセス速度が速い方のメモリに配置するようにして、2回目のコンパイル及びリンクによりプログラムを生成することを特徴とするプログラム生成装置。 - 前記複数のメモリは、第1メモリ及びそれよりアクセス速度が速い第2メモリであり、
前記コンピュータにて前記1回目のコンパイル及びリンクで生成したプログラムを動作させることで得られた前記監視結果としての、アクセスされた所定範囲のアドレス毎の読み出し回数と書き込み回数を含む第1プロファイルデータを取得し、
前記第1メモリ及び前記第2メモリ毎に前記アクセス速度としての読み出し速度と書き込み速度を含む第1メモリデバイス情報を取得し、
前記2回目のコンパイル及びリンクによりプログラムを生成する際に、
前記アクセスされた所定範囲のアドレス毎に、当該所定範囲のアドレスに配置されていたデータが前記第1メモリに仮に配置された場合に読み出し及び書き込みにかかる第1読み書き合計時間と、当該データが前記第2メモリに仮に配置された場合に読み出し及び書き込みにかかる第2読み書き合計時間とを、前記第1プロファイルデータと前記第1メモリデバイス情報に基づいてそれぞれ算出し、
前記アクセスされた所定範囲のアドレス毎に、前記第1読み書き合計時間と前記第2読み書き合計時間との差分を算出し、
前記差分が大きいアドレスから順に、当該アドレスに配置されていたデータを前記第2メモリに配置することを特徴とする請求項1記載のプログラム生成装置。 - 前記第1メモリとしてメインメモリ、前記第2メモリとしてキャッシュメモリを有するコンピュータで動作されるプログラムを生成する場合、
前記コンピュータにて前記1回目のコンパイル及びリンクで生成したプログラムを動作させることで得られた、アクセスされたアドレス毎の、当該アクセスのサイズ、当該アクセスが読み出しか書き込みかをアクセス順に含む第2プロファイルデータを、前記第1プロファイルデータの代わりに取得し、
前記メインメモリの読み出し速度、書き込み速度、及び、前記キャッシュメモリのキャッシュサイズ、キャッシュライン数、キャッシュウェイ数、読み出し速度、書き込み速度を含む第2メモリデバイス情報を、前記第1メモリデバイス情報の代わりに取得し、
前記2回目のコンパイル及びリンクによりプログラムを生成する際に、
前記第2プロファイルデータを基に前記キャッシュメモリの動作をシミュレートし、キャッシュヒット率が最も低いラインを求め、
前記キャッシュヒット率が最も低いラインにキャッシュされるデータのうち、アクセス数が最も多いデータAを前記キャッシュメモリから追い出した回数が最も多いデータBを探し、
前記データAと前記データBのキャッシュラインが一致するように、前記データBと前記データAの近傍にある複数のデータとのアドレスの入れ替えをそれぞれ行い、
前記キャッシュメモリの動作をシミュレートしながら、前記第2メモリデバイス情報を基に、前記アドレスの入れ替えそれぞれにおけるアクセス時間の総計を計算し、
前記アクセス時間の総計が最短となった前記アドレスの入れ替えを採用することを特徴とする請求項2記載のプログラム生成装置。 - アクセス速度が前記第1メモリよりも速く、前記第2メモリよりも遅い第3メモリをさらに有するコンピュータで動作されるプログラムを生成する場合、
前記コンピュータにて前記1回目のコンパイル及びリンクで生成したプログラムを動作させることで得られた、前記第2プロファイルデータを取得し、
前記第2メモリアドバイス情報に加えて前記第3メモリの読み出し速度、書き込み速度を含む第3メモリデバイス情報を、前記第2メモリデバイス情報の代わりに取得し、
前記2回目のコンパイル及びリンクによりプログラムを生成する際に、
前記アクセスされたアドレス毎に、当該アドレスに配置されていたデータが前記第1メモリに仮に配置された場合に読み出し及び書き込みにかかる第1読み書き合計時間と、当該データが前記第3メモリに仮に配置された場合に読み出し及び書き込みにかかる第3読み書き合計時間とを、前記第2プロファイルデータと前記第3メモリデバイス情報に基づいてそれぞれ算出し、
前記アクセスされたアドレス毎に、前記第1読み書き合計時間と前記第3読み書き合計時間との差分を算出し、
前記差分が大きいアドレスから順に、当該アドレスに配置されていたデータを前記第3メモリに配置するようにし、
前記第2プロファイルデータを基に前記キャッシュメモリの動作をシミュレートし、キャッシュヒット率が最も低いラインを求め、
前記キャッシュヒット率が最も低いラインにキャッシュされるデータのうち、アクセス数が最も多いデータAを前記キャッシュメモリから追い出した回数が最も多いデータBを探し、
前記データAと前記データBのキャッシュラインが一致するように、前記データBと前記データAの近傍にある複数のデータとのアドレスの入れ替えをそれぞれ行い、
前記キャッシュメモリの動作をシミュレートしながら、前記第3メモリデバイス情報を基に、前記アドレスの入れ替えそれぞれにおけるアクセス時間の総計を計算し、
前記アクセス時間の総計が最短となった前記アドレスの入れ替えを採用することを特徴とする請求項3記載のプログラム生成装置。 - 前記第1メモリと対になる第1プロセッサを備えた第1ノードと、前記第2メモリと対になる第2プロセッサを備えた第2ノードとを有するコンピュータで動作されるプログラムを生成する場合、
前記コンピュータにて前記1回目のコンパイル及びリンクで生成したプログラムを前記第1プロセッサ又は前記第2プロセッサにより動作させることで得られた、前記第2プロファイルデータを取得し、
前記第1メモリアドバイス情報を取得し、
前記2回目のコンパイル及びリンクによりプログラムを生成する際に、
前記プログラムが動作するプロセッサを前記第1プロセッサ又は前記第2プロセッサのいずれかに固定し、
前記アクセスされたアドレス毎に、当該アドレスに配置されていたデータが前記第1メモリに仮に配置された場合に読み出し及び書き込みにかかる第1読み書き合計時間と、当該データが前記第2メモリに仮に配置された場合に読み出し及び書き込みにかかる第2読み書き合計時間とを、前記第2プロファイルデータと前記第1メモリデバイス情報に基づいてそれぞれ算出し、
前記アクセスされたアドレス毎に、前記第1読み書き合計時間と前記第2読み書き合計時間との差分を算出し、
前記差分が大きいアドレスから順に、当該アドレスに配置されていたデータを、前記固定されたプロセッサと対になるメモリに配置することを特徴とする請求項2記載のプログラム生成装置。 - 前記コンピュータで動作されるプログラムとして、マルチスレッドプログラムを生成する場合、
前記コンピュータにて前記1回目のコンパイル及びリンクで生成したマルチスレッドプログラムを前記第1プロセッサ又は前記第2プロセッサにより動作させることで得られた、アクセスされた所定範囲のアドレス毎の、各スレッドの読み出し回数と書き込み回数を含む第3プロファイルデータを、第2プロファイルデータの代わりに取得し、
前記第1メモリアドバイス情報を取得し、
前記2回目のコンパイル及びリンクによりプログラムを生成する際に、
前記第3プロファイルデータを基に、全てのスレッドからアクセスされている所定範囲のアドレスを特定するとともに、当該全てのスレッドの中で最も読み出し回数と書き込み回数が多いスレッドを特定し、当該特定したスレッドが動作するプロセッサを、前記第1プロセッサ又は前記第2プロセッサのいずれかに固定し、
前記第3プロファイルデータを基に、一のスレッドのみからアクセスされている所定範囲のアドレスを特定し、当該一のスレッドが動作するプロセッサを、前記第1プロセッサ又は前記第2プロセッサのいずれかに固定し、
前記アクセスされた所定範囲のアドレス毎に、当該所定範囲のアドレスに配置されていたデータが前記第1メモリに仮に配置された場合に読み出し及び書き込みにかかる第1読み書き合計時間と、当該データが前記第2メモリに仮に配置された場合に読み出し及び書き込みにかかる第2読み書き合計時間とを、前記第3プロファイルデータと前記第1メモリデバイス情報に基づいてそれぞれ算出し、
前記アクセスされた所定範囲のアドレス毎に、前記第1読み書き合計時間と前記第2読み書き合計時間との差分を算出し、
前記差分が大きいアドレスから順に、当該所定範囲のアドレスに配置されていたデータを、前記固定されたプロセッサと対になるメモリに配置することを特徴とする請求項5記載のプログラム生成装置。 - 前記第1ノード及び前記第2ノードのそれぞれにキャッシュメモリをさらに有するコンピュータで動作されるプログラムを生成する場合、
請求項4又は5に記載の一連の動作の後で、請求項2に記載の一連の動作を行うことを特徴とする請求項5又は6記載のプログラム生成装置。 - アクセス速度の異なる複数のメモリを有するコンピュータで動作されるプログラムを生成するプログラム生成方法であって、
1回目のコンパイル及びリンクによりプログラムを生成し、
当該プログラムを前記コンピュータ上で動作させた際のメモリに対するアクセスの監視結果と、前記複数のメモリのアクセス速度を示す情報とに基づいて、頻繁にアクセスされるデータを優先的にアクセス速度が速い方のメモリに配置するようにして、2回目のコンパイル及びリンクによりプログラムを生成することを特徴とするプログラム生成方法。 - アクセス速度の異なる複数のメモリを有するコンピュータで動作されるプログラムを生成するプログラムであって、
1回目のコンパイル及びリンクによりプログラムを生成する処理と、
当該プログラムを前記コンピュータ上で動作させた際のメモリに対するアクセスの監視結果と、前記複数のメモリのアクセス速度を示す情報とに基づいて、頻繁にアクセスされるデータを優先的にアクセス速度が速い方のメモリに配置するようにして、2回目のコンパイル及びリンクによりプログラムを生成する処理と、
をコンピュータに実行させることを特徴とするプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2011116755A JP2012247827A (ja) | 2011-05-25 | 2011-05-25 | プログラム生成装置、プログラム生成方法及びプログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2011116755A JP2012247827A (ja) | 2011-05-25 | 2011-05-25 | プログラム生成装置、プログラム生成方法及びプログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2012247827A true JP2012247827A (ja) | 2012-12-13 |
Family
ID=47468255
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2011116755A Withdrawn JP2012247827A (ja) | 2011-05-25 | 2011-05-25 | プログラム生成装置、プログラム生成方法及びプログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2012247827A (ja) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2015145595A1 (ja) * | 2014-03-26 | 2015-10-01 | 株式会社日立製作所 | 計算機システム及び計算機システム管理方法 |
JP2016162008A (ja) * | 2015-02-27 | 2016-09-05 | 富士通株式会社 | データ配置決定装置、データ配置決定プログラム及びデータ配置決定方法 |
JP2019020965A (ja) * | 2017-07-14 | 2019-02-07 | 富士通株式会社 | 情報処理装置、プログラム及び情報処理方法 |
JP2019045974A (ja) * | 2017-08-30 | 2019-03-22 | 富士通株式会社 | 情報処理装置、情報処理プログラム及び情報処理方法 |
JP2019191870A (ja) * | 2018-04-24 | 2019-10-31 | 株式会社デンソー | 並列化方法、並列化ツール、及びマルチコアマイコン |
JP2022033688A (ja) * | 2020-08-24 | 2022-03-02 | ベイジン バイドゥ ネットコム サイエンス テクノロジー カンパニー リミテッド | メモリアクセスリクエストスケジューリング方法、装置、電子デバイス、コンピュータ可読記憶媒体及びコンピュータプログラム |
-
2011
- 2011-05-25 JP JP2011116755A patent/JP2012247827A/ja not_active Withdrawn
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2015145595A1 (ja) * | 2014-03-26 | 2015-10-01 | 株式会社日立製作所 | 計算機システム及び計算機システム管理方法 |
JPWO2015145595A1 (ja) * | 2014-03-26 | 2017-04-13 | 株式会社日立製作所 | 計算機システム及び計算機システム管理方法 |
JP2016162008A (ja) * | 2015-02-27 | 2016-09-05 | 富士通株式会社 | データ配置決定装置、データ配置決定プログラム及びデータ配置決定方法 |
US9842049B2 (en) | 2015-02-27 | 2017-12-12 | Fujitsu Limited | Data deployment determination apparatus, data deployment determination program, and data deployment determination method |
JP2019020965A (ja) * | 2017-07-14 | 2019-02-07 | 富士通株式会社 | 情報処理装置、プログラム及び情報処理方法 |
JP6996139B2 (ja) | 2017-07-14 | 2022-01-17 | 富士通株式会社 | 情報処理装置、プログラム及び情報処理方法 |
JP2019045974A (ja) * | 2017-08-30 | 2019-03-22 | 富士通株式会社 | 情報処理装置、情報処理プログラム及び情報処理方法 |
JP2019191870A (ja) * | 2018-04-24 | 2019-10-31 | 株式会社デンソー | 並列化方法、並列化ツール、及びマルチコアマイコン |
JP7059776B2 (ja) | 2018-04-24 | 2022-04-26 | 株式会社デンソー | 並列化方法、並列化ツール、及びマルチコアマイコン |
JP2022033688A (ja) * | 2020-08-24 | 2022-03-02 | ベイジン バイドゥ ネットコム サイエンス テクノロジー カンパニー リミテッド | メモリアクセスリクエストスケジューリング方法、装置、電子デバイス、コンピュータ可読記憶媒体及びコンピュータプログラム |
JP7282823B2 (ja) | 2020-08-24 | 2023-05-29 | ベイジン バイドゥ ネットコム サイエンス テクノロジー カンパニー リミテッド | メモリアクセスリクエストスケジューリング方法、装置、電子デバイス、コンピュータ可読記憶媒体及びコンピュータプログラム |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Ganguly et al. | Interplay between hardware prefetcher and page eviction policy in cpu-gpu unified virtual memory | |
Abel et al. | nanoBench: A low-overhead tool for running microbenchmarks on x86 systems | |
JP6218833B2 (ja) | 処理リソース割り当て | |
US10846450B2 (en) | Device for simulating multicore processors | |
US9798528B2 (en) | Software solution for cooperative memory-side and processor-side data prefetching | |
KR102645481B1 (ko) | 상위 계층 캐시의 항목을 기반으로 하위 계층 캐시로의 유입을 로깅함으로써 트레이스 기록 | |
JP2008525919A (ja) | プログラマ制御のキャッシュ・ライン追出しポリシーのための方法 | |
JP7348919B2 (ja) | 予約タグ・フィールド・ビットを使用するキャッシュ・ベースのブレークポイント・トレース/リプレイ(trace replay breakpoint) | |
JP2012247827A (ja) | プログラム生成装置、プログラム生成方法及びプログラム | |
Piccoli et al. | Compiler support for selective page migration in NUMA architectures | |
JP5583514B2 (ja) | バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム | |
JP2005078264A (ja) | コンピュータシステム、コンパイラ装置およびオペレーティングシステム | |
US20110302561A1 (en) | Architecture-aware field affinity estimation | |
Zhao et al. | Efficient memory shadowing for 64-bit architectures | |
US8359435B2 (en) | Optimization of software instruction cache by line re-ordering | |
TW201246068A (en) | Methods and systems for mapping a function pointer to the device code | |
Kayi et al. | Adaptive cache coherence mechanisms with producer–consumer sharing optimization for chip multiprocessors | |
Wang et al. | Efficient management for hybrid memory in managed language runtime | |
CN110431536A (zh) | 实现整个数据结构上的断点 | |
JP4643740B2 (ja) | プロセッサおよびプリフェッチ支援プログラム | |
JP5687603B2 (ja) | プログラム変換装置、プログラム変換方法、および変換プログラム | |
Sato et al. | Exana: an execution-driven application analysis tool for assisting productive performance tuning | |
Sato et al. | An accurate simulator of cache-line conflicts to exploit the underlying cache performance | |
Kamkin et al. | An approach to test program generation based on formal specifications of caching and address translation mechanisms | |
Cruz et al. | A sharing-aware memory management unit for online mapping in multi-core architectures |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A300 | Application deemed to be withdrawn because no request for examination was validly filed |
Free format text: JAPANESE INTERMEDIATE CODE: A300 Effective date: 20140805 |