(57)【要約】【課題】マルチコアプロセッサのメモリ使用効率を向上できる。【解決手段】本発明の一実施形態に係るプログラム変換装置は、複数の変数を有する第１プログラムコードを、複数のコアを有するプロセッサによって実行される第２プログラムコードへ変換する。第２のプログラムコードは、所定のアクセスパターンでアクセスされると判定された変数を含むメンバ構造体と、そのメンバ構造体を指定するルートポインタとを有する。【選択図】  図１
2012038219.tif 000002
【特許請求の範囲】
【請求項１】
複数の変数を有する第１プログラムコードを、複数のコアを有するプロセッサによって実行される第２プログラムコードへ変換するプログラム変換装置であって、
前記第１プログラムコードが実行される場合に、前記第１プログラムコードに含まれる変数に対する前記プロセッサによるアクセスパターンを判定する判定部と、
（ａ）第１アクセスパターンでアクセスされると判定された変数を含む第１メンバ構造体と、（ｂ）前記複数のコアのうちのいずれかで実行される各スレッドのうち、第１スレッドを実行するコアによってアクセス可能であることを示す第１アクセス属性を有し、前記第１メンバ構造体を指定する第１ルートポインタと、（ｃ）第２アクセスパターンでアクセスされると判定された変数を含む第２メンバ構造体と、（ｄ）前記第１スレッドを実行するコア及び第２スレッドを実行するコアによってアクセス可能であることを示す第２アクセス属性を有し、前記第２メンバ構造体を指定する第２ルートポインタとを有する第２のプログラムコードへ、前記第１プログラムコードを変換する変換部とを備えるプログラム変換装置。
【請求項２】
前記第２プログラムコードは、前記プロセッサのメモリが備える複数の記憶単位のうち、前記第１メンバ構造体が記憶される１つ以上の第１記憶単位と、前記第２メンバ構造体が記憶される１つ以上の第２記憶単位とを重複させないためのコードをさらに含むことを特徴とする請求項１に係るプログラム変換装置。
【請求項３】
前記第１プログラムコードと、前記複数の変数のそれぞれに対する前記プロセッサによるアクセス回数を示すプロファイル情報とを入力する入力部をさらに備え、
前記判定部は、前記プロファイル情報を用いて、前記第１プログラムコードに含まれる変数に対する前記プロセッサによるアクセスパターンを判定することを特徴とする請求項１又は請求項２に係るプログラム変換装置。
【請求項４】
前記判定部は、前記第１プログラムコードに含まれる変数のうち、
前記第１スレッドを実行するコアによって更新される変数を前記第１アクセスパターンでアクセスされる変数と判定し、
前記第１スレッドを実行するコア及び前記第２スレッドを実行するコアによって更新される変数を前記第２アクセスパターンでアクセスされる変数と判定し、
前記複数のコアのいずれによっても更新されない変数を第３アクセスパターンでアクセスされる変数と判定することを特徴とする請求項１乃至請求項３のいずれか１項に記載のプログラム変換装置。
【請求項５】
前記第２プログラムコードは、前記第２ルートポインタの前記第２アクセス属性を、
前記第１スレッドに係るメモリアクセス期間は前記第１スレッドを実行するコアによってアクセス可能であることを示すアクセス属性へ変更し、
前記第２スレッドに係るメモリアクセス期間は前記第２スレッドを実行するコアによってアクセス可能であることを示すアクセス属性へ変更するためのコードをさらに含むことを特徴とする請求項１乃至請求項４のいずれか１項に記載のプログラム変換装置。
【請求項６】
複数の変数を有する第１プログラムコードを、複数のコアを有するプロセッサによって実行される第２プログラムコードへ変換するためのプログラムであって、
コンピュータに、
前記第１プログラムコードが実行される場合に、前記第１プログラムコードに含まれる変数に対する前記プロセッサによるアクセスパターンを判定する機能と、
（ａ）第１アクセスパターンでアクセスされると判定された変数を含む第１メンバ構造体と、（ｂ）前記複数のコアのうちのいずれかで実行される各スレッドのうち、第１スレッドを実行するコアによってアクセス可能であることを示す第１アクセス属性を有し、前記第１メンバ構造体を指定する第１ルートポインタと、（ｃ）第２アクセスパターンでアクセスされると判定された変数を含む第２メンバ構造体と、（ｄ）前記第１スレッドを実行するコア及び第２スレッドを実行するコアによってアクセス可能であることを示す第２アクセス属性を有し、前記第２メンバ構造体を指定する第２ルートポインタとを有する第２のプログラムコードへ、前記第１プログラムコードを変換する機能とを実現させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、プログラムの変換に関する。
【背景技術】
【０００２】
スクラッチパッドメモリを用いたアーキテクチャにおいて、メモリ最適化に関する技術がある（例えば、特許文献１）。この技術では、アプリケーションのプロファイル結果に基づいて、使用するデータをメインメモリからスクラッチパッドメモリにコピーする。しかし、特許文献１に係る技術はキャッシュメモリには適用できない。
【０００３】
キャッシュメモリを用いたアーキテクチャにおいて、メモリ最適化を行う技術がある（例えば、特許文献１）。この技術では、実行するアプリケーションのＯｂｊｅｃｔのメンバを分類し、同じグループに入るものをメモリ上の近い位置に配置する。しかし、特許文献２に係る技術は、各コアがメモリ等を有するマルチコアプロセッサには適用できない。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】米国特許公開公報  ２００７／０１７４８２９号
【特許文献２】米国特許登録公報  ６８６２７２９号
【発明の概要】
【発明が解決しようとする課題】
【０００５】
本発明の一観点は、マルチコアプロセッサのメモリ使用効率を向上できるプログラム変換装置を提供することを目的とする。
【課題を解決するための手段】
【０００６】
上記目的を達成するために、本発明の一実施形態に係るプログラム変換装置は、複数の変数を有する第１プログラムコードを、複数のコアを有するプロセッサによって実行される第２プログラムコードへ変換する。第２プログラムコードは、（ａ）第１アクセスパターンでアクセスされると判定された変数を含む第１メンバ構造体と、（ｂ）前記複数のコアのうちのいずれかで実行される各スレッドのうち、第１スレッドを実行するコアによってアクセス可能であることを示す第１アクセス属性を有し、前記第１メンバ構造体を指定する第１ルートポインタと、（ｃ）第２アクセスパターンでアクセスされると判定された変数を含む第２メンバ構造体と、（ｄ）前記第１スレッドを実行するコア及び第２スレッドを実行するコアによってアクセス可能であることを示す第２アクセス属性を有し、前記第２メンバ構造体を指定する第２ルートポインタとを有する。
【図面の簡単な説明】
【０００７】
【図１】第１実施形態に係るプログラム変換装置を示す図。
【図２】第１実施形態に係るプログラム変換装置の動作を示すフローチャート図。
【図３】変換前及び変換後プログラムコードの一例を示す図。
【図４】変換前プログラムコードの一例を示す図。
【図５】変換前プログラムコードの一例を示す図。
【図６】プロファイル情報の一例を示す図。
【図７】変換後プログラムコードの一例を示す図。
【図８】変換後プログラムコードの一例を示す図。
【図９】変換後プログラムコードを実行するアーキテクチャの一例を示す図。
【図１０】アクセス属性とメモリマップの一例を示す図。
【図１１】ルートポインタのアクセス属性の変遷を示す図。
【図１２】ルートポインタのアクセス属性の変遷を示す図。
【図１３】ルートポインタのアクセス属性の変遷を示す図。
【図１４】アクセス属性を変更するコードの一例を示す図。
【図１５】スクラッチパッドメモリとキャッシュメモリを示す図。
【図１６】アラインメントの一例を示す図。
【発明を実施するための形態】
【０００８】
以下、本発明の実施形態について説明する。
【０００９】
（第１の実施形態）
図１は、第１の実施形態に係るプログラム変換装置１００を示す図である。プログラム変換装置１００は、複数の変数を有するプログラムコードを、複数のコアを有するプロセッサ（マルチコアプロセッサ、メニーコアプロセッサ）によって実行されるプログラムコードへ変換する。プログラム変換装置１００は、入力部１１０と、判定部１２０と、変換部１３０と、出力部１４０とを備える。これらの機能ブロック（入力部１１０、判定部１２０、変換部１３０、出力部１４０）は、他の機能ブロックと協調しながら動作しても良く、１つの機能ブロックが複数の機能ブロックに分割されても良く、以下の説明に係る各機能ブロックの処理の順番が入れ替わっても良い。
【００１０】
図２は、第１の実施形態に係るプログラム変換装置１００の動作を示すフローチャートである。
【００１１】
まず、入力部１１０には、変換する対象であるプログラムコード（変換前プログラムコード）が入力される（ステップＳ１０１）。入力部１１０には、変換前プログラムコードを実行したときの各変数についてのプロファイル情報が入力されても良い。
【００１２】
次に、判定部１２０は、変換前プログラムコードに含まれる各変数へのプロセッサからのアクセスパターン（以下、変数のアクセスパターンと略記する。）を判定する（ステップＳ１０２）。判定部１２０は、変換前プログラムコードに含まれる各変数を、そのアクセスパターンごとにグループ化する。
【００１３】
次に、変換部１３０は、アクセスパターンによって分類された変数のグループごとに、メンバ構造体を作成する（ステップＳ１０３）。メンバ構造体は、変数のグループを有する構造体である。次に、変換部１３０は、各メンバ構造体へのポインタ（ルートポインタ）を作成する（ステップＳ１０４）。次に、変換部１３０は、変換前プログラムコードに含まれる変数のコードを、ルートポインタとメンバ構造体を用いて変数を指定するコードへ変換する（ステップＳ１０５）。
【００１４】
次に、出力部１４０は、変換部１３０によって変換されたプログラムコード（変換後プログラムコード）を出力する（ステップＳ２０６）。
【００１５】
上記の通り、入力部１１０から入力した変換前プログラムコードは、判定部１２０及び変換部１３０の処理を経て変換され、変換後プログラムコードとして出力部１４０から出力される。判定部１２０又は変換部１３０の出力の途中経過、処理結果を受けて、ユーザ等の判断により、再度、異なった方式で判定処理、変換処理が行われても良い。以下では、各機能ブロックの詳細を説明する。
【００１６】
図３、図４、図５は、プログラムコードを示す図である。入力部１１０は、変換前プログラムコード（図４、図５）を入力する。変換前プログラムコード（ソースプログラム）は、Ｃ言語やＪａｖａ(登録商標、以下同様)言語のようなプログラミング言語であっても良く、特定の処理装置独自のプログラミング言語であっても良い。変換前プログラムコードは、１つのファイルにすべての情報（複数の変数と、変数に対する演算処理の規定など）が含まれる必要はなく、複数のファイルにそれらの情報が分割されて含まれても良い。
【００１７】
入力部１１０は、プログラムコードをプログラム変換装置１００によって処理可能な状態にすることができれば、どのような入力方法であってもよい。入力部１１０は、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）のファイルシステムを用いて入力しても良く、ネットワークを介してメモリに記憶されたものを入力しても良く、プログラム変換装置１００に組み込まれたプログラムコードを入力しても良く、ＧＵＩ（Ｇｒａｐｈｉｃａｌ  Ｕｓｅｒ  Ｉｎｔｅｒｆａｃｅ）によってユーザにインタラクティブに入力させても良い。
【００１８】
入力部１１０は、変換前プログラムコードのプロファイル情報を入力しても良い。プロファイル情報とは、変換前プログラムコードが実行されたときに、プロセッサによる各変数に対するアクセスについての情報であればどのようなものであっても良い。プロファイル情報は、少なくともプログラムコードに含まれる各変数のアクセス回数を含む。プロファイル情報は、メモリアクセスがなされたタイミングについての情報や、プロセッサがメモリアクセスに用いるアドレス、プロセッサがメモリアクセスに要した時間、プロセッサによるアクセスが読み出し又は書き込みのどちらかを示す情報、いずれのスレッドからアクセスされたのか（スレッド番号）、いずれのコアからアクセスされたのか（コア番号）、等を有していても良い。
【００１９】
図６は、プログラムコードのプロファイル情報の一例を示す図である。図６に示すプロファイル情報は、プロセッサによるメモリアクセスごとに、メモリアクセスがなされたタイミングがプログラムの実行開始から何サイクル目であるかの情報（サイクル数）と、メモリアクセスに用いたアドレス（アドレス）と、読み出し（Ｒ）と書き込み（Ｗ）のどちらかと、いずれのスレッドからアクセスされたのかの情報（スレッド番号）とを有する。
【００２０】
「１５  ００１２  Ｒ  ３」は、プログラムが実行を開始して１５サイクル目にアドレス００１２に記憶された変数に対して読み込み処理を第３スレッドが行ったことを示す。「３７  １９２５  Ｗ  ２」は、プログラムが実行を開始して３７サイクル目にアドレス１９２５に記憶された変数に対して書き込み処理を第２スレッドが行ったことを示す。
【００２１】
プロファイル情報は、判定部１２０や変換部１３０で使用する情報を含んでいれば、プログラム変換装置１００専用のプロファイル情報生成装置によって生成されたものである必要はなく、汎用的な又は他の装置向けプロファイル情報生成装置等で生成しても良い。
【００２２】
プロファイル情報は、１つのファイルにすべての情報が含まれる必要はなく、複数のファイルにそれらの情報が分割されて含まれても良い。プロファイル情報が誤りである場合、各変数のアクセスパターンの分類に誤る可能性がある。この問題を回避するために、アクセスパターンの判定対象となる変数は、ユーザが事前に指定してもよい。アクセスパターンの判定対象となる変数（ユーザによって指定された変数）は、変換前プログラムコードに含まれるグローバル変数でも良く、その他スタティック変数や、定数、特定のスレッドでのみアクセスされるローカル変数などでも良い。アクセスパターンの判定対象となる指定方法は、変換前プログラムコードに含まれる全変数の一覧表（判定部１２０によって出力されても良い）から指定してもよく、予めアクセスパターンの判定対象となる変数が記載されたファイル（入力部１１０で入力されても良い、判定部１２０に記憶されても良い）に従って指定されても良い。
【００２３】
判定部１２０は、変換前プログラムコードに含まれる各変数のアクセスパターンを判定し、アクセスパターンごとに変数をグループ化する。アクセスパターンは、プロセッサによって変数がどのようにアクセスされるかを分類するものであればどのようなものであっても良く、例えば、読み出しのみがなされる変数と、書き込み（更新）がなされる変数とで分けられる。
【００２４】
判定部１２０は、変数のアクセスパターンを、プログラムコードを用いて、静的に判定しても良い。判定部１２０は、変数のアクセスパターンを、プログラムコードの実行結果（プロファイル情報等）を用いて、動的に判定しても良い。アクセスパターンは、読み出しのみがなされる変数と、書き込み（更新）のみがなされる変数と、読み出しと書き込みが両方なされる変数とで分けられても良い。アクセスパターンは、変数の型（整数型や浮動小数点型等）に応じて分けられても良い。アクセスパターンは、プログラムコードのいずれの関数に含まれるか、複数の関数によって呼び出されるか等に従って分けられても良い。アクセスパターンは、第１スレッドを実行するコアからアクセスされる変数と、第２スレッドを実行するコアからアクセスされる変数と、第１スレッドを実行するコア及び第２スレッドを実行するコアからアクセスされる変数とで分けられても良い。アクセスパターンは、第１スレッドを実行するコア及び第２スレッドを実行するコアから同時にアクセスされない変数と、第１スレッドを実行するコア及び第２スレッドを実行するコアから同時にアクセスされる変数とで分けられても良い。各スレッドが実行されるコアが静的に決定される場合等、アクセスパターンは、第１コアからアクセスされる変数と、第２コアからアクセスされる変数と、第１及び第２コアからアクセスされる変数とで分けられても良い。アクセスパターンは、複数のコアから同時にアクセスされない変数と、複数のコアから同時にアクセスされる変数とで分けられても良い。アクセスパターンは、プロファイル情報から、変数の操作（各コア内蔵メモリ間の移動、コア内蔵メモリと複数のコアで共有されるメモリ間の移動、複数のコアで共有されるメモリとすべてのコアで共有されるメモリ間の移動など）の有無や頻度に応じて分けられても良い。アクセスパターンは、変数の操作のタイミングに応じて分けられても良い。その他、アクセスパターンは、プロファイル情報に含まれる情報に応じて、分けられても良い。アクセスパターンは、上記の各分類方法の一部のみを用いても良く、複数の分類方法を組み合わせて用いても良い。
【００２５】
判定部１２０が判定するアクセスパターンの決定方法は、予め定められていても良く、プログラム変換装置１００に実装されていても良く、ユーザが入力部１１０で入力しても良く、外部からネットワーク等を通じて定められても良い。
【００２６】
以下では、アクセスパターンが、スレッドＡ、Ｂ、Ｃをそれぞれ実行するコアのうち、１以上のどのコアからアクセスされる変数であるかに従って、分けられる例を用いて、判定部１２０の動作例を説明する。
【００２７】
判定部１２０は、図３、図４、図５に示す変換前プログラムコードに含まれる変数のアクセスパターンを判定して、変数をグループ化する。判定部１２０は、変数のアクセスパターンを判定する際に必要な情報を、変換前プログラムコードあるいはプロファイル情報から取得する。以下ではスレッドに注目し、判定部１２０は、各スレッドでどのデータにアクセスしているのかという情報を取得するが、取得する情報はこれに限らない。例えば、判定部１２０は、読み込み操作のみが行われるもの、書き込み操作のみが行われるもの、読み込み及び書き込み操作の両方が行われるもの等、データに対する情報を取得しても良い。ソースプログラム中の関数や、整数型や浮動小数点型等のデータの型等の情報を取得しても良い。判定部１２０は、メモリアクセスが行われる時間情報を取得しても良い。判定部１２０は、どのコアからアクセスされる可能性があるか等の情報を取得しても良い。さらに、これらの１つ以上の方法を組み合わせたものを利用しても良い。
【００２８】
図３は、変換前プログラムコードが有する変数の構造（データ構造）を規定するコードを示す。図４は、変換前プログラムコードが有するｍａｉｎ関数及びグローバル宣言の部分を規定するコードを示す。図５は、変換前プログラムコードが有する各スレッドのコードを示す。関数ｔｈｒｅａｄ＿ＡがスレッドＡとしてコアに実行されるコード、関数ｔｈｒｅａｄ＿ＢがスレッドＢとしてコアに実行されるコード、関数ｔｈｒｅａｄ＿ＣがスレッドＣとしてコアに実行されるコードを示す。
【００２９】
スレッドＡを実行するコアは、図３の示す変換前プログラムコードに含まれる変数すべて「ａｒｒａｙ１，ａｒｒａｙ２，ａｒｒａｙ３，ｄａｔａ１，ｄａｔａ２，ｐ１」に対してアクセスする。スレッドＢを実行するコアは、図３の示す変換前プログラムコードに含まれる変数のうち、「ａｒｒａｙ１，ａｒｒａｙ２，ｄａｔａ１，ｄａｔａ２」に対してアクセスする。スレッドＣを実行するコアは、図３の示す変換前プログラムコードに含まれる変数のうち、「ａｒｒａｙ１，ｄａｔａ２」に対してアクセスする。
【００３０】
判定部１２０は、スレッドＡを実行するコアによりアクセスされる変数（第１グループ２１）「ａｒｒａｙ３，ｐ１」を第１のアクセスパターンと判定し、スレッドＡを実行するコア及びスレッドＢを実行するコアによりアクセスされる変数（第２グループ２２）「ａｒｒａｙ２，ｄａｔａ１」を第２のアクセスパターンと判定し、スレッドＡを実行するコア、スレッドＢを実行するコア、及びスレッドＣを実行するコアによりアクセスされる変数（第３グループ２３）「ａｒｒａｙ１，ｄａｔａ２」を第３のアクセスパターンと判定する。なお、判定部１２０が判定するアクセスパターンの種類はこれに限られず、上述のいずれであっても良い。判定部１２０は、変換前プログラムコードと、変換前プログラムコードに含まれる変数のアクセスパターン（いずれのグループに属するか）を示す情報とを、変換部１３０へ送る。判定部１２０は、プロファイル情報を、さらに変換部１３０へ送っても良い。
【００３１】
変換部１３０は、変換前プログラムコードを、変換前プログラムコードに含まれる変数のアクセスパターンを示す情報を用いて、メモリ最適化が容易な変換後プログラムコードに変換する。変換部１３０は、プログラムコードの変換の際に、プロファイル情報を用いても良い。変換部１３０は、変換前プログラムコード（図３の“１０”、図４、図５）を、変換後プログラムコード（図３の“３０”、図７、図８）へ変換する。
【００３２】
まず、変換部１３０は、アクセスパターンによって分類された変数のグループごとに、メンバ構造体を作成する。メンバ構造体は、同一のアクセスパターンと判定された変数のグループを含む構造体である。メンバ構造体に含まれる１つ以上の変数は、メモリ上の一連の領域で記憶される。メンバ構造体は、例えば、Ｃ言語の構造体、Ｊａｖａ言語のクラス等である。変換部１３０は、第１グループ２１の変数「ａｒｒａｙ３，ｐ１」を有するｐａｔｔｅｒｎＡ構造体と、第２グループ２２の変数「ａｒｒａｙ２，ｄａｔａ１」を有するｐａｔｔｅｒｎＢ構造体と、第３グループ２３の変数「ａｒｒａｙ１，ｄａｔａ２」を有するｐａｔｔｅｒｎＣ構造体と、を作成する。
【００３３】
次に、変換部１３０は、各メンバ構造体へのポインタ（ルートポインタ）を作成する。ルートポインタは、メンバ構造体のアドレスを指定できるものであればどのようなものであっても良く、例えば、Ｃ言語のポインタや、Ｊａｖａ言語の参照等である。変換部１３０は、ｐａｔｔｅｒｎＡ構造体を指定するルートポインタ「ｓｔｒｕｃｔ  ｐａｔｔｅｒｎＡ  ｐＡ（＝ｓｔｒｕｃｔ  ｐａｔｔｅｒｎＡ  ＊ｐ＿ａ）」と、ｐａｔｔｅｒｎＢ構造体を指定するルートポインタ「ｓｔｒｕｃｔ  ｐａｔｔｅｒｎＢ  ｐＢ（＝ｓｔｒｕｃｔ  ｐａｔｔｅｒｎＢ  ＊ｐ＿ｂ）」と、ｐａｔｔｅｒｎＣ構造体を指定するルートポインタ「ｓｔｒｕｃｔ  ｐａｔｔｅｒｎＣ  ｐＣ（＝ｓｔｒｕｃｔ  ｐａｔｔｅｒｎＣ  ＊ｐ＿ｃ）」とを作成する。
【００３４】
次に、変換部１３０は、変換前プログラムコードの中から、メンバ構造体に含まれる変数（メンバ）へのアクセスを規定するコードを抽出する。そして、変換部１３０は、変換前プログラムコードに含まれる変数へのアクセスを規定するコード（「ａｒｒａｙ１，ａｒｒａｙ２，ａｒｒａｙ３，ｄａｔａ１，ｄａｔａ２，ｐ１」）を、それぞれ、メンバ構造体へのアクセスを規定するコード（「ｐ＿ｃ−＞ａｒｒａｙ１，ｐ＿ｂ−＞ａｒｒａｙ２，ｐ＿ａ−＞ａｒｒａｙ３，ｐ＿ｂ−＞ｄａｔａ１，ｐ＿ｃ−＞ｄａｔａ２，ｐ＿ａ−＞ｐ１」）へ変換する。変換部１３０は、図４、図５に示す変換前プログラムコードを、図７、図８に示す変換後プログラムコードへ変換する。
【００３５】
上記の変換例では、メンバ構造体及びルートポインタをグローバル変数として宣言し、ルートポインタを介してメンバ構造体に含まれる変数へアクセスするためのコードへ変換するものであるが、これに限定されるものではない。変換部１３０は、変換後プログラムコード中の特定の関数でメンバ構造体及びルートポインタを宣言し、他の関数には引数で渡すためのコードへ変換してもよい。変換部１３０は、ルートポインタをメンバとする構造体を規定するためのコードを作成してもよい。変換部１３０は、メンバ構造体を階層構造にし、上位のメンバ構造体のメンバの中に下位のメンバ構造体のルートポインタを入れることを規定するコードを作成しても良い。
【００３６】
出力部１４０は、変換部１３０で変換されたソースコードをプログラム変換装置１００から出力する。変換後プログラムコードは、Ｃ言語やＪａｖａ言語のようなプログラミング言語であっても良く、特定の処理装置独自のプログラミング言語であっても良い。変換後プログラムコードは、１つのファイルにすべての情報が含まれる必要はなく、複数のファイルにそれらの情報が分割されて含まれても良い。変換前プログラムコードと変換後プログラムコードは、同一の言語でも異なる言語であっても良い。
【００３７】
出力部１４０は、変換後プログラムコードを、プロセッサに実行可能な状態にすることができれば、どのような出力方法であってもよい。出力部１４０は、ＯＳのファイルシステムを用いて出力しても良く、ネットワークを介して出力しても良く、ＧＵＩによってユーザにインタラクティブに出力させても良い。
【００３８】
図９は、マルチコアプロセッサ２００を示す図である。変換後プログラムは、例えば、図９に示すマルチコアプロセッサ２００等で実行される。このマルチコアプロセッサ２００は、４つのコア２１１〜２１４と、各コア２１１〜２１４のみがアクセス可能なＬ１キャッシュメモリ２２１〜２２４と、４つのコアがアクセス可能なＬ２キャッシュメモリ２３０と、メインメモリ２４０とを備える。Ｌ１キャッシュメモリ２２１〜２２４は、Ｌ２キャッシュメモリ２３０やメインメモリ２４０よりも高速にデータの読み込み、書き込み処理を行うことが可能であるが、容量はＬ２キャッシュメモリ２３０やメインメモリ２４０よりも小さい。Ｌ２キャッシュメモリ２３０は、メインメモリ２４０よりも高速にデータの読み込み、書き込み処理を行うことが可能であるが、容量はメインメモリ２４０よりも小さい。このアーキテクチャでは、キャッシュコヒーレンシを確保するために、ポインタによるアドレスの変更制御を行う。
【００３９】
スレッドとは、マルチコアプロセッサ２００の処理単位である。スレッドは、プログラムコードによっていずれのコア２１１〜２１４で実行されるかが静的に定められていても良く、プログラムコードの実行中にいずれのコア２１１〜２１４で実行されるかが動的に定められていても良い。
【００４０】
このアーキテクチャでは、第１コア２１１のＬ１キャッシュメモリ２２１に記憶された変数は、他（第２、第３、第４）のコア２１２〜２１４からはアクセスできない。そのため、第１コア２１１でＬ１キャッシュメモリ２２１に記憶された変数を変更（更新）した場合、他のコア２１２〜２１４はその変更を認識できず、第１コア２１１が変更する前の値（古いデータ）を使用してしまうという問題が生じうる。この問題は、Ｌ１キャッシュメモリ２２１〜２２４のみならず、各メモリ階層において、そのメモリの内容が特定のコアからのみしかアクセスできない状況で生じる。
【００４１】
そこで、第１コア２１１によって変更された変数は、他のコア２１２〜２１４によってその変数の処理がなされる前に、他のコア２１２〜２１４がアクセスできるＬ２キャッシュメモリ２３０やメインメモリ２４０に書き戻される。そして、第１コア２１１のＬ１キャッシュメモリ２２１に記憶された変数を無効化する。このようにして、キャッシュコヒーレンシを確保する。
【００４２】
図１０は、キャッシュコヒーレンシの実現方法を示す図である。このメモリマップ方式では、アドレスの上位４ビットは、アクセス属性を示す。アドレスの上位４ビットが“２”の場合、そのアドレスに記憶された変数は第１アクセス属性であることを示す。アドレスの上位４ビットが“１”の場合、そのアドレスに記憶された変数は第２アクセス属性であることを示す。アドレスの上位４ビットが“０”の場合、そのアドレスに記憶された変数は第３のアクセス属性であることを示す。実際の変数（データ）は、メモリマップ２２０Ａ上に存在する。メモリマップ２２０Ｂ、２２０Ｃは、仮想的な領域である。アクセス属性を変更するためのＡＰＩは、ポインタ（アドレス）を入力とし、アクセス属性変更後のポインタ（アドレス）を出力する。ＡＰＩは、入力されたポインタ（アドレス）の上位４ビットを変更する事で、アクセス属性を変更できる。さらに、ＡＰＩは、アクセス属性の変更の際にＬ１キャッシュメモリ上の変数を無効化する。このようにすることで、Ｌ１キャッシュメモリに記憶される変数とＬ２キャッシュメモリに記憶される変数とのコヒーレンシを確保できる。この他の実現方法としては、変数毎にアクセス属性を示す識別子を有していても良い。
【００４３】
変換後プログラムコードは、図９に示すアーキテクチャ以外で実行されても良い。アーキテクチャは、Ｌ１キャッシュメモリ２２１〜２２４のみを備え、Ｌ２キャッシュメモリ２３０を備えなくてもよい。アーキテクチャは、すべてのコア２１１〜２１４から読み出し、書き込みが可能で、Ｌ２キャッシュメモリ２３０よりも遅く、メインメモリ２４０より高速に動作し、Ｌ２キャッシュメモリ２３０よりも容量が大きく、メインメモリ２４０よりも容量が小さいＬ３キャッシュメモリを備えていても良い。アーキテクチャは、さらにメモリ階層の数が多いメモリを備えていても良い。アーキテクチャは、Ｌ２キャッシュメモリ２３０がすべてのコア２１１〜２１４ではなく、特定のコアからのみアクセスできる構成であっても良い。アーキテクチャは、スクラッチパッドメモリを備えていても良い。アーキテクチャは、あるコアに内蔵されるＬ１キャッシュメモリに記憶された変数が、他のコアからもアクセスできる構造であっても良い。アーキテクチャは、キャッシュコヒーレンシを確保するための独自の命令による制御（変数の操作）を行っても良い。この独自の命令は、アドレスの指定により、自動的に下位のメモリ階層にそのデータを書き戻すことができるｃｏｈｅｌｅｎｃｅといった命令等である。この独自の命令は、プログラマによりシステムコール等を用いて呼び出されても良い。アーキテクチャは、キャッシュコヒーレンシを制御するハードウェアを備えていても良い。
【００４４】
プログラム変換装置１００によって変換された変換後プログラムコードは、コンパイラ装置でコンパイルされ、マルチコアプロセッサ２００等で実行される。マルチコアプロセッサ２００は、変換後プログラムコードの実行時に、ルートポインタを用いて変数のアクセス属性を変化させることで、メモリ最適化を実現できる。
【００４５】
図１１、１２、１３は、各スレッドの実行期間と、ルートポインタ（変数）のメモリアクセス属性の変遷を示す図である。
【００４６】
白抜きの矢印は、各スレッドが実行状態である期間を示す。白抜きの矢印がない期間は、そのスレッドが実行状態でないことを示す。スレッドは、スレッドの実行が終了した場合、他のスレッドとの同期をとる場合等に、実行状態以外の状態となる。
【００４７】
塗りつぶしの矢印は、ルートポインタが第１又は第２アクセス属性である期間を示す。ルートポインタが第１アクセス属性である場合、ルートポインタのメンバ構造体に含まれる変数は、Ｌ１キャッシュメモリ２２１〜２２４、Ｌ２キャッシュメモリ２３０、及びメインメモリ２４０に記憶可能（あるスレッドを実行するコアによってアクセス可能）であることを示す。ルートポインタが第２アクセス属性である場合、ルートポインタのメンバ構造体に含まれる変数は、Ｌ２キャッシュメモリ２３０、及びメインメモリ２４０に記憶可能（各スレッドを実行する１つ以上のコアによってアクセス可能）であることを示す。図１１、１２、１３において、第１アクセス属性と記載された部分の右横に、塗りつぶしの矢印がある期間は、ルートポインタが第１アクセス属性を有する事を示す。第２アクセス属性と記載された部分の右横に、塗りつぶしの矢印がある期間は、ルートポインタが第２アクセス属性を有する事を示す。
【００４８】
スレッドの実行期間を示す白抜きの矢印と、ルートポインタのアクセス属性を示す塗りつぶしの矢印とを結ぶ矢印は、スレッドを実行するコアが変数に対してアクセス（読み出し又は書き込み）した事を示す。下方向の矢印と上方向の矢印との間に「ｒｅａｄ」と書かれている場合は、この間にスレッドを実行するコアが読み出し処理を行った事を示す。下方向の矢印と上方向の矢印との間に「ｗｒｉｔｅ」場合は、この間にスレッドを実行するコアが書き込み処理を行った事を示す。
【００４９】
第１アクセス属性であることを示す塗りつぶしの矢印と、第２アクセス属性であることを示す塗りつぶしの矢印との間の矢印（図１２）は、ルートポインタのアクセス属性が変化した事を示す。
【００５０】
図１１は、ルートポインタに指定されるメンバ構造体のメンバ（変数）へ、第３スレッドを実行するコアのみからアクセスされる場合のルートポインタのアクセス属性を示す。ルートポインタに指定されるメンバ構造体のメンバは、第３スレッド以外のスレッドを実行するコアからアクセスされない。そのため、ルートポインタに指定されるメンバ構造体は、第３スレッドを実行するコアに内蔵されるＬ１キャッシュに記憶され続けた場合であっても、キャッシュコヒーレンシ上の問題は生じない。
【００５１】
ルートポインタのアクセス属性を、Ｌ１キャッシュメモリ２２１〜２２４、Ｌ２キャッシュメモリ２３０、及びメインメモリ２４０に記憶可能（第３スレッドを実行するコアでアクセス可能）である第１アクセス属性に常に設定しておくことで、最も高速なＬ１キャッシュメモリ２２１〜２２４に記憶された状態での処理が可能となる。この結果、アプリケーションの性能を向上できる。
【００５２】
図１２は、ルートポインタに指定されるメンバ構造体のメンバ（変数）へ、第１スレッドを実行するコア及び第２スレッドを実行するコアからアクセスされる場合のルートポインタのアクセス属性を示す。ルートポインタに指定されるメンバ構造体のメンバは、第１、第２スレッドの一方を実行するコアからアクセスされる期間と、第１、第２スレッドの他方を実行するコアからアクセスされる期間とが重複しない。図１２の例では、キャッシュキャッシュコヒーレンシの問題が生じる可能性があるが、ルートポインタのアクセス属性を変更することで回避する。
【００５３】
第１スレッドを実行するコアからのアクセスがある場合、又は第２スレッドを実行するコアからのアクセスがある場合、アクセス前に、ルートポインタのアクセス属性は、第２アクセス属性（第１スレッドを実行するコア及び第２スレッドを実行するコアでアクセス可能）から第１アクセス属性（第１又は第２スレッドの一方を実行するコアでアクセス可能）に変更される。このため、最も高速なＬ１キャッシュメモリ２２１〜２２４に記憶された状態での処理が可能となる。この結果、アプリケーションの性能を向上できる。
【００５４】
そして、第１スレッドを実行するコアからのアクセスがあった後、又は第２スレッドを実行するコアからのアクセスがあった後、ルートポインタのアクセス属性は、第１アクセス属性（第１又は第２スレッドの一方を実行するコアでアクセス可能）から第２アクセス属性（第１スレッドを実行するコア及び第２スレッドを実行するコアでアクセス可能）に変更される。このような処理を行うことで、仮に、ルートポインタに指定されるメンバ構造体がＬ１キャッシュメモリ２２１〜２２４に記憶された場合でも、第２アクセス属性はＬ１キャッシュメモリ２２１〜２２４上に記憶されることが許可されないため、ルートポインタに指定されるメンバ構造体は、一旦Ｌ２キャッシュメモリ２３０やメインメモリ２４０に書き戻される。このため、キャッシュコヒーレンシの問題を回避でき、アプリケーションに問題を生じさせることはない。
【００５５】
図１４は、ルートポインタのアクセス属性を行うコードの例を示す図である。「ｍｅｍｃｈａｎｇｅ＿ｍｅｍ２ｔｏｍｅｍ１（ａｒｒａｙ，（ｓｉｚｅｏｆ（ｉｎｔ）＊１００））」は、ルートポインタａｒｒａｙのアクセス属性を第２アクセス属性から第１アクセス属性に変更するためのコード（ＡＰＩ）である。ａｒｒａｙは配列ａｒｒａｙの先頭の要素を指すポイントである。（ｓｉｚｅｏｆ（ｉｎｔ）＊１００）は配列ａｒｒａｙのデータサイズを示す。「ｍｅｍｃｈａｇｅ＿ｍｅｍ１ｔｏｍｅｍ２（ａｒｒａｙ，（ｓｉｚｅｏｆ（ｉｎｔ）＊１００））は、ルートポインタａｒｒａｙのアクセス属性を第１アクセス属性から第２アクセス属性に変更するためのコード（ＡＰＩ）である。アクセス属性の変更方法は、ＡＰＩを利用したアクセス属性の変更に限定されるものではない。例えば、システムコール等を用いて、ハードウェアに備わっているアクセス属性を変更する命令を直接利用しても良い。
【００５６】
図１３は、ルートポインタに指定されるメンバ構造体のメンバ（変数）へ、第１スレッドを実行するコア、第２スレッドを実行するコア、及び第３スレッドを実行するコアからアクセスされる場合のルートポインタのアクセス属性を示す。ルートポインタに指定されるメンバ構造体のメンバは、あるスレッドを実行するコアからアクセスされる期間と、他のスレッドを実行するコアからアクセスされる期間とが重複する。
【００５７】
そこで、ルートポインタのアクセス属性を切り替えずに、常に第２アクセス属性（第１スレッドを実行するコア、第２スレッドを実行するコア、及び第３スレッドを実行するコアでアクセス可能）に設定することで、ルートポインタに指定されるメンバ構造体は、全コアからアクセスできるＬ２キャッシュメモリ２３０を記憶される。このため、キャッシュコヒーレンシの問題を回避でき、アプリケーションに問題を生じさせることはない。
【００５８】
また、第１スレッド、第２スレッド、及び第３スレッドで読み出し処理のみが行われ、書き込み処理が行われていない場合には、ルートポインタのアクセス属性を、読み出し処理のみを許可するものであって、Ｌ１キャッシュ、Ｌ２キャッシュ、及びメインメモリ２４０に記憶可能とする第３のアクセス属性としても良い。このようにすることで、図１３の例で、読み出し処理中にＬ１キャッシュメモリ２２１〜２２４上での処理が可能となる。この場合、Ｌ１キャッシュメモリ２２１〜２２４に記憶された変数が書き込み（更新）されることはなく、キャッシュコヒーレンシを確保できる。このため、アプリケーションに問題を生じさせることなく、Ｌ１キャッシュメモリ２２１〜２２４を使用してアプリケーションの性能を向上できる。
【００５９】
図１５は、スクラッチパッドメモリとキャッシュメモリに記憶されるメンバ構造体を示す図である。白抜きの矢印の部分が、メモリへ書き込む（更新する）メンバ構造体のメンバを示す。斜線部分が、実際にメモリへ書き込まれるデータを示す。
【００６０】
スクラッチパッドメモリでは、書き込み（更新）に係るデータのサイズと、メモリへ実際に書き込むデータのサイズは、同一である。キャッシュメモリでは、書き込み（更新）に係るデータのサイズよりも、メモリへ実際に書き込むデータのサイズが大きい。
【００６１】
キャッシュメモリは、データをライン単位で管理する。図１５に示すキャッシュメモリの各ブロックが１つのラインに対応する。キャッシュメモリへデータを書き込む場合、書き込みに係るデータが属するライン上のデータを同時に書き込む必要がある。
【００６２】
アクセス属性は、１つ以上のラインごと（以下、記憶単位と呼ぶ）で設定される。ここで、第１アクセス属性に係るメンバ構造体と、第２アクセス属性に係るメンバ構造体とが１つの記憶単位に混在して記憶される場合、キャッシュコヒーレンシの問題を回避するため、このライン上に記憶されるデータすべては、第２アクセス属性が設定される。このため、高速なＬ１キャッシュメモリを利用できない。
【００６３】
変換後プログラムでは、同一のアクセスパターンの変数が１つのメンバ構造体に含まれる。メンバ構造体はルートポインタによって指定される。ルートポインタは、１つのアクセス属性を有する。変換後プログラムが実行される場合、メンバ構造体のメンバは、連続したメモリ領域に記憶される。そのため、第１又は第２メンバ構造体のメンバが記憶される領域内部に、他のアクセス属性の変数が記憶されることはない。このようにすることで、第１アクセス属性に係るメンバ構造体と、第２アクセス属性に係るメンバ構造体とが１つの記憶単位に混在して記憶されることを抑制でき、高速なＬ１キャッシュメモリ等を有効に活用できる。
【００６４】
変換後プログラムは、あるアクセス属性に係るメンバ構造体が記憶される記億単位には、他のアクセス属性に係るメンバ構造体を記憶しない制御を行うためのコードを含んでいても良い。この場合、第１アクセス属性に係るメンバ構造体と、第２アクセス属性に係るメンバ構造体とが１つの記憶単位に混在して記憶されることをより正確に抑制でき、高速なＬ１キャッシュメモリ等をより有効に活用できる。
【００６５】
メンバ構造体をメモリに記憶する際に、アクセス属性が設定される記億単位の先頭とアラインメントをとって記憶することで、第１アクセス属性に係るメンバ構造体と、第２アクセス属性に係るメンバ構造体とが１つの記憶単位に混在して記憶されることを抑制でき、高速なＬ１キャッシュメモリ等を有効に活用できる。
【００６６】
図１６は、ａｒｒａｙ［１００］についてのアラインメントを示す図である。図１６に示すキャッシュメモリの各ブロックが１つのラインに対応する。白抜きの矢印の部分は、メンバ構造体ａｒｒａｙの記憶領域を示す。図１６（下）は、アラインメントする前のａｒｒａｙ［１００］の記憶領域を示す。図１６（上）は、アラインメントした後のａｒｒａｙ［１００］の記憶領域を示す。「ａｌｉｇｎ（ａｒｒａｙ）」は、メンバ構造体ａｒｒａｙのアラインメントを行うためのコード（ＡＰＩ）である。変換後プログラムは、メンバ構造体のアラインメントを行うためのコードをさらに含んでも良い。アラインメントした後のａｒｒａｙ［１００］の記憶領域の先頭は、ラインの先頭のアドレスと等しい。アラインメントした後のａｒｒａｙ［１００］が属する記憶単位のうちａｒｒａｙ［１００］が記憶されていない領域は、パディング（無意味なデータ）が追加される。このように、メンバ構造体のアラインメントを行い、メンバ構造体が記憶される記億単位には、その他のアクセスパターンの変数が記憶されることを防止できる。
【００６７】
また、アラインメントを取るためのＡＰＩ（ａｌｉｇｎ）を用意する方法以外にも、ラインのバイト数を確認し、各変数に記億単位分の領域を最初から確保してもよく、変数をメモリに記憶する際に必ずアラインメントを取る仕様にしても良い。
【００６８】
第１の実施形態に係るプログラム変換装置１００は、プロセッサの使用メモリ量を削減できる。アーキテクチャやＯＳによっては、アラインメントを自動でとるものがある。この場合、どんなにサイズが小さい変数を宣言した場合でも、同一ライン上に他のデータが記憶されることはない。この場合、メモリ階層が原因となるアプリケーションのエラーは回避できるものの、メモリ使用量は大きくなる。変換後プログラムは、同一アクセスパターンの変数をメンバとするメンバ構造体を含むため、小さな変数を１つにまとめることができる。そして、メンバ構造体ごとにアラインメントを取ることになるため、余分なメモリの占有を削減することができる。
【００６９】
第１の実施形態に係るプログラム変換装置１００は、消費エネルギーを削減できる。キャッシュメモリにデータが記憶されている場合、プロセッサ（ＣＰＵ）は、下位のメモリにアクセスせず、キャッシュメモリ上のデータを読み出して演算処理等を行う。変換後プログラムでは、アクセス属性をルートポインタごとに切り替えることで、キャッシュメモリの使用効率を改善し、キャッシュメモリ上のデータのヒット率を向上できるため、大容量で消費エネルギーの大きい下位のメモリへのアクセスを抑制できる。その結果、アプリケーション全体の消費エネルギーの削減、並びに、プロセッサの動作時に発生する熱を低減が可能となる。
【００７０】
このプログラム変換装置１００は、例えば、汎用のコンピュータ装置を基本ハードウェアとして用いることでも実現することが可能である。すなわち、入力部１１０、判定部１２０、変換部１３０、および出力部１４０は、上記のコンピュータ装置に搭載されたプロセッサにプログラムを実行させることにより実現することができる。また、判定部１２０及び変換部１３０のみを、上記のコンピュータ装置に搭載されたプロセッサにプログラムを実行させることにより実現することができる。このとき、プログラム変換装置１００は、上記のプログラムをコンピュータ装置にあらかじめインストールすることで実現してもよいし、ＣＤ−ＲＯＭなどの記憶媒体に記憶して、あるいはネットワークを介して上記のプログラムを配布して、このプログラムをコンピュータ装置に適宜インストールすることで実現してもよい。また、入力部１１０、判定部１２０、変換部１３０、および出力部１４０に内蔵されるメモリは、上記のコンピュータ装置に内蔵あるいは外付けされたメモリ、ハードディスクもしくはＣＤ−Ｒ、ＣＤ−ＲＷ、ＤＶＤ−ＲＡＭ、ＤＶＤ−Ｒなどの記憶媒体などを適宜利用して実現することができる。
【００７１】
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、実施形態にわたる構成要素を適宜組み合わせてもよい。
【符号の説明】
【００７２】
１０・・・変換前プログラムコード
２０、２１、２２、２３・・・変換のグループ
３０・・・変換後プログラムコード
１００・・・プログラム変換装置
１１０・・・入力部
１２０・・・判定部
１３０・・・変換部
１４０・・・出力部
２００・・・マルチコアプロセッサ
２１１〜２１４・・・コア
２２１〜２２４・・・Ｌ１キャッシュメモリ
２２０Ａ〜２２０Ｃ・・・メモリマップ領域
２３０・・・Ｌ２キャッシュメモリ
２４０・・・メインメモリ
【図１】
2012038219.tif 000003
【図２】
2012038219.tif 000004
【図３】
2012038219.tif 000005
【図４】
2012038219.tif 000006
【図５】
2012038219.tif 000007
【図６】
2012038219.tif 000008
【図７】
2012038219.tif 000009
【図８】
2012038219.tif 000010
【図９】
2012038219.tif 000011
【図１０】
2012038219.tif 000012
【図１１】
2012038219.tif 000013
【図１２】
2012038219.tif 000014
【図１３】
2012038219.tif 000015
【図１４】
2012038219.tif 000016
【図１５】
2012038219.tif 000017
【図１６】
2012038219.tif 000018