プログラム変換装置、プログラム変換方法、および変換プログラム
【課題】プロセッサコアが夫々キャッシュメモリを有するマルチプロセッサ環境で前記キャッシュメモリを効率よく使用できるようにプログラムを変換すること。
【解決手段】プログラム変換装置は、アクセス属性決定部と、非共有化対象分類部と、変換部とを備える。アクセス属性決定部は、ソースプログラムを構成するスレッドによるメモリアクセスから排他アクセスを求め、前記求めた排他アクセスのうちからキャッシュメモリを使用するメモリアクセスを決定する。非共有化対象分類部は、前記キャッシュメモリを使用してメモリアクセスされるアクセスデータのうちから、他のアクセスデータとの間でキャッシュラインを非共有化させるアクセスデータを決定する。変換部は、前記非共有化対象分類部による決定結果に基づいてキャッシュラインを非共有化させる処理をソースプログラムに挿入する。
【解決手段】プログラム変換装置は、アクセス属性決定部と、非共有化対象分類部と、変換部とを備える。アクセス属性決定部は、ソースプログラムを構成するスレッドによるメモリアクセスから排他アクセスを求め、前記求めた排他アクセスのうちからキャッシュメモリを使用するメモリアクセスを決定する。非共有化対象分類部は、前記キャッシュメモリを使用してメモリアクセスされるアクセスデータのうちから、他のアクセスデータとの間でキャッシュラインを非共有化させるアクセスデータを決定する。変換部は、前記非共有化対象分類部による決定結果に基づいてキャッシュラインを非共有化させる処理をソースプログラムに挿入する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、プログラム変換装置、プログラム変換方法、および変換プログラムに関する。
【背景技術】
【0002】
階層メモリ構成を持つマルチプロセッサ環境で実行するアプリケーションの性能を向上させるために、アクセス回数の多いデータをプロセッサに近いメモリ上に配置する技術が公知技術として存在する。
【先行技術文献】
【特許文献】
【0003】
【特許文献1】米国特許第6609088号明細書
【発明の概要】
【発明が解決しようとする課題】
【0004】
本発明の一つの実施形態は、プロセッサコアが夫々キャッシュメモリを有するマルチプロセッサ環境で前記キャッシュメモリを効率よく使用できるようにプログラムを変換するプログラム変換装置、プログラム変換方法、および変換プログラムを提供することを目的とする。
【課題を解決するための手段】
【0005】
本発明の一つの実施形態によれば、プログラム変換装置は、アクセス属性決定部と、非共有化対象分類部と、変換部とを備える。アクセス属性決定部は、個別にキャッシュメモリを有する複数のプロセッサコアを備えるマルチプロセッサ環境で実行されるソースプログラムを構成するスレッドによるメモリアクセスから排他的なメモリアクセスを求め、前記求めた排他的なメモリアクセスのうちから前記プロセッサコアが備えるキャッシュメモリを使用するメモリアクセスを決定する。非共有化対象分類部は、前記キャッシュメモリを使用してメモリアクセスされると決定されたアクセスデータのうちから、特定のまたは任意のアクセスデータとの間でキャッシュラインを非共有化させるアクセスデータを決定する。変換部は、前記アクセス属性決定部による決定結果に基づいて前記キャッシュメモリを使用する処理を、前記非共有化対象分類部による決定結果に基づいて前記特定のまたは任意のアクセスデータとの間でキャッシュラインを非共有化させる処理を、前記受け付けたソースプログラムに夫々挿入し、前記夫々の処理を挿入したソースプログラムを出力する。
【図面の簡単な説明】
【0006】
【図1】問題点を説明する図。
【図2】第1の実施形態のプログラム変換装置の機能構成を示す図。
【図3】ソースプログラムが実行対象とする情報処理装置の構成例を示す図。
【図4】第1の実施形態のプログラム変換装置のハードウェア構成例を示す図。
【図5】第1の実施形態のプログラム変換装置の動作を説明するフローチャート。
【図6】ソースプログラムの例を示す図。
【図7】メモリアクセスを時系列順に示す図。
【図8】第1の実施形態のプロファイル情報の例を示す図。
【図9】第1の実施形態の解析結果情報の例を示す図。
【図10】アクセス属性の決定結果を示す図。
【図11】第1の実施形態のアクセス属性情報の例を示す図。
【図12−1】非共有化処理をAPI形式で記述する例を示す図。
【図12−2】非共有化処理をオブジェクトに非共有化情報を持たせる方式で記述する例を示す図。
【図12−3】非共有化処理をコンパイラプラグマ方式で記述する例を示す図。
【図12−4】非共有化処理をポインタ形式で記述する例を示す図。
【図13−1】属性設定処理をAPI形式で記述する例を示す図。
【図13−2】属性設定処理をオブジェクトにアクセス属性を指定する情報を持たせる方式で記述する例を示す図。
【図13−3】属性設定処理をコンパイラプラグマ方式で記述する例を示す図。
【図13−4】属性設定処理をポインタ形式で記述する例を示す図。
【図14】第2の実施形態のソースプログラムの例を示す図。
【図15】メモリアクセスを時系列順に示す図。
【図16】第2の実施形態のプロファイル情報を示す図。
【図17】第2の実施形態の解析結果情報を示す図。
【図18】アクセス属性の決定結果を示す図。
【図19】第2の実施形態のアクセス属性情報を示す図。
【図20】第2の実施形態のS4の処理をさらに詳しく説明するフローチャート。
【図21】非共有化対象リストに追加する組み合わせと追加しない組み合わせを説明する図。
【図22】メモリアクセスを時系列順に示す図。
【図23】第4の実施形態のソースプログラムの例を示す図。
【発明を実施するための形態】
【0007】
情報処理装置のアーキテクチャとして、複数のプロセッサコア(以下、単にコア)が個別にキャッシュメモリを有するマルチプロセッサアーキテクチャが採用されることがある。
このような情報処理装置においては、第1のコアが備えるキャッシュメモリに格納されたデータを第1のコアがキャッシュメモリ上で書き換えた後、同じデータを第2のコアが参照する場合、第2のコアが共有メモリ(コア間で共有されるメモリ)上にある書き換え前のデータに対して処理を行うと、問題が発生する。こうした問題を回避するために、第2のコアがデータに対して処理を行う前に、第1のコアがキャッシュメモリで書き換えたデータを共有メモリ上に書き戻す処理(ライトバック処理)を行う。
【0008】
また、キャッシュメモリは、データの格納などの制御を、メモリアクセスされる最小のサイズよりも大きいキャッシュライン単位で行う。複数のコアが夫々アクセス対象とする異なるデータが互いに近い番地に格納されていると、それらのデータが同一のキャッシュラインで管理されてしまう場合がある。そういった場合には、当該複数のコアは当該キャッシュラインに対してキャッシュメモリを使用した同時アクセスを行うことができなくなり、プログラムの性能が低下する。
【0009】
図1は、複数のコアが夫々アクセス対象とする異なるデータが同一のキャッシュラインで管理されている場合の問題点を説明する図である。ここで、メモリアクセスの単位となるサイズのデータをアクセス単位データということとする。アクセス単位データは、変数、配列、構造体、ポインタやポインタが指す配列等のような1つ、もしくは複数の集合により構成される。
図1に示した例によれば、アクセス単位データである「array0」と「char0」とがキャッシュライン1000を共有している。「array0」および「char0」は、同時に実行可能な異なるスレッドの夫々からメモリアクセスされうるデータであるとする。この場合に、第1のコアが「array0」に、第2のコアが「char0」に、夫々が有するキャッシュメモリを介して共有メモリに同時にアクセスすると、第1のコアのキャッシュメモリでは「array0」が更新されるが「char0」が更新されず、第2のコアのキャッシュメモリでは「char0」が更新されるが「array0」が更新されない。したがって、更新後にどちらのキャッシュメモリをライトバック処理してもキャッシュコヒーレンシが保てない。
【0010】
本発明の実施形態のプログラム変換装置は、ソースプログラムを解析して、他のアクセス単位データとキャッシュラインを共有すると性能低下を引き起こす虞のあるアクセス単位データを特定し、当該ソースプログラムに、特定したアクセス単位データを他のアクセス単位データとキャッシュラインを共有しないようにメモリに配置する処理(以下、単に非共有化処理)を挿入する。
【0011】
以下に添付図面を参照して、実施形態にかかるプログラム変換装置、プログラム変換方法、および変換プログラムを詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。
【0012】
(第1の実施形態)
図2は、本発明の第1の実施形態のプログラム変換装置の機能構成を示す図である。図2のプログラム変換装置100は、解析部101と、アクセス属性決定部102と、非共有化対象分類部103と、変換部104とを具備している。また、プログラム変換装置100には、ソースプログラム201およびプロファイル情報202が入力される。
【0013】
ソースプログラム201は、夫々のコアが個別にキャッシュメモリを有する情報処理装置を実行対象として記述されたプログラムとする。なお、以降、キャッシュメモリを単にキャッシュということもある。
図3は、ソースプログラム201が実行対象とする情報処理装置の構成例を示す図である。情報処理装置300は、個別に1次キャッシュ311〜314を備える複数のコア301〜304と、2次キャッシュ321と、メインメモリ331とを備えている。1次キャッシュ311〜314、2次キャッシュ321、メインメモリ331は、階層メモリ構造を構成する。即ち、L1キャッシュ311〜314は、L2キャッシュ321に共通接続されており、L2キャッシュ321はメインメモリ331に接続されている。
【0014】
情報処理装置300が備える各メモリの容量は、メインメモリ331、L2キャッシュ321、L1キャッシュ311〜314の順番で大きく、各メモリアクセスにかかる速度は、L1キャッシュ311〜314、L2キャッシュ321、メインメモリ331の順番で速い。このため、コア301〜304がデータにアクセスする際には、メインメモリ331よりもL2キャッシュ321、メインメモリ331やL2キャッシュ321よりもL1キャッシュ311〜314にデータを格納しておくことで、データの読み込みやアクセス処理を高速に行うことが可能となる。なお、L1キャッシュ311〜314、L2キャッシュ321は、メインメモリ331に格納されているデータをキャッシュライン単位で記憶し、L1キャッシュ311〜314、L2キャッシュ321のキャッシュラインのサイズは等しいとする。
【0015】
プロファイル情報202は、メモリアクセス対象のデータ(即ちアクセス単位データ)、およびアクセス単位データに対するアクセス回数を、スレッド毎に記述した情報である。プロファイル情報202は、例えばソースプログラム201を実際に実行するなどして生成されるが、プロファイル情報202の生成手法はこれに限定されない。プロファイル情報202は、外部から入力されてもよいし、後述する解析部101によって生成されるようにしてもよい。
【0016】
解析部101は、入力されたソースプログラム201に対して静的解析を行って、解析結果情報204を生成する。解析結果情報204は、ソースプログラム201を構成するスレッドが実行しうるメモリアクセス毎にスレッドとアクセスデータとの対の一覧(第1のリスト)と、並列に実行されうるスレッドの集合の一覧(第2のリスト)とを含む。
【0017】
アクセス属性決定部102は、解析結果情報204に基づいて、ソースプログラム201を構成するスレッドによるメモリアクセスから排他的なメモリアクセス(排他アクセス)を求め、求めた排他アクセスのうちから1次キャッシュ311〜314を使用するメモリアクセスを決定する。
【0018】
ここで、メモリアクセスを行う際のキャッシュメモリ(L1$311〜314、L2$321)の使用/不使用を規定する属性情報であるアクセス属性を用いて説明する。なお、1つのアクセス単位メモリは同じ時間に排他的に1つのアクセス属性のみが付与されるようにしてもよいし、同時に複数のアクセス属性が付与されるようにしてもよい。本実施形態においては、1つのアクセス単位データは同時に複数のアクセス属性は与えられないものとする。また、アクセス属性は、ソフトウェアにて遵守すべき規定を定めるものであるので、アーキテクチャのコアの位置やキャッシュメモリの位置など、ハードウェア構成要素の物理的な配置には依存しない。
【0019】
ここでは、一例として、L1$311〜314を使用することを規定したPrivate属性と、L1$311〜314を使用しないことを規定したPublic属性とが用いられるものとする。なお、キャッシュコヒーレンシを保つ観点から、Private属性からPublic属性に遷移させる際には、L1$311〜314上の対象のキャッシュラインをライトバック処理し、かつ無効化処理を実行する必要がある。
【0020】
アクセス属性決定部102は、排他アクセスのうちから1次キャッシュ311〜314を使用するメモリアクセス、即ちPrivate属性に設定するメモリアクセスを決定する。これ以外のメモリアクセスは、Public属性となる。そして、アクセス属性決定部102は、決定したアクセス属性をメモリアクセス毎に記述したアクセス属性情報205を出力する。
【0021】
アクセス属性決定部102は、排他アクセスに対してPrivate属性およびPublic属性のうちのどちらを設定するかを、ソースプログラム201の実行性能が向上するか否かの観点から判断する。具体的には、アクセス属性決定部102は、プロファイル情報202に基づいて、Public属性を設定した場合とPrivate属性を設定した場合とで夫々性能評価値(以下、単に評価値)を算出し、算出した評価値から最良のアクセス属性を選定する。評価値は、例えば、アクセス単位データへのアクセス回数やアクセス時間やアクセスに要する消費電力やアクセスで発生する熱量、アクセス単位データのアクセス属性の変更に要する時間、アクセス単位データの1回のアクセスに要する時間等やその組み合わせがある。ここでは、アクセス属性決定部102は、入力されたプロファイル情報202に基づいて評価値を求めるものとする。
【0022】
非共有化対象分類部103は、アクセス属性情報205を参照し、全てのアクセス単位データを、少なくともライトバック処理を必要とするか否かに基づいて、任意のアクセスデータとキャッシュラインを共有させないアクセス単位データ、即ち非共有化処理対象のアクセス単位データを決定する。第1の実施形態では、非共有化対象分類部103は、Private属性に設定されているアクセス単位データを非共有化処理対象のアクセス単位データとし、特定した非共有化処理対象のアクセス単位データを列記した非共有化対象リスト206を分類結果として出力する。
【0023】
変換部104は、ソースプログラム201に、非共有化対象リスト206に基づいて非共有化処理を、また、アクセス属性情報205に基づいてアクセス属性設定処理を、夫々挿入して変換後プログラム203を生成する。
【0024】
図4は、プログラム変換装置100のハードウェア構成例を示す図である。プログラム変換装置100は、CPU(Central Processing Unit)1、RAM(Random Access Memory)2、ROM(Read Only Memory)3、入力装置4、表示装置5を備える。CPU1、RAM2、ROM3、入力装置4、表示装置5は、バスラインを介して夫々接続されている。
【0025】
表示装置5は、例えば液晶モニタなどの情報を表示可能な装置である。表示装置5は、ユーザに対する出力情報を表示する。入力装置4は、例えばマウスやキーボードを備えて構成され、ユーザからのプログラム変換装置100の操作情報が入力される。入力された操作情報は、CPU1へ送られる。
【0026】
ROM3は、第1の実施形態のプログラム変換方法を実行する変換プログラム6を記録する記録媒体である。CPU1は、ROM3から変換プログラム6をバスラインを介して読み出して、RAM2へロードし、RAM2内にロードされた変換プログラム6を実行する。変換プログラム6は、RAM2にロードされることによって、RAM2上に解析部101、アクセス属性決定部102、非共有化対象分類部103、および変換部104が生成される。なお、変換プログラム6をインターネット等のネットワーク経由で提供または配布するように構成してもよい。また、変換プログラム6のロード元となる記録媒体として、外部記憶装置、着脱可能なメモリデバイス、光ディスク装置を適用することが可能である。
【0027】
ソースプログラム201やプロファイル情報202は、外部記憶装置(図示せず)などから入力される。CPU1は、RAM2にロードされた変換プログラム6による制御の下で、入力されたソースプログラム201およびプロファイル情報202を使用して各種処理を実行し、これらの各種処理に際して生じるデータ、即ち解析結果情報204、アクセス属性情報205および非共有化対象リスト206ならびにその他のワークデータを、RAM2内に形成されるデータ格納領域に一時的に記憶させておく。CPU1は、データ格納領域に一時的に記憶させたデータを使用して生成した変換後プログラム203をRAM2内のプログラム格納領域あるいは外部記憶装置などに出力する。
【0028】
次に、プログラム変換装置100の動作を、具体例を用いて説明する。図5は、プログラム変換装置100の動作を説明するフローチャートである。
【0029】
まず、プログラム変換装置100は、ソースプログラム201およびプロファイル情報202の入力を受け付ける(S1)。
【0030】
図6は、入力されるソースプログラム201の例を示す図であり、図7は、ソースプログラム201を実行したときのメモリアクセスを時系列順に示す図である。以下、図6に示したソースプログラム201を例に各処理について説明する。
このソースプログラム201において、「array0[10]」は、10個の要素を持つ配列を示し、「char0」は、1つの変数を示す。「thread_0」、「thread_1」、「thread_2」は夫々スレッドを示す。「SYNC(thread_0)」はthread_0が終了するまで後続に記述された処理を実行しない同期処理を示す。「READ(array0[i])」はarray0のi番目の要素への読み込み処理を、「WRITE(array0[i])」は「array0」のi番目の要素への書き込み処理を、「WRITE(char0)」は変数char0への書き込み処理を、夫々示している。図7に示すように、「thread_1」および「thread_2」の処理は、並列に実行することができる。
【0031】
図8は、プロファイル情報202の例を示す図である。プロファイル情報202には、スレッド毎のアクセス回数が記述されている。例えば、「thread0 array0 10 Read 10 Write」という記述は、「thread0」がアクセス単位データ「array0」に10回の読み込み処理と10回の書き込み処理を行ったことを示している。
【0032】
ソースプログラム201およびプロファイル情報202が入力されると、解析部101は、ソースプログラム201を静的解析して、全てのメモリアクセスおよび並列に実行されるスレッドを特定し、解析結果情報204を生成する(S2)。
【0033】
図9は、解析結果情報204の例を示す図である。S2の処理において、まず、解析部101は、ソースプログラム201のスレッド内に記述された「READ(array0[i])」や「WRITE(array0[i])」や「WRITE(char0)」から「thread_0」、「thread_1」、「thread_2」がアクセスするアクセス単位データはそれぞれ「array0」、「array0」、「char0」であると解析する。そして、「thread_0」は他のスレッドと並列に実行されず、「thread_1」と「thread_2」とは並列に実行されると解析する。なお、ここでは、メモリアクセスを記述する内容にアクセス種別(Read,Writeなど)を含めて記述しているが、アクセス種別を含めなくてもよい。
【0034】
なお、「array0[i]」のようなループインデックス情報を含む複数のデータの集合である場合は、解析結果情報204に、要素毎のアクセス単位データを記述するようにしているが、アクセス単位データとして単に「array0」を記述するようにしてもよい。
【0035】
次に、アクセス属性決定部102は、解析結果情報204とプロファイル情報202とに基づいてメモリアクセス毎にアクセス属性を決定し、アクセス属性情報205を生成する(S3)。メモリアクセスが排他アクセスであるとき、そのメモリアクセスはPrivate属性に設定しうる。解析結果情報204によると、「thread_0」と並列に実行されるスレッドはなく、かつ「thread_0」は「array0」にアクセスするので、「thread_0」による「array0」に対するメモリアクセスは排他アクセスであることがわかる。また、「thread_1」と「thread_2」とは並列に実行されることが可能であり、「thread_1」は「array0」に、「thread_2」は「char0」に夫々メモリアクセスするので、「thread_1」による「array0」に対するメモリアクセスおよび「thread_2」による「char0」に対するメモリアクセスは夫々排他アクセスであることがわかる。アクセス属性決定部102は、Private属性を取りうるメモリアクセスを特定した後、当該特定したメモリアクセスをPrivate属性に設定した場合とPublic属性を設定した場合とで評価値を算出・比較し、最も性能が良くなるアクセス属性を前記特定したメモリアクセスのアクセス属性に決定する。
【0036】
ソースプログラム201のアクセス単位データ「array0」と「char0」とを挙げて説明する。まず、全てのアクセス単位データは初期状態で全てのスレッドに対してPublic属性とする。そして、アクセス属性を変更する場合は、同期処理で区切られた期間(以降、単に期間)あるいはスレッドの開始時にアクセス属性の変更を行い、期間あるいはスレッドの終了時に全てのスレッドに対してPublic属性に変更すると仮定する。また、評価値は期間毎のアクセス単位データの1回のアクセスに要する時間とアクセス回数の積と、アクセス属性の変更に要する時間の総和とし、スレッド毎の評価値を合計した全スレッド分の評価値が小さいほど良いとする。また、L1キャッシュとL2キャッシュ上のアクセス単位データに1回アクセスするのに要する時間をそれぞれ1サイクルと20サイクルとし、アクセス属性を変更に要する時間を10サイクルと仮定する。
【0037】
図7に示したように、「array0」は期間901で20回、期間902で10回アクセスされる。また、「array0」の属性変更回数は、「thread_0」及び「thread_1」の実行開始時にPrivate属性に、実行終了時にPublic属性に変更するので、4回である。この際の「array0」の評価値は、「70(=1サイクル×20回+1サイクル×10回+10×4回)」となる。同様に、「array0」の各期間で取りうる属性から、アクセス属性の組み合わせに対する評価値を計算する。評価値は、期間901が「thread_0」に対してPrivate属性かつ期間902が全てのスレッドに対してPublic属性のとき「240」、期間901が全てのスレッドに対してPublic属性かつ期間902が「thread_1」に対してPrivate属性のとき「430」、期間901が全てのスレッドに対してPublic属性かつ期間902が全てのスレッドに対してPublic属性のとき「600」となる。最良なアクセス属性は、期間901で「thread_0」に対してPrivate属性かつ期間902で「thread_1」に対してPrivate属性とわかる。
【0038】
また、「char0」は期間901で0回、期間902で1回アクセスされる。「char0」が期間901で「thread_0」に対してPrivate属性かつ期間902で「thread_2」に対してPrivate属性の際の評価値は、「41=(1サイクル×0回+1サイクル×1回+10×4回(アクセス属性変更))」となる。同様に、「char0」の各期間で取りうるアクセス属性の組み合わせに対する評価値を計算する。評価値は、期間901が「thread_0」に対してPrivate属性かつ期間902が全てのスレッドに対してPublic属性のとき「40」、期間901が全てのスレッドに対してPublic属性かつ期間902が「thread_2」に対してPrivate属性のとき「21」、期間901が全てのスレッドに対してPublic属性かつ期間902が全てのスレッドに対してPublic属性のとき「20」となる。最良なアクセス属性は、期間901で全てのスレッドに対してPublic属性かつ期間902で全てのスレッドに対してPublic属性とわかる。
【0039】
このように、評価値から図10のようにアクセス属性が決定される。期間1101と期間1102はそれぞれ期間901と期間902と同じく、同期などで区切られた期間を示し、1103と1104はそれぞれ「array0」と「char0」のアクセス属性を示している。「array0」は期間1101において「thread_0」に対してPrivate属性に、期間1102において「thread_1」に対してPrivate属性に決定され、「char0」は全ての期間においてPublic属性に決定される。
【0040】
図11は、決定されたアクセス属性を記述したアクセス属性情報205の一例を示す図である。このアクセス属性情報205は、「thread_0」による「array0」に対するメモリアクセスおよび「thread_1」による「array0」に対するメモリアクセスにはPrivate属性が、「thread_0」による「char0」に対するメモリアクセス、「thread_1」による「char0」に対するメモリアクセスおよび「thread_2」による「char0」に対するメモリアクセスにはPublic属性が、夫々設定されていることを示している。
【0041】
なお、アクセス属性決定部102は、メモリアクセスの回数をプロファイル情報202から取得するとして説明したが、解析部101が求めたメモリアクセスの回数を取得するようにしてもよい。具体的には、例えば、アクセス属性決定部102は、プログラムの記述から、「array0」が「thread_0」においてreadとwriteのメモリアクセスを各10回実行され、合計20回のメモリアクセスがなされることがわかる。評価値の算出に、プロファイル情報202を使用しないようにすると、プログラム変換装置100へのプロファイル情報202の入力を不要とすることができる。
【0042】
また、アクセス単位データに対する1回のメモリアクセスに要する時間やアクセス属性変更に要する時間等、評価値の算出に用いられる情報は、アクセス属性決定部102に予め保持されるようにしてもよいし、外部からプログラム変換装置100に入力されるようにしてもよい。
【0043】
次に、非共有化対象分類部103は、アクセス属性情報205に基づいて、非共有化処理対象のアクセス単位データを抽出し、非共有化対象リスト206を出力する(S4)。具体的には、非共有化対象分類部103は、S4の処理を開始すると、Private属性でメモリアクセスされるアクセス単位データを抽出し、非共有化対象リスト206に記録する。アクセス属性情報205によれば、「array0」がPrivate属性でメモリアクセスされ、「char0」がPublic属性でメモリアクセスされるので、S11の処理により、「array0」が非共有化処理対象として非共有化対象リスト206に記録される。
【0044】
続いて、変換部104は、非共有化対象リスト206に基づいてソースプログラム201に非共有化処理を挿入する(S5)。非共有化処理を示す記述は、API形式、コンパイラプラグマ方式、オブジェクトに非共有化情報を持たせる方式、ポインタ形式等、様々な方式で記述することができる。
【0045】
図12−1〜4は、非共有化処理を挿入したソースプログラム207の記述例である。図12−1はAPI形式、図12−2はオブジェクトに非共有化情報を持たせる方式、図12−3はコンパイラプラグマ方式、図12−4はポインタ形式、で記述している。各図において、「UNSHARED(array0)」(図12−1、2071)が、「#pragma unshared array0」(図12−2、2072)が、「array0.unshared()」(図12−3、2073)が、「unshared *unshared_list[1]」と「unshared_list[0]=array0」(図12−4、2074)とが、夫々非共有化情報に該当する。なお、ソースプログラム201では、アクセス単位データとして「array0」と「char0」とが存在するため、「array0」を非共有化処理対象とすることは、「char0」を非共有化処理対象とすることと同じである。図12−1〜4の例においては、「array0」と「char0」との夫々に対して非共有化処理するようにしてもよい。具体的には、2071を「UNSHARED(array0, char0)」に変更してよい。同様に、2072を「#pragma unshared array0 char0」に、2073を「array0.unshared()」と「char0.unshared()」とに、2074を「unshared *unshared_list[2]」と「unshared_list[0]=array0」と「unshared_list[1]=char0」とに変更してもよい。
【0046】
次に、変換部104は、アクセス属性情報205に基づいて、ソースプログラム207に属性設定処理を挿入する(S6)。属性設定処理は、API形式、コンパイラプラグマ方式、オブジェクトにアクセス属性を指定する情報を持たせる方式、ポインタ形式等、様々な方式で記述することができる。
【0047】
図13−1〜4は、属性設定処理を挿入した変換後プログラム203の記述例である。図13−1はAPI形式、図13−2はオブジェクトにアクセス属性を指定する情報を持たせる方式、図13−3はコンパイラプラグマ方式、図13−4はポインタ形式、で記述している。図13−1においては、「PRIVATE(array0)」と「PUBLIC(array0)」(2031)とが属性設定処理に該当する。「PRIVATE(array0)」は、「array0」をPrivate属性に設定する処理APIであり、「PUBLIC(array0)」は「array0」をPublic属性に設定する処理APIである。図13−2の2032および図13−3の2033が属性設定処理に該当する。同様に、「array0」をPrivate属性またはPublic属性に変更する。図13−4においては、「public int array[0]」、「private int *private_array0」、「private_array0=array」、および「array0=private_array0」(2034)が属性設定処理に該当する。2034は、Private属性のポインタ変数「*private_array0」にアクセス単位データ「array0」のアドレスを渡すことで「array0」をPrivate属性に設定している記述である。なお、図13−4では、「thread_0」、「thread_1」を抜けるとPrivate属性の設定が無効になってPublic属性に戻るようになっている。
【0048】
続いて、変換部104は、非共有化処理および属性設定処理を挿入した変換後プログラム203を出力し(S7)、動作が終了となる。
【0049】
なお、以上の説明においては、変換部104は、ソースプログラム201に非共有化処理を挿入した後に属性設定処理を挿入するとして説明したが、各処理の挿入の順序はこれに限定されない。
【0050】
また、変換部104は、コンパイラ装置をさらに備えることにより、ハードウェアや仮想マシン上で実行可能なプログラムコードを生成し、生成したプログラムコードを変換後プログラム203として出力するようにしてもよい。また、変換部104は、コンパイラ装置に入力可能なメモリマップ情報を生成し、生成したメモリマップ情報を出力するようにしてもよい。
【0051】
また、アクセス属性としてPrivate属性とPublic属性とが用いられるとして説明したが、他の様々なアクセス属性を追加で定義したり、Private属性またはPublic属性をさらに粒度を細かくしたアクセス属性を定義することが可能である。例えば、コア301〜104のうちの複数が同一のアクセス単位データに対して読み込み処理のみを行う場合には、それらのコアのL1キャッシュにデータを移動させることを許容する属性が採用できる。様々なアクセス属性を設定可能に構成する場合には、非共有化対象分類部103は、キャッシュコヒーレンシを保つためにライトバック処理(および無効化処理)を必要とするか否かに基づいて非共有化処理対象とするか否かを決定するとよい。即ち、非共有化対象分類部103は、一つでもライトバック処理を必要とするアクセス属性に設定されるアクセス単位データを非共有化処理対象に分類し、ライトバック処理を必要とするアクセス属性がどのメモリアクセスに対しても設定されていないアクセス単位データを非共有化処理対象に分類しないようにするとよい。因みに、ライトバック処理を必要とする処理とは、1次キャッシュ311〜314を用いて書き込み処理を行うメモリアクセスが該当する。非共有化対象分類部103が1次キャッシュ311〜314を用いて書き込み処理を行うメモリアクセスを特定することができるようにするためには、解析部101は、メモリアクセス毎のスレッドとアクセス単位データとを記述した第1のリストにアクセス種別を記述し、当該第1のリストを非共有化対象分類部103に入力するようにするとよい。
【0052】
また、ソースプログラム201を記述する言語は特定の言語に限定されない。例えば、C言語やJava(登録商標)言語を採用することができるし、特定の処理装置独自のプログラミング言語を採用することができる。
【0053】
また、ソースプログラム201は、1つのファイルに記述されたものであってもよいし、複数のファイルに分割されて記述されたものであってもよい。同様に、変換後プログラム203も、複数に分割して出力されるようにしてもよい。
【0054】
また、プログラム変換装置100が変換することができるソースプログラム201のターゲットアーキテクチャは、上記に説明した情報処理装置300だけに限定されない。例えば、プログラム変換装置100が変換することができるソースプログラム201のターゲットアーキテクチャは、L1キャッシュのみを持ち、L2キャッシュがないアーキテクチャであってもよい。また、全コアから読み込み、書き込み処理が可能で、L2キャッシュよりも遅く、メインメモリより高速に動作し、L2キャッシュよりも容量が大きく、メインメモリよりも小さいL3キャッシュを1つ持つアーキテクチャでもよい。また、さらにメモリ階層の数を増やしたアーキテクチャでもよい。また、L2キャッシュが特定のコアからのみアクセスできるようになっているアーキテクチャでもよい。また、スクラッチパッドメモリを持つアーキテクチャ、L1キャッシュが他のコアからもアクセスできるアーキテクチャでもよい。
【0055】
また、アクセス属性決定部102は、解析結果情報204に基づいて排他アクセスを特定するようにしたが、コンパイラの依存解析技術を用いて、特定のスレッドからのみアクセスするアクセス単位データを抽出したり、並列に実行されうる複数のスレッドの中の1つのスレッドからのみアクセスするアクセス単位データを抽出したりする等の解析を行うようにしてもよい。
【0056】
また、プロファイル情報202に並列に実行されうるスレッドの集合のリストを持たせ、アクセス属性決定部102は、当該プロファイル情報202から排他アクセスを特定するようにしてもよい。なお、プロファイル情報202、必ずしもソースプログラム201の全てを示している情報であるとは限らない。例えば、ソースプログラム201中のあるスレッド内に条件分岐が存在し、当該スレッドは、条件が満たされた場合のみ、あるアクセス単位データにアクセスするとき、条件が一度も満たされず実行された際に生成されるプロファイル情報201は、条件が満たされ実行された際の情報を保持していないことがある。この場合、プロファイル情報201を基にした解析を行うと解析結果が誤る可能性がある。こうした問題を回避するため、スレッドがソースプログラム201中のアクセス単位データに対して排他アクセスするか否かをプログラマが指定する方法をとることが可能である。
【0057】
このように、第1の実施形態によれば、アクセス属性決定部102は、ソースプログラム201を構成するスレッドによるメモリアクセスから排他アクセスを求め、前記求めた排他アクセスのうちから1次キャッシュ311〜314を使用するメモリアクセスを決定し、非共有化対象分類部103は、1次キャッシュ311〜314を使用してメモリアクセスされると決定されたアクセス単位データを、他のアクセス単位データとの間でキャッシュラインを非共有化させるアクセス単位データに決定し、変換部104は、アクセス属性決定部102による決定結果に基づいて1次キャッシュ311〜314を使用する処理(属性設定処理)を、非共有化対象分類部103による決定結果に基づいて非共有化処理を、ソースプログラム201に夫々挿入して変換後プログラム203を出力する、ように構成したので、ライトバック処理を必要とするメモリアクセスは1次キャッシュ311〜314を使用したメモリアクセスに含まれ、当該1次キャッシュ311〜314を使用したメモリアクセスがなされるアクセス単位データは非共有化処理される。即ち、プログラム変換装置100により生成された変換後プログラム203では、複数のコア301〜304が1次キャッシュ311〜314を使用してメモリアクセスするアクセス単位データは夫々異なるキャッシュラインに配置されているので、複数のコア301〜304が1次キャッシュ311〜314を使用したメモリアクセスを同時に行ってもキャッシュコヒーレンシを保つことができる。したがって、第1の実施形態によれば、プロセッサコアが夫々キャッシュメモリを有するマルチプロセッサ環境でキャッシュメモリを効率よく使用できるプログラムに変換することができる。
【0058】
また、ソースプログラム201によるメモリアクセス毎のスレッドとアクセス単位データとの対の一覧を記述した第1のリストと並列に実行されうるスレッドの集合の一覧を記述した第2のリストとを生成する解析部101をさらに備え、アクセス属性決定部102は、第1および第2のリストに基づいて排他アクセスを求める、ように構成した。
【0059】
また、アクセス属性決定部102は、排他アクセスを1次キャッシュ311〜314を使用してした場合と使用しないでした場合との夫々で性能評価し、性能評価の結果に基づいて排他アクセスのうちから1次キャッシュ311〜314を使用するメモリアクセスを決定する、ように構成したので、第1の実施形態によれば、排他アクセスであっても、性能が低下する場合には1次キャッシュ311〜314を使用しないようにすることができる。したがって、キャッシュメモリをさらに効率よく使用できるプログラムに変換することができる。
【0060】
(第2の実施形態)
あるアクセス単位データが、特定のアクセス単位データとキャッシュラインを共有すると、キャッシュコヒーレンシを保つ制約から性能低下を引き起すが、特定のアクセス単位データを除く他のアクセス単位データと共有しても性能低下を引き起こさない場合がある。第2の実施形態のプログラム変換装置は、ライトバック処理を必要とするアクセス単位データを一律に非共有化処理の対象とするのではなく、キャッシュラインを共有すると性能低下を引き起こすアクセス単位データの対を特定し、特定したアクセス単位データの対のみ非共有化処理対象とする。また、ライトバック処理を必要とするアクセス単位データと並列にメモリアクセスされるアクセス単位データであっても、当該ライトバック処理を必要とするアクセス単位データと並列にメモリアクセスされるアクセス単位データに対するメモリアクセスが読み込み処理であってかつこのアクセス単位データがライトバック処理を必要しない場合には、双方のアクセス単位データがキャッシュラインを共有することを許容する。
【0061】
以下、第2の実施形態の説明では、第1の実施形態の説明で用いた図2の機能構成図および図5のフローチャートを準用し、第1の実施形態と異なる要素を重点的に説明する。
【0062】
図14は、プログラム変換装置100に入力されるソースプログラム201の別の例を示す図であり、図15は、図14に示すソースプログラム201を実行したときのメモリアクセスを時系列順に示す図である。
図14に示すソースプログラム201において、「char1」は、「char0」とは異なる1つの変数を示す。図15に示すように、このソースプログラム201によれば、「thread_0」は、「array0」の10個の要素に対する読み込み処理を実行する。「thread_0」の処理が終了した後、「thread_1」は、「array0」の各要素への読み込み処理と「char1」に対する書き込み処理とを実行し、「thread_2」は、「char0」へ書き込み処理を実行する。「thread_1」および「thread_2」の処理は、並列に実行することができる。
【0063】
図16は、プロファイル情報202を示す図である。このプロファイル情報202には、「thread_0」、「thread_1」、「thread_2」が「array0」、「char0」、「char1」に対してアクセスした回数が記録されている。
【0064】
図17は、解析結果情報204を示す図である。この解析結果情報204によると、「thread_0」と並列に実行しうるスレッドはなく、かつ「thread_0」は「array0」に読み込み処理を実行することがわかる。また、「thread_1」と「thread_2」とは並列に実行されることが可能であり、「thread_1」は「array0」に読み込み処理と「char1」に書き込み処理を実行し、「thread_2」は「char0」に書き込み処理を実行する。
【0065】
図18は、アクセス属性の決定結果を示す図である。図示するように、「thread_0」が実行されている期間2001においては「array0」、「char0」、「char1」は、全てのスレッドに対してPublic属性である。「thread_1」および「thread_2」が並列に実行されうる期間2002においては、「array0」はPublic属性のままとなっており、「char0」は「thread_1」に対してPrivate属性となっており、「char1」は「thread_2」に対してPrivate属性となっている。
【0066】
図19は、アクセス属性決定部102がS3の処理により出力する第2の実施形態のアクセス属性情報205を示す図である。第2の実施形態のアクセス属性情報205は、メモリアクセス毎にアクセス属性が記述されているのに加え、Public属性のメモリアクセスには、アクセス種別が記述されている。また、並列に実行されうるスレッドの集合のリストが記述されている。
【0067】
図20は、第2の実施形態におけるS4の処理をさらに詳しく説明するフローチャートである。非共有化対象分類部103は、S4の処理が開始すると、アクセス属性情報205に記述されているアクセス単位データを一つ選択する(S21)。S21の処理により選択されたアクセス単位データを第1のアクセス単位データということとする。
【0068】
続いて、非共有化対象分類部103は、第1のアクセス単位データとは別のアクセス単位データを1つ選択する(S22)。S22の処理により選択されたアクセス単位データを第2のアクセス単位データということとする。
【0069】
そして、非共有化対象分類部103は、第1および第2のアクセス単位データの組み合わせがキャッシュコヒーレンシを保てないパターンに該当するか否かを判定する(S23)。この組み合あせがキャッシュコヒーレンシを保てないパターンに該当する場合(S23、Yes)、この組み合わせを非共有化対象リスト206に追加する(S24)。この組み合わせがキャッシュコヒーレンシを保てないパターンに該当しない場合(S23、No)、非共有化対象分類部103は、S24の処理をスキップする。
【0070】
図21は、非共有化対象リスト206に追加する組み合わせと追加しない組み合わせを説明する図である。なお、図21は、第1および第2のアクセス単位データと、並列に実行されうる2つのスレッド「thread_x」、「thread_y」との関係を例に示している。
【0071】
パターン0では、第1のアクセス単位データは、「thread_x」および「thread_y」の夫々からPrivate属性のメモリアクセスがなされ、第2のアクセス単位データは「thread_x」および「thread_y」のどちらからもアクセスがなされないことを示している。パターン0によれば、第1および第2のアクセス単位データは同時にメモリアクセスされることがないので、「thread_x」および「thread_y」に関し、第1および第2のアクセス単位データがキャッシュラインを共有してもキャッシュコヒーレンシを保つことができる。即ち、第1および第2のアクセス単位データとの組み合わせは、「thread_x」および「thread_y」に関し、非共有化処理対象と判定されない。
【0072】
パターン1は、第1のアクセス単位データは、「thread_x」からPrivate属性のメモリアクセスがなされ、「thread_y」からメモリアクセスされず、第2のアクセス単位データは、「thread_x」からメモリアクセスされず、「thread_y」からPublic属性の読み込み処理がなされることを示している。パターン1によれば、第1および第2のアクセス単位データを同一のキャッシュラインに配置すると、当該キャッシュラインは「thread_x」によりライトバック処理がなされるが、「thread_x」によるライトバック処理の前後で第2のアクセス単位データが変更されず、また、「thread_y」によるメモリアクセスによっても第2のアクセス単位データが変更されないので、第1のアクセス単位データと第2のアクセス単位データとがキャッシュラインを共有してもキャッシュコヒーレンシを保つことができる。即ち、第1および第2のアクセス単位データの組み合わせは、「thread_x」および「thread_y」に関し、非共有化処理対象と判定されない。
【0073】
パターン2は、第1のアクセス単位データは、「thread_x」からPrivate属性のメモリアクセスがなされ、「thread_y」からメモリアクセスされず、第2のアクセス単位データは、「thread_x」からメモリアクセスされず、「thread_y」からPublic属性の書き込み処理がなされることを示している。パターン2によれば、第1および第2のアクセス単位データを同一のキャッシュラインに配置すると、当該キャッシュラインは「thread_x」によりライトバック処理がなされ、「thread_x」によるライトバック処理の前後で第2のアクセス単位データが変更されない。一方、「thread_y」によるメモリアクセスによって第2のアクセス単位データが変更されるので、第1および第2のアクセス単位データがキャッシュラインを共有すると、キャッシュコヒーレンシを保つことができない。即ち、第1および第2のアクセス単位データの組み合わせは、「thread_x」および「thread_y」に関し、非共有化処理対象と判定される。
【0074】
パターン3は、第1のアクセス単位データは、「thread_x」からPrivate属性のメモリアクセスがなされ、「thread_y」からメモリアクセスされず、第2のアクセス単位データは、「thread_x」からメモリアクセスされず、「thread_y」からPrivate属性のメモリアクセスがなされることを示している。パターン3は、図1を用いて説明した場合に該当する。即ち、第1および第2のアクセス単位データがキャッシュラインを共有すると、キャッシュコヒーレンシを保つことができない。即ち、第1およびと第2のアクセス単位データの組み合わせは、「thread_x」および「thread_y」に関し、非共有化処理対象と判定される。
【0075】
パターン4は、第1および第2のアクセス単位データは、ともに、「thread_x」および「thread_y」の夫々からPublic属性のメモリアクセスがなされることを示している。パターン4によれば、第1および第2のアクセス単位データは「thread_x」および「thread_y」のどちらからのメモリアクセスにもライトバック処理を必要としないので、双方のアクセス単位データがキャッシュラインを共有してもキャッシュコヒーレンシを保つことができる。即ち、第1および第2のアクセス単位データの組み合わせは、「thread_x」および「thread_y」に関し、非共有化処理対象と判定されない。
【0076】
なお、S23の判定処理は、並列に実行可能なスレッドの全ての対について判定される。何らか一つの対について第1および第2のアクセス単位データの組み合わせがパターン2またはパターン3に該当した場合には、S23、Yesと判定され、全てのスレッドの対について第1および第2のアクセス単位データの組み合わせがパターン0またはパターン1またはパターン4に該当した場合には、S23、Noと判定される。
【0077】
パターン2およびパターン3に該当した、第1および第2のアクセス単位データの組み合わせを非共有化対象リストに追加する。例えば、パターン3の場合、「thread_1」と「thread_2」からメモリアクセスされる「char0」と「char1」の組み合わせを記述する。
【0078】
なお、アクセス属性決定部102は、アクセス属性情報205にアクセス種別や並列に実行されうるスレッドの集合のリストを記述せず、非共有化対象分類部103は、解析結果情報204に記述されているアクセス種別、並列に実行されうるスレッドの集合のリスト、およびアクセス属性情報205を参照してS23の判定処理を実行するようにしてもよい。
【0079】
S23、Noと判定した後またはS24の処理の後、非共有化対象分類部103は、第2のアクセス単位データを全て選択済みであるか否かを判定する(S25)。第2のアクセス単位データとして選択可能なアクセス単位データが残っている場合(S25、No)、S22に移行して、未選択のアクセス単位データから新たな第2のアクセス単位データを選択する。未選択のアクセス単位データが残っていない場合(S25、Yes)、非共有化対象分類部103は、第1のアクセス単位データを全て選択済みであるか否かをさらに判定する(S26)。第1のアクセス単位データとして選択可能なアクセス単位データが残っている場合(S26、No)、非共有化対象分類部103は、S21に移行して、未選択のアクセス単位データから新たな第1のアクセス単位データを選択する。未選択のアクセス単位データが残っていない場合(S26、Yes)、非共有化対象分類部103は、S4の処理を終了する。なお、S25、Yesと判定された場合、第2のアクセス単位データの選択履歴はリセットされる。
【0080】
S5の処理において、変換部104は、非共有化対象リスト206に記述されているアクセス単位データの組み合わせを同一のキャッシュラインに配置しない非共有化処理を挿入する。
【0081】
以上述べたように、第2の実施形態によれば、非共有化対象分類部103は、Private属性のメモリアクセスがなされるアクセス単位データを一律に非共有化処理対象とするのではなく、並列に実行されるスレッドのうち、一のスレッドからPrivate属性のメモリアクセスがなされる第1のアクセス単位データと、他のスレッドからPublic属性で書き込み処理またはPrivate属性でメモリアクセスされる第2のアクセス単位データと互いにキャッシュラインを非共有化させる対象とする、ようにした。これにより、非共有化対象のアクセス単位データを第1の実施形態よりも少なくすることができるので、キャッシュメモリをさらに効率よく使用できるようにプログラムを変換することができる。
【0082】
なお、非共有化対象分類部103は、並列に実行されうるスレッドのうち、一のスレッドからPrivate属性で書き込み処理される第1のアクセスデータと、他のスレッドからPrivate属性またはPublic属性で書き込み処理される第2のアクセスデータとを互いにキャッシュラインを非共有化させる対象としてもよい。さらに、非共有化対象のアクセス単位データを少なくすることができ、キャッシュメモリを効率よく使用できるようにプログラムを変換することができる。
【0083】
(第3の実施形態)
複数のアクセス単位データが、常に同一のタイミングで、同一のスレッドから同一のアクセス属性のメモリアクセスがなされる場合には、たとえアクセス属性がライトバック処理を要するものであっても、当該複数のアクセス単位データがキャッシュラインを共有しても、キャッシュコヒーレンシを保つことができる。そのような場合には、当該複数のアクセス単位データがPrivate属性に設定されることがあっても、当該複数のアクセス単位データの組み合わせを同一のキャッシュラインに配置するようにしてもよい。
【0084】
具体的には、非共有化対象分類部103は、メモリアクセスされるスレッドと当該メモリアクセスのアクセス属性との組み合わせがスレッド毎に一致する複数のアクセス単位データを抽出し、抽出した複数のアクセス単位データのうちのどの対もキャッシュラインを非共有化処理対象から除外するようにする。
【0085】
例えば、図22に示すようなメモリアクセスがなされる場合を考える。この場合には、期間2501において、「thread_0」は、「array0」と「array1」とにPrivate属性のメモリアクセスを行い、期間2502において、「thread_1」は、「array0」と「array1」とにPrivate属性のメモリアクセスを行う。非共有化対象分類部103は、「array0」と「array1」との対は、メモリアクセスされるスレッドと当該メモリアクセスのアクセス属性との組み合わせがスレッド毎に一致するので、当該対を非共有化処理対象から除外する。
【0086】
このように、第3の実施の形態によれば、メモリアクセスされるスレッドと当該メモリアクセスのアクセス属性との組み合わせがスレッド毎に一致する複数のアクセス単位データを非共有化処理対象から除外するようにしたので、前記複数のアクセス単位データを非共有化処理対象とする場合に比べてキャッシュメモリを効率的に使用することができるようになる。
【0087】
(第4の実施形態)
配列の1つ以上の要素、構造体のメンバ変数など、配列や構造体を構成するデータの一部をアクセス単位データとして各種処理を実行するようにしてもよい。
【0088】
図23は、ソースプログラム201の別の例を示す図である。この例においては、「array0」は100の要素を有し、「thread_0」および「thread_1」はそのうちの0〜9番目までの要素にのみメモリアクセスを行っている。このような場合には、「array0」を構成する要素のうち、0〜9番目までの要素をまとめて一つのアクセス単位データとして扱うことが可能である。
【0089】
第4の実施形態の非共有化対象リスト206は、配列のうちのアクセス単位データとして扱う要素を特定する記述を含んでいる。例えば、array0[i] i=0,10のように記述される。
【0090】
なお、配列の一部に対する非共有化処理も、配列の全体に対する非共有化処理と同様に、API形式、コンパイラプラグマ方式、オブジェクトに非共有化情報を持たせる方式ポインタ形式、変数方式等、様々な方式で記述することができる。
【0091】
このように、第4の実施の形態によれば、配列や構造体を構成するデータを1つのアクセス単位データとして扱うようにしたので、非共有化対象リスト206のサイズを小さくすることができるので、RAM2を効率的に使用して変換後プログラム203を生成することができるようになる。
【0092】
(第5の実施形態)
プログラム変換装置100は、アクセス属性決定部102、非共有化対象分類部103、変換部104を具備するとして説明したが、これらの構成要素のうちの複数を統合したり、これらの構成要素のうちの一つを分割したり、一部の構成要素の実行順番を入れ替えたりして構成するようにしてもかまわない。
【0093】
例えば、非共有化対象分類部103は、まず、解析部101が出力した解析結果情報204やプロファイル情報202に基づいてソースプログラム201を構成するスレッドが行うメモリアクセスのうち排他アクセスを求め、当該求めた排他アクセスがなされるアクセス単位データのうちから非共有化処理対象のアクセス単位データを決定する。ここで、非共有化対象分類部103は、排他アクセスされるアクセス単位データを全て非共有化処理対象とするようにしてもよいし、書き込み処理を伴う排他アクセスがなされるアクセス単位データのみを非共有化処理対象とするようにしてもよい。また、性能評価に基づいて排他アクセスされるアクセス単位データのうちから非共有化処理対象を選択するようにしてもよい。非共有化対象分類部103は、非共有化処理対象に決定したアクセス単位データを、非共有化対象リスト206に記述して出力する。
【0094】
そして、アクセス属性決定部102は、非共有化対象リスト206を参照し、非共有化対象のアクセス単位データに対するメモリアクセスのうちから、性能評価に基づいてPrivate属性に設定するメモリアクセスを決定する。そして、他のメモリアクセスをPublic属性に決定する。アクセス属性決定部102は、アクセス属性の決定結果をアクセス属性情報205に記述して出力する。
【0095】
変換部104は、第1〜第4の実施形態と同様に、アクセス属性情報205および非共有化対象リスト206に基づいてソースプログラム201に各種処理を挿入し、変換後プログラム203を出力する。
【0096】
以上述べたように第1〜第5の実施形態によれば、少なくともライトバック処理の有無に基づいてアクセス単位データを他のアクセス単位データと非共有化するか否かを決定し、決定結果に基づいてソースプログラム201に非共有化処理を挿入するようにしたので、プロセッサコアが夫々キャッシュメモリを有するマルチプロセッサ環境でキャッシュメモリを効率よく使用できるようにプログラムを変換することができる。
【0097】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0098】
6 変換プログラム、100 プログラム変換装置、101 解析部、102 アクセス属性決定部、103 非共有化対象分類部、104 変換部、201 ソースプログラム、202 プロファイル情報、203 変換後プログラム、204 解析結果情報、205 アクセス属性情報、206 非共有化対象リスト、300 情報処理装置。
【技術分野】
【0001】
本発明の実施形態は、プログラム変換装置、プログラム変換方法、および変換プログラムに関する。
【背景技術】
【0002】
階層メモリ構成を持つマルチプロセッサ環境で実行するアプリケーションの性能を向上させるために、アクセス回数の多いデータをプロセッサに近いメモリ上に配置する技術が公知技術として存在する。
【先行技術文献】
【特許文献】
【0003】
【特許文献1】米国特許第6609088号明細書
【発明の概要】
【発明が解決しようとする課題】
【0004】
本発明の一つの実施形態は、プロセッサコアが夫々キャッシュメモリを有するマルチプロセッサ環境で前記キャッシュメモリを効率よく使用できるようにプログラムを変換するプログラム変換装置、プログラム変換方法、および変換プログラムを提供することを目的とする。
【課題を解決するための手段】
【0005】
本発明の一つの実施形態によれば、プログラム変換装置は、アクセス属性決定部と、非共有化対象分類部と、変換部とを備える。アクセス属性決定部は、個別にキャッシュメモリを有する複数のプロセッサコアを備えるマルチプロセッサ環境で実行されるソースプログラムを構成するスレッドによるメモリアクセスから排他的なメモリアクセスを求め、前記求めた排他的なメモリアクセスのうちから前記プロセッサコアが備えるキャッシュメモリを使用するメモリアクセスを決定する。非共有化対象分類部は、前記キャッシュメモリを使用してメモリアクセスされると決定されたアクセスデータのうちから、特定のまたは任意のアクセスデータとの間でキャッシュラインを非共有化させるアクセスデータを決定する。変換部は、前記アクセス属性決定部による決定結果に基づいて前記キャッシュメモリを使用する処理を、前記非共有化対象分類部による決定結果に基づいて前記特定のまたは任意のアクセスデータとの間でキャッシュラインを非共有化させる処理を、前記受け付けたソースプログラムに夫々挿入し、前記夫々の処理を挿入したソースプログラムを出力する。
【図面の簡単な説明】
【0006】
【図1】問題点を説明する図。
【図2】第1の実施形態のプログラム変換装置の機能構成を示す図。
【図3】ソースプログラムが実行対象とする情報処理装置の構成例を示す図。
【図4】第1の実施形態のプログラム変換装置のハードウェア構成例を示す図。
【図5】第1の実施形態のプログラム変換装置の動作を説明するフローチャート。
【図6】ソースプログラムの例を示す図。
【図7】メモリアクセスを時系列順に示す図。
【図8】第1の実施形態のプロファイル情報の例を示す図。
【図9】第1の実施形態の解析結果情報の例を示す図。
【図10】アクセス属性の決定結果を示す図。
【図11】第1の実施形態のアクセス属性情報の例を示す図。
【図12−1】非共有化処理をAPI形式で記述する例を示す図。
【図12−2】非共有化処理をオブジェクトに非共有化情報を持たせる方式で記述する例を示す図。
【図12−3】非共有化処理をコンパイラプラグマ方式で記述する例を示す図。
【図12−4】非共有化処理をポインタ形式で記述する例を示す図。
【図13−1】属性設定処理をAPI形式で記述する例を示す図。
【図13−2】属性設定処理をオブジェクトにアクセス属性を指定する情報を持たせる方式で記述する例を示す図。
【図13−3】属性設定処理をコンパイラプラグマ方式で記述する例を示す図。
【図13−4】属性設定処理をポインタ形式で記述する例を示す図。
【図14】第2の実施形態のソースプログラムの例を示す図。
【図15】メモリアクセスを時系列順に示す図。
【図16】第2の実施形態のプロファイル情報を示す図。
【図17】第2の実施形態の解析結果情報を示す図。
【図18】アクセス属性の決定結果を示す図。
【図19】第2の実施形態のアクセス属性情報を示す図。
【図20】第2の実施形態のS4の処理をさらに詳しく説明するフローチャート。
【図21】非共有化対象リストに追加する組み合わせと追加しない組み合わせを説明する図。
【図22】メモリアクセスを時系列順に示す図。
【図23】第4の実施形態のソースプログラムの例を示す図。
【発明を実施するための形態】
【0007】
情報処理装置のアーキテクチャとして、複数のプロセッサコア(以下、単にコア)が個別にキャッシュメモリを有するマルチプロセッサアーキテクチャが採用されることがある。
このような情報処理装置においては、第1のコアが備えるキャッシュメモリに格納されたデータを第1のコアがキャッシュメモリ上で書き換えた後、同じデータを第2のコアが参照する場合、第2のコアが共有メモリ(コア間で共有されるメモリ)上にある書き換え前のデータに対して処理を行うと、問題が発生する。こうした問題を回避するために、第2のコアがデータに対して処理を行う前に、第1のコアがキャッシュメモリで書き換えたデータを共有メモリ上に書き戻す処理(ライトバック処理)を行う。
【0008】
また、キャッシュメモリは、データの格納などの制御を、メモリアクセスされる最小のサイズよりも大きいキャッシュライン単位で行う。複数のコアが夫々アクセス対象とする異なるデータが互いに近い番地に格納されていると、それらのデータが同一のキャッシュラインで管理されてしまう場合がある。そういった場合には、当該複数のコアは当該キャッシュラインに対してキャッシュメモリを使用した同時アクセスを行うことができなくなり、プログラムの性能が低下する。
【0009】
図1は、複数のコアが夫々アクセス対象とする異なるデータが同一のキャッシュラインで管理されている場合の問題点を説明する図である。ここで、メモリアクセスの単位となるサイズのデータをアクセス単位データということとする。アクセス単位データは、変数、配列、構造体、ポインタやポインタが指す配列等のような1つ、もしくは複数の集合により構成される。
図1に示した例によれば、アクセス単位データである「array0」と「char0」とがキャッシュライン1000を共有している。「array0」および「char0」は、同時に実行可能な異なるスレッドの夫々からメモリアクセスされうるデータであるとする。この場合に、第1のコアが「array0」に、第2のコアが「char0」に、夫々が有するキャッシュメモリを介して共有メモリに同時にアクセスすると、第1のコアのキャッシュメモリでは「array0」が更新されるが「char0」が更新されず、第2のコアのキャッシュメモリでは「char0」が更新されるが「array0」が更新されない。したがって、更新後にどちらのキャッシュメモリをライトバック処理してもキャッシュコヒーレンシが保てない。
【0010】
本発明の実施形態のプログラム変換装置は、ソースプログラムを解析して、他のアクセス単位データとキャッシュラインを共有すると性能低下を引き起こす虞のあるアクセス単位データを特定し、当該ソースプログラムに、特定したアクセス単位データを他のアクセス単位データとキャッシュラインを共有しないようにメモリに配置する処理(以下、単に非共有化処理)を挿入する。
【0011】
以下に添付図面を参照して、実施形態にかかるプログラム変換装置、プログラム変換方法、および変換プログラムを詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。
【0012】
(第1の実施形態)
図2は、本発明の第1の実施形態のプログラム変換装置の機能構成を示す図である。図2のプログラム変換装置100は、解析部101と、アクセス属性決定部102と、非共有化対象分類部103と、変換部104とを具備している。また、プログラム変換装置100には、ソースプログラム201およびプロファイル情報202が入力される。
【0013】
ソースプログラム201は、夫々のコアが個別にキャッシュメモリを有する情報処理装置を実行対象として記述されたプログラムとする。なお、以降、キャッシュメモリを単にキャッシュということもある。
図3は、ソースプログラム201が実行対象とする情報処理装置の構成例を示す図である。情報処理装置300は、個別に1次キャッシュ311〜314を備える複数のコア301〜304と、2次キャッシュ321と、メインメモリ331とを備えている。1次キャッシュ311〜314、2次キャッシュ321、メインメモリ331は、階層メモリ構造を構成する。即ち、L1キャッシュ311〜314は、L2キャッシュ321に共通接続されており、L2キャッシュ321はメインメモリ331に接続されている。
【0014】
情報処理装置300が備える各メモリの容量は、メインメモリ331、L2キャッシュ321、L1キャッシュ311〜314の順番で大きく、各メモリアクセスにかかる速度は、L1キャッシュ311〜314、L2キャッシュ321、メインメモリ331の順番で速い。このため、コア301〜304がデータにアクセスする際には、メインメモリ331よりもL2キャッシュ321、メインメモリ331やL2キャッシュ321よりもL1キャッシュ311〜314にデータを格納しておくことで、データの読み込みやアクセス処理を高速に行うことが可能となる。なお、L1キャッシュ311〜314、L2キャッシュ321は、メインメモリ331に格納されているデータをキャッシュライン単位で記憶し、L1キャッシュ311〜314、L2キャッシュ321のキャッシュラインのサイズは等しいとする。
【0015】
プロファイル情報202は、メモリアクセス対象のデータ(即ちアクセス単位データ)、およびアクセス単位データに対するアクセス回数を、スレッド毎に記述した情報である。プロファイル情報202は、例えばソースプログラム201を実際に実行するなどして生成されるが、プロファイル情報202の生成手法はこれに限定されない。プロファイル情報202は、外部から入力されてもよいし、後述する解析部101によって生成されるようにしてもよい。
【0016】
解析部101は、入力されたソースプログラム201に対して静的解析を行って、解析結果情報204を生成する。解析結果情報204は、ソースプログラム201を構成するスレッドが実行しうるメモリアクセス毎にスレッドとアクセスデータとの対の一覧(第1のリスト)と、並列に実行されうるスレッドの集合の一覧(第2のリスト)とを含む。
【0017】
アクセス属性決定部102は、解析結果情報204に基づいて、ソースプログラム201を構成するスレッドによるメモリアクセスから排他的なメモリアクセス(排他アクセス)を求め、求めた排他アクセスのうちから1次キャッシュ311〜314を使用するメモリアクセスを決定する。
【0018】
ここで、メモリアクセスを行う際のキャッシュメモリ(L1$311〜314、L2$321)の使用/不使用を規定する属性情報であるアクセス属性を用いて説明する。なお、1つのアクセス単位メモリは同じ時間に排他的に1つのアクセス属性のみが付与されるようにしてもよいし、同時に複数のアクセス属性が付与されるようにしてもよい。本実施形態においては、1つのアクセス単位データは同時に複数のアクセス属性は与えられないものとする。また、アクセス属性は、ソフトウェアにて遵守すべき規定を定めるものであるので、アーキテクチャのコアの位置やキャッシュメモリの位置など、ハードウェア構成要素の物理的な配置には依存しない。
【0019】
ここでは、一例として、L1$311〜314を使用することを規定したPrivate属性と、L1$311〜314を使用しないことを規定したPublic属性とが用いられるものとする。なお、キャッシュコヒーレンシを保つ観点から、Private属性からPublic属性に遷移させる際には、L1$311〜314上の対象のキャッシュラインをライトバック処理し、かつ無効化処理を実行する必要がある。
【0020】
アクセス属性決定部102は、排他アクセスのうちから1次キャッシュ311〜314を使用するメモリアクセス、即ちPrivate属性に設定するメモリアクセスを決定する。これ以外のメモリアクセスは、Public属性となる。そして、アクセス属性決定部102は、決定したアクセス属性をメモリアクセス毎に記述したアクセス属性情報205を出力する。
【0021】
アクセス属性決定部102は、排他アクセスに対してPrivate属性およびPublic属性のうちのどちらを設定するかを、ソースプログラム201の実行性能が向上するか否かの観点から判断する。具体的には、アクセス属性決定部102は、プロファイル情報202に基づいて、Public属性を設定した場合とPrivate属性を設定した場合とで夫々性能評価値(以下、単に評価値)を算出し、算出した評価値から最良のアクセス属性を選定する。評価値は、例えば、アクセス単位データへのアクセス回数やアクセス時間やアクセスに要する消費電力やアクセスで発生する熱量、アクセス単位データのアクセス属性の変更に要する時間、アクセス単位データの1回のアクセスに要する時間等やその組み合わせがある。ここでは、アクセス属性決定部102は、入力されたプロファイル情報202に基づいて評価値を求めるものとする。
【0022】
非共有化対象分類部103は、アクセス属性情報205を参照し、全てのアクセス単位データを、少なくともライトバック処理を必要とするか否かに基づいて、任意のアクセスデータとキャッシュラインを共有させないアクセス単位データ、即ち非共有化処理対象のアクセス単位データを決定する。第1の実施形態では、非共有化対象分類部103は、Private属性に設定されているアクセス単位データを非共有化処理対象のアクセス単位データとし、特定した非共有化処理対象のアクセス単位データを列記した非共有化対象リスト206を分類結果として出力する。
【0023】
変換部104は、ソースプログラム201に、非共有化対象リスト206に基づいて非共有化処理を、また、アクセス属性情報205に基づいてアクセス属性設定処理を、夫々挿入して変換後プログラム203を生成する。
【0024】
図4は、プログラム変換装置100のハードウェア構成例を示す図である。プログラム変換装置100は、CPU(Central Processing Unit)1、RAM(Random Access Memory)2、ROM(Read Only Memory)3、入力装置4、表示装置5を備える。CPU1、RAM2、ROM3、入力装置4、表示装置5は、バスラインを介して夫々接続されている。
【0025】
表示装置5は、例えば液晶モニタなどの情報を表示可能な装置である。表示装置5は、ユーザに対する出力情報を表示する。入力装置4は、例えばマウスやキーボードを備えて構成され、ユーザからのプログラム変換装置100の操作情報が入力される。入力された操作情報は、CPU1へ送られる。
【0026】
ROM3は、第1の実施形態のプログラム変換方法を実行する変換プログラム6を記録する記録媒体である。CPU1は、ROM3から変換プログラム6をバスラインを介して読み出して、RAM2へロードし、RAM2内にロードされた変換プログラム6を実行する。変換プログラム6は、RAM2にロードされることによって、RAM2上に解析部101、アクセス属性決定部102、非共有化対象分類部103、および変換部104が生成される。なお、変換プログラム6をインターネット等のネットワーク経由で提供または配布するように構成してもよい。また、変換プログラム6のロード元となる記録媒体として、外部記憶装置、着脱可能なメモリデバイス、光ディスク装置を適用することが可能である。
【0027】
ソースプログラム201やプロファイル情報202は、外部記憶装置(図示せず)などから入力される。CPU1は、RAM2にロードされた変換プログラム6による制御の下で、入力されたソースプログラム201およびプロファイル情報202を使用して各種処理を実行し、これらの各種処理に際して生じるデータ、即ち解析結果情報204、アクセス属性情報205および非共有化対象リスト206ならびにその他のワークデータを、RAM2内に形成されるデータ格納領域に一時的に記憶させておく。CPU1は、データ格納領域に一時的に記憶させたデータを使用して生成した変換後プログラム203をRAM2内のプログラム格納領域あるいは外部記憶装置などに出力する。
【0028】
次に、プログラム変換装置100の動作を、具体例を用いて説明する。図5は、プログラム変換装置100の動作を説明するフローチャートである。
【0029】
まず、プログラム変換装置100は、ソースプログラム201およびプロファイル情報202の入力を受け付ける(S1)。
【0030】
図6は、入力されるソースプログラム201の例を示す図であり、図7は、ソースプログラム201を実行したときのメモリアクセスを時系列順に示す図である。以下、図6に示したソースプログラム201を例に各処理について説明する。
このソースプログラム201において、「array0[10]」は、10個の要素を持つ配列を示し、「char0」は、1つの変数を示す。「thread_0」、「thread_1」、「thread_2」は夫々スレッドを示す。「SYNC(thread_0)」はthread_0が終了するまで後続に記述された処理を実行しない同期処理を示す。「READ(array0[i])」はarray0のi番目の要素への読み込み処理を、「WRITE(array0[i])」は「array0」のi番目の要素への書き込み処理を、「WRITE(char0)」は変数char0への書き込み処理を、夫々示している。図7に示すように、「thread_1」および「thread_2」の処理は、並列に実行することができる。
【0031】
図8は、プロファイル情報202の例を示す図である。プロファイル情報202には、スレッド毎のアクセス回数が記述されている。例えば、「thread0 array0 10 Read 10 Write」という記述は、「thread0」がアクセス単位データ「array0」に10回の読み込み処理と10回の書き込み処理を行ったことを示している。
【0032】
ソースプログラム201およびプロファイル情報202が入力されると、解析部101は、ソースプログラム201を静的解析して、全てのメモリアクセスおよび並列に実行されるスレッドを特定し、解析結果情報204を生成する(S2)。
【0033】
図9は、解析結果情報204の例を示す図である。S2の処理において、まず、解析部101は、ソースプログラム201のスレッド内に記述された「READ(array0[i])」や「WRITE(array0[i])」や「WRITE(char0)」から「thread_0」、「thread_1」、「thread_2」がアクセスするアクセス単位データはそれぞれ「array0」、「array0」、「char0」であると解析する。そして、「thread_0」は他のスレッドと並列に実行されず、「thread_1」と「thread_2」とは並列に実行されると解析する。なお、ここでは、メモリアクセスを記述する内容にアクセス種別(Read,Writeなど)を含めて記述しているが、アクセス種別を含めなくてもよい。
【0034】
なお、「array0[i]」のようなループインデックス情報を含む複数のデータの集合である場合は、解析結果情報204に、要素毎のアクセス単位データを記述するようにしているが、アクセス単位データとして単に「array0」を記述するようにしてもよい。
【0035】
次に、アクセス属性決定部102は、解析結果情報204とプロファイル情報202とに基づいてメモリアクセス毎にアクセス属性を決定し、アクセス属性情報205を生成する(S3)。メモリアクセスが排他アクセスであるとき、そのメモリアクセスはPrivate属性に設定しうる。解析結果情報204によると、「thread_0」と並列に実行されるスレッドはなく、かつ「thread_0」は「array0」にアクセスするので、「thread_0」による「array0」に対するメモリアクセスは排他アクセスであることがわかる。また、「thread_1」と「thread_2」とは並列に実行されることが可能であり、「thread_1」は「array0」に、「thread_2」は「char0」に夫々メモリアクセスするので、「thread_1」による「array0」に対するメモリアクセスおよび「thread_2」による「char0」に対するメモリアクセスは夫々排他アクセスであることがわかる。アクセス属性決定部102は、Private属性を取りうるメモリアクセスを特定した後、当該特定したメモリアクセスをPrivate属性に設定した場合とPublic属性を設定した場合とで評価値を算出・比較し、最も性能が良くなるアクセス属性を前記特定したメモリアクセスのアクセス属性に決定する。
【0036】
ソースプログラム201のアクセス単位データ「array0」と「char0」とを挙げて説明する。まず、全てのアクセス単位データは初期状態で全てのスレッドに対してPublic属性とする。そして、アクセス属性を変更する場合は、同期処理で区切られた期間(以降、単に期間)あるいはスレッドの開始時にアクセス属性の変更を行い、期間あるいはスレッドの終了時に全てのスレッドに対してPublic属性に変更すると仮定する。また、評価値は期間毎のアクセス単位データの1回のアクセスに要する時間とアクセス回数の積と、アクセス属性の変更に要する時間の総和とし、スレッド毎の評価値を合計した全スレッド分の評価値が小さいほど良いとする。また、L1キャッシュとL2キャッシュ上のアクセス単位データに1回アクセスするのに要する時間をそれぞれ1サイクルと20サイクルとし、アクセス属性を変更に要する時間を10サイクルと仮定する。
【0037】
図7に示したように、「array0」は期間901で20回、期間902で10回アクセスされる。また、「array0」の属性変更回数は、「thread_0」及び「thread_1」の実行開始時にPrivate属性に、実行終了時にPublic属性に変更するので、4回である。この際の「array0」の評価値は、「70(=1サイクル×20回+1サイクル×10回+10×4回)」となる。同様に、「array0」の各期間で取りうる属性から、アクセス属性の組み合わせに対する評価値を計算する。評価値は、期間901が「thread_0」に対してPrivate属性かつ期間902が全てのスレッドに対してPublic属性のとき「240」、期間901が全てのスレッドに対してPublic属性かつ期間902が「thread_1」に対してPrivate属性のとき「430」、期間901が全てのスレッドに対してPublic属性かつ期間902が全てのスレッドに対してPublic属性のとき「600」となる。最良なアクセス属性は、期間901で「thread_0」に対してPrivate属性かつ期間902で「thread_1」に対してPrivate属性とわかる。
【0038】
また、「char0」は期間901で0回、期間902で1回アクセスされる。「char0」が期間901で「thread_0」に対してPrivate属性かつ期間902で「thread_2」に対してPrivate属性の際の評価値は、「41=(1サイクル×0回+1サイクル×1回+10×4回(アクセス属性変更))」となる。同様に、「char0」の各期間で取りうるアクセス属性の組み合わせに対する評価値を計算する。評価値は、期間901が「thread_0」に対してPrivate属性かつ期間902が全てのスレッドに対してPublic属性のとき「40」、期間901が全てのスレッドに対してPublic属性かつ期間902が「thread_2」に対してPrivate属性のとき「21」、期間901が全てのスレッドに対してPublic属性かつ期間902が全てのスレッドに対してPublic属性のとき「20」となる。最良なアクセス属性は、期間901で全てのスレッドに対してPublic属性かつ期間902で全てのスレッドに対してPublic属性とわかる。
【0039】
このように、評価値から図10のようにアクセス属性が決定される。期間1101と期間1102はそれぞれ期間901と期間902と同じく、同期などで区切られた期間を示し、1103と1104はそれぞれ「array0」と「char0」のアクセス属性を示している。「array0」は期間1101において「thread_0」に対してPrivate属性に、期間1102において「thread_1」に対してPrivate属性に決定され、「char0」は全ての期間においてPublic属性に決定される。
【0040】
図11は、決定されたアクセス属性を記述したアクセス属性情報205の一例を示す図である。このアクセス属性情報205は、「thread_0」による「array0」に対するメモリアクセスおよび「thread_1」による「array0」に対するメモリアクセスにはPrivate属性が、「thread_0」による「char0」に対するメモリアクセス、「thread_1」による「char0」に対するメモリアクセスおよび「thread_2」による「char0」に対するメモリアクセスにはPublic属性が、夫々設定されていることを示している。
【0041】
なお、アクセス属性決定部102は、メモリアクセスの回数をプロファイル情報202から取得するとして説明したが、解析部101が求めたメモリアクセスの回数を取得するようにしてもよい。具体的には、例えば、アクセス属性決定部102は、プログラムの記述から、「array0」が「thread_0」においてreadとwriteのメモリアクセスを各10回実行され、合計20回のメモリアクセスがなされることがわかる。評価値の算出に、プロファイル情報202を使用しないようにすると、プログラム変換装置100へのプロファイル情報202の入力を不要とすることができる。
【0042】
また、アクセス単位データに対する1回のメモリアクセスに要する時間やアクセス属性変更に要する時間等、評価値の算出に用いられる情報は、アクセス属性決定部102に予め保持されるようにしてもよいし、外部からプログラム変換装置100に入力されるようにしてもよい。
【0043】
次に、非共有化対象分類部103は、アクセス属性情報205に基づいて、非共有化処理対象のアクセス単位データを抽出し、非共有化対象リスト206を出力する(S4)。具体的には、非共有化対象分類部103は、S4の処理を開始すると、Private属性でメモリアクセスされるアクセス単位データを抽出し、非共有化対象リスト206に記録する。アクセス属性情報205によれば、「array0」がPrivate属性でメモリアクセスされ、「char0」がPublic属性でメモリアクセスされるので、S11の処理により、「array0」が非共有化処理対象として非共有化対象リスト206に記録される。
【0044】
続いて、変換部104は、非共有化対象リスト206に基づいてソースプログラム201に非共有化処理を挿入する(S5)。非共有化処理を示す記述は、API形式、コンパイラプラグマ方式、オブジェクトに非共有化情報を持たせる方式、ポインタ形式等、様々な方式で記述することができる。
【0045】
図12−1〜4は、非共有化処理を挿入したソースプログラム207の記述例である。図12−1はAPI形式、図12−2はオブジェクトに非共有化情報を持たせる方式、図12−3はコンパイラプラグマ方式、図12−4はポインタ形式、で記述している。各図において、「UNSHARED(array0)」(図12−1、2071)が、「#pragma unshared array0」(図12−2、2072)が、「array0.unshared()」(図12−3、2073)が、「unshared *unshared_list[1]」と「unshared_list[0]=array0」(図12−4、2074)とが、夫々非共有化情報に該当する。なお、ソースプログラム201では、アクセス単位データとして「array0」と「char0」とが存在するため、「array0」を非共有化処理対象とすることは、「char0」を非共有化処理対象とすることと同じである。図12−1〜4の例においては、「array0」と「char0」との夫々に対して非共有化処理するようにしてもよい。具体的には、2071を「UNSHARED(array0, char0)」に変更してよい。同様に、2072を「#pragma unshared array0 char0」に、2073を「array0.unshared()」と「char0.unshared()」とに、2074を「unshared *unshared_list[2]」と「unshared_list[0]=array0」と「unshared_list[1]=char0」とに変更してもよい。
【0046】
次に、変換部104は、アクセス属性情報205に基づいて、ソースプログラム207に属性設定処理を挿入する(S6)。属性設定処理は、API形式、コンパイラプラグマ方式、オブジェクトにアクセス属性を指定する情報を持たせる方式、ポインタ形式等、様々な方式で記述することができる。
【0047】
図13−1〜4は、属性設定処理を挿入した変換後プログラム203の記述例である。図13−1はAPI形式、図13−2はオブジェクトにアクセス属性を指定する情報を持たせる方式、図13−3はコンパイラプラグマ方式、図13−4はポインタ形式、で記述している。図13−1においては、「PRIVATE(array0)」と「PUBLIC(array0)」(2031)とが属性設定処理に該当する。「PRIVATE(array0)」は、「array0」をPrivate属性に設定する処理APIであり、「PUBLIC(array0)」は「array0」をPublic属性に設定する処理APIである。図13−2の2032および図13−3の2033が属性設定処理に該当する。同様に、「array0」をPrivate属性またはPublic属性に変更する。図13−4においては、「public int array[0]」、「private int *private_array0」、「private_array0=array」、および「array0=private_array0」(2034)が属性設定処理に該当する。2034は、Private属性のポインタ変数「*private_array0」にアクセス単位データ「array0」のアドレスを渡すことで「array0」をPrivate属性に設定している記述である。なお、図13−4では、「thread_0」、「thread_1」を抜けるとPrivate属性の設定が無効になってPublic属性に戻るようになっている。
【0048】
続いて、変換部104は、非共有化処理および属性設定処理を挿入した変換後プログラム203を出力し(S7)、動作が終了となる。
【0049】
なお、以上の説明においては、変換部104は、ソースプログラム201に非共有化処理を挿入した後に属性設定処理を挿入するとして説明したが、各処理の挿入の順序はこれに限定されない。
【0050】
また、変換部104は、コンパイラ装置をさらに備えることにより、ハードウェアや仮想マシン上で実行可能なプログラムコードを生成し、生成したプログラムコードを変換後プログラム203として出力するようにしてもよい。また、変換部104は、コンパイラ装置に入力可能なメモリマップ情報を生成し、生成したメモリマップ情報を出力するようにしてもよい。
【0051】
また、アクセス属性としてPrivate属性とPublic属性とが用いられるとして説明したが、他の様々なアクセス属性を追加で定義したり、Private属性またはPublic属性をさらに粒度を細かくしたアクセス属性を定義することが可能である。例えば、コア301〜104のうちの複数が同一のアクセス単位データに対して読み込み処理のみを行う場合には、それらのコアのL1キャッシュにデータを移動させることを許容する属性が採用できる。様々なアクセス属性を設定可能に構成する場合には、非共有化対象分類部103は、キャッシュコヒーレンシを保つためにライトバック処理(および無効化処理)を必要とするか否かに基づいて非共有化処理対象とするか否かを決定するとよい。即ち、非共有化対象分類部103は、一つでもライトバック処理を必要とするアクセス属性に設定されるアクセス単位データを非共有化処理対象に分類し、ライトバック処理を必要とするアクセス属性がどのメモリアクセスに対しても設定されていないアクセス単位データを非共有化処理対象に分類しないようにするとよい。因みに、ライトバック処理を必要とする処理とは、1次キャッシュ311〜314を用いて書き込み処理を行うメモリアクセスが該当する。非共有化対象分類部103が1次キャッシュ311〜314を用いて書き込み処理を行うメモリアクセスを特定することができるようにするためには、解析部101は、メモリアクセス毎のスレッドとアクセス単位データとを記述した第1のリストにアクセス種別を記述し、当該第1のリストを非共有化対象分類部103に入力するようにするとよい。
【0052】
また、ソースプログラム201を記述する言語は特定の言語に限定されない。例えば、C言語やJava(登録商標)言語を採用することができるし、特定の処理装置独自のプログラミング言語を採用することができる。
【0053】
また、ソースプログラム201は、1つのファイルに記述されたものであってもよいし、複数のファイルに分割されて記述されたものであってもよい。同様に、変換後プログラム203も、複数に分割して出力されるようにしてもよい。
【0054】
また、プログラム変換装置100が変換することができるソースプログラム201のターゲットアーキテクチャは、上記に説明した情報処理装置300だけに限定されない。例えば、プログラム変換装置100が変換することができるソースプログラム201のターゲットアーキテクチャは、L1キャッシュのみを持ち、L2キャッシュがないアーキテクチャであってもよい。また、全コアから読み込み、書き込み処理が可能で、L2キャッシュよりも遅く、メインメモリより高速に動作し、L2キャッシュよりも容量が大きく、メインメモリよりも小さいL3キャッシュを1つ持つアーキテクチャでもよい。また、さらにメモリ階層の数を増やしたアーキテクチャでもよい。また、L2キャッシュが特定のコアからのみアクセスできるようになっているアーキテクチャでもよい。また、スクラッチパッドメモリを持つアーキテクチャ、L1キャッシュが他のコアからもアクセスできるアーキテクチャでもよい。
【0055】
また、アクセス属性決定部102は、解析結果情報204に基づいて排他アクセスを特定するようにしたが、コンパイラの依存解析技術を用いて、特定のスレッドからのみアクセスするアクセス単位データを抽出したり、並列に実行されうる複数のスレッドの中の1つのスレッドからのみアクセスするアクセス単位データを抽出したりする等の解析を行うようにしてもよい。
【0056】
また、プロファイル情報202に並列に実行されうるスレッドの集合のリストを持たせ、アクセス属性決定部102は、当該プロファイル情報202から排他アクセスを特定するようにしてもよい。なお、プロファイル情報202、必ずしもソースプログラム201の全てを示している情報であるとは限らない。例えば、ソースプログラム201中のあるスレッド内に条件分岐が存在し、当該スレッドは、条件が満たされた場合のみ、あるアクセス単位データにアクセスするとき、条件が一度も満たされず実行された際に生成されるプロファイル情報201は、条件が満たされ実行された際の情報を保持していないことがある。この場合、プロファイル情報201を基にした解析を行うと解析結果が誤る可能性がある。こうした問題を回避するため、スレッドがソースプログラム201中のアクセス単位データに対して排他アクセスするか否かをプログラマが指定する方法をとることが可能である。
【0057】
このように、第1の実施形態によれば、アクセス属性決定部102は、ソースプログラム201を構成するスレッドによるメモリアクセスから排他アクセスを求め、前記求めた排他アクセスのうちから1次キャッシュ311〜314を使用するメモリアクセスを決定し、非共有化対象分類部103は、1次キャッシュ311〜314を使用してメモリアクセスされると決定されたアクセス単位データを、他のアクセス単位データとの間でキャッシュラインを非共有化させるアクセス単位データに決定し、変換部104は、アクセス属性決定部102による決定結果に基づいて1次キャッシュ311〜314を使用する処理(属性設定処理)を、非共有化対象分類部103による決定結果に基づいて非共有化処理を、ソースプログラム201に夫々挿入して変換後プログラム203を出力する、ように構成したので、ライトバック処理を必要とするメモリアクセスは1次キャッシュ311〜314を使用したメモリアクセスに含まれ、当該1次キャッシュ311〜314を使用したメモリアクセスがなされるアクセス単位データは非共有化処理される。即ち、プログラム変換装置100により生成された変換後プログラム203では、複数のコア301〜304が1次キャッシュ311〜314を使用してメモリアクセスするアクセス単位データは夫々異なるキャッシュラインに配置されているので、複数のコア301〜304が1次キャッシュ311〜314を使用したメモリアクセスを同時に行ってもキャッシュコヒーレンシを保つことができる。したがって、第1の実施形態によれば、プロセッサコアが夫々キャッシュメモリを有するマルチプロセッサ環境でキャッシュメモリを効率よく使用できるプログラムに変換することができる。
【0058】
また、ソースプログラム201によるメモリアクセス毎のスレッドとアクセス単位データとの対の一覧を記述した第1のリストと並列に実行されうるスレッドの集合の一覧を記述した第2のリストとを生成する解析部101をさらに備え、アクセス属性決定部102は、第1および第2のリストに基づいて排他アクセスを求める、ように構成した。
【0059】
また、アクセス属性決定部102は、排他アクセスを1次キャッシュ311〜314を使用してした場合と使用しないでした場合との夫々で性能評価し、性能評価の結果に基づいて排他アクセスのうちから1次キャッシュ311〜314を使用するメモリアクセスを決定する、ように構成したので、第1の実施形態によれば、排他アクセスであっても、性能が低下する場合には1次キャッシュ311〜314を使用しないようにすることができる。したがって、キャッシュメモリをさらに効率よく使用できるプログラムに変換することができる。
【0060】
(第2の実施形態)
あるアクセス単位データが、特定のアクセス単位データとキャッシュラインを共有すると、キャッシュコヒーレンシを保つ制約から性能低下を引き起すが、特定のアクセス単位データを除く他のアクセス単位データと共有しても性能低下を引き起こさない場合がある。第2の実施形態のプログラム変換装置は、ライトバック処理を必要とするアクセス単位データを一律に非共有化処理の対象とするのではなく、キャッシュラインを共有すると性能低下を引き起こすアクセス単位データの対を特定し、特定したアクセス単位データの対のみ非共有化処理対象とする。また、ライトバック処理を必要とするアクセス単位データと並列にメモリアクセスされるアクセス単位データであっても、当該ライトバック処理を必要とするアクセス単位データと並列にメモリアクセスされるアクセス単位データに対するメモリアクセスが読み込み処理であってかつこのアクセス単位データがライトバック処理を必要しない場合には、双方のアクセス単位データがキャッシュラインを共有することを許容する。
【0061】
以下、第2の実施形態の説明では、第1の実施形態の説明で用いた図2の機能構成図および図5のフローチャートを準用し、第1の実施形態と異なる要素を重点的に説明する。
【0062】
図14は、プログラム変換装置100に入力されるソースプログラム201の別の例を示す図であり、図15は、図14に示すソースプログラム201を実行したときのメモリアクセスを時系列順に示す図である。
図14に示すソースプログラム201において、「char1」は、「char0」とは異なる1つの変数を示す。図15に示すように、このソースプログラム201によれば、「thread_0」は、「array0」の10個の要素に対する読み込み処理を実行する。「thread_0」の処理が終了した後、「thread_1」は、「array0」の各要素への読み込み処理と「char1」に対する書き込み処理とを実行し、「thread_2」は、「char0」へ書き込み処理を実行する。「thread_1」および「thread_2」の処理は、並列に実行することができる。
【0063】
図16は、プロファイル情報202を示す図である。このプロファイル情報202には、「thread_0」、「thread_1」、「thread_2」が「array0」、「char0」、「char1」に対してアクセスした回数が記録されている。
【0064】
図17は、解析結果情報204を示す図である。この解析結果情報204によると、「thread_0」と並列に実行しうるスレッドはなく、かつ「thread_0」は「array0」に読み込み処理を実行することがわかる。また、「thread_1」と「thread_2」とは並列に実行されることが可能であり、「thread_1」は「array0」に読み込み処理と「char1」に書き込み処理を実行し、「thread_2」は「char0」に書き込み処理を実行する。
【0065】
図18は、アクセス属性の決定結果を示す図である。図示するように、「thread_0」が実行されている期間2001においては「array0」、「char0」、「char1」は、全てのスレッドに対してPublic属性である。「thread_1」および「thread_2」が並列に実行されうる期間2002においては、「array0」はPublic属性のままとなっており、「char0」は「thread_1」に対してPrivate属性となっており、「char1」は「thread_2」に対してPrivate属性となっている。
【0066】
図19は、アクセス属性決定部102がS3の処理により出力する第2の実施形態のアクセス属性情報205を示す図である。第2の実施形態のアクセス属性情報205は、メモリアクセス毎にアクセス属性が記述されているのに加え、Public属性のメモリアクセスには、アクセス種別が記述されている。また、並列に実行されうるスレッドの集合のリストが記述されている。
【0067】
図20は、第2の実施形態におけるS4の処理をさらに詳しく説明するフローチャートである。非共有化対象分類部103は、S4の処理が開始すると、アクセス属性情報205に記述されているアクセス単位データを一つ選択する(S21)。S21の処理により選択されたアクセス単位データを第1のアクセス単位データということとする。
【0068】
続いて、非共有化対象分類部103は、第1のアクセス単位データとは別のアクセス単位データを1つ選択する(S22)。S22の処理により選択されたアクセス単位データを第2のアクセス単位データということとする。
【0069】
そして、非共有化対象分類部103は、第1および第2のアクセス単位データの組み合わせがキャッシュコヒーレンシを保てないパターンに該当するか否かを判定する(S23)。この組み合あせがキャッシュコヒーレンシを保てないパターンに該当する場合(S23、Yes)、この組み合わせを非共有化対象リスト206に追加する(S24)。この組み合わせがキャッシュコヒーレンシを保てないパターンに該当しない場合(S23、No)、非共有化対象分類部103は、S24の処理をスキップする。
【0070】
図21は、非共有化対象リスト206に追加する組み合わせと追加しない組み合わせを説明する図である。なお、図21は、第1および第2のアクセス単位データと、並列に実行されうる2つのスレッド「thread_x」、「thread_y」との関係を例に示している。
【0071】
パターン0では、第1のアクセス単位データは、「thread_x」および「thread_y」の夫々からPrivate属性のメモリアクセスがなされ、第2のアクセス単位データは「thread_x」および「thread_y」のどちらからもアクセスがなされないことを示している。パターン0によれば、第1および第2のアクセス単位データは同時にメモリアクセスされることがないので、「thread_x」および「thread_y」に関し、第1および第2のアクセス単位データがキャッシュラインを共有してもキャッシュコヒーレンシを保つことができる。即ち、第1および第2のアクセス単位データとの組み合わせは、「thread_x」および「thread_y」に関し、非共有化処理対象と判定されない。
【0072】
パターン1は、第1のアクセス単位データは、「thread_x」からPrivate属性のメモリアクセスがなされ、「thread_y」からメモリアクセスされず、第2のアクセス単位データは、「thread_x」からメモリアクセスされず、「thread_y」からPublic属性の読み込み処理がなされることを示している。パターン1によれば、第1および第2のアクセス単位データを同一のキャッシュラインに配置すると、当該キャッシュラインは「thread_x」によりライトバック処理がなされるが、「thread_x」によるライトバック処理の前後で第2のアクセス単位データが変更されず、また、「thread_y」によるメモリアクセスによっても第2のアクセス単位データが変更されないので、第1のアクセス単位データと第2のアクセス単位データとがキャッシュラインを共有してもキャッシュコヒーレンシを保つことができる。即ち、第1および第2のアクセス単位データの組み合わせは、「thread_x」および「thread_y」に関し、非共有化処理対象と判定されない。
【0073】
パターン2は、第1のアクセス単位データは、「thread_x」からPrivate属性のメモリアクセスがなされ、「thread_y」からメモリアクセスされず、第2のアクセス単位データは、「thread_x」からメモリアクセスされず、「thread_y」からPublic属性の書き込み処理がなされることを示している。パターン2によれば、第1および第2のアクセス単位データを同一のキャッシュラインに配置すると、当該キャッシュラインは「thread_x」によりライトバック処理がなされ、「thread_x」によるライトバック処理の前後で第2のアクセス単位データが変更されない。一方、「thread_y」によるメモリアクセスによって第2のアクセス単位データが変更されるので、第1および第2のアクセス単位データがキャッシュラインを共有すると、キャッシュコヒーレンシを保つことができない。即ち、第1および第2のアクセス単位データの組み合わせは、「thread_x」および「thread_y」に関し、非共有化処理対象と判定される。
【0074】
パターン3は、第1のアクセス単位データは、「thread_x」からPrivate属性のメモリアクセスがなされ、「thread_y」からメモリアクセスされず、第2のアクセス単位データは、「thread_x」からメモリアクセスされず、「thread_y」からPrivate属性のメモリアクセスがなされることを示している。パターン3は、図1を用いて説明した場合に該当する。即ち、第1および第2のアクセス単位データがキャッシュラインを共有すると、キャッシュコヒーレンシを保つことができない。即ち、第1およびと第2のアクセス単位データの組み合わせは、「thread_x」および「thread_y」に関し、非共有化処理対象と判定される。
【0075】
パターン4は、第1および第2のアクセス単位データは、ともに、「thread_x」および「thread_y」の夫々からPublic属性のメモリアクセスがなされることを示している。パターン4によれば、第1および第2のアクセス単位データは「thread_x」および「thread_y」のどちらからのメモリアクセスにもライトバック処理を必要としないので、双方のアクセス単位データがキャッシュラインを共有してもキャッシュコヒーレンシを保つことができる。即ち、第1および第2のアクセス単位データの組み合わせは、「thread_x」および「thread_y」に関し、非共有化処理対象と判定されない。
【0076】
なお、S23の判定処理は、並列に実行可能なスレッドの全ての対について判定される。何らか一つの対について第1および第2のアクセス単位データの組み合わせがパターン2またはパターン3に該当した場合には、S23、Yesと判定され、全てのスレッドの対について第1および第2のアクセス単位データの組み合わせがパターン0またはパターン1またはパターン4に該当した場合には、S23、Noと判定される。
【0077】
パターン2およびパターン3に該当した、第1および第2のアクセス単位データの組み合わせを非共有化対象リストに追加する。例えば、パターン3の場合、「thread_1」と「thread_2」からメモリアクセスされる「char0」と「char1」の組み合わせを記述する。
【0078】
なお、アクセス属性決定部102は、アクセス属性情報205にアクセス種別や並列に実行されうるスレッドの集合のリストを記述せず、非共有化対象分類部103は、解析結果情報204に記述されているアクセス種別、並列に実行されうるスレッドの集合のリスト、およびアクセス属性情報205を参照してS23の判定処理を実行するようにしてもよい。
【0079】
S23、Noと判定した後またはS24の処理の後、非共有化対象分類部103は、第2のアクセス単位データを全て選択済みであるか否かを判定する(S25)。第2のアクセス単位データとして選択可能なアクセス単位データが残っている場合(S25、No)、S22に移行して、未選択のアクセス単位データから新たな第2のアクセス単位データを選択する。未選択のアクセス単位データが残っていない場合(S25、Yes)、非共有化対象分類部103は、第1のアクセス単位データを全て選択済みであるか否かをさらに判定する(S26)。第1のアクセス単位データとして選択可能なアクセス単位データが残っている場合(S26、No)、非共有化対象分類部103は、S21に移行して、未選択のアクセス単位データから新たな第1のアクセス単位データを選択する。未選択のアクセス単位データが残っていない場合(S26、Yes)、非共有化対象分類部103は、S4の処理を終了する。なお、S25、Yesと判定された場合、第2のアクセス単位データの選択履歴はリセットされる。
【0080】
S5の処理において、変換部104は、非共有化対象リスト206に記述されているアクセス単位データの組み合わせを同一のキャッシュラインに配置しない非共有化処理を挿入する。
【0081】
以上述べたように、第2の実施形態によれば、非共有化対象分類部103は、Private属性のメモリアクセスがなされるアクセス単位データを一律に非共有化処理対象とするのではなく、並列に実行されるスレッドのうち、一のスレッドからPrivate属性のメモリアクセスがなされる第1のアクセス単位データと、他のスレッドからPublic属性で書き込み処理またはPrivate属性でメモリアクセスされる第2のアクセス単位データと互いにキャッシュラインを非共有化させる対象とする、ようにした。これにより、非共有化対象のアクセス単位データを第1の実施形態よりも少なくすることができるので、キャッシュメモリをさらに効率よく使用できるようにプログラムを変換することができる。
【0082】
なお、非共有化対象分類部103は、並列に実行されうるスレッドのうち、一のスレッドからPrivate属性で書き込み処理される第1のアクセスデータと、他のスレッドからPrivate属性またはPublic属性で書き込み処理される第2のアクセスデータとを互いにキャッシュラインを非共有化させる対象としてもよい。さらに、非共有化対象のアクセス単位データを少なくすることができ、キャッシュメモリを効率よく使用できるようにプログラムを変換することができる。
【0083】
(第3の実施形態)
複数のアクセス単位データが、常に同一のタイミングで、同一のスレッドから同一のアクセス属性のメモリアクセスがなされる場合には、たとえアクセス属性がライトバック処理を要するものであっても、当該複数のアクセス単位データがキャッシュラインを共有しても、キャッシュコヒーレンシを保つことができる。そのような場合には、当該複数のアクセス単位データがPrivate属性に設定されることがあっても、当該複数のアクセス単位データの組み合わせを同一のキャッシュラインに配置するようにしてもよい。
【0084】
具体的には、非共有化対象分類部103は、メモリアクセスされるスレッドと当該メモリアクセスのアクセス属性との組み合わせがスレッド毎に一致する複数のアクセス単位データを抽出し、抽出した複数のアクセス単位データのうちのどの対もキャッシュラインを非共有化処理対象から除外するようにする。
【0085】
例えば、図22に示すようなメモリアクセスがなされる場合を考える。この場合には、期間2501において、「thread_0」は、「array0」と「array1」とにPrivate属性のメモリアクセスを行い、期間2502において、「thread_1」は、「array0」と「array1」とにPrivate属性のメモリアクセスを行う。非共有化対象分類部103は、「array0」と「array1」との対は、メモリアクセスされるスレッドと当該メモリアクセスのアクセス属性との組み合わせがスレッド毎に一致するので、当該対を非共有化処理対象から除外する。
【0086】
このように、第3の実施の形態によれば、メモリアクセスされるスレッドと当該メモリアクセスのアクセス属性との組み合わせがスレッド毎に一致する複数のアクセス単位データを非共有化処理対象から除外するようにしたので、前記複数のアクセス単位データを非共有化処理対象とする場合に比べてキャッシュメモリを効率的に使用することができるようになる。
【0087】
(第4の実施形態)
配列の1つ以上の要素、構造体のメンバ変数など、配列や構造体を構成するデータの一部をアクセス単位データとして各種処理を実行するようにしてもよい。
【0088】
図23は、ソースプログラム201の別の例を示す図である。この例においては、「array0」は100の要素を有し、「thread_0」および「thread_1」はそのうちの0〜9番目までの要素にのみメモリアクセスを行っている。このような場合には、「array0」を構成する要素のうち、0〜9番目までの要素をまとめて一つのアクセス単位データとして扱うことが可能である。
【0089】
第4の実施形態の非共有化対象リスト206は、配列のうちのアクセス単位データとして扱う要素を特定する記述を含んでいる。例えば、array0[i] i=0,10のように記述される。
【0090】
なお、配列の一部に対する非共有化処理も、配列の全体に対する非共有化処理と同様に、API形式、コンパイラプラグマ方式、オブジェクトに非共有化情報を持たせる方式ポインタ形式、変数方式等、様々な方式で記述することができる。
【0091】
このように、第4の実施の形態によれば、配列や構造体を構成するデータを1つのアクセス単位データとして扱うようにしたので、非共有化対象リスト206のサイズを小さくすることができるので、RAM2を効率的に使用して変換後プログラム203を生成することができるようになる。
【0092】
(第5の実施形態)
プログラム変換装置100は、アクセス属性決定部102、非共有化対象分類部103、変換部104を具備するとして説明したが、これらの構成要素のうちの複数を統合したり、これらの構成要素のうちの一つを分割したり、一部の構成要素の実行順番を入れ替えたりして構成するようにしてもかまわない。
【0093】
例えば、非共有化対象分類部103は、まず、解析部101が出力した解析結果情報204やプロファイル情報202に基づいてソースプログラム201を構成するスレッドが行うメモリアクセスのうち排他アクセスを求め、当該求めた排他アクセスがなされるアクセス単位データのうちから非共有化処理対象のアクセス単位データを決定する。ここで、非共有化対象分類部103は、排他アクセスされるアクセス単位データを全て非共有化処理対象とするようにしてもよいし、書き込み処理を伴う排他アクセスがなされるアクセス単位データのみを非共有化処理対象とするようにしてもよい。また、性能評価に基づいて排他アクセスされるアクセス単位データのうちから非共有化処理対象を選択するようにしてもよい。非共有化対象分類部103は、非共有化処理対象に決定したアクセス単位データを、非共有化対象リスト206に記述して出力する。
【0094】
そして、アクセス属性決定部102は、非共有化対象リスト206を参照し、非共有化対象のアクセス単位データに対するメモリアクセスのうちから、性能評価に基づいてPrivate属性に設定するメモリアクセスを決定する。そして、他のメモリアクセスをPublic属性に決定する。アクセス属性決定部102は、アクセス属性の決定結果をアクセス属性情報205に記述して出力する。
【0095】
変換部104は、第1〜第4の実施形態と同様に、アクセス属性情報205および非共有化対象リスト206に基づいてソースプログラム201に各種処理を挿入し、変換後プログラム203を出力する。
【0096】
以上述べたように第1〜第5の実施形態によれば、少なくともライトバック処理の有無に基づいてアクセス単位データを他のアクセス単位データと非共有化するか否かを決定し、決定結果に基づいてソースプログラム201に非共有化処理を挿入するようにしたので、プロセッサコアが夫々キャッシュメモリを有するマルチプロセッサ環境でキャッシュメモリを効率よく使用できるようにプログラムを変換することができる。
【0097】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0098】
6 変換プログラム、100 プログラム変換装置、101 解析部、102 アクセス属性決定部、103 非共有化対象分類部、104 変換部、201 ソースプログラム、202 プロファイル情報、203 変換後プログラム、204 解析結果情報、205 アクセス属性情報、206 非共有化対象リスト、300 情報処理装置。
【特許請求の範囲】
【請求項1】
個別にキャッシュメモリを有する複数のプロセッサコアを備えるマルチプロセッサ環境で実行されるソースプログラムを構成するスレッドによる排他的なメモリアクセスから前記キャッシュメモリを使用するメモリアクセスを決定するアクセス属性決定部と、
前記キャッシュメモリを使用してメモリアクセスされるアクセスデータのうちから、任意のアクセスデータとの間でキャッシュラインを非共有化させるアクセスデータを決定する非共有化対象分類部と、
前記アクセス属性決定部による決定結果に基づいて前記キャッシュメモリを使用する処理、および、前記非共有化対象分類部による決定結果に基づいて前記キャッシュラインを非共有化させる処理を、前記ソースプログラムに挿入し、前記挿入したソースプログラムを出力する変換部と、
を備えることを特徴とするプログラム変換装置。
【請求項2】
前記ソースプログラムを解析し、メモリアクセス毎のスレッドとアクセスデータとの対を記述した第1のリストと、並列に実行されるスレッドの集合を記述した第2のリストとを生成する解析部をさらに備え、
前記アクセス属性決定部は、前記第1および第2のリストに基づいて前記排他的なメモリアクセスを求める、
ことを特徴とする請求項1に記載のプログラム変換装置。
【請求項3】
前記アクセス属性決定部は、前記排他的なメモリアクセスをキャッシュメモリを使用した場合と使用しない場合との夫々で性能評価し、評価結果に基づいて前記排他的なメモリアクセスのうちから前記キャッシュメモリを使用するメモリアクセスを決定する、
ことを特徴とする請求項1に記載のプログラム変換装置。
【請求項4】
前記非共有化対象分類部は、前記キャッシュメモリを使用してメモリアクセスされるアクセスデータの全てを任意のアクセスデータとの間でキャッシュラインを非共有化させることに決定する、
ことを特徴とする請求項1に記載のプログラム変換装置。
【請求項5】
個別にキャッシュメモリを有する複数のプロセッサコアを備えるマルチプロセッサ環境で実行されるソースプログラムを構成するスレッドによる排他的なメモリアクセスから前記キャッシュメモリを使用するメモリアクセスを決定するアクセス属性決定ステップと、
前記キャッシュメモリを使用してメモリアクセスされるアクセスデータのうちから、任意のアクセスデータとの間でキャッシュラインを非共有化させるアクセスデータを決定する非共有化対象分類ステップと、
前記アクセス属性決定ステップによる決定結果に基づいて前記キャッシュメモリを使用する処理、および、前記非共有化対象分類ステップによる決定結果に基づいて前記キャッシュラインを非共有化させる処理を、前記ソースプログラムに挿入し、前記挿入したソースプログラムを出力する変換ステップと、
を備えることを特徴とするプログラム変換方法。
【請求項6】
個別にキャッシュメモリを有する複数のプロセッサコアを備えるマルチプロセッサ環境で実行されるソースプログラムを構成するスレッドによる排他的なメモリアクセスから前記キャッシュメモリを使用するメモリアクセスを決定するアクセス属性決定ステップと、
前記キャッシュメモリを使用してメモリアクセスされるアクセスデータのうちから、任意のアクセスデータとの間でキャッシュラインを非共有化させるアクセスデータを決定する非共有化対象分類ステップと、
前記アクセス属性決定ステップによる決定結果に基づいて前記キャッシュメモリを使用する処理、および、前記非共有化対象分類ステップによる決定結果に基づいて前記キャッシュラインを非共有化させる処理を、前記ソースプログラムに挿入し、前記処理を挿入したソースプログラムを出力する変換ステップと、
をコンピュータに実行させることを特徴とする変換プログラム。
【請求項1】
個別にキャッシュメモリを有する複数のプロセッサコアを備えるマルチプロセッサ環境で実行されるソースプログラムを構成するスレッドによる排他的なメモリアクセスから前記キャッシュメモリを使用するメモリアクセスを決定するアクセス属性決定部と、
前記キャッシュメモリを使用してメモリアクセスされるアクセスデータのうちから、任意のアクセスデータとの間でキャッシュラインを非共有化させるアクセスデータを決定する非共有化対象分類部と、
前記アクセス属性決定部による決定結果に基づいて前記キャッシュメモリを使用する処理、および、前記非共有化対象分類部による決定結果に基づいて前記キャッシュラインを非共有化させる処理を、前記ソースプログラムに挿入し、前記挿入したソースプログラムを出力する変換部と、
を備えることを特徴とするプログラム変換装置。
【請求項2】
前記ソースプログラムを解析し、メモリアクセス毎のスレッドとアクセスデータとの対を記述した第1のリストと、並列に実行されるスレッドの集合を記述した第2のリストとを生成する解析部をさらに備え、
前記アクセス属性決定部は、前記第1および第2のリストに基づいて前記排他的なメモリアクセスを求める、
ことを特徴とする請求項1に記載のプログラム変換装置。
【請求項3】
前記アクセス属性決定部は、前記排他的なメモリアクセスをキャッシュメモリを使用した場合と使用しない場合との夫々で性能評価し、評価結果に基づいて前記排他的なメモリアクセスのうちから前記キャッシュメモリを使用するメモリアクセスを決定する、
ことを特徴とする請求項1に記載のプログラム変換装置。
【請求項4】
前記非共有化対象分類部は、前記キャッシュメモリを使用してメモリアクセスされるアクセスデータの全てを任意のアクセスデータとの間でキャッシュラインを非共有化させることに決定する、
ことを特徴とする請求項1に記載のプログラム変換装置。
【請求項5】
個別にキャッシュメモリを有する複数のプロセッサコアを備えるマルチプロセッサ環境で実行されるソースプログラムを構成するスレッドによる排他的なメモリアクセスから前記キャッシュメモリを使用するメモリアクセスを決定するアクセス属性決定ステップと、
前記キャッシュメモリを使用してメモリアクセスされるアクセスデータのうちから、任意のアクセスデータとの間でキャッシュラインを非共有化させるアクセスデータを決定する非共有化対象分類ステップと、
前記アクセス属性決定ステップによる決定結果に基づいて前記キャッシュメモリを使用する処理、および、前記非共有化対象分類ステップによる決定結果に基づいて前記キャッシュラインを非共有化させる処理を、前記ソースプログラムに挿入し、前記挿入したソースプログラムを出力する変換ステップと、
を備えることを特徴とするプログラム変換方法。
【請求項6】
個別にキャッシュメモリを有する複数のプロセッサコアを備えるマルチプロセッサ環境で実行されるソースプログラムを構成するスレッドによる排他的なメモリアクセスから前記キャッシュメモリを使用するメモリアクセスを決定するアクセス属性決定ステップと、
前記キャッシュメモリを使用してメモリアクセスされるアクセスデータのうちから、任意のアクセスデータとの間でキャッシュラインを非共有化させるアクセスデータを決定する非共有化対象分類ステップと、
前記アクセス属性決定ステップによる決定結果に基づいて前記キャッシュメモリを使用する処理、および、前記非共有化対象分類ステップによる決定結果に基づいて前記キャッシュラインを非共有化させる処理を、前記ソースプログラムに挿入し、前記処理を挿入したソースプログラムを出力する変換ステップと、
をコンピュータに実行させることを特徴とする変換プログラム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12−1】
【図12−2】
【図12−3】
【図12−4】
【図13−1】
【図13−2】
【図13−3】
【図13−4】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12−1】
【図12−2】
【図12−3】
【図12−4】
【図13−1】
【図13−2】
【図13−3】
【図13−4】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【公開番号】特開2013−101563(P2013−101563A)
【公開日】平成25年5月23日(2013.5.23)
【国際特許分類】
【出願番号】特願2011−245813(P2011−245813)
【出願日】平成23年11月9日(2011.11.9)
【出願人】(000003078)株式会社東芝 (54,554)
【Fターム(参考)】
【公開日】平成25年5月23日(2013.5.23)
【国際特許分類】
【出願日】平成23年11月9日(2011.11.9)
【出願人】(000003078)株式会社東芝 (54,554)
【Fターム(参考)】
[ Back to top ]