(57)【要約】【課題】より効率のよいアクセラレーション計算プログラムを簡潔に実装することができる技術を提供する。【解決手段】複数のプロセッサからなる並列計算機に適用されるコンパイラであって、ソースプログラムを入力して前記プロセッサそれぞれのローカルコードを生成するコンパイラにおいて、入力した前記ソースプログラムを解析して、このソースプログラムに記述された手続きの中から前記プロセッサ間のデータ転送ポイントを抽出し、データコピーの呼び出し処理を生成する生成手段と、前記呼び出し処理を含むオブジェクトコードを生成する生成手段とを具備してなるコンパイラ。【選択図】  図２
2014149765.tif 000002
【特許請求の範囲】
【請求項１】
複数のプロセッサからなる並列計算機に適用されるコンパイラであって、ソースプログラムを入力して前記プロセッサそれぞれのローカルコードを生成するコンパイラにおいて、
入力した前記ソースプログラムを解析して、このソースプログラムに記述された手続きの中から前記プロセッサ間のデータ転送ポイントを抽出し、データコピーの呼び出し処理を生成する生成手段と、
前記呼び出し処理を含むオブジェクトコードを生成する生成手段とを
具備してなるコンパイラ。
【請求項２】
更に前記データ転送ポイントを前記プロセッサ単位で細分化する請求項１に記載のコンパイラ。
【請求項３】
前記データコピーの呼び出し処理は前記プロセッサ間の共有キャッシュへのプリフェッチに置き換えて生成される請求項１に記載のコンパイラ。
【請求項４】
複数のプロセッサからなる並列計算機に適用されるコンパイラであり、ソースプログラムを入力して前記プロセッサそれぞれのローカルコードを生成するコンパイラにおけるオブジェクトコード生成方法であって、
入力した前記ソースプログラムを解析して、このソースプログラムに記述された手続きの中から前記プロセッサ間のデータ転送ポイントを抽出し、データコピーの呼び出し処理を生成する生成工程と、
前記呼び出し処理を含むオブジェクトコードを生成する生成工程とを
含むオブジェクトコード生成方法。
【請求項５】
前記プロセッサとして、請求項１に記載のコンパイラにより生成されたオブジェクトコードを実行するＣＰＵ及びアクセラレータを備えた情報処理装置。
【請求項６】
請求項４に記載のオブジェクトコード生成方法により生成されたオブジェクトコードを実行する情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、コンパイラ、オブジェクトコード生成方法、情報処理装置及び情報処理方法に関する。
【背景技術】
【０００２】
従来、マルチコア向けのプログラム実行モデルとしてマルチスレッド処理が存在している。かかるマルチスレッド処理では、実行単位となる複数のスレッドが並列に動作し、メインメモリ上のデータを遣り取りすることによって並列処理を遂行している。
【０００３】
上記並列処理の実行形態の一例としては、複数の実行単位を各実行ユニット（ＣＰＵコア）に割り当てるスケジューラを含むランタイム処理と、各実行ユニット上で動作するスレッドとの２つの要素で構成される。また、並列処理ではスレッド間の同期が重要であり、同期処理が適切でないとデッドロックやデータの整合性が崩れる等の問題が発生する。そこで、従来、スレッドの実行順序をスケジューリングし、このスケジュールに基づいて並列処理を行うことでスレッド間の同期を保持することが行われている。
【０００４】
更にヘテロジニアスマルチコアの枠組みで、ＧＰＧＰＵ（General-purpose computing on graphics processing units; GPUによる汎目的計算、GPUの演算資源を画像処理以外の目的に応用する技術）をはじめとするアクセラレータなどの各デバイスのメモリ間やホストＣＰＵのシステムメモリ間のデータコピーを暗黙的に行うランタイム環境が求められている。
【０００５】
例えば、アクセラレーション計算環境におけるバッファ同期と並列ランタイムを重視しＣＰＵとＧＰＵカードなどのアクセラレータとで協調して大規模計算を実行する場合、ＣＰＵとＧＰＵの間でデータをやりとりするためにバッファを定義し、計算する側のメモリへデータを転送して並列計算を実行する。
【０００６】
このとき、どういうタイミングでどちらの向きにデータを転送するのかを、プログラムコード状で表現するのは、煩雑でありコーディングでバグを混入する原因となる。とくに計算をＣＰＵ，ＧＰＵ１，ＧＰＵ２，…等のどこで実行するかを、プログラムチューニング過程で変更する場合はデータ転送のタイミングや向きに注意が必要となる。
【０００７】
そこで、バッファを抽象化したＶｉｅｗを定義し、Ｖｉｅｗのデータ構造にどこのメモリに最新データが存在するかという状態を保持することで、オンデマンドで必要に応じてデータのコピーを行う方法が提供されている。この方法を使うと、プログラムコード上でデータ転送を明示的に記述する必要がなく、必要に応じて正しくデータが転送されるため、簡潔なコードで信頼性の高いプログラムを書くことが可能である。
【０００８】
しかし、オンデマンドでデータをコピーする方法では、並列計算処理（以降カーネルと呼ぶ）を呼び出すタイミングまで、データコピーの必要性が判明しないため、データコピーの遅延を甘受しなければならなかった。
【０００９】
より効率のよいアクセラレーション計算プログラムを簡潔に実装することができる技術が、求められている。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開平１０−２４０７０３号公報
【特許文献２】特開２００８−１２３３１５号公報
【発明の概要】
【発明が解決しようとする課題】
【００１１】
本発明の実施の形態は、より効率のよいアクセラレーション計算プログラムを簡潔に実装することができる技術を提供することを目的とする。
【課題を解決するための手段】
【００１２】
上記課題を解決するために、実施形態によればコンパイラは、複数のプロセッサからなる並列計算機に適用されるコンパイラであって、ソースプログラムを入力して前記プロセッサそれぞれのローカルコードを生成するコンパイラにおいて、入力した前記ソースプログラムを解析して、このソースプログラムに記述された手続きの中から前記プロセッサ間のデータ転送ポイントを抽出し、データコピーの呼び出し処理を生成する生成手段と、前記呼び出し処理を含むオブジェクトコードを生成する生成手段とを具備する。
【図面の簡単な説明】
【００１３】
【図１】実施形態のシステム全体の構成の一例を示す図。
【図２】同実施形態のシステム構成例を示す機能ブロック構成図。
【図３】同実施形態のデータ処理シーケンスとデータフローを説明するために示す図。
【図４】一般的なコンパイラの動作原理を説明する図。
【図５】実施形態のデータコピーポイントの計算とコピーコードの挿入を示すフロー図。
【図６】同実施形態のデータ分割による効率向上の例を示すブロック構成図。
【図７】実施形態のシステム全体の構成の他の例を示す図。
【図８】同実施形態に用いられるシステム構成例２を示す機能ブロック構成図。
【発明を実施するための形態】
【００１４】
以下、本発明の一実施形態を説明する。
（第１の実施形態）
本実施形態は情報処理装置として或いは情報処理方法として用いることができ、ソースプログラムを入力して並列計算機を構成するプロセッサそれぞれのローカルコードを生成するコンパイラに適用して好適なオブジェクトコード生成方法に係わり、特にプロセッサ構造に依存しないローカルコードを生成することを可能とするオブジェクトコード生成方法に関する。
【００１５】
第１の実施形態を図１乃至図８を参照して説明する。
【００１６】
図１に実施形態のシステム全体の構成の一例を示す。例えば、ＧＰＵ等である計算デバイス１０（以下、GPU）はホストＣＰＵ１２により制御される。計算デバイス１０はマルチコアプロセッサからなり、多数のコアブロックに分割されている。図１の例では、計算デバイス１０は８つのコアブロック３４に分割される。計算デバイス１０はコアブロック３４単位に別のコンテキストを管理できる。コアブロックは１６個のコアからなる。コアブロックあるいはコアを並列に動作させることにより、高速なタスク並列処理が可能となる。
【００１７】
コアブロック３４はブロックＩＤにより識別され、図１の例では、ブロックＩＤは０〜７である。ブロック内の１６個のコアはローカルＩＤにより識別され、ローカルＩＤは０〜１５である。ローカルＩＤが０のコアはブロックの代表コア３２と称される。
【００１８】
ホストＣＰＵ１２もマルチコアプロセッサであってもよい。図１の例では、デュアルコアプロセッサとする。ホストＣＰＵ１２は３段階のキャッシュメモリ階層を持つ。メインメモリ１６と接続されるＬ１キャッシュ２２はホストＣＰＵ１２内に設けられ、Ｌ２キャッシュ２６ａ、２６ｂと接続される。Ｌ２キャッシュ２６ａ、２６ｂはそれぞれＣＰＵコア２４ａ、２４ｂに接続される。Ｌ１キャッシュ２２とＬ２キャッシュ２６ａ、２６ｂはハードウェアによる同期機構を持ち、同一アドレスへのアクセスの際に必要な同期処理が行われる。Ｌ２キャッシュ２６ａ、２６ｂはＬ１キャッシュ２２で参照されるアドレスのデータを保持し、キャッシュミスが生じた場合などにはハードウェアによる同期機構により、メインメモリ１６との間で必要な同期処理が行われる。
【００１９】
計算デバイス１０によりアクセスできるデバイスメモリ１４が計算デバイス１０に接続され、ホストＣＰＵ１２にメインメモリ１６が接続される。メインメモリ１６とデバイスメモリ１４の２つのメモリが接続されているので、計算デバイス１０で処理を実行する前後で、デバイスメモリ１４とメインメモリ１６とでデータのコピー（同期化）を行う。このため、メインメモリ１６とデバイスメモリ１４とが互いに接続されている。しかし、複数の処理を連続して実行する場合、１つの処理毎にコピーを実行する必要はない。
【００２０】
図２にシステム機能構成例を示す。計算デバイス１０はPCIe（PCI Express）を経由してホストＣＰＵ１２と接続され、計算デバイス１０は専用のデバイスメモリ（DRAM）１４を持つ。計算に利用するデータを格納するバッファの実体はホストのシステムメモリ１６とデバイスメモリ１４にそれぞれ割り当てられ、BufferViewというデータ構造によって状態を管理される。
【００２１】
このデータ構造は、図２に示すように４つの要素を含んでいる。ホストＣＰＵ１２とＧＰＵ１０で共有となる対象データをデータＡとすると、まずSizeはこのデータＡのサイズ（バイト数）である。次に述べるState（状態）の他にはCpu_memとGpu_memとがある。
【００２２】
Cpu_memはシステムメモリ１６内のデータＡの位置を表すポインタであり、Gpu_memはデバイスメモリ１４内のデータＡの位置を表すポインタである。
さてBufferViewの状態は、CPUのみ、GPUのみ、共有、未定義の4つの状態（計算デバイスが増えると状態は増える）で管理される。図３（ａ）の「ホスト(CPU)でカーネル関数を呼び出す順序」がプログラムコードに記載されたカーネル呼び出しであり、図の例ではKE,KF,KI,KJ がホストＣＰＵ１２で、KG,KH がGPUで実行される。
【００２３】
従来の技術では、オンデマンドでデータコピーを行う仕組みになっており、図３に示すようにホストＣＰＵ１２上でカーネルKEを実行するとBufferView Eの状態は「CPUのみ」となりカーネルKFについても同様である。ここでGPUで実行するカーネルKH が呼び出されると、BufferView E,Fの状態をチェックし、状態が「CPUのみ」であるために、データコピーを起動する。コピーが完了すると状態を「共有」に変更する。同様にBufferView G,Hは、カーネルKG,KH終了時は、「GPUのみ」の状態であり、カーネルKI を呼び出したときに初めてBufferView Gのコピーが開始されるため、カーネルKI の実行開始が遅れてしまう。
【００２４】
これを解決するためにBufferView Gのコピー開始をKernel Gの終了直後に開始すればよいが、これではプログラミングが煩雑となり、BufferViewによる抽象化の利便性を損なってしまう。
【００２５】
本実施形態に係わるオブジェクトコード生成方式を適用してなる一般的なコンパイラの概略構成は、コンパイラ、最適化変換部及びコード生成部を有してなる。コンパイラは、ソースプログラムを読み込み、構文解析して中間コードに変換してメモリの中に格納する。一般的には、ソースプログラムを構文解析し中間コードを生成し、その後最適化、コード生成、オブジェクトコードの出力となる。この最適化の中では、制御フロー解析、データ依存解析、様々な最適化（中間コード変換）という流れである。後述のDef-Useチェインの解析はデータ依存解析であり、データ転送コードの挿入はさまざまな最適化とコード生成部で実現される機能である。
【００２６】
ここで、図４を参照して一般的な並列コンパイラの動作手順の概略を示す。
まず、コンパイルの最初にターゲットプロセッサの構成２１を指定する（コンパイラ指示子等と呼ばれるものを援用することにより指定してもよい）。そして、コンパイラは、ステップＳ２２においてソースプログラム２５を読み込み、構文解析してソースプログラム２５を内部表現である中間形式２６に変換する。
【００２７】
次に、コンパイラは、ステップＳ２３において内部表現２６に対して様々な最適化変換を行い、変換された中間形式２７を生成する。
次に、コンパイラは、ステップＳ２４にて変換された中間形式２７をスキャンして、ＰＥそれぞれのオブジェクトコード２８を生成する。例としてはＣ言語系列のプログラムから、機械語コードを生成している。
【００２８】
本実施形態では、図５に示すように、プログラムコンパイル時にデータフローを解析し、必要な場合のみデータコピー開始のためのコードを挿入する。具体的には、BufferViewのDef-Useチェインを解析し、DefするカーネルとUseするカーネルの実行デバイスが異なる場合のみ、Defするカーネルの直後でデータコピーをキックするコードを挿入する。これにより、プログラムを簡潔に保ったままデータの先読みすることによって図３（ｂ）に示すタイムチャートの通り、カーネルKIの実行を早期に開始することが可能となり（図３（ｂ）のKGからKI，KHからKJへの破線を参照、従来ではKHが終了してから KIへ移行する）、全体の実行時間を短縮できる。なお、図３（ｃ）は、図３（ａ）のデータフローで出たデータとカーネルの属性を列挙したものである。
【００２９】
Def-Useチェインは、du −連鎖（definition - use chain）と呼ばれてきたものである。生きている変数の解析と本質的に同じ計算になるのが、定義−使用連鎖（du −連鎖）の作成である。例えば文ｓ において、変数が右辺値を要求することがあれば、その変数はｓ で使用されるという。たとえば、文a : = b + c とa [ b ]：= c があれば、b とcはそれぞれの文で使用される（a は使用されない）。 du −連鎖の問題は、ある点p について、変数x を使用する文ｓ の集合を求めることである。具体的なステップは次のようになる。
【００３０】
ステップＳ７１：  プログラムを基本ブロックに分割する。
ステップＳ７２：  制御フローをグラフを作成する。
ステップＳ７３：  BufferViewに対してデータフローを解析しDef-Useチェインを作成する。
ステップＳ７４：  すべてのBufferViewのDef-Useチェインに対して以下の処理を実行する。
ステップＳ７４Ａ：  すべてのBufferViewのDef-Useチェインの処理が実行されたか判定し、実行されたと判定されればステップＳ７４Ｃまでの処理ループから抜け全体の処理を終了する。
【００３１】
ステップＳ７４Ｂ：  BufferViewをDefするカーネルの実行デバイスとBufferViewをUseするカーネルの実行デバイスとが異なるか判定し、この判定がYesならば次のステップＳ７４Ｃに進み他方NoならばステップＳ７４Ａに戻る。
【００３２】
ステップＳ７４Ｃ：  Defするカーネルの実行直後にデータコピーを起動するコードを挿入する。このデータコピーの呼び出し処理を生成するためのコードは、例えば関数により実現される。
【００３３】
ここで基本ブロックとは連続した文の列からなり、制御は先頭の文に与えられ、そのあと、途中で停止したり、途中から分岐したりしないで、最後の文から制御が離れるものをいう。例えば所謂三番地文の列は基本ブロックを形成する。
【００３４】
尚さらに、図６（ｃ）のBufferView示すようにデータの分割方法（BlockSize）をあらかじめ定義しておくことにより、これをバッファGとIに適用し、カーネルKI が並列度の低いCPUで実行されるということを基準にカーネルKG,KI を分割実行することによって（図６（ａ）のKGとKIを参照）全体の実行時間を短くすることが可能である（図６（ｂ）のKGからKIへの３本の破線を参照）。BlockSize（３０００バイト）はSize（９０００バイト）を３分割した値となっている。
【００３５】
（第２の実施形態）
本発明による第２の実施形態を図３乃至図８を参照して説明する。実施形態１と共通する部分は説明を省略する。
図７はシステム構成の他の例を示す図である。ここでは、デバイスメモリ１４を単独で設けずに、計算デバイス１０とホストＣＰＵ１２がメインメモリ１６を共有し、メインメモリ１６内に図１のデバイスメモリ１４と等価なデバイスメモリ領域１４Ｂが設けられる。この場合は、デバイスメモリとメインメモリとでデータのコピーを行う必要がない。
【００３６】
図８の機能ブロックに示すように本実施形態は、共有キャッシュ１６Bを介在として、メモリ領域１４Ｂが設けられている。
結果としてCPU,GPUを統合し共有メモリをもつSoC（System on Chip）に対しては、実施形態１におけるデータのコピーは、キャッシュへのプリフェッチへと置き換えることで、CPU/GPU/その他アクセラレータがメモリを共有する場合においても、簡潔なプログラム記述における性能向上のための有効な手段となる。なおmemは、共有キャッシュ１６B内のデータＡの位置を表すポインタである。
【００３７】
以上に説明したように複雑で手間のかかるGPUプログラミングを簡潔にした環境においても、データ転送の遅延を自動的に隠ぺいすることにより高効率なプログラムを作成することが可能である。
【００３８】
（実施形態のまとめ）
計算対象のデータバッファを抽象化することにより、ＧＰＧＰＵをはじめとするアクセラレータなどの各デバイスのメモリ間やホストＣＰＵのシステムメモリ間のデータコピーを暗黙的に行うランタイム環境において、以下のことを実施する。
【００３９】
（１）．オンデマンドでデータコピーを発行するのではなく、できるだけ早い時点でデータコピーを発行することにより、データ移動の遅延を少なくし性能を向上させる。
【００４０】
（２）．早い時点でデータをコピーするために、プログラムコンパイル時にデータ転送ポイントを求めてデータコピーの呼び出し処理を生成する。
（３）．また、マルチコアＣＰＵなどの比較的並列度が低いデバイスで計算する場合は、入力データバッファを細分化してストリーム的にデータを流してマルチコアＣＰＵでの計算開始タイミングを早くすることにより、システム性能を向上させる。
【００４１】
本実施形態によれば、プログラマはデータの転送処理を記述することなく、適切なタイミングでデータのコピーを起動するプログラムを作成できるため、効率のよいアクセラレーション計算プログラムを簡潔に実装することが可能となる。
【００４２】
なお、この発明は上記実施形態に限定されるものではなく、この外その要旨を逸脱しない範囲で種々変形して実施することができる。
また、上記した実施の形態に開示されている複数の構成要素を適宜に組み合わせることにより、種々の発明を形成することができる。例えば、実施の形態に示される全構成要素から幾つかの構成要素を削除しても良いものである。さらに、異なる実施の形態に係わる構成要素を適宜組み合わせても良いものである。
【符号の説明】
【００４３】
１０…計算デバイス、１２…ホストＣＰＵ。
【図１】
2014149765.tif 000003
【図２】
2014149765.tif 000004
【図３】
2014149765.tif 000005
【図４】
2014149765.tif 000006
【図５】
2014149765.tif 000007
【図６】
2014149765.tif 000008
【図７】
2014149765.tif 000009
【図８】
2014149765.tif 000010