(57)【特許請求の範囲】
【請求項１】
複数の演算素子と、該複数の演算素子に対して設けられた階層の異なる複数のメモリとを有する並列プロセッサの前記複数の演算素子による並列演算を制御する演算制御装置であって、
前記複数のメモリのうちの最下位階層のメモリに１つ以上格納されたデータブロックであって、前記並列演算の演算対象としてそのデータが前記他の階層のメモリに転送されるリードブロックと、前記並列演算後に前記他の階層のメモリから前記最下位階層のメモリに転送される１つ以上のデータブロックであって、前記１つ以上のリードブロックに対する並列演算の演算結果であるライトブロックとに対して夫々設定された属性群を取得して保持する属性群保持部と、
前記属性群保持部により保持された各前記属性群と、前記並列プロセッサの構成を示す構成パラメータとに基づいて、夫々の前記リードブロックと前記ライトブロックの転送方式を決定し、決定した転送方式に応じて各前記リードブロックと前記ライトブロックの転送、及び該転送に対応する前記並列演算の制御を行うシナリオ決定部とを有し、
前記属性群は、前記転送方式を決定するために必要である一方、前記並列プロセッサの構成に依存しない属性を１つ以上含み、
前記ライトブロックの属性群は、該ライトブロックが既に前記他の階層のメモリに存在し、かつ、前記最下位階層のメモリに転送されると仮定して設定されたものであることを特徴とする演算制御装置。
【請求項２】
前記並列プロセッサは、ＯｐｅｎＣＬ（（Ｏｐｅｎ  Ｃｏｍｐｕｔｉｎｇ  Ｌａｎｇｕａｇｅ）デバイスであり、
各前記属性群は、カーネルの引数として設定されることを特徴とする請求項１に記載の演算制御装置。
【請求項３】
複数の演算素子と、該複数の演算素子に対して設けられた階層の異なる複数のメモリとを有する並列プロセッサの前記複数の演算素子による並列演算を制御する演算制御方法であって、
前記複数のメモリのうちの最下位階層のメモリに１つ以上格納されたデータブロックであって、前記並列演算の演算対象としてそのデータが前記他の階層のメモリに転送されるリードブロックと、前記並列演算後に前記他の階層のメモリから前記最下位階層のメモリに転送される１つ以上のデータブロックであって、前記１つ以上のリードブロックに対する並列演算の演算結果であるライトブロックとに対して夫々設定された属性群を取得して保持し、
保持された各前記属性群と、前記並列プロセッサの構成を示す構成パラメータとに基づいて、夫々の前記リードブロックと前記ライトブロックの転送方式を決定し、決定した転送方式に応じて各前記リードブロックと前記ライトブロックの転送、及び該転送に対応する前記並列演算の制御を行い、
前記属性群は、前記転送方式を決定するために必要である一方、前記並列プロセッサの構成に依存しない属性を１つ以上含み、
前記ライトブロックの属性群は、該ライトブロックが既に前記他の階層のメモリに存在し、かつ、前記最下位階層のメモリに転送されると仮定して設定されたものであることを特徴とする演算制御方法。
【請求項４】
前記並列プロセッサは、ＯｐｅｎＣＬ（（Ｏｐｅｎ  Ｃｏｍｐｕｔｉｎｇ  Ｌａｎｇｕａｇｅ）デバイスであり、
各前記属性群は、カーネルの引数として設定されることを特徴とする請求項３に記載の演算制御方法。
【請求項５】
複数の演算素子と、該複数の演算素子に対して設けられた階層の異なる複数のメモリとを有する並列プロセッサの前記複数の演算素子による並列演算の制御に際して、
前記複数のメモリのうちの最下位階層のメモリに１つ以上格納されたデータブロックであって、前記並列演算の演算対象としてそのデータが前記他の階層のメモリに転送されるリードブロックと、前記並列演算後に前記他の階層のメモリから前記最下位階層のメモリに転送される１つ以上のデータブロックであって、前記１つ以上のリードブロックに対する並列演算の演算結果であるライトブロックとに対して夫々設定された属性群を取得して保持し、
保持された各前記属性群と、前記並列プロセッサの構成を示す構成パラメータとに基づいて、夫々の前記リードブロックと前記ライトブロックの転送方式を決定し、決定した転送方式に応じて各前記リードブロックと前記ライトブロックの転送、及び該転送に対応する前記並列演算の制御を行う処理をコンピュータに実行させ、
前記属性群は、前記転送方式を決定するために必要である一方、前記並列プロセッサの構成に依存しない属性を１つ以上含み、
前記ライトブロックの属性群は、該ライトブロックが既に前記他の階層のメモリに存在し、かつ、前記最下位階層のメモリに転送されると仮定して設定されたものであることを特徴とするプログラム。
【請求項６】
前記並列プロセッサは、ＯｐｅｎＣＬ（（Ｏｐｅｎ  Ｃｏｍｐｕｔｉｎｇ  Ｌａｎｇｕａｇｅ）デバイスであり、
各前記属性群は、カーネルの引数として設定されることを特徴とする請求項５に記載のプログラム。
【請求項７】
複数の演算素子と、
該複数の演算素子に対して設けられた階層の異なる複数のメモリと、
前記複数の演算素子による並列演算を制御する演算制御部とを備える並列プロセッサであって、
前記演算制御部は、
前記複数のメモリのうちの最下位階層のメモリに１つ以上格納されたデータブロックであって、前記並列演算の演算対象としてそのデータが前記他の階層のメモリに転送されるリードブロックと、前記並列演算後に前記他の階層のメモリから前記最下位階層のメモリに転送される１つ以上のデータブロックであって、前記１つ以上のリードブロックに対する並列演算の演算結果であるライトブロックとに対して夫々設定された属性群を取得して保持する属性群保持部と、
前記属性群保持部により保持された各前記属性群と、前記並列プロセッサの構成を示す構成パラメータとに基づいて、夫々の前記リードブロックと前記ライトブロックの転送方式を決定し、決定した転送方式に応じて各前記リードブロックと前記ライトブロックの転送、及び該転送に対応する前記並列演算の制御を行うシナリオ決定部とを有し、
前記属性群は、前記転送方式を決定するために必要である一方、前記並列プロセッサの構成に依存しない属性を１つ以上含み、
前記ライトブロックの属性群は、該ライトブロックが既に前記他の階層のメモリに存在し、かつ、前記最下位階層のメモリに転送されると仮定して設定されたものであることを特徴とする並列プロセッサ。
【請求項８】
ＯｐｅｎＣＬ（（Ｏｐｅｎ  Ｃｏｍｐｕｔｉｎｇ  Ｌａｎｇｕａｇｅ）デバイスであり、
各前記属性群は、カーネルの引数として設定されることを特徴とする請求項７に記載の並列プロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、並列プロセッサの演算制御技術に関する。
【背景技術】
【０００２】
近年、プロセッサの発熱を抑制する必要性から、プロセッサの動作周波数を上げる代わりに、並列に処理を行うプロセッサ・コア（以下、単に「コア」という）の数を増やすことで性能向上を実現する動きが顕著になっている。複数のコアを有するプロセッサは、マルチコアプロセッサと呼ばれており、マルチコアプロセッサの中の、特にコア数が多いものは、メニコアプロセッサと呼ばれる。本明細書の中で、マルチコアプロセッサとメニコアプロセッサの区別を特にせず、並列に処理を行うコアが複数含まれるプロセッサを概して「並列プロセッサ」という。
【０００３】
並列プロセッサは、アクセラレータとして様々な分野で用いられている。しかし、メーカ、分野などによって種々のアクセラレータが製造され、アクセラレータ用の言語やフレームワークも様々開発されているため、アクセラレータ間でプログラムコードの移植が困難である。
【０００４】
この問題を解決するため、並列プロセッサのための標準的なフレームワークとして、ＯｐｅｎＣＬ（Ｏｐｅｎ  Ｃｏｍｐｕｔｉｎｇ  Ｌａｎｇｕａｇｅ）が定められた（非特許文献１）。ここで、ＯｐｅｎＣＬの概要を説明する。
【０００５】
図１９は、非特許文献１におけるＦｉｇ３．１に対して符号を追加したものであり、典型的なＯｐｅｎＣＬシステムのプラットフォームモデルを示す。
【０００６】
図１９に示すように、ＯｐｅｎＣＬシステム１０は、Ｈｏｓｔ（ホスト）１２、１つ以上のＣｏｍｐｕｔｅ  Ｄｅｖｉｃｅ（以下「ＯｐｅｎＣＬデバイス」という）１４を備える。ＯｐｅｎＣＬデバイス１４は、上述したアクセラレータに該当する。
【０００７】
夫々のＯｐｅｎＣＬデバイス１４は、１つ以上のＣｏｍｐｕｔｅ  Ｕｎｉｔ（以下「ＣＵ」と略す）１６を有し、夫々のＣＵ１６は、１つ以上の演算素子（Ｐｒｏｃｅｓｓｉｎｇ  Ｅｌｅｍｅｎｔ。以下「ＰＥ」と略す）１８を有する。なお、演算素子ＰＥ１８は、前述したコアに該当する。
【０００８】
ＯｐｅｎＣＬのアプリケーションは、ホスト１２側で動作するプログラムコードと、ＯｐｅｎＣＬデバイス１４、すなわちアクセラレータ側で動作するプログラムコードとで構成される。ホスト１２側で動作するプログラムコードは「ホストコード」と呼ばれ、ＯｐｅｎＣＬデバイス１４側で動作するプログラムコードは「カーネル」と呼ばれる。
【０００９】
ホスト１２は、ＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍ  Ｉｎｔｅｒｆａｃｅ）をコールして演算を指示する。ＯｐｅｎＣＬデバイス１４は、指示された演算を実行する。ホスト１２は、リソースを管理するコンテキストの生成、さらに、ＯｐｅｎＣＬを通じてデバイス動作を調停するためのコマンドキューの生成を行う。「デバイス動作」は、演算を実行すること、メモリを操作すること、同期をとることなどが含まれる。
【００１０】
ＯｐｅｎＣＬにおいて、カーネルは、ｗｏｒｋ−ｉｔｅｍ（以下、略して「アイテム」とも呼ぶ）として、Ｎ次元（１≦Ｎ≦３）のインデックス空間（Ｉｎｄｅｘ  Ｓｐａｃｅ）で実行される。例えば、２次元のインデックス空間として（４，６）が指定されれば、「４×６」の計２４個のアイテムが実行される。
【００１１】
１アイテムを実行するには、１ＰＥが利用される。したがって、並列に実行されるアイテムの数と、該アイテムと実在するＰＥの数とが同一の場合、カーネルは、４列６行計２４個のＰＥ上で実行されることになる。
【００１２】
なお、並列に実行されるアイテム数に対して実際に存在するＰＥ数が少ない場合には、実際に存在するＰＥ上でアイテムの並列実行を繰り返すことが行われる。例えば、２列３行計６個のＰＥしかないときに、上述した（４，６）のインデックス空間が指定された場合には、該６個のＰＥにより、６個のアイテムの並列実行を４回繰り返す必要がある。
【００１３】
また、ＯｐｅｎＣＬでは、ｗｏｒｋ−ｇｒｏｕｐ（ワークグループ）という概念も導入されている。ワークグループは、同一のＣＵ１６上で実行され、かつ、互いに関連するアイテムの集合である。同一のワークグループ内の各アイテムは、同一のカーネルを実行し、該ＣＵ１６の後述するローカルメモリをシェアする。
【００１４】
各ワークグループは、ユニックなグループＩＤが割り当てられ、各ワークグループ内のアイテムは、該ワークグループ内においてユニックなローカルＩＤが割り当てられる。また、アイテムは、ユニックなグローバルＩＤも割り当てられる。アイテムは、グローバルＩＤ、または、グループＩＤとローカルＩＤの組合せによって識別できる。
【００１５】
ＯｐｅｎＣＬデバイス１４に演算処理を行わせるプロセスは、下記のステップ順でＡＰＩをコールすることにより構成される。
【００１６】
＜ステップ１＞：演算処理の参照用のデータ（以下「参照データ」という）やカーネルをホスト１２からＯｐｅｎＣＬデバイス１４へ転送する。
【００１７】
＜ステップ２＞：「カーネル起動コマンド」によりＯｐｅｎＣＬデバイス１４上でカーネルの実行を開始させる。
【００１８】
＜ステップ３＞：ＯｐｅｎＣＬデバイス１４におけるカーネルの実行完了後、ＯｐｅｎＣＬデバイス１４のメモリ空間から演算処理の結果データをホスト１２側に転送する。
【００１９】
図２０を参照して、メモリ空間を含むＯｐｅｎＣＬデバイス１４の構成を説明する。
図２０は、非特許文献１におけるＦｉｇ３．３に対して符号を追加したものである。前述したように、ＯｐｅｎＣＬデバイス１４は１つ以上のＣＵ１６を備え、夫々のＣＵ１６は１つ以上のＰＥ１８を有する。
【００２０】
上述したステップ２におけるカーネルの実行に際して、ＯｐｅｎＣＬデバイス１４では、４つの異なるメモリへのアクセスが生じ得る。この４つのメモリは、プライベートメモリ２０、ローカルメモリ２２、グローバルメモリ３２、コンスタントメモリ３４である。この４つのメモリについて、まず、図２１を参照して、アイテムとワークグループの視点から説明する。なお、図２１は、非特許文献１におけるＴａｂｌｅ３．１である。
【００２１】
プライベートメモリ２０は、１つのアイテムに対応し、該アイテムの実行にのみ用いられる。１つのアイテムに対応するプライベートメモリ２０に対して定義された変数は、他のアイテムに対して使用できない。
【００２２】
ローカルメモリ２２は、１つのグループに対応し、該グループ内の各アイテムによりシェアすることができる。そのため、ローカルメモリ２２の用途としては、例えば、該グループ内の各アイテムによりシェアされる変数をローカルメモリ２２に割り当てることが挙げられる。
【００２３】
グローバルメモリ３２とコンスタントメモリ３４は、全てのグループの全てのアイテムからアクセスできる。なお、グローバルメモリ３２は、アイテムからリードとライトのいずれからもアクセスできるが、コンスタントメモリ３４は、アイテムからリードアクセスのみができる。以下、グローバルメモリ３２とコンスタントメモリ３４をまとめてデバイスメモリ３０という。
【００２４】
アイテムとＰＥ１８の１対１の対応関係から、上記４つのメモリと、ＣＵ１６及びＰＥ１８との対応関係は、以下のようになる。
【００２５】
プライベートメモリ２０は、ＰＥ１８と１対１で対応し、相対応するＰＥ１８によりのみアクセス可能である。
【００２６】
ローカルメモリ２２は、ＣＵ１６と１対１で対応し、相対応するＣＵ１６内の全てのＰＥ１８によりアクセス可能である。
【００２７】
デバイスメモリ３０は、全てのＣＵ１６内の全てのＰＥ１８、すなわちＯｐｅｎＣＬデバイス１４内の全てのＰＥによりアクセス可能である。
【００２８】
また、ＯｐｅｎＣＬデバイス１４によっては、デバイスメモリ３０のキャッシュメモリとして機能するキャッシュ２４がさらに設けられる場合もある。
【００２９】
このように、ＯｐｅｎＣＬデバイス１４には、階層の異なる複数のメモリが設けられている。これらのメモリは、上位階層にあるほど、ＰＥからのアクセスが高速にできる。デバイスメモリ３０（最下位）、ローカルメモリ２２（中位）、プライベートメモリ２０（最上位）の順で階層が上位になり、同様の順でＰＥからのアクセスもより高速になる。
【００３０】
ＯｐｅｎＣＬデバイス１４の性能を充分に引き出すためには、例えば、利用頻度の高いデータを、なるべくより高速なメモリ空間に移動してから参照するようにするなど、デバイスメモリ３０と、プライベートメモリ２０／ローカルメモリ２２との間でのデータ移動について工夫する必要がある。
【００３１】
制御方式がＯｐｅｎＣＬデバイスと異なる逐次プロセッサの場合においても、グローバルメモリ空間とプライベートメモリ空間との間でのデータ移動が行われる。図２２に示す逐次プロセッサの例を参照して説明する。
【００３２】
図２２に示す逐次プロセッサ２０は、演算素子であるＰＥ５２、プライベートメモリ５４、グローバルメモリ５６、キャッシュ制御機構５８を有する。
【００３３】
図示のように、逐次プロセッサ５０の記憶装置は、プライベートメモリ５４とグローバルメモリ５６に分けられている。プライベートメモリ５４は、物理的にオンチップの小容量メモリであり、グローバルメモリ５６は、物理的にオフチップの大容量のメモリである。
【００３４】
逐次プロセッサ５０では、記憶装置がプライベートメモリ５４とグローバルメモリ５６に分けられているが、プライベートメモリ５４とグローバルメモリ５６の間に設けられたキャッシュ制御機構５８により、プライベートメモリ５４とグローバルメモリ５６間のデータ移動は自動的に行われ、逐次プロセッサ５０のユーザは、１つの大きなメモリ空間しか見えない。つまり、逐次プロセッサ５０のユーザは、グローバルメモリ５６とプライベートメモリ５４との間でどのようにデータを移動するかを意図しなくても、ＰＥ５２に演算処理を行わせるユーザプログラムを容易に開発できる。
【先行技術文献】
【非特許文献】
【００３５】
【非特許文献１】Ｔｈｅ  ＯｐｅｎＣＬ  Ｓｐｅｃｉｃａｔｉｏｎ，Ｖｅｒ：１．０，Ｄｏｃｕｍｅｎｔ  Ｒｅｖｉｓｉｏｎ：４３，Ｋｈｒｏｎｏｓ  ＯｐｅｎＣＬ  Ｗｏｒｋｉｎｇ  Ｇｒｏｕｐ（２００９）
【発明の概要】
【発明が解決しようとする課題】
【００３６】
ところで、並列プロセッサ、特に図２０に示すＯｐｅｎＣＬデバイス１４のように多数のコア（ＰＥ）を搭載した場合には、コアの数と同数のプライベートメモリ２０が存在し、さらに、ＣＵ１６の数と同数のローカルメモリ２２が存在する。これらのメモリを全て１つのキャッシュ制御機構で統一的に管理するのは、ハードウェアのコストが高く、一般的には実現困難である。
【００３７】
他方、キャッシュ制御機構が無いと、ＯｐｅｎＣＬシステム１０のユーザ（以下、単に「ユーザ」と呼ぶ）には、複数のメモリ空間が見えてしまう。前述したように、利用頻度の高いデータを、なるべくより高速なメモリ空間（すなわちより上位階層のメモリ空間）に移動してから参照するようにするなど、より良い性能を追求するためには、演算処理に伴う階層の異なるメモリ間でのデータ移動について、ユーザプログラムで明示的に指示するする必要がある。これを正しく実現するためには、ユーザには、上述した各メモリ同士間の速度差、容量差、機能差等に関する知識を持つ必要がある。図２３を参照して具体例を説明する。
【００３８】
図２３は、複数のデータブロック（データブロックＡ〜Ｄ）から、データブロックＡ'〜Ｂ'を得る演算処理を実行する場合を説明するための図である。なお、図２３において、ホストからデバイスへのカーネル転送の図示を省略している。また、データブロックＡ〜Ｄは、上述したステップ１でホスト１２からＯｐｅｎＣＬデバイス１４に転送された参照データであり、グローバルメモリ３２に格納される。データブロックＡ'〜Ｂ'は、上述したステップ２にいてデータブロックＡ〜Ｄに対して行われた演算の結果であり、グローバルメモリ３２に書き込まれ、後に、上述したステップ３でホスト１２に転送される。
【００３９】
ここで、ステップ２の処理、すなわちカーネルを実行する演算処理を説明する。なお、本明細書において、以下、プライベートメモリについて、複数が有り得る場合には、「プライベートメモリ群」という。
【００４０】
演算処理の性能を追求しなければ、演算において、プライベートメモリ群／ローカルメモリ２２を使わずに、グローバルメモリ３２のみを使用する手法が考えられる。この場合、グローバルメモリ３２と、プライベートメモリ群／ローカルメモリ２２間のデータ転送が無い。
【００４１】
この手法は、制御が単純であるが、性能が良くない。演算処理をより良い性能で行うために、上述したように、演算対象のデータをグローバルメモリ３２からプライベートメモリ群／ローカルメモリ２２に転送してから演算を行い、演算の結果をプライベートメモリ群／ローカルメモリ２２に格納してからグローバルメモリ３２に転送する手法が用いられる。
【００４２】
この手法を用いる場合について、まず、全てのアイテムが同時に並行して実行可能なときの手順（ステップＡ〜Ｃ）を説明する。なお、「全てのアイテムが同時に並行して実行可能」とは、ＰＥ数が総アイテム数以上であり、かつ、プライベートメモリ群とローカルメモリの容量は、演算対象の全てのデータを格納可能できることなどを意味し、この場合、演算対象のデータをグローバルメモリ３２からプライベートメモリ群／ローカルメモリ２２への転送、各ＰＥ１８による演算の並列実行、演算結果をプライベートメモリ群／ローカルメモリ２２からグローバルメモリ３２への転送が一度しか行われない。
【００４３】
＜ステップＡ＞：グローバルメモリ３２に格納されたデータブロックＡ〜Ｄをプライベートメモリ群／ローカルメモリ２２に転送する。
【００４４】
この転送は、例えば、演算対象のデータのうちの、ＰＥ１８によりのみ使用されるデータをＰＥ１８のプライベートメモリに転送し、複数のＰＥ１８により共有されるデータをローカルメモリ２２に転送することである。
【００４５】
なお、以下において、グローバルメモリ３２からプライベートメモリ群／ローカルメモリ２２へのデータ転送を「リード転送」という。また、データブロックＡ〜Ｄのような、リード転送されるデータブロックを「リードブロックＲＢ」という。
【００４６】
＜ステップＢ＞：各ＰＥ１８上で演算処理を実行し、演算処理の結果を該ＰＥ１８がアクセスできるプライベートメモリ／ローカルメモリ２２に格納する。
【００４７】
＜ステップＣ＞：ステップＢの演算処理により得られ、プライベートメモリ群／ローカルメモリ２２に格納されたデータブロックＡ'〜Ｂ'をグローバルメモリ３２に転送する。
【００４８】
なお、以下において、プライベートメモリ群／ローカルメモリ２２からグローバルメモリ３２へのデータ転送を「ライト転送」という。また、データブロックＡ'〜Ｂ'のような、プライベートメモリ群／ローカルメモリ２２に格納され、ライト転送されるデータブロックを「ライトブロックＷＢ」という。
【００４９】
該３つのステップの全てについて、ユーザにより作成されたカーネルの中で明示的に指定される必要がある。これらの指定は、演算処理の内容や、ＯｐｅｎＣＬデバイス１４の構成（ＰＥ数（＝プライベートメモリ数）や、個々のプライベートメモリの容量、ローカルメモリの容量など）に依存する内容が含まれる。
【００５０】
例えば、演算対象となるリードブロックＲＢが複数あり、かつ全てが一度に一つのワークグループ内のプライベートメモリ群／ローカルメモリ２２に入りきらないため、それぞれのリードブロックＲＢをサブブロックに分割しなければならない場合に、該複数のリードブロックＲＢに対して、ステップＡにおいて、サブブロック間の対応付け方法を指定する必要がある。リードブロックＲＢのサブブロック間の「対応付け方法」は、上記複数のリードブロックＲＢのサブブロック同士で、どのリードブロックＲＢのサブブロック同士を、同一のワークグループ内のプライベートメモリ群、または同一ワークグループ内のローカルメモリ２２に転送するかを意味する。これは、演算処理の内容、またどのように分割すべきかは、ＯｐｅｎＣＬデバイス１４の構成に依存する。
【００５１】
同様に、演算結果として複数のライトブロックＷＢがある場合には、該複数のライトブロックＷＢのそれぞれのサブブロックが、どのようなリードブロックＲＢのサブブロック同士の組合せの下で、演算結果として求められることになるか、という意味での対応付け方法も指定する必要がある。なお、ライトブロックＷＢの各サブブロックの内容とは、すなわち各ワークグループのプライベートメモリ群またはローカルメモリ２２に演算結果として格納されたデータである。そしてライトブロックＷＢをローバルメモリ３２へ転送するとは、該データをグローバルメモリ３２内のライトブロックＷＢの各サブブロック位置に書き込むことを意味する。リードブロックＲＢの対応付け方法と同様に、ライトブロックＷＢの対応付け方法も、演算処理の内容と、ＯｐｅｎＣＬデバイス１４の構成に依存する。
【００５２】
上記のように所要のデータブロック全体がワークグループ内のメモリに入りきらない場合以外、ＰＥの総数が、インデックス空間のサイズより小さいなどのときにおいても、全てのアイテムが同時に並行して実行することができないため、ＰＥによるアイテムの並列実行を複数回繰り返す必要がある。当然ながら、並列実行の繰り返しに合わせてリード転送とライト転送も繰り返す必要がある。この場合、演算処理の内容とＯｐｅｎＣＬデバイス１４の構成に応じて、データブロックの分割方法、データブロックを分割して得たサブブロック間の対応付け方法を指定する必要がある。
【００５３】
データブロックの「分割方法」は、該データブロックをどのようにしてサブブロックに分割するかを意味する。「サブブロックＳＢ」は、リード転送とライト転送の転送単位である。以下において、リードとライトを区別する必要がある場合については、リードブロックＲＢを分割して得たサブブロックを「サブリードブロックＳＲＢ」といい、ライトブロックＷＢを分割して得たサブブロック「サブライトブロックＳＷＢ」という。
【００５４】
サブブロックＳＢ間の「対応付け方法」とは、異なるリードブロックあるいはライトブロックに夫々含まれるどのサブブロックＳＢ同士を、同時に同一のプライベートメモリ群、または同一のローカルメモリ２２上に存在させるかを意味する。
【００５５】
データブロックの分割方法はＯｐｅｎＣＬデバイス１４の構成に依存し、一方、サブブロックの対応付け方法は演算処理の内容に依存する。分割が必要になると、データブロックを分割しない場合より、さらに指定が複雑である。
【００５６】
図２４は、ＯｐｅｎＣＬデバイス１４に演算処理を行わせるために、ユーザにより指定する必要のある内容をまとめて示す。
【００５７】
図示のように、第１の部分は、リード転送用の指定であり、演算処理の内容とＯｐｅｎＣＬデバイス１４の構成に依存する部分が含まれる。
【００５８】
演算処理の内容とＯｐｅｎＣＬデバイス１４の構成に依存する部分は、例えば、リードブロックＲＢを分割するか否かの指定（例１）や、分割する場合における分割方法の指定（例２）とサブリードブロックＳＲＢ間の対応付け方法の指定（例３）がある。
【００５９】
第２の部分は、リードブロックＲＢまたはサブリードブロックＳＲＢに対する演算処理の指定である。演算処理を指定するための内容であるため、当然演算処理の内容に依存する。さらに、この部分は、リード転送用の指示に合わせる必要があるため、アイテムの並行実行の回数の指定（例４）など、ＯｐｅｎＣＬデバイス１４の構成に依存する内容が含まれる。
【００６０】
第３の部分は、ライト転送用の指定であり、リード転送用の指示に合わせる必要があるため、必然的に、演算処理の内容とＯｐｅｎＣＬデバイス１４の構成に依存する部分（例５）が含まれる。
【００６１】
このように、より良い性能を追求するために、ユーザは、演算処理の内容と、ＯｐｅｎＣＬデバイス１４の構成に合わせてカーネル（ユーザコード）を開発する必要がある。
【００６２】
しかし、ＯｐｅｎＣＬに準拠したデバイスであっても、メーカが異なれば、各メモリ空間の容量、アクセス速度、アクセス遅延、キャッシュ制御の有無などの点において、千差万別である。そのため、あるＯｐｅｎＣＬデバイスにとって、階層の異なるメモリ間のデータ移動が理想的に開発されたユーザコードであっても、他のＯｐｅｎＣＬデバイスや、同一シリーズであるものの世代が違うＯｐｅｎＣＬデバイスなどにとっては、反って性能劣化を引き起こすものになってしまう可能性がある。つまり、ユーザコードの性能上の可搬性が低い。
【００６３】
ある程度の性能可搬性を実現するために、特定のＯｐｅｎＣＬデバイスを対象にユーザコードを開発するのではなく、なるべく、既存の多くの種類のＯｐｅｎＣＬデバイスの構成を念頭に入れつつ、ユーザコードを作成することが考えられる。しかし、そうした作業は、演算処理の設計者からみれば本質的でない作業のために多大な負担に感じる上に、コードの可読性の低下、そして煩雑度の増大等を引き起こす要因にもなる。
【００６４】
本発明は、上記事情を鑑みてなされたものであり、ＯｐｅｎＣＬデバイスのような並列プロセッサに対して、演算処理に伴う階層の異なる複数のメモリ間でのデータ移動について、ユーザコードの開発者の負担を減らすと共に、ユーザコードの可搬性を高める技術を提供する。
【課題を解決するための手段】
【００６５】
本発明の１つの態様は、複数の演算素子と、該複数の演算素子に対して設けられた階層の異なる複数のメモリとを有する並列プロセッサの前記複数の演算素子による並列演算を制御する演算制御方法である。
【００６６】
該方法は、２つの工程を有する。１つ目の工程は、前記複数のメモリのうちの最下位階層のメモリに１つ以上格納されたデータブロックであって、前記並列演算の演算対象としてそのデータが前記他の階層のメモリに転送されるリードブロックと、前記並列演算後に前記他の階層のメモリから前記最下位階層のメモリに転送される１つ以上のデータブロックであって、前記１つ以上のリードブロックに対する並列演算の演算結果であるライトブロックとに対して夫々設定された属性群を取得して保持する工程である。
【００６７】
２つ目の工程は、保持された各前記属性群と、前記並列プロセッサの構成を示す構成パラメータとに基づいて、夫々の前記リードブロックと前記ライトブロックの転送方式を決定し、決定した転送方式に応じて各前記リードブロックと前記ライトブロックの転送、及び該転送に対応する前記並列演算の制御を行う工程である。
【００６８】
前記属性群は、前記転送方式を決定するために必要である一方、前記並列プロセッサの構成に依存しない１つ以上の属性を含む。前記ライトブロックの属性群は、該ライトブロックが既に前記他の階層のメモリに存在し、かつ、前記最下位階層のメモリに転送されると仮定して設定されたものである。
【００６９】
なお、上記態様の方法を装置に置換えて表現したものや該装置を含むシステム、該方法を実行する並列プロセッサ、該方法をコンピュータに実行せしめるプログラムなども、本発明の態様としては有効である。
【発明の効果】
【００７０】
本発明にかかる技術によれば、ＯｐｅｎＣＬデバイスのような並列プロセッサに対して、演算処理に伴う階層の異なる複数のメモリ間でのデータ移動について、ユーザコードの開発者の負担を減らすと共に、ユーザコードの可搬性を高めることができる。
【図面の簡単な説明】
【００７１】
【図１】本発明の実施の形態にかかるＯｐｅｎＣＬシステムを示す図である。
【図２】ユーザが実現したい処理の具体例を説明するための図である。
【図３】リード属性を説明するための図である。
【図４】余白属性を説明するための図である。
【図５】放送属性を説明するための図である。
【図６】割当属性を説明するための図である（その１）
【図７】割当属性を説明するための図である（その２）。
【図８】依存属性を説明するための図である。
【図９】図２に示す各データブロックに対して設定された属性群の例を示す図である。
【図１０】図１に示すＯｐｅｎＣＬシステムにおける演算ユニットの構成を示すパラメータの例である。
【図１１】階層内での対応付けと階層間での対応付けを示す図である。
【図１２】図２に示す例に対してシナリオ決定部が決定した内容の一部を示す図である。
【図１３】図１に示すＯｐｅｎＣＬシステムにおいて、ユーザにより指定する必要のある内容を示す図である。
【図１４】従来の手法により図２に示す演算を実現したい場合のカーネルの例を示す図である（その１）。
【図１５】従来の手法により図２に示す演算を実現したい場合のカーネルの例を示す図である（その２）。
【図１６】図１に示すＯｐｅｎＣＬシステムにおいて、図２に示す演算を実現したい場合のカーネルの例を示す図である。
【図１７】従来の手法により、非同期メモリ転送に対応するＯｐｅｎＣＬデバイスで図２に示す演算を実現したい場合のカーネルの例を示す図である。
【図１８】非同期メモリ転送に対応する／対応しないＯｐｅｎＣＬデバイスで図２に示す演算を実現したい場合に、図１に示すＯｐｅｎＣＬシステムにおけるシナリオ決定部の処理の差異を示す図である。
【図１９】ＯｐｅｎＣＬシステムのプラットフォームモデルを示す図である。
【図２０】ＯｐｅｎＣＬデバイスの構成を示す図である。
【図２１】ＯｐｅｎＣＬデバイスにおける各種メモリを説明するための図である。
【図２２】逐次プロセッサの例を示す図である。
【図２３】従来技術の問題点を説明するための図である（その１）。
【図２４】従来技術の問題点を説明するための図である（その２）。
【発明を実施するための形態】
【００７２】
以下、図面を参照して本発明の実施の形態について説明する。説明の明確化のため、以下の記載及び図面は、適宜、省略、及び簡略化がなされている。また、様々な処理を行う機能ブロックとして図面に記載される各要素は、ハードウェアとソフトウェア（プログラム）の組合せによっていろいろな形で実現できることは当業者には理解されるところであり、ハードウェアとソフトウェアのいずれかに限定されるものではない。なお、各図面において、同一の要素には同一の符号が付されており、必要に応じて重複説明は省略されている。
【００７３】
また、上述したプログラムは、様々なタイプの非一時的なコンピュータ可読媒体（ｎｏｎ−ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（ｔａｎｇｉｂｌｅ  ｓｔｏｒａｇｅ  ｍｅｄｉｕｍ）を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Ｐｒｏｇｒａｍｍａｂｌｅ  ＲＯＭ）、ＥＰＲＯＭ（Ｅｒａｓａｂｌｅ  ＰＲＯＭ）、フラッシュＲＯＭ、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【００７４】
図１は、本発明の実施の形態にかかるＯｐｅｎＣＬシステム１００を示す。ＯｐｅｎＣＬシステム１００は、ＯｐｅｎＣＬホスト（以下、単に「ホスト」という）１１０、ＯｐｅｎＣＬデバイス（以下、単に「デバイス」という）１２０を備える。
【００７５】
デバイス１２０は、演算制御部１３０、演算ユニット１４０を備える。演算制御部１３０は、属性群格納部１３２、シナリオ決定部１３４を有する。演算ユニット１４０は、デバイスメモリ１５０、複数のコンピュートユニット（ＣＵ）１６０、ＣＵ１６０毎に設けられたローカルメモリ１７０を有する。
【００７６】
デバイスメモリ１５０は、グローバルメモリ１５２、コンスタントメモリ１５４を有する。また、夫々のＣＵ１６０は、複数のＰＥ１６２と、ＰＥ１６２毎に設けられたプライベートメモリ１６４を有する。
【００７７】
なお、グローバルメモリ１５２、コンスタントメモリ１５４、ＣＵ１６０、ＰＥ１６２、プライベートメモリ１６４、ローカルメモリ１７０は、通常のＯｐｅｎＣＬデバイスにおける同一名称のものと同様であり、ここで詳細な説明を省略する。
【００７８】
ホスト１１０は、デバイス１２０に演算を行わせる際に、ユーザにより引数の指定がなされた、該演算に対応するカーネルをデバイス１２０に転送する。
【００７９】
デバイス１２０において、演算制御部１３０は、ホスト１１０からのカーネルに基づいて演算ユニット１４０を制御する。演算ユニット１４０は、演算制御部１３０の制御に従って演算を行い、演算結果を得る。演算ユニット１４０が行う演算は、演算対象のデータをデバイスメモリ１５０からプライベートメモリ１６４／ローカルメモリ１７０への転送（リード転送）と、演算結果のデータをデバイスメモリ１５０への転送（ライト転送）が伴う。
【００８０】
通常、演算対象のデータと演算結果のデータのいずれもグローバルメモリ１５２に格納されるため、以下において、「リード転送」と「ライト転送」がグローバルメモリ１５２と、プライベートメモリ１６４／ローカルメモリ１７０との間の転送であるとして説明をする。演算対象のデータがコンスタントメモリ１５４にも格納される場合には、「リード転送」がコンスタントメモリ１５４からプライベートメモリ１６４／ローカルメモリ１７０への転送も含むことを理解されたい。
【００８１】
分かりやすいように、図２に示す具体例を参照しながら、本実施の形態のＯｐｅｎＣＬシステム１００を詳細に説明する。なお、以下の説明における用語「次元」は、前述したインデックス空間の次元に対応する。ＯｐｅｎＣＬでは、インデックス空間は、３次元まで指定することができるが、説明上の便宜のため、２次元を例にする。
【００８２】
図２に示すように、ユーザが実現したい処理は、式（１）に示す処理である。
【数１】
0005707265.tif 000002
【００８３】
演算対象のデータは、リードブロックＰとリードブロックＱに含まれる各データである。演算結果のデータは、ライトブロックＲに含まれる各データである。図２に示す例では、ライトブロックは、ライトブロックＲの１つのみである。
【００８４】
式（１）に示す処理を実現するためのカーネルは、当然ながら、ユーザにより作成される。カーネルの作成は、デバイス１２０の各ＰＥ１６２により実行されるプログラムコード（以下、「ユーザ指定処理」という）の作成処理と、引数の指定処理を含む。
【００８５】
本実施の形態のＯｐｅｎＣＬシステム１００では、ＯｐｅｎＣＬで定められた各引数以外に、さらに、８つの属性を含む「属性群」がサポートされている。これらの８つの属性は、「サイズ属性」、「リード属性」、「ライト属性」、「余白属性」、「放送属性」、「割当属性」、「階層属性」、「依存属性」であり、ユーザにより、カーネルの引数として、全てのリードブロックとライトブロックに対して指定される。なお、属性の指定に際して、必ずしも８つの属性の全てを指定する必要があるとは限らない。
【００８６】
上記属性群に含まれる８つの属性は、グローバルメモリ１５２と、プライベートメモリ１６４及び／またはローカルメモリ１７０との間で転送される方式（転送方式）を決定するために参照する必要があるパラメータである。以下、特別な説明が無い限り、「転送」は、グローバルメモリ１５２と、プライベートメモリ１６４及び／またはローカルメモリ１７０との間の転送を意味する。
【００８７】
「転送方式」は、下記の内容が含まれる。
（１）転送方式１：分割の有無
該転送方式１は、「分割無し」方式と「分割有り」方式のいずれかである。
【００８８】
リードブロックについて、「分割無し」とは、該リードブロックの全てのデータを一度のリード転送により転送することを意味し、「分割有り」とは、該リードブロックを複数のサブリードブロックＳＲＢに分割し、一度のリード転送により一つのワークグループへ１つのサブリードブロックＳＲＢのみを転送することを意味する。
【００８９】
ライトブロックについて、「分割無し」とは、該ライトブロックの全てのデータ（演算結果）を一度のライト転送によりグローバルメモリ１５２に転送することを意味し、「分割有り」とは、該ライトブロックを複数のサブライトブロックＳＷＢに分割し、一度のライト転送により一つのワークグループから１つのサブライトブロックＳＷＢのみを転送することを意味する。
【００９０】
（２）転送方式２：分割方式
該転送方式２は、該データブロックを複数のサブブロックに分割する場合に、どのように分割するかを意味する。
【００９１】
（３）転送方式３：分配方式（サブリードブロックＳＲＢの対応付け方法）
該転送方式３は、リードブロックを対象として、上記転送方式１が分割有りの場合に指定される。
【００９２】
すなわち分配方式は、リードブロックが複数あるときには、同じ回のリード転送により転送される、各リードブロックからの１つずつのサブリードブロックＳＲＢをどのようにしてプライベートメモリ１６４／ローカルメモリ１７０に分配するかを意味する。リードブロックが１つしか無い場合には、分割方式は、該サブリードブロックＳＲＢをプライベートメモリ１６４／ローカルメモリ１７０に均等に分配する方式になる。
【００９３】
（４）転送方式４：統合方式（サブライトブロックＳＷＢの対応付け方法）
該転送方式４は、ライトブロックを対象として、上記転送方式１が分割有りの場合に指定される。
【００９４】
なお、「統合する」とは、グローバルメモリ１５２における、該ライトブロックの個々のサブライトブロックＳＷＢに割り当てられた領域に書き込むことを意味する。
【００９５】
統合方式は、ライトブロックが複数あるときには、同じ回のライト転送により転送される、プライベートメモリ群／ローカルメモリ１７０に格納されている複数のサブライトブロックＳＷＢを、どのようにして夫々のライトブロックに統合するかを意味する。ライトブロックが１つしか無い場合には、統合方式は、プライベートメモリ群／ローカルメモリ１７０に格納された該ライトブロックの各サブライトブロックＳＷＢのデータを、上記１つのライトブロックに統合する方式になる。
【００９６】
上記した「転送方式」は、従来では、この転送方式は、ユーザコードにより指定される必要がある。演算処理の内容、及びデバイス１２０（具体的には演算ユニット１４０）の構成に依存するため、ユーザコードが煩雑であり、可搬性を維持するのは極めて困難と言ってよい。
【００９７】
こうした状況の下、本願発明の発明者が鋭意研究模索した結果、演算処理の内容とＯｐｅｎＣＬデバイスの構成の双方を考慮しつつその都度、個々のユーザが時間を費やして場当たり的に転送方式を決定してきた処理を、ＯｐｅｎＣＬデバイスの構成に依存する処理と依存しない処理とに分け、さらに、ＯｐｅｎＣＬデバイスに依存する処理については、ＯｐｅｎＣＬデバイスに依存しない処理により指定したパラメータと、ＯｐｅｎＣＬデバイスの構成を示すパラメータとに基づいて自動的に決定することに成功し、ユーザコードの開発者の負担を減らすと共に、ユーザコードの可搬性を高める技術を確立した。
【００９８】
本実施の形態のＯｐｅｎＣＬシステム１００では、ＯｐｅｎＣＬデバイスに依存しない処理は、データブロックに対する上記属性群の指定に該当する。これらの属性群は、転送方式を決定する上で必要なパラメータであるものの、ＯｐｅｎＣＬデバイスの構成に依存しないものである。以下、詳細に説明する。なお、以下において、各属性が「転送方式を決定する上で必要であるものの、ＯｐｅｎＣＬデバイスの構成に依存しないもの」であることを繰り返せず、このこと以外の要素についてのみを説明する。
【００９９】
上記８つの属性は、さらに、「固有属性」、「演算属性」、「ポリシ属性」の３種類に分けられる。図２に示す各データブロックの例を参照しながら説明する。
【０１００】
固有属性は、演算処理の内容及びユーザの意志に関係なく、当該データブロックが持つ固有の属性である。本実施の形態において、「固有属性」は、下記の「サイズ属性」である。
【０１０１】
＜サイズ属性＞
この属性は、データブロックのサイズを示すパラメータであり、例えば、次元毎のワード数、及びワード毎のバイト数やビット数である。この属性は、全てのデータブロックに対して必ず指定される。
【０１０２】
そのため、図２に示すリードブロックＰ、リードブロックＱ、及びライトブロックＲのサイズ属性は、下記のようになる。
【０１０３】
リードブロックＰは、２次元のデータブロックであり、Ｘ方向サイズＬｘとＹ方向サイズＬｙが、共に３ワードである。なお、リードブロックＰは、１ワードのビット数が、８ビットである。そのため、サイズ属性として、リードブロックＰに対して、「Ｘ方向サイズＬｘ：３、Ｙ方向サイズＬｙ：３、ビット数／ワード：８」が指定される。
【０１０４】
同様に、リードブロックＱに対して、「「Ｘ方向サイズＬｘ：６４０、Ｙ方向サイズＬｙ：４８０、ビット数／ワード：１６」が指定される。
【０１０５】
また、ライトブロックＲに対して、「「Ｘ方向サイズＬｘ：６４０、Ｙ方向サイズＬｙ：４８０、ビット数／ワード：３２」が指定される。
【０１０６】
「演算属性」は、ユーザの意志には関係しないものの、演算処理の内容に関係する属性である。本実施の形態において、「演算属性」は、下記の「リード属性」、「ライト属性」、を含む。演算属性は、各データブロックが１つ以上のサブブロックに分割される仮定の元で指定される。ライトブロックについては、さらに、リードブロックが既にプライベートメモリ群／ローカルメモリ上に存在する仮定が加えられる。なお、データブロックが１つのサブブロックに分割されることは、分割されないことである。
【０１０７】
＜リード属性＞
この属性は、まず、該データブロックが演算対象のデータ（つまり、リード転送されるデータ）であるか否か、及び演算対象のデータである場合の転送順位を示す。転送順位は、該データブロックの各サブブロックを、どのような順位で転送するかを指定するパラメータである。
【０１０８】
ライトブロックは、リード転送されないので、リード転送されないことを示す「ＮＯＮＥ」が指定される。リードブロックは、リード転送されるデータブロックであるので、「リード転送される」として、転送順位が指定される。
【０１０９】
本実施の形態のＯｐｅｎＣＬシステム１００において、リード属性として設定される転送順位は、「ＴＯＰ  ＬＥＦＴ」、「ＢＯＴＴＯＭ  ＲＩＧＨＴ」、「ランダム」が指定可能である。なお、「ランダム」が指定された場合に限り、別途、転送順位を示す情報を格納した領域へのポインタが指定される。
【０１１０】
「ＴＯＰ  ＬＥＦＴ」は、左上端のサブブロックから転送することを示し、「ＢＯＴＴＯＭ  ＲＩＧＨＴ」は、右下端のサブブロックから転送することを示す。図３は、リード属性として「「ＴＯＰ  ＬＥＦＴ」が指定された場合のサブブロックの転送順位を示す。
【０１１１】
図３に示すように、この場合、グローバルメモリ１５２に格納されたデータブロック（リードブロック）は、転送順位が、左上端のサブブロック１、サブブロック１の右隣のサブブロック２、サブブロック３の右隣のサブブロック３、・・・となっている。
【０１１２】
図２に示す各データブロックのリード属性を説明する。
式（１）に示す演算処理の内容に基づいて、リードブロックＰとリードブロックＱは、リード転送されるデータであるため、リード属性として、転送順位が「ＴＯＰ  ＬＥＦＴ」に指定される。
【０１１３】
一方、ライトブロックＲは、リード転送されるデータではないため、リード属性が「ＮＯＮＥ」に指定される。
【０１１４】
＜ライト属性＞
この属性は、まず、該データブロックが演算結果のデータ（つまり、ライト転送されるデータ）であるか否か、及び演算結果のデータである場合の転送順位を示す。転送順位は、各サブライトブロックＳＷＢを、どのような順位で転送するかを指定するパラメータである。
【０１１５】
リードブロックは、ライト転送されないので、ライト転送されないことを示す「ＮＯＮＥ」が指定される。ライトブロックは、ライト転送されるデータブロックであるので、「ライト転送される」として、転送順位が指定される。
【０１１６】
本実施の形態のＯｐｅｎＣＬシステム１００において、ライト属性として設定される転送順位は、「ＴＯＰ  ＬＥＦＴ」、「ＢＯＴＴＯＭ  ＲＩＧＨＴ」、「ランダム」が指定可能である。なお、「ランダム」が指定された場合に限り、別途、転送順位を示す情報を格納した領域へのポインタが指定される。
【０１１７】
リードブロックは、ライト転送されないので、ライト転送されないことを示す「ＮＯＮＥ」が指定される。そのため、図２に示すリードブロックＰとリードブロックＱは、ライト属性として「ＮＯＮＥ」が指定される。
【０１１８】
ライトブロックは、ライト転送されるデータブロックであるので、「ライト転送される」として、上記転送順位が指定される。この転送順位は、該データブロックの各サブブロックを、どのような順位で転送するかを指定するパラメータである。
【０１１９】
本実施の形態のＯｐｅｎＣＬシステム１００において、ライト属性として設定される転送順位は、リード属性として設定される転送順位と同様に、「ＴＯＰ  ＬＥＦＴ」と、「ＢＯＴＴＯＭ  ＲＩＧＨＴ」と、「ランダム」が指定可能である。「ランダム」が指定された場合に限り、別途、転送順位を示す情報を格納した領域へのポインタが指定される。
【０１２０】
ライト属性として設定される転送順位の夫々のパラメータの意義は、リード属性として設定される転送順位の相対応するパラメータと同一であるので、ここで詳細な説明を省略する。
【０１２１】
図２に示す各データブロックのライト属性を説明する。
式（１）に示す演算処理の内容に基づいて、ライトブロックＲは、ライト転送されるデータであるため、ライト属性として、転送順位が「ＴＯＰ  ＬＥＦＴ」に指定される。
【０１２２】
一方、リードブロックＰとリードブロックＱは、ライト転送されるデータではないため、ライト属性が「ＮＯＮＥ」に指定される。
【０１２３】
「ポリシ属性」は、演算処理の内容と共に、ユーザがどのように転送及び演算処理を実行したいかの意志に関係する属性である。本実施の形態のＯｐｅｎＣＬシステム１００において、「ポリシ属性」は、「余白属性」、「放送属性」、「割当属性」、「階層属性」、「依存属性」を含む。ポリシ属性も、各データブロックが１つ以上のサブブロックに分割される仮定の元で指定される。ライトブロックについては、さらに、ライトブロックが既にプライベートメモリ２０／ローカルメモリ２２上に存在する仮定が加えられる。なお、データブロックが１つのサブブロックに分割されることは、分割されないことである。
【０１２４】
＜余白属性＞
この属性は、リードブロックを対象とするパラメータであり、サブリードブロックＳＲＢ内のデータと共に転送される、該サブリードブロックＳＲＢの境界と隣接する該サブリードブロックＳＲＢ外のデータの量を示すパラメータである。また、余白属性は、次元毎に指定される。余白属性のパラメータの単位は、ワードである。
【０１２５】
なお、ライトブロックについては、余白属性を指定できない、または指定したとしても無視されるようになっている。
【０１２６】
図４は、余白属性として、Ｘ方向に「１」、Ｙ方向に「２」が指定された場合に該データブロック（リードブロック）の各サブリードブロックＳＲＢの転送時の転送範囲を示す。この場合、該サブリードブロックＳＲＢの転送時の転送範囲は、該サブリードブロックＳＲＢ内のデータに加え、該サブリードブロックＳＲＢの左右両側の境界に隣接する１列ずつのデータと、上下両端の境界に隣接する２行ずつのデータが含まれる。なお、図４では、データブロックの上端に位置するサブリードブロックＳＲＢを例としており、該サブリードブロックＳＲＢの上端の境界に隣接するデータが無いため、該サブリードブロックＳＲＢの転送時の転送範囲には、上端の境界に隣接するデータが含まれない。
【０１２７】
後に詳細に説明するが、本実施の形態のＯｐｅｎＣＬシステム１００では、各リードブロックについて、１度のリード転送時に1つのＣＵ１６０に対して１つのサブリードブロックＳＲＢが転送され、１度のリード転送により該ＣＵ１６０のプライベートメモリ／ローカルメモリに転送された各サブブロックサブリードブロックＳＲＢを対象として該ＣＵ１６０により演算が行われる。そして、演算の結果は、夫々のライトブロックの１つのサブブロックとして該ＣＵ１６０からグローバルメモリに転送される。
【０１２８】
例えば、２次元画像に対して３×３のコンボリューション演算を行う場合、注目画素と上下左右の４つの方向において、該注目画素に隣接する１画素が必要である。サブリードブロックＳＲＢ内のデータのみが転送されるのでは、該サブリードブロックＳＲＢの最も外側に位置する各画素に対する演算ができない。そのため、この場合、余白属性として、Ｘ方向とＹ方向に共に「１」を指定する必要がある。
【０１２９】
図２に示す各データブロックの余白属性を説明する。なお、余白属性の指定は、他の属性の指定と関係するため、余白属性のみでは説明しにくい。そのため、ここでは、図２に示す各データブロックに対して指定された余白属性の値のみを示し、それらの意義の詳細については後述する。
【０１３０】
リードブロックＰとリードブロックＱは、余白属性の指定対象であるが、リードブロックＰに対しては、Ｘ方向とＹ方向のいずれについても余白が「０」に設定される。また、リードブロックＱに対しては、Ｘ方向の余白が「０」、Ｙ方向の余白が「９」に指定される。
【０１３１】
従って、リードブロックＰの転送時には、サブリードブロックＳＲＢ内のデータのみが転送される。一方、リードブロックＱの転送時には、サブリードブロックＳＲＢ内のデータに加え、該サブリードブロックＳＲＢと下端で隣接する９行のデータも転送される。
【０１３２】
ライトブロックＲは、ライト転送されるデータであるため、余白属性の指定対象ではない。すなわち、ライトブロックＲの転送時には、当該サブライトブロックＳＷＢ内のデータのみが転送される。
【０１３３】
＜放送属性＞
この属性は、各リードブロックについてはサブリードブロックＳＲＢの転送先、各ライトブロックについてはサブライトブロックＳＷＢの転送元が、プライベートメモリとローカルメモリのいずれになるかを指定するパラメータであり、「ＯＮ」と「ＯＦＦ」のいずれである。例えば、図５に示すように、放送属性の「ＯＮ」は、上記転送先または転送元としてローカルメモリを指定し、放送属性の「ＯＦＦ」は、上記転送先または転送元としてプライベートメモリを指定する。
【０１３４】
図２に示す各データブロックの放送属性を説明する。なお、放送属性の指定も、他の属性と関係するため、放送属性のみでは説明しにくい。そのため、ここでは、図２に示す各データブロックに対して指定された放送属性の値のみを示し、それらの意義の詳細については後述する。
【０１３５】
リードブロックＰは、放送属性が「ＯＮ」に指定される。そのため、リードブロックＰの転送時に、各サブリードブロックＳＲＢは、ローカルメモリ１７０に転送される。
【０１３６】
リードブロックＱとライトブロックＲは、放送属性が「０ＦＦ」に指定される。そのため、リードブロックＱの転送時には、各サブリードブロックＳＲＢは、プライベートメモリ１６４に転送される。また、ライトブロックＲのサブライトブロックＳＷＢは、プライベートメモリ群からグローバルメモリ１５２に転送される。
【０１３７】
＜割当属性＞
この属性は、サブリードブロックＳＲＢとサブライトブロックＳＷＢをどのようにしてＣＵ１６０のプライベートメモリ群／ローカルメモリに割り当てる割当方式を示すパラメータである。
【０１３８】
本実施の形態のＯｐｅｎＣＬシステム１００では、「縦優先」と「横優先」の２つの割当方式がサポートされる。
【０１３９】
割当属性を詳細に説明する前に、まず、ワークグループサイズＷＧｓと、１つのアイテムに割り当てるデータ量を説明する。
【０１４０】
放送属性が「ＯＦＦ」のデータブロックに対応する「ワークグループサイズＷＧｓ」は、１つのワークグループ内のアイテム数により表されるデータ量であり、例えばアイテム数がＮであれば、ワークグループサイズＷＧｓはＮワードになる。一方、放送属性が「ＯＮ」のデータブロックに対応するワークグループサイズＷＧｓは、常に１と見なされる。以降、放送属性が「ＯＦＦ」のデータブロックに対応する「ワークグループサイズＷＧｓ」を単にワークグループサイズＷＧｓと呼ぶ。このワークグループサイズＷＧｓは、後にデバイス１２０における演算制御部１３０のシナリオ決定部１３４により決定されるが、ユーザが、カーネルの作成時に、その最大値と最小値のいずれをとるかを指定することができる。
【０１４１】
また、１つのアイテムに割り当てるデータ量も、後にシナリオ決定部１３４により決定される。ワークグループサイズＷＧｓが最小値をとる場合とは、１アイテムが１ＰＥに対応する場合である。それに対し、ＰＥのプライベートメモリをＭ（Ｍ：２以上の整数）分割してＭアイテムを１ＰＥに対応させることで、ワークグループサイズＷＧｓを最大Ｍ倍大きく指定できるＯｐｅｎＣＬデバイスの場合、最大値は最小値のＭ倍となる。一方、最大値のワークグループサイズＷＧｓを利用する場合、１ＰＥ当たりのプライベートメモリは最小値のワークグループサイズＷＧｓを利用する場合のＭ分の１となるだけである。以下、説明を簡単にするため、シナリオ決定部１３４は、常に、ワークグループサイズＷＧｓとしてその最小値を採用するものとし、その結果、１アイテムが１ＰＥに対応するので、以降、アイテムという表現の代わりにＰＥという表現を用いる。
【０１４２】
「縦優先」は、サブブロックのＸ方向のサイズ（ＳＢｓｘ）がワークグループサイズＷＧｓであり、Ｙ方向のサイズＳＢｓｙが１つのアイテムに割り当てるデータ量、すなわち１ＰＥに割り当てるデータ量であるようにデータブロックを割り当てる方式である。
【０１４３】
割当属性として「縦優先」が指定されたデータブロック内の各サブブロックは、１サブブロックが１ワークグループに対応し、かつ、該サブブロック内の１列のデータが該ワークグループ内の１つのＰＥ１６２のプライベートメモリ１６４に対応するように、グローバルメモリ１５２とプライベートメモリ１６４間で転送される。
【０１４４】
図６は、割当属性として「縦優先」が指定されたリードブロックの場合の例を示す。この場合、夫々のサブリードブロックＳＲＢは、該サブリードブロックＳＲＢ内の全てのデータが同一のワークグループ内のＰＥ１６２のプライベートメモリ１６４に格納され、かつ、該サブブロック内の同列のデータが同一のＰＥ１６２のプライベートメモリ１６４に格納されるように、グローバルメモリ１５２からプライベートメモリ１６４に転送される。
【０１４５】
「横優先」は、サブブロックのＸ方向のサイズＳＢｓｘがワークグループサイズＷＧｓの整数倍になるようにデータブロックを分割する方式である。なお、サブブロックのＹ方向のサイズＳＢｓｙは、後にシナリオ決定部１３４により決定される。
【０１４６】
割当属性として「横優先」が指定されたデータブロック内の各サブブロックは、１サブブロックが１つのワークグループに対応し、該サブブロック内の全てのデータが、同一のワークグループに含まれるＰＥ１６２のプライベートメモリ１６４に転送される。さらに、サブブロックの各行は、該行をワークグループサイズＷＧｓの量毎に区切って得た整数個の区切りブロックのデータが、区切りブロック毎に、該ワークグループ内のＷＧｓ個のＰＥ１６２のプライベートメモリ１６４に均等に分配される。
【０１４７】
図７は、割当属性として「横優先」が指定されたリードブロックの場合の例を示す。なお、該例では、サブライトブロックＳＷＢのＹ方向のサイズＳＢｓｙが１ワードとされている。つまり、該リードブロックは、サブリードブロックＳＲＢのＸ方向のサイズＳＢｓｘがワークグループサイズＷＧｓの整数倍であり、行数が１であるように分割される。
【０１４８】
図示のように、この場合、該リードブロックの夫々のサブリードブロックＳＲＢサは、該サブリードブロックＳＲＢ内の全てのデータが同一のワークグループ内のＰＥ１６２のプライベートメモリ１６４に格納されるように転送される。さらに、該サブリードブロックＳＲＢを行方向にワークグループサイズＷＧｓの量毎に区切って得た整数個の区切りブロックのデータが、区切りブロック毎に、該ワークグループ内のＷＧｓ個のＰＥ１６２のプライベートメモリ１６４に均等に分配されるように転送される。例えば、データ１から、データａの前のデータまでの複数のデータは、１つの区切りブロックを構成しており、同一のワークグループの複数のＰＥ１６２のプライベートメモリ１６４に夫々格納されるように転送される。また、データａから、データｊの前のデータまでの複数のデータも、１つの区切りブロックを構成しており、ワークグループの複数のＰＥ１６２のプライベートメモリ１６４に夫々格納されるように転送される。
【０１４９】
図２に示す各データブロックの割当属性を説明する。なお、割当属性の指定も、他の属性と関係するため、割当属性のみでは説明しにくい。そのため、ここでは、図２に示す各データブロックに対して指定された割当属性の値のみを示し、それらの意義の詳細については後述する。
【０１５０】
リードブロックＰは、割当属性として「縦優先」が指定されたとする。
【０１５１】
リードブロックＱとライトブロックＲも、割当属性が「縦優先」に指定されたとする。
【０１５２】
＜階層属性＞
この属性は、１以上の自然数で指定される階層数である。同一の階層数が指定された複数のリードブロックは、１度のリードあるいはライト転送により、夫々１つのサブブロックＳＢが転送される。
【０１５３】
図２に示す各データブロックの階層属性を説明する。なお、階層属性の指定も、他の属性と関係するため、階層属性のみでは説明しにくい。そのため、ここでは、図２に示す各データブロックに対して指定された階層属性の値のみを示し、それらの意義の詳細については後述する。
【０１５４】
リードブロックＰとリードブロックＱは、階層属性が「２」と「１」に夫々指定される。また、ライトブロックＲの階層属性が「１」に指定される。
【０１５５】
＜依存属性＞
この属性は、当該データブロックに対して、サブブロックと、該サブブロックと隣接する８つの他のサブブロックとのデータ依存関係を示すパラメータであり、「依存有り」、「依存無し」を指定可能である。また、「依存有り」については、さらに、３種類の依存関係を指定可能である。
【０１５６】
「依存有り」は、Ｒ１型、Ｒ２型、Ｒ３型の３種類がある。図８を参照して説明する。なお、図８において、点線により囲まれる枠は、サブブロックＳＢを示し、数字は、転送順位を示す。
【０１５７】
図８は、割当属性とリード属性が「縦優先」と「ＴＯＰ  ＬＥＦＴ」に夫々指定されている場合のＲ１型〜Ｒ３型依存関係を示す。
【０１５８】
図示のように、この場合、「Ｒ１型依存」は、注目サブブロックＳＢ視点から見て上のサブブロックＳＢと依存関係を有する場合に指定される。「Ｒ２型依存」は、注目サブブロックＳＢから見て上、斜め左上、左のサブブロックＳＢと依存関係を有する場合に指定される。また、「Ｒ３型依存」は、注目サブブロックＳＢから見て、隣接する８つのサブブロックＳＢのうちの、下、斜め右下の２つを除いた６つとデータ依存関係を有する場合に指定される。
【０１５９】
図２に例示したデータブロックの依存属性を説明する。なお、依存属性の指定も、他の属性と関係するため、依存属性のみでは説明しにくい。そのため、ここでは、図２に示す各データブロックに対して指定された依存属性の値のみを示し、それらの意義の詳細については後述する。
【０１６０】
該例において、リードブロックＰ、リードブロックＱ、ライトブロックＲのいずれも、依存属性が「ＮＯＮＥ」に指定される。
【０１６１】
以上、本実施の形態のＯｐｅｎＣＬシステム１００でサポートされる８つの属性を説明した。これらの８つの属性は、いずれもデバイス１２０における演算ユニット１４０の構成に依存しない。後の説明時に分かりやすいように、図２に示す３つのデータブロックに対して夫々設定された属性群を図９にまとめて示す。
【０１６２】
本実施の形態のＯｐｅｎＣＬシステム１００において、ホスト１１０からデバイス１２０に転送したカーネルの引数には、演算対象と演算結果の夫々のデータブロックに対して指定した上記の属性群が含まれる。デバイス１２０の演算制御部１３０における属性群格納部１３２は、これらの各属性群を格納して、シナリオ決定部１３４に供する。
【０１６３】
シナリオ決定部１３４は、属性群格納部１３２に格納された各属性群に基づいて、後述する転送シナリオ（以下、単に「シナリオ」ともいう）を決定すると共に、決定されたシナリオに基づいて、演算ユニット１４０による演算、及び演算に伴うデータの転送を制御する。なお、シナリオ決定部１３４は、上記制御に際して、指示セットを演算ユニット１４０に送信することを繰り返す。指示セットは、リード転送指示Ｒ、演算実行指示Ｓ、ライト転送指示Ｗを含む。また、指示セットの１回の送信は、リード転送指示Ｒ、演算実行指示Ｓ、ライト転送指示Ｗの順にこれらの指示を送信することを意味する。
【０１６４】
演算ユニット１４０において、演算制御部１３０からのリード転送指示Ｒに応じて、リード転送が行われる。
【０１６５】
次いで、演算制御部１３０からの演算実行指示Ｓに応じて、演算ユニット１４０のＰＥ１６２により、リード転送指示Ｒに応じたリード転送でプライベートメモリ１６４／ローカルメモリ１７０に格納されたデータに対して演算処理が行われる。演算結果となる各々のデータは、夫々のＰＥ１６２の対応するプライベートメモリ１６４／ローカルメモリ１７０に格納される。
【０１６６】
そして、演算制御部１３０からのライト転送指示Ｗに応じて、プライベートメモリ１６４／ローカルメモリ１７０に格納されているデータ（演算結果）は、ライト転送によりグローバルメモリ１５２へ転送される。
【０１６７】
ここで、シナリオ決定部１３４によるシナリオの決定処理を説明する。
シナリオ決定部１３４は、属性群格納部１３２に格納された各属性群と、演算ユニット１４０の構成を示すパラメータとに基づいて、シナリオを決定する。このシナリオは、転送方式に該当する。
【０１６８】
シナリオ決定部１３４の動作を説明する。説明に当たって、演算処理及びデータブロックについては、図２に示す例を使用する。なお、図２に示す各データブロックは、図９に示すように属性群が設定され、属性群格納部１３２に格納されたとする。また、演算ユニット１４０の構成を示すパラメータの例を、図１０に示す。
【０１６９】
また、上記において各属性を説明する際に、分かりやすいように、１アイテムが１ＰＥに対応するとした。以下の説明においては、１ＰＥが１以上のアイテムに対応可能であるとする。
【０１７０】
シナリオ決定部１３４は、下記の規則に従って転送方式の決定と、決定した転送方式に応じた演算処理の制御を行う。
【０１７１】
＜規則１＞
シナリオ決定部１３４は、まず、全てのデータブロックに対して、共通のワークグループサイズＷＧｓを設定すると共に、階層属性が同一である複数のデータブロックが共通の分割数でサブブロックに分割されるように、データブロックの分割サイズ、反復回数を決定する。
【０１７２】
「分割サイズ」とは、サブブロックのサイズを意味し、「分割数」は、１つのデータブロックを分割して得たサブブロックの数を意味する。１となる分割数は、分割しないことを意味する。また、「反復回数」は、該データブロックの全てのサブブロックの転送に必要な転送回数を意味する。
【０１７３】
データブロックのサイズ、分割サイズ、分割数、ワークグループサイズＷＧｓ、反復回数などは、下記の式（２）〜（５）に示す関係を有する。
【０１７４】
データブロックのサイズ＝Ｘ方向サイズＬｘ×Ｙ方向サイズＬｙ              （２）
分割サイズ
＝サブブロックのＸ方向のサイズＳＢｓｘ×Ｙ方向のサイズＳＢｓｙ          （３）
分割数＝データブロックのサイズ÷（分割サイズ×ワークグループサイズＷＧｓ）（４）
反復回数
＝｛分割数×（Ｘ方向サイズＬｘ÷ワークグループサイズＷＧｓ）／ＷＧ数      （５）
【０１７５】
シナリオ決定部１３４は、放送属性が「ＯＦＦ」であるデータブロックのうちの、リード属性が「ＮＯＮＥ」でないデータブロック（リードブロック）またはライト属性が「ＮＯＮＥ」でないデータブロック（ライトブロック）のそれぞれに対して、分割サイズと、余白属性が指定されている場合の余白分の総量（余白属性が指定されていない場合には「０」）との和が、個々のアイテムのプライベートメモリの利用可能容量の合計値を上回らない、かつ、同一の階層属性を持つデータブロックが同一の分割数に分割される制約を満たすように、ワークグループサイズＷＧｓと分割サイズ（正確にはサブブロックのＹ方向サイズＳＢｓｙ）を決定する。なお、上記制約を満たす前提の下、ターゲットＯｐｅｎＣＬデバイスの推奨ワークグループサイズＷＧｓがあれば、該ワークグループサイズＷＧｓを採用し、ワークグループサイズＷＧｓの上限と下限が定められていれば、上限と下限により決められる範囲内にワークグループサイズＷＧｓを決定する。
【０１７６】
＜規則２＞
階層属性が同一であるリードブロックの相対応するサブリードブロックＳＲＢを含むサブリードブロックＳＲＢ群毎を、同時にプライベートメモリまたはローカルメモリ空間へ転送すると共に、ユーザ指定処理を起動する。なお、転送されるサブリードブロックＳＲＢに対して余白属性により余白が指定される場合に、該余白分のデータも転送する。
【０１７７】
＜規則３＞
階層属性が異なるデータブロックの分割数の掛け算となる回数だけ、相対応するサブリードブロックＳＲＢのサブリードブロックＳＲＢ群をプライベートメモリまたはローカルメモリ区間に転送した後、ユーザ指定処理を起動する。
【０１７８】
例えば、階層属性が「１」であるリードブロックの分割数をＮ、階層属性が「２」であるリードブロックの分割数をＭとすると、シナリオ決定部１３４は、ユーザ指定処理をＮ×Ｍ回だけ呼び出すように動作する。また、各回の呼出しに先立ち、サブリードブロックＳＲＢの１種類の組合せをプライベートメモリまたはローカルメモリ区間に転送する。
【０１７９】
シナリオ決定部１３４は、サブブロックの対応付け方法（上述した転送方式における分配方式及び統合方式）を決定してから転送を行う。図１２に示すように、同一の階層のデータブロック同士のサブブロック間と、異なる階層のデータブロック同士のサブブロック間とでは対応付け方法が異なる。
＜規則４＞
ユーザ指定処理の各回の起動後に、演算処理の結果となるサブライトブロックＳＷＢをグローバルメモリ区間に転送する。サブライトブロックＳＷＢの転送は、ユーザ指定処理の起動後に行われ、転送方向が「プライベートメモリ及び／またはローカルメモリ空間からグローバルメモリ空間へ」である点を除き、サブリードブロックＳＲＢのときと同様である。
【０１８０】
図１１は、図９に示すリードブロックＰ、リードブロックＱ、ライトブロックＲに対して指定された属性群と、図１０に示す演算ユニット１４０の構成を示すパラメータとに基づいて、シナリオ決定部１３４により決定されたワークグループサイズＷＧｓ、縦分割サイズ（サブブロックのＹ方向のサイズＳＢｓｙ）、反復回数の例を示す。
【０１８１】
シナリオ決定部１３４は、まず、演算ユニット１４０のワークグループサイズＷＧｓ（３２）を仮決定する。階層属性が「１」である各データブロックの分割数を４とすると、リードブロックＱによるプライベートメモリ占有量は、アイテム毎に、「１２９×２Ｂ」の０．２５８ＫＢとなる。なお、１２９は、「リードブロックＱのＹ方向サイズＬｙ（４８０）／分割数（４）」（縦分割サイズ）に、余白属性により指定されたＹ方向の９を加算して求められた値である。同様に、ライトブロックＲによるプライベートメモリ占有量は、ワークアイテムＷＩ毎に、「（４８０／４）×４Ｂ」の０．７３８ＫＢに求められる。
【０１８２】
リードブロックＱとライトブロックＲによるアイテム毎のプライベートメモリ占有量の和が、演算ユニット１４０の構成を示すパラメータ（図１０）におけるアイテム毎のプライベートメモリ容量（１ＫＢ）より小さいので、規則１が満たされているとして、リードブロックＱとライトブロックＲのワークグループサイズＷＧｓ、分割サイズが決まる。また、反復回数は、上記式（６）に従って「５」と算出される。
【０１８３】
また、階層属性が「２」のリードブロックＰについては、放送属性が「ＯＮ」であるため、ローカルメモリへ割り当てられる。また、そのサイズ（３×３＝９）は、演算ユニット１４０のワークグループＷＧ毎のローカルメモリ容量４ＫＢより小さいので、分割無し（反復回数：１）でローカルメモリに転送される。
【０１８４】
最後に、依存属性が「依存有り」のデータブロックが存在する場合のシナリオ決定部１３４の動作をまとめる。以下の説明が分かりやすいように、ここで、各データブロックを夫々の分割サイズに分割した上で対応付けされたサブブロック群のことを、「サブブロック集合」と呼ぶ。
【０１８５】
シナリオ決定部１３４は、サブブロック集合間でサブブロック同士が依存関係にある場合は、依存元のサブブロック集合に対する処理が行われてから、依存先のサブブロック集合を処理対象とするように、反復の順序を制御する。ここで、サブブロック集合Ｍ０内のある一つのサブブロックＭＸが、サブブロック集合Ｍ１内のある一つのサブブロックＭＹと依存関係にあり、かつＭＸが定義元であるとすると、サブブロック集合Ｍ０とＭ１は依存関係にあると呼び、Ｍ０がＭ１の依存元、Ｍ１がＭ０の依存先と呼ぶ。
【０１８６】
このように、本実施の形態のＯｐｅｎＣＬシステム１００では、シナリオ決定部１３４は、デバイス１２０に設けられたおり、ホスト１１０からのカーネルの引数が示す演算対象及び演算結果の各データブロックの属性群と、演算ユニット１４０の構成を示すパラメータとに基づいて、自動的に転送方式を決定すると共に、決定した転送方式でデータの転送と、演算ユニット１４０による演算を制御する。そのため、ユーザがカーネルを開発する際に指定する必要のある内容は、図１３に示すように、属性群の指定とユーザ処理の指定のみである。図１３と図２４を比較すると、本実施の形態ＯｐｅｎＣＬシステム１００では、ユーザによる指定内容のいずれもデバイスの構成に依存せず、単純である。
【０１８７】
そのため、ユーザが演算処理の内容の指定に重心をおいて開発することができ、演算処理に伴うデータ転送の設計の重荷から解放される。シナリオ決定部１３４の設計について、デバイス１２０の構成の専門家、例えばデバイス１２０のメーカの開発者により行えばよい。
【０１８８】
なお、ＯｐｅｎＣＬについて、ソフトウェア開発者の中には、ハードウェアの演算性能を究極まで引き出そうとするエキスパートがいることを前提に、そうしたエキスパートにハードウェアを自在に制御できる自由を与えるポリシの元で、敢えて抽象的なＡＰＩのみを用意したと思われている部分がある。その一方、抽象的なＡＰＩしかないと、利用できるのはハードウェアに詳しいエキスパートのみに限定されてしまい、折角定められた規格の利用人口が増えない恐れがある。本発明にかかる技術は、上述したようにユーザの負担を軽減し、規格の利用人口の拡大が期待できるようにすると共に、演算に必ず必要な固有属性、演算属性に加え、ポリシ属性をユーザに設定させることにより、ユーザに有る程度の自由を当与えることができる。
【０１８９】
さらに、例えば、カーネルの引数の中で「スタンダードモード」と「エキスパートモード」のいずれかを示す「モード属性」を設定できるようにし、デバイス１２０は、設定されたモード属性を参照して、「スタンダードモード」である場合には上述したシナリオ決定部１３４により転送方式の決定を含む制御を行う一方、「エキスパートモード」である場合には従来のＯｐｅｎＣＬデバイスの動作をすればよい。こうすることにより、ハードウェアの構成に詳しい所謂エキスパートは、「エキスパートモード」を設定して従来通りに抽象的なＡＰＩのみを利用してカーネルを開発することができる。
【０１９０】
ＯｐｅｎＣＬシステム１００の得られる効果をより具体的に説明する。
まず、本発明にかかる技術を使用せず、従来の場合を説明する。
図１４は、図２に示す例の演算処理を実現するために、プライベートメモリとローカルメモリを使用せずに、ＰＥが直接グローバルメモリをアクセスすることによりデータ転送が行われる場合のカーネルのプログラムコードである。
【０１９１】
図１４に示すプログラムコードは、グローバルメモリ空間と、プライベートメモリ及び／またはローカルメモリ区間との間のデータ転送が無いため、内容が単純であり、コード数も少ない。
【０１９２】
しかし、これでは、演算処理の性能が良くないので、性能向上を図るために、リード転送によりグローバルメモリからプライベートメモリ及び／またはローカルメモリへ演算対象のデータを転送し、ライト転送によりプライベートメモリ及び／またはローカルメモリから演算結果のデータをグローバルメモリへ転送する必要がある。このような転送が伴う演算処理を実現するための従来のカーネルのプログラムコードの例は、図１５に示す。図１５から分かるように、図１４と比べると、プログラムのコードが増え、構成が複雑になっている。
【０１９３】
図１６は、ＯｐｅｎＣＬシステム１００において図２に示す処理を実現するためのカーネルのプログラムコードを示す。図中関数「ｇｅｔ＿ａｃｌ＿ｌｏｃａｌ＿ｓｉｚｅ（）」は、シナリオ決定部１３４によるシナリオの決定及び実行を実現するために追加した、分割サイズを戻すシステム関数の例である。このカーネルは、同等の機能を実現する図１５に示す例と比べると、コード数が少なく、構成が簡単であることが一目瞭然である。
【０１９４】
本発明にかかる技術によれば、カーネルの開発を容易にすることができると共に、ユーザによる指定内容がデバイスの構成に依存しないため、優れた可搬性を有する。ここで、ターゲットのＯｐｅｎＣＬデバイスが非同期メモリ転送に対応する場合と対応しない場合を比較する。
【０１９５】
本発明にかかる技術を使用しない場合に、ターゲットが非同期メモリ転送に対応しないデバイスから非同期メモリ転送に対応するデバイスに変ったときに、図１５に示すプログラムコードを図１７に示すプログラムコードに変更する必要がある。図１５と図１７を比較すると分かるように、プログラムコードの数も、構成も大きく変っている。
【０１９６】
図１８は、本発明の技術を適用した場合に、非同期メモリ転送に対応するデバイスと非同期メモリ転送に対応しないデバイスにおけるシナリオ決定部１３４の処理フローの例を示す。図中において、点線枠は、非同期メモリ転送に対応するデバイスの場合に、非同期メモリに対応しないデバイスの場合における処理フローに対して追加した処理を示す。
【０１９７】
図示のように、デバイスの構成の変更があっても、シナリオ決定部１３４に対してある程度の変更を加えれば対応できるため、シナリオ決定部１３４の開発者の負担も少ない。
【０１９８】
さらに、本発明にかかる技術によれば、デバイスの構成の違いがシナリオ決定部１３４により吸収されるので、非同期メモリ転送に対応するデバイスの場合と、非同期メモリに対応しないデバイスの場合とで、図２に示す演算処理を実現するためのカーネルは、図１６に示す同一のものを使用することができ、可搬性が優れている。
【０１９９】
以上、実施の形態をもとに本発明を説明した。実施の形態は例示であり、本発明の主旨から逸脱しない限り、上述した実施の形態に対してさまざまな変更、増減を行ってもよい。これらの変更、増減が行われた変形例も本発明の範囲にあることは、当業者に理解されるところである。
【符号の説明】
【０２００】
１０  ＯｐｅｎＣＬシステム
１２  ホスト
１４  ＯｐｅｎＣＬデバイス
１６  ＣＵ
１８  ＰＥ
２０  プライベートメモリ
２２  ローカルメモリ
２４  キャッシュ
３０  デバイスメモリ
３２  グローバルメモリ
３４  コンスタントメモリ
５０  逐次プロセッサ
５２  ＰＥ
５４  プライベートメモリ
５６  グローバルメモリ
５８  キャッシュ制御機構
１００  ＯｐｅｎＣＬシステム
１１０  ホスト
１２０  デバイス
１３０  演算制御部
１３２  属性群格納部
１３４  シナリオ決定部
１４０  演算ユニット
１５０  デバイスメモリ
１５２  グローバルメモリ
１５４  コンスタントメモリ
１６０  ＣＵ
１６２  ＰＥ
１６４  プライベートメモリ
１７０  ローカルメモリ
Ｌｘ  データブロックのＸ方向サイズ
Ｌｙ  データブロックのＹ方向サイズ
ＳＢｓｘ  サブブロックのＸ方向サイズ
ＳＢｓｙ  サブブロックのＹ方向サイズ
ＳＲＢ  サブリードブロック
ＳＷＢ  サブライトブロック
ＷＧ  ワークグループ
ＷＧｓ  ワークグループサイズ
ＷＩ  ワークアイテム
Ｒ  リード転送指示
Ｗ  ライト転送指示
Ｓ  演算実行指示
【図１】
0005707265.tif 000003
【図２】
0005707265.tif 000004
【図３】
0005707265.tif 000005
【図４】
0005707265.tif 000006
【図５】
0005707265.tif 000007
【図６】
0005707265.tif 000008
【図７】
0005707265.tif 000009
【図８】
0005707265.tif 000010
【図９】
0005707265.tif 000011
【図１０】
0005707265.tif 000012
【図１１】
0005707265.tif 000013
【図１２】
0005707265.tif 000014
【図１３】
0005707265.tif 000015
【図１４】
0005707265.tif 000016
【図１５】
0005707265.tif 000017
【図１６】
0005707265.tif 000018
【図１７】
0005707265.tif 000019
【図１８】
0005707265.tif 000020
【図１９】
0005707265.tif 000021
【図２０】
0005707265.tif 000022
【図２１】
0005707265.tif 000023
【図２２】
0005707265.tif 000024
【図２３】
0005707265.tif 000025
【図２４】
0005707265.tif 000026