特許第6092780号(P6092780)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ マイクロソフト テクノロジー ライセンシング,エルエルシーの特許一覧

<>
  • 特許6092780-タイルコミュニケーションオペレーター 図000026
  • 特許6092780-タイルコミュニケーションオペレーター 図000027
  • 特許6092780-タイルコミュニケーションオペレーター 図000028
  • 特許6092780-タイルコミュニケーションオペレーター 図000029
  • 特許6092780-タイルコミュニケーションオペレーター 図000030
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】6092780
(24)【登録日】2017年2月17日
(45)【発行日】2017年3月8日
(54)【発明の名称】タイルコミュニケーションオペレーター
(51)【国際特許分類】
   G06F 9/45 20060101AFI20170227BHJP
【FI】
   G06F9/44 322G
【請求項の数】20
【全頁数】22
(21)【出願番号】特願2013-533869(P2013-533869)
(86)(22)【出願日】2011年9月23日
(65)【公表番号】特表2013-539888(P2013-539888A)
(43)【公表日】2013年10月28日
(86)【国際出願番号】US2011053017
(87)【国際公開番号】WO2012050796
(87)【国際公開日】20120419
【審査請求日】2014年9月1日
(31)【優先権主張番号】12/902,404
(32)【優先日】2010年10月12日
(33)【優先権主張国】US
(73)【特許権者】
【識別番号】314015767
【氏名又は名称】マイクロソフト テクノロジー ライセンシング,エルエルシー
(74)【代理人】
【識別番号】100140109
【弁理士】
【氏名又は名称】小野 新次郎
(74)【代理人】
【識別番号】100075270
【弁理士】
【氏名又は名称】小林 泰
(74)【代理人】
【識別番号】100101373
【弁理士】
【氏名又は名称】竹内 茂雄
(74)【代理人】
【識別番号】100118902
【弁理士】
【氏名又は名称】山本 修
(74)【代理人】
【識別番号】100153028
【弁理士】
【氏名又は名称】上田 忠
(74)【代理人】
【識別番号】100120112
【弁理士】
【氏名又は名称】中西 基晴
(74)【代理人】
【識別番号】100196508
【弁理士】
【氏名又は名称】松尾 淳一
(74)【代理人】
【識別番号】100147991
【弁理士】
【氏名又は名称】鳥居 健一
(74)【代理人】
【識別番号】100119781
【弁理士】
【氏名又は名称】中村 彰吾
(74)【代理人】
【識別番号】100162846
【弁理士】
【氏名又は名称】大牧 綾子
(74)【代理人】
【識別番号】100173565
【弁理士】
【氏名又は名称】末松 亮太
(74)【代理人】
【識別番号】100138759
【弁理士】
【氏名又は名称】大房 直樹
(72)【発明者】
【氏名】ポール エフ.リングセス
【審査官】 石川 亮
(56)【参考文献】
【文献】 特開平05−298272(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/45
(57)【特許請求の範囲】
【請求項1】
コンピューター実行可能命令を格納するコンピューター可読メモリであって、コンピューターシステムによってコンパイルおよび実行されると、
専用アーキテクチャーを有する1つ以上のデータ並列最適化計算ノード上での実行のために構成されたデータ並列処理ソースコード中のタイルコミュニケーションオペレーターに応答して、入力インデックスタイプから出力インデックスタイプを生成するステップであって、
前記データ並列処理ソースコードが、前記1つ以上のデータ並列最適化計算ノードの専用アーキテクチャーを利用するデータ並列処理機能を含み、データ並列処理動作が、汎用プロセッサよりもより速くまたはより効率的に実行できるようにし、
前記入力インデックスタイプが、ランクと、第1のエレメントタイプおよび第1の形状の内少なくとも1つとを有し、
前記出力インデックスタイプが、前記ランクと、前記入力インデックスタイプのタイルである第2のエレメントタイプおよび前記入力インデックスタイプのタイルである第2の形状の内少なくとも1つとを有する、ステップと、
前記出力インデックスタイプを用いてデータ並列処理アルゴリズムを実行するステップと
を含む方法を実行させる、コンピューター可読メモリ。
【請求項2】
請求項1記載のコンピューター可読メモリにおいて、
前記入力インデックスタイプが前記第1エレメントタイプを有し、
前記出力インデックスタイプが、前記入力インデックスタイプのタイルである前記第2エレメントタイプを有する、コンピューター可読メモリ。
【請求項3】
請求項1記載のコンピューター可読メモリにおいて、
前記入力インデックスタイプが、前記第1形状を有し、
前記出力インデックスタイプが、前記入力インデックスタイプのタイルである前記第2形状を有する、コンピューター可読メモリ。
【請求項4】
請求項1記載のコンピューター可読メモリにおいて、
前記出力インデックスタイプが、前記1つ以上のデータ並列最適化計算ノードの実行構造体にマッピングされる、コンピューター可読メモリ。
【請求項5】
請求項1記載のコンピューター可読メモリにおいて、
前記出力インデックスタイプが、前記1つ以上のデータ並列最適化計算ノードにおける、前記入力インデックスタイプのローカルビューストラクチャを提供する、コンピューター可読メモリ。
【請求項6】
請求項1記載のコンピューター可読メモリにおいて、
前記データ並列処理ソースコードが、データ並列処理拡張機能を有する高水準汎用プログラミング言語で記述される、コンピューター可読メモリ。
【請求項7】
請求項1記載のコンピューター可読メモリにおいて、
前記データ並列処理ソースコードが、高水準データ並列処理プログラミング言語で記述される、コンピューター可読メモリ。
【請求項8】
請求項1記載のコンピューター可読メモリにおいて、
前記1つ以上のデータ並列最適化計算ノードが、少なくとも1つのグラフィックプロセッシングユニットを含む、コンピューター可読メモリ。
【請求項9】
請求項1記載のコンピューター可読メモリにおいて、
前記1つ以上のデータ並列最適化計算ノードが、少なくとも1つの汎用プロセッサを含む、コンピューター可読メモリ。
【請求項10】
コンピューターシステムにおいてコンパイラが実施する方法であって、
専用アーキテクチャーを有する1つ以上のデータ並列最適化計算ノード上での実行のために構成されたデータ並列処理ソースコードのタイルコミュニケーションオペレーターを特定するステップであって、
前記データ並列処理ソースコードが、前記1つ以上のデータ並列最適化計算ノードの専用アーキテクチャーを利用するデータ並列処理機能を含み、データ並列処理動作が、汎用プロセッサよりもより早くまたはより効率的に実行できるようにする
ステップと、
前記データ並列処理ソースコードから、入力インデックスタイプを出力インデックスタイプに分割することによってタイルコミュニケーションオペレーターを実装するデータ並列処理実行コードを生成するステップであって
前記入力インデックスタイプが、ランクと、第1のエレメントタイプおよび第1の形状の内少なくとも1つとを有し、
前記出力インデックスタイプが、前記ランクと、前記入力インデックスタイプのタイルである第2のエレメントタイプおよび前記入力インデックスタイプのタイルである第2の形状の内少なくとも1つとを有する
ステップと
を含む、方法。
【請求項11】
請求項10記載の方法において、
前記入力インデックスタイプが、前記第1エレメントタイプを有し、
前記出力インデックスタイプが、前記入力インデックスタイプのタイルである前記第2エレメントタイプを有する、方法。
【請求項12】
請求項10記載の方法において、
前記入力インデックスタイプが、前記第1形状を有し、
前記出力インデックスタイプが、前記入力インデックスタイプのタイルである前記第2形状を有する、方法。
【請求項13】
請求項10記載の方法において、前記出力インデックスタイプが、前記1つ以上のデータ並列最適化計算ノードの実行構造体にマッピングされる、方法。
【請求項14】
請求項10記載の方法において、前記出力インデックスタイプが、前記1つ以上のデータ並列最適化計算ノードにおける、前記入力インデックスタイプのローカルビューストラクチャを提供する、方法。
【請求項15】
請求項10記載の方法において、前記データ並列処理ソースコードが、データ並列処理拡張機能を有する高水準汎用プログラミング言語で記述される、方法。
【請求項16】
請求項10記載の方法において、前記データ並列処理ソースコードが、高水準データ並列処理プログラミング言語で記述される、方法。
【請求項17】
請求項10記載の方法において、前記1つ以上のデータ並列最適化計算ノードが、少なくとも1つのグラフィックプロセッシングユニットを含む、方法。
【請求項18】
請求項10記載の方法において、前記1つ以上のデータ並列最適化計算ノードが、少なくとも1つの汎用プロセッサを含む、方法。
【請求項19】
コンピューター実行可能命令を格納するコンピューター可読メモリであって、コンピューターシステムによって実行されると、
タイルコミュニケーションオペレーターを適用して、ランクと第1のエレメントタイプとを有する入力インデックスタイプを、前記ランクと前記入力インデックスタイプのタイルである第2のエレメントタイプとを有する出力インデックスタイプに分解するステップと、
前記入力インデックスタイプに対して、前記出力インデックスタイプを用いてデータ並列処理アルゴリズムを実行するステップと
を含む方法を実行させ、
前記タイルコミュニケーションオペレーターが、データ並列処理拡張機能を有する高水準汎用プログラミング言語で記述されたデータ並列処理ソースコードに含まれ、
前記出力インデックスタイプが、専用アーキテクチャーを有する前記データ並列処理アルゴリズムを実行するように構成された1つ以上のデータ並列最適化計算ノードの実行構造体にマッピングされ、
データ並列処理拡張機能が、前記1つ以上のデータ並列最適化計算ノードの専用アーキテクチャーを利用するデータ並列処理機能を含み、データ並列処理動作が、汎用プロセッサよりもより速くまたはより効率的に実行できるようにし、
1つ以上の前記データ並列最適化計算ノードが、少なくとも1つのグラフィックプロセッシングユニットを含む、コンピューター可読メモリ。
【請求項20】
請求項19記載のコンピューター可読メモリにおいて、前記第1エレメントタイプが第1の形状を有し、前記第2エレメントタイプは、前記タイルである第2の形状を有する、コンピューター可読メモリ。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、タイルコミュニケーションオペレーター(Tile Communication Operator)に関する。
【背景技術】
【0002】
従来、コンピューターシステムは、通常、一つ又は一つ以上の汎用プロセッサ(例えば、中央処理装置(CPU)や、一つ又は一つ以上の、より特化したデータ並列計算ノード(例えば、グラフィックスプロセッシングユニット(GPU)又は、CPUにおけるSIMD(single instruction, multiple data)演算実行部)を有する。汎用プロセッサは、通常コンピューターシステムにおいて汎用的な処理を行い、データ並列計算ノードは、一般的にコンピューターシステムにおいてデータ並列処理(例えば、グラフィック処理等)を行う。汎用プロセッサは、データ並列処理アルゴリズムの実装が可能であり、データ並列計算ノードのようなハードウェアリソースの最適化を行わずに処理を行うこともある。その結果、汎用プロセッサにおけるデータ並列処理アルゴリズムの処理は、データ並列計算ノードに比して、かなり非効率となる。
【0003】
データ並列計算ノードは、もともと、コンピューターシステムにおいてプログラムを実行する際の、汎用プロセッサに対する補助的な役割を有している。データ並列計算ノードの処理能力の向上により、データ並列処理アルゴリズムを実施するための最適化されたハードウェアの役割は増しており、データ並列計算ノードのプログラムを行うプログラマの技能を高めること、そして、より容易にデータ並列計算ノードのプログラミングを行い得ることが望まれている。
【発明の概要】
【発明が解決しようとする課題】
【0004】
計算機型線形代数(computational linear algebra)における一般的な技術として、計算上の空間が、サブスペースに分割され、各タイル又はブロックをポイントであるかのように処理することによってアルゴリズムが再帰的に実装される、タイル又はブロック分割アルゴリズムがある。そのような分割においては、しかしながら、インデックス群の詳細なトラッキングが必要であり、また、タイル及びブロックの相対的な位置関係の把握も必要とされる。その結果、インデックスの作成及び位置関係の処理においては、エラーが発生しやすく、実装が難しい。
【課題を解決するための手段】
【0005】
本要約は、簡潔化された形式で選択されたコンセプト群を紹介するものであり、下記の発明を実施するための形態においてより詳細に説明される。本要約は、特許請求の範囲に記載された事項の主要な機能や本質的な機能を明らかにするためのものではなく、請求項に記載された事項の範囲を限定するために用いられるものでもない。
【0006】
高級プログラミング言語によって、計算上の空間を、データ並列計算ノードにおける実行構造体(execution structure)(例えば、スレッドグループ)にマッピングされたサブスペース(すなわち、タイル)に分割するタイルコミュニケーションオペレーターを提供する。ランク(rank)とエレメントタイプ(element type)を有するインデックスタイプ(indexable type)は、計算上の空間を定義する。入力インデックスタイプ(input indexable type)に対し、タイルコミュニケーションオペレーターは、入力インデックスタイプと同じランクと入力インデックスタイプのタイルであるエレメントタイプを有する出力インデックスタイプ(output indexable type)を生成する。出力インデックスタイプは、データ並列計算ノードにおいて、グローバルメモリアクセスにおけるコアレッシング(coalescing)を実現する計算上の空間におけるローカルビューストラクチャを提供する。
【図面の簡単な説明】
【0007】
添付された図面は、本発明の実施形態をより深く理解するために提供され、本明細書の一部として組み込まれている。図面は、本発明の実施形態を示し、明細書中の説明と共に参照されることにより、実施形態の原理が理解され得る。その他の実施形態及び実施形態における意図された有益な点は、以下の詳細な説明を参照することにより、理解が深まり、より一層認識され得る。図面における各要素は、必ずしも相対的に縮尺を変える必要はない。同一の参照番号は、同一又は類似する部分を示す。
図1】タイルコミュニケーションオペレーターのコードの実施形態を表すコンピュータコード図である。
図2】入力インデックスタイプにタイルコミュニケーションオペレーターを適用する実施形態を表すブロック図である。
図3】出力インデックスタイプをタイルコミュニケーションオペレーターで生成する実施形態を表すブロック図である。
図4】タイルコミュニケーションオペレーターを実装するコードの実施形態を表すコンピュータコード図である。
図5】タイルコミュニケーションオペレーターを含むデータ並列コードをコンパイルし実行するように設計されたコンピューターシステムの実施形態を表すブロック図である。
【発明を実施するための形態】
【0008】
次の詳細な説明において、本明細書の一部を形成し、本発明が実行されうる例示的な実施形態によって示される添付図面を参照する。本明細書において、上(top)、下(bottom)、前(front)、後ろ(back)、先頭の(leading)、後続の(trailing)等の方向を示すための用語が、開示される図面の向きを示す言葉として用いられている。実施形態におけるコンポーネントは様々な異なる形態で配置可能であるから、方向を示すための用語が図示するために用いられているが、限定されて解釈されうるものではない。本発明の範囲を逸脱せずに、その他の実施形態が採用され得ること、構造的又は論理的な変更がされ得ることを留意されたい。したがって、以下の詳細な説明は、限定して解釈されるものではなく、本発明の範囲は添付された書面における、特許請求の範囲によって定義されるべきである。本明細書において開示される様々な実施例の機能は、特に限定のない限り、それぞれ組み合わされ得ることに留意されたい。
【0009】
図1は、タイルコミュニケーションオペレーター12のコード10の実施形態を表すコンピュータコード図である。コンパイルされ実行される際に、タイルコミュニケーションオペレーター12は、計算上の空間(図1の実施形態においてindexable_type<N,T>として表される)を、extentとして定義される(図1の実施形態において_Extentとして表される)サブスペース(すなわち、タイル)に分解する。タイルは、例えば、図5におけるDP最適化コンピューターノード121や以下に詳説されるデータ並列(DP)最適化コンピューターノードの実行構造体(execution structure)(例えば、スレッドグループ(DirectX),スレッドブロック(CUDA),ワークグループ(OpenCL), 又はwaves(AND/ATI)等)にマッピングされうる。
【0010】
コード10は、高水準汎用プログラミング言語、又は、データ並列プログラミング言語(一つ以上のデータ並列(DP)最適化コンピューターノード(例えば、図5におけるDP最適化コンピューターノード121)による実行のために一つ以上の実行可能ファイル(例えば、DP実行可能ファイル138)にコンパイルされうる)で記述された一連の処理命令を含む。
【0011】
ある実施形態においては、コード10は、一つ以上のモジュールのセットに保存されるプログラムを構成する、データ並列処理拡張機能を有する高水準汎用プログラミング言語(以下、「GP言語」という。)からの一連の処理命令を含む。GP言語においては、プログラムを異なるパーツ(例えば、モジュール)に分けて記述することが許容され、それぞれのモジュールは、コンピューターシステムがアクセスし得る、それぞれ異なるファイル又は場所に保存されても良い。GP言語は、一つ以上の汎用プロセッサ及び一つ以上の専用のDP最適化コンピューターノードの両方を含むコンピューター環境をプログラミングするための唯一の言語である。DP最適化コンピューターノードは、一般的にグラフィックプロセッシングユニット(GPU)又は汎用プロセッサのSIMDユニットであるが、汎用プロセッサのスカラまたはベクタ実行ユニットや、フィールドプログラマブルゲートアレイ(FPGA)、その他特定のコンピューター実行環境において最適なデバイスであっても良い。GP言語を利用して、プログラマは、汎用プロセッサ又はDPコンピューターノードそれぞれによる実行のために、汎用プロセッサ及びDP両方のソースコードをコード10に含めることができ、汎用プロセッサ及びDPソースコードの実行を協働させることができる。本実施形態においては、コード10は、アプリケーション、ライブラリ関数、又はオペレーティングシステムサービス等の適切なコードの種類を表すことができる。
【0012】
GP言語は、データ並列処理機能を含む、C又はC++といった、広く採用されている、高水準汎用プログラミング言語を拡張することによって構成されても良い。DP機能を含みうるその他の汎用言語の例としては、Java(登録商標),PHP,Visual Basic,Perl,Python(商標),C#,Ruby,Delphi,Fortran,VB,F#,OCaml,Haskell,Erlang,NESL,Chapel,JavaScript(登録商標)等が挙げられる。GP言語は、それぞれのプログラムの部分が異なるモジュールに含まれることを許容するリッチなリンク設定機能を有していてもよい。データ並列処理機能は、専用アーキテクチャであるDP最適化コンピューターノードを利用して、汎用プロセッサ(例えば、DP最適化コンピューターノード非対応のもの)に比して、データ並列処理をより速く又はより効率的に実行することができるプログラミングツールを提供する。GP言語はまた、プログラマが、汎用プロセッサ及びDP最適化コンピューターノード、両方のためのプログラムを記述することを可能とする、推奨されるべき高水準汎用プログラミング言語となり得る。
【0013】
その他の実施形態として、コード10は、プログラムを形成する高水準データ並列処理プログラミング言語(以下、「DP言語」という。)からの一連の処理命令を含む。DP言語は、DP最適化コンピューターノードを有するコンピューター環境において、DP最適化コンピューターノードをプログラミングするための専用言語である。DP言語を利用することによって、プログラマは、DP最適化コンピューターノード上での実行用のコード10中で、DPソースコードを生成する。DP言語は、専用アーキテクチャであるDP最適化コンピューターノードを利用して、汎用プロセッサに比して、データ並列処理をより速く又はより効率的に実行できるようにするプログラミングツールを提供する。DP言語は、既存のDPプログラミング言語であるHLSL,GLSL,Cg,C,C++,NESL,Chapel,CUDA,OpenCL,Accelerator,Ct,PGI GPGPU Accelerator,CAPS GPGPU Accelerator,Brook+,CAL,APL,Fortran 90(より上位),Data Parallel C, DAPPLE,又はAPL等であってもよい。コード10は本実施形態において、アプリケーション、ライブラリ関数、又は、オペレーティングシステムサービスといった、適切なコードの種類であってもよい。
【0014】
コード10は、DP最適化コンピューターノード上での実行のために指定されるコード部分を含む。コード10がGP言語で記載された図1における実施形態においては、GP言語を使用して、プログラマは、ベクトル関数を定義する際に、アノテーション26(例えば、_declspec(vector)...)を使って、DPソースコードを指定することが可能である。アノテーション26は、DP最適化コンピューターノードにおいて実行されるためのベクトル関数のファンクション名27(例えば、vector_func)に関連付けられている。コード10はまた、コールサイト(例えば、forall,reduce,scan,等)のベクトル関数(例えば、forall…,vector_func,…)の一つ以上の呼び出し関数(インボケーション)28を含みうる。コールサイトに対応するベクトル関数は、カーネル関数として参照される。カーネル関数は、コード10(例えば他のDPソースコード)において他のベクトル関数を呼び出し、ベクトル関数のコールグラフのルートと見なされうる。カーネル関数はまた、コード10において定義された型(type)(例えば、クラス又はストラッツ(structs))を利用しうる。DPソースコードとして型(type)をアノテーションしてもしなくても良い。他の実施形態においては、他の適切なプログラム言語のコンストラクタが、DPソースコード、及び/又は汎用プロセッサコードとして、コード10の部分を指定するために用いられても良い。さらに、コード10がDP言語で記述されている実施形態においては、アノテーション26は、省略されても良い。
【0015】
図2は、タイルコミュニケーションオペレーター12を、入力インデックスタイプ14に適用することにより、出力インデックスタイプ18を生成する実施形態を表すブロック図である。ここで用いられているように、インデックスタイプは、一つ以上の添字演算子として、非負の整数であるランクと、element_typeとして表されるタイプが指定されているものであればどのようなデータタイプでもよい。もし、index<N>が整数のN−タプル(すなわち、整数のデータタイプであればよい)を示すタイプであれば、index<N>のインスタンスは、N個の整数{i0,i1,...,im}(mはN−1(すなわち、Nタプル)に等しい)のセットである。インデックス演算子であるランクNは、index<N>におけるNタプルインスタンスをとり、そのインスタンスを、インデックスタイプにおける各要素を定義するエレメントタイプと呼ばれる他の型のインスタンスと関連付ける。ある実施形態においては、インデックスタイプは、一つ以上の以下の演算子(operators)を定義する。
【0016】
【0017】
その他の実施形態においては、オペレータは、関数、ファンクタ(Functor)又はより一般的な形態であっても良い。所定のランクとエレメントタイプを有するインデックスタイプのカテゴリは、フィールドと呼ばれるイニシャルオブジェクトを有する。インデックスタイプは、ポリトープ(polytope)の形状として、すなわち、座標軸における一次関数で表された有限数からなる半平面の交点として、代数的に表現されてもよい。
【0018】
図1及び図2を参照すると、高水準言語であるコード10は、タイルコミュニケーションオペレーター12を、入力インデックスタイプ14をデータ並列コンピューティング環境において使用するために用いている。入力インデックスタイプ14は、ランク(例えば、図1の実施形態におけるランクN)やエレメントタイプ(例えば、図1の実施形態におけるエレメントタイプT)を有し、そして、タイルコミュニケーションオペレーター12によって分解される計算上の空間を定義する。入力インデックスタイプ14それぞれに対し、タイルコミュニケーションオペレーター12は、出力インデックスタイプ18を、入力インデックスタイプ14と同じランク、および入力インデックスタイプ14のタイルであるエレメントタイプとして出力する。
【0019】
図3は、タイルコミュニケーションオペレーター12によって出力インデックスタイプ18を生成する際の実施例を示すブロック図である。図3の例として、タイルコミュニケーションオペレーター12は、2x2のタイルを使用して、4x4の入力インデックスタイプ14を、2x2の出力インデックスタイプ18に分割している。他の例として(図示されていない)、1024x1024のマトリックスを有する入力インデックスタイプ14と64x64のタイルを考えると、出力インデックスタイプ18を16x16のタイル(64x16=1024)とする例が挙げられる。
【0020】
タイルコミュニケーションオペレーター12はデータ分割の範囲パターン(range pattern)を示す。範囲パターンは、インデックスタイプの集合体を含む。Indexable<N>を、任意のランクNの入力インデックスタイプ14とすることは、インデックスオペレーターが、index<N>タイプのインスタンスを対象とすることを意味する。添字演算子(例えば、エレメントタイプ)の返される型(type)は、Indexable<N>::element_typeとなる。
【0021】
タイルコミュニケーションオペレーター12の計算結果は、下記のようになる。
tile<grid_tile>:Indexable<N>−>range<N,Indexable<N>>およびrange<N,Indexable<N>>は、grid_tileに制限される、Indexable<N> の集合体となり、Indexable<N>/grid_tileでインデックス化される。より詳細には、もしgridが、Indexable<N>の形状(shape)を示すのであれば、range<N,Indexable<N>>は、grid_range=(grid+grid_tile_−1)/grid_tile のオフセットでトランスレートされるgrid_tileに制限される、Indexable<N>の集合体となる。したがって、tile<grid_tile>(Indexable<N>)で生成された際に、grid_range は、range<N,Indexable<N>>の形状となる。
【0022】
タイルコミュニケーションオペレーター12においてコンストラクトされる、すべてのrangeインスタンスは、Indexable<N>の形状(shape)又はIndexable<N>の元々の定義領域を使用して、一般性を失うことなく、Indexable<N>.gridとして参照される。定義上は、Indexable<N>のインデックスオペレーターは、Indexable<N>.gridとして表されるすべてのIndex<N>に作用する。range<N1,Indexable<N2>>を形成する際に、Indexable<N>.gridの分割が形成され、そして、range<N1,Indexable<N2>>で定義される集合体が、N2次元(N2−dimentional)の分割に制限された、オリジナルなIndexable<N>となる−−それらは、N1次元(N1−dimentional)のIndex<N1>のセットでパラメーター化されている。コンパイルする際にコンパイラによって推論できる最適化は、range<N,Indexable<N>>が元々のIndexable<N>のパーティショニングであることである。
【0023】
入力インデックスタイプ14が”range”として定義されている例において、タイルコミュニケーションオペレーター12の以下のコード部分における“tile”を使用することによって、入力インデックスタイプ14のrangeを出力インデックスタイプ18にタイリングすることが可能である。
【0024】
【0025】
上記のコード部分においては、grid<_Rank>(e)は、タイルの集合体として、tile_rangeの形状(shape)を現している。_Tileは乗数(multiplier)又はtile_rangeによって行われるステップ、すなわち、次のタイル(’the next tile’)は、_Tileによってインクリメントされる。最後のパラメーターである、
【0026】
【0027】
は、_Parentのサブオブジェクトである_Tile−shapedを示すものである。実際に、インデックスタイプをタイリングするために、つまり、’tile(...)’演算子を有効とするために、以下のシグネチャのコンストラクタを有することが必要とされる。
【0028】
【0029】
入力インデックスタイプ14がフィールドのイニシャルオブジェクト(すなわち、”field”)として定義されている他の例において、タイルコミュニケーションオペレーター12は以下のコード部分を利用して、入力インデックスタイプ14のフィールドを出力インデックスタイプ18にタイリングする。
【0030】
【0031】
上記のコード部分においては、grid<_Rank>(e)は、タイルの集合体としてのtile_rangeの形状(shape)を示す。_Tileは乗数(multiplier)又はtile_rangeによって行われるステップ、すなわち、次のタイル(’the next tile’)は、_Tileによってインクリメントされる。最後のパラメーターである、
【0032】
【0033】
は、field<_Rank, _Element_type>のサブオブジェクトである_Tile−shapedを示すものである。
【0034】
図4は、タイルコミュニケーションオペレーター12と出力インデックスタイプ18を実装するコードの一実施形態を示すコンピュータコード図である。図4において示されるコードにおいて、データストラクチャである”tile_range”が、タイルコミュニケーションオペレーター12の”tile”により、出力インデックスタイプ18(同様に、”pseudo−field”と呼ばれる)を形成する。tile_rangeのインデックス演算子は、以下をとり、
【0035】
【0036】
そして、フィールド、又は、エクステントが_Tile
であり、そのオフセットが_Parent 内の
【0037】
【0038】
である pseudo−fieldを形成する。
【0039】
出力インデックスタイプ18は、DP最適化コンピューターノードにおいてグローバルメモリへのコアレス(coalesce)アクセスを可能とするデータ並列処理アルゴリズムの計算上の空間(例えば、入力インデックスタイプ14等)のローカルビュー構造を提供する。データ並列処理アルゴリズムのローカル構造(ストラクチャ)は、DP最適化コンピューターノードの実行構造体(execution structure)(例えば、スレッドグループ、スレッドブロック、ワークグループ又はwave等)に対応したスケジューリングパターンを形成する。ストリーミングSIMDエクステンション(SSE)計算エンジンを含むDP最適化コンピューターノードに対して、ローカルストラクチャは、ループタイリング又はループブロッキングを通じて形成されるストリップマイニング拡張機能に相似するものである。ローカルストラクチャは、グローバルメモリストアへのアクセスにおいて、アルゴリズム的により高いアクセスパフォーマンスを実現するために、DP最適化コンピューターノードの高速なローカルメモリ又は共有メモリ(例えば、有効なスクラッチパッドメモリ又はキャッシュ)と情報をやりとりする。タイリングに対するローカルストラクチャの関係性は次のものである。タイルは複数のローカルストラクチャの定数の倍数として設定されることにより、タイルに割り当てられるローカルストラクチャの数によって、実行構造のループディメンションをループ展開(アンローリング)する程度が決定される。この関係性は、以下のローカルビューの分解において示される:
【0040】
【0041】
_tileIndex は、_index(すなわち、入力インデックスタイプ14)に含まれるタイルの座標を示し、そして、_localIndex は、そのタイルにおけるオフセットを示す。ローカルストラクチャの定数である、thread_group_dimentionsは、_Tileと同じ値にセットされるか、又は、thread_group_dimentionsの倍数(例えば16)が_Tileと同じ値にセットされることにより、DP最適化コンピューターノードにおいて、グローバルメモリへのコアレス(coalesce)アクセスを可能とする。従って、タイルコミュニケーションオペレーター12によれは、DP最適化ノードにおいて、単純で且つエラーフリーで直感的なタイル分割を可能とする。
【0042】
タイルコミュニケーションオペレーター12は、繰り返し適用され、インデックスタイプを操作するその他のコミュニケーションオペレーターと結び付けられてもよい。
【0043】
行列積に関するタイルコミュニケーションオペレーター12の使用について、ここで示される。
【0044】
タイルコミュニケーションオペレーター12を使用しなければ、行列積はグローバルビューストラクチャにおいて、以下のコードで示されるように実施されるであろう。
【0045】
【0046】
16x16のスレッドグループディメンションとされたローカルビューストラクチャがあると仮定する。アルゴリズム的には、マトリックスA,B及びCを16x16のタイルにタイリングする(ここでは、Nは、16で割り切れる数とする−一般的な境界チェック(checks for boundary conditions)とカーネルは、タイル元のデータに完全に含まれていないときは、早い時期に終了してしまう。)。
【0047】
以下のループ処理が繰り返し実行され、
【0048】
【0049】
そして以下の結果がもたらされる
【0050】
【0051】
上記をタイリングするために、解体する
【0052】
【0053】
そして、タイリングされた_mA及びタイリングされた_mBから以下をもたらす。
【0054】
【0055】
上記の解体から、以下のことがわかる。
【0056】
【0057】
【0058】
から応答が始まり、つまり、マトリックス中のすべてのポイントは、タイル中にポイント及びオフセットを含むタイルに固有に分解したものを有している。ここで挙げた例を完了するために、共有メモリを利用したコアレスアクセスが実施されうる。上記のグローバルビューマトリックス乗算により、16x16のスレッドグループディメンションに対してディスパッチされるカーネルが形成されると仮定すると、論理的には256スレッドが同時にカーネルを実行することになる。あるスレッドは、同じスレッドグループの他のスレッドからの結果を必要とするときは常に、下記の同期バリア処理命令が挿入され、スレッドグループ内の他の全てのスレッドプロセスがバリアに到達するまで進行しないようにする。
【0059】
【0060】
以下のメモリ読み込みが行われることを想定する。
【0061】
【0062】
スレッドグループは、threads(i,j) 0<=i,j<16 となる。任意のiに対して、スレッド
【0063】
【0064】
は、完全にコアレスなメモリアクセスを実現するために、連続した4バイトのアドレスをグローバルメモリから読み込む。特に、スレッド(i,0)は最初の4バイト読み込み、スレッド(i,1)は2つ目の4バイトを読み込み、スレッド(i,2)は3番目の4バイト読み込む。
【0065】
グローバルメモリから、64もしくは128バイトのチャンクでメモリアクセスが行われ、そして、アクセスされた全てのメモリを実際に使用することが最適である。しかしながら、
【0066】
【0067】
は、いずれのスレッド列(i,0),(i,1),...,(i,15)に対しても、4バイトしか使用されず、ゆえに、フェッチされたグローバルメモリがほとんど利用されない。一方、
【0068】
【0069】
は、64バイトのチャンクに対して、完全にコアレスされる。なぜなら、localIdxは、実際に、(i,0), (i,1),...,(i,15)のように変化するからである。同様に、スレッドグループ及び_Tileグループが、8x32次元であると仮定すると、
【0070】
【0071】
は、128バイトのチャンクに対して、完全にコアレスされる。なぜなら、_localIdx は、実際に (i,0),(i,1),...,(i,31),のように変化するからである。
【0072】
全てのメモリアクセスにおいて、必ずコアレスなアクセスがされるようにするために、グローバルメモリのデータがコアレスな形で共有メモリに読み込まれるが、コアレスされた順番は、計算を実行する順番ではないため、グループバリアで同期を取り、その後、共有メモリから望ましい順番でアクセスを行う。これにより、メモリアクセスが完全にコアレスであること、および価値ある最適化がもたらされるが、これは、DP最適化コンピューターノードにおける共有メモリは実質的にユニットアクセススピードを有するからである。
【0073】
【0074】
これを全て合わせると、以下の結果をもたらす。
【0075】
【0076】
タイルコミュニケーションオペレーター12の利用により、完全なコアレスメモリアクセスをベースとして、行列積を行うスピードが飛躍的に高まる。加えて、マトリクスのうちの一つが、乗算のパーツとしてトランスポーズ(transpose)されるとすると、タイルコミュニケーションオペレーター12の利用により、完全なコアレスメモリアクセスをベースとして、劇的にマトリックスの乗算のスピードが高まる可能性がある。A*transpose(B)の場合、タイリングなしで100倍のパフォーマンスを生み出すために、メモリアクセスは全体として、コアレスメモリアクセスがなされない。
【0077】
図5は、タイルコミュニケーションオペレーター12を含むデータ並列コード10をコンパイルして実行するためのコンピューターシステム100の実施形態を示すブロック図である。
【0078】
コンピューターシステム100は、一つもしくは一つ以上のプロセッサパッケージ(図示されていない)に配置された一つもしくは一つ以上のプロセッシングエレメント(PE)102と、メモリシステム104を備えたホスト101を有する。コンピューターシステム100はまた、ゼロまたはそれよりも多い入力/出力デバイス106と、ゼロまたはそれよりも多いディスプレイデバイス108、ゼロまたはそれよりも多い周辺機器110、ゼロまたはそれよりも多いネットワークデバイス112を備えてもよい。コンピューターシステム100はさらに、コンピュータエンジン120を有し、コンピュータエンジン120は、一つ又は一つ以上のDP最適化コンピューターノード121を備えており、それぞれのDP最適化コンピューターノード121は、一つ以上のプロセッシングエレメント(PE)122とDP実行可能ファイル138を保存するメモリ124とのセットを含んでいる。
【0079】
ホスト101、入力/出力デバイス106、ディスプレイデバイス108、周辺機器110、ネットワークデバイス112およびコンピュータエンジン120は、それぞれ相互に、最適な種類、数及び設定のコントローラ、バス、インターフェース、及び/又はその他の有線又は無線接続を含む相互接続部114を通じて通信を行う。
【0080】
コンピューターシステム100は、汎用又は特定の目的に供すために構成された最適な処理装置を表す。コンピューターシステム100の例には、サーバー、パーソナルコンピュータ、ラップトップコンピュータ、タブレットコンピュータ、スマートフォン、PDA、携帯電話、そして、オーディオ/ビデオ機器が含まれる。コンピューターシステム100のコンポーネント(すなわち、ホスト101、入力/出力デバイス106、ディスプレイデバイス108、周辺機器110、ネットワークデバイス112、相互接続部114およびコンピュータエンジン120)は、1つの共通の(図示されていない)筐体に設置されていてもよいし、又は、(図示されていない)適切な数の個別の筐体に置かれていても良い。
【0081】
プロセッシングエレメント102それぞれは、メモリシステム104に保存されている処理命令(すなわち、ソフトウェア)を実行するように設計されている実行ハードウェアを形成する。各プロセッサパッケージに含まれるプロセッシングエレメント102は、同じ又は異なる、アーキテクチャ及び/又は処理命令セットを有していても良い。例えば、プロセッシングエレメント102は、順番どおりの実行エレメント、スーパースカラ(superscalar)実行エレメントおよびデータ並列実行エレメント(例えば、GPU実行エレメント等)を有していても良い。それぞれのプロセッシングエレメント102はメモリシステム104に保存された処理命令にアクセスし、実行するように設定されている。処理命令は、BIOS(basic input output system)や(図示されていない)ファームウェア、オペレーションシステム(OS)132、コード10、コンパイラ134、GP実行可能ファイル136、そして、DP実行可能ファイル138を含む。各プロセッシングエレメント102は、入力/出力デバイス106、ディスプレイデバイス108、周辺機器110、ネットワークデバイス112、相互接続部114、コンピュータエンジン120から受信した情報と併せて、あるいは応答して処理命令を実行し得る。
【0082】
ホスト101は、OS132をブートし、実行する。OS132は、プロセッシングエレメントが実行可能な、コンピューターシステム100のコンポーネントの管理をするための処理命令を含み、また、各プログラムがコンポーネントにアクセスして利用するためのファンクションを提供する。ある実施形態においては、OS132はWindows(登録商標)オペレーションシステムであってもよい。その他の実施形態においては、OS132は、コンピューターシステム100とともに使用されるのに適切な他のオペレーションシステムであっても良い。
【0083】
コンピューターシステムが、コード10をコンパイルするために、コンパイラ134を実行する際には、コンパイラ134は、一以上の実行可能ファイル、例えば、一つ以上のGP実行可能ファイル136や、一つ以上のDP実行可能ファイル138を生成する。他の実施形態においては、コンパイラ134は、それぞれが一つ以上のDP実行可能ファイル138を含む一つ以上のGP実行可能ファイル136を生成しても良く、GP実行可能ファイル136を生成することなく、一つ以上のDP実行可能ファイル138を生成してもよい。GP実行可能ファイル136及び/又はDP実行可能ファイル138は、コンパイラ実行に応じて、コード10の全て、又は選択された一部をコンパイルすることにより、データ並列処理拡張機能を伴う形式で生成される。コンパイルの実行は、プログラマ又はコンピューターシステム100のその他のユーザーにより行われてもよく、その他のコンピュータシステム(図示されていない)におけるコードで指示されていてもよい。
【0084】
GP実行可能ファイル136は、一つ以上の汎用プロセッシングエレメント102(例えば、中央処理装置(CPU))上で実行されるためのプログラムを表す。GP実行可能ファイル136は、一つ以上の汎用プロセッシングエレメント102の命令セットからの下位レベルの処理命令を含む。
【0085】
DP実行可能ファイル138は、データ並列処理プログラム又はデータ並列処理アルゴリズム(例えば、shader等)を表すものであり、それらは一つ以上のデータ並列(DP)最適化コンピューターノード121上での実行用に最適化されたものである。ある実施形態においては、DP実行可能ファイル138は、DPバイトコード、又は、DP最適化コンピューターノード上での実行前に、デバイスドライバ(図示されていない)により、DP最適化コンピューターノード121の処理命令群がローレベル処理命令に変換された他の中間表現(IL)を含んでいても良い。その他の実施形態として、DP実行可能ファイル138は、コンパイラ134によって挿入される、一つ以上のDP最適化コンピューターノードの処理命令群からのローレベルの実行命令を含んでも良い。したがって、一つ以上の汎用プロセッサ(例えば、CPU等)はGP実行可能ファイル136を直接実行することができ、そして、一つ以上のDP最適化コンピューターノード121、又は、DP最適化コンピューターノード121のローレベルの処理命令に変換された後のDP最適化コンピューターノードのいずれも、DP実行可能ファイル138を実行し得る。
【0086】
コンピューターシステム100は一つ以上のプロセッシングエレメント102を使用して、GP実行ファイル136を実行しても良く、そして、コンピューターシステム100はまた、下記に詳説される一つ以上のPE122を利用してDP実行可能ファイル138を実行してもよい。
【0087】
メモリシステム104は、処理命令やデータを保存するために、適切なタイプ、数、そしてコンフィグレーションの揮発性又は不揮発性のストレージデバイスを含む。メモリシステム104のストレージデバイスは、OS132、コード10、コンパイラ134、GP実行可能ファイル136、DP実行可能ファイル138を含む、コンピューターが実行可能な処理命令(すなわち、ソフトウェア)を保存するコンピューター可読保存媒体を表す。OS132、コード10、コンパイラ134、GP実行可能ファイル136、DP可能実行ファイル138のファンクションやメソッドを実行するために、処理命令がコンピューターシステム100によって実行されうる。メモリシステム104は、プロセッシングエレメント102、入力/出力デバイス106、ディスプレイデバイス108、周辺機器110、ネットワークデバイス112、コンピュータエンジン120から受信した処理命令やデータを保存する。メモリシステム104は、プロセッシングエレメント102、入力/出力デバイス106、ディスプレイデバイス、周辺機器110、ネットワークデバイス112、コンピュータエンジン120に対し、保存した処理命令やデータを提供する。メモリシステム104におけるストレージデバイスの例として、ハードディスクデバイス、ランダムアクセスメモリ(RAM)、リードオンリメモリ(ROM)、フラッシュメモリデバイスもしくはカード、磁気及びCDやDVDといった光学式ディスクが挙げられる。
【0088】
入力/出力デバイス106は、適切なタイプ、数、そしてコンフィグレーションの入力/出力デバイスであって、ユーザーからコンピューターシステム100への処理命令又はデータの入力や、コンピューターシステム100からユーザーへの処理命令又はデータの出力を行うように構成されている。入力/出力デバイス106の例として、キーボード、マウス、タッチパッド、タッチスクリーン、ボタン、ダイアル、ノブ、そしてスイッチなどが挙げられる。
【0089】
ディスプレイデバイス108は、適切なタイプ、数、そしてコンフィグレーションのディスプレイデバイスであって、テキスト及び/又はグラフィック情報をコンピューターシステムのユーザーに向けて出力するように構成されている。ディスプレイデバイス108の例として、モニタ、ディスプレイスクリーン、プロジェクタ等が挙げられる。
【0090】
周辺機器110は、適切なタイプ、数、そしてコンフィグレーションからなる周辺機器であって、コンピューターシステム100における一つ以上のコンポーネントが一般的な又は特定の機能を発揮しうるように構成されている。
【0091】
ネットワークデバイス112は、適切なタイプ、数、そしてコンフィグレーションのネットワークデバイスであって、コンピューターシステム100が一つ以上のネットワーク(図示されていない)を通じて通信可能なように構成されている。ネットワークデバイス112は、適切なネットワークプロトコル及び/又はコンフィグレーションに従い動作し、コンピューターシステム100からネットワークに情報を発信したり、コンピューターシステム100によってネットワークから情報を受信したりする。
【0092】
コンピュータエンジン120は、DP実行可能ファイル138を実行するように設計されている。コンピュータエンジン120は、一つ以上のコンピューターノード121を有する。コンピューターノード121それぞれは、メモリ階層を共有するコンピューター資源の集合体である。各々のコンピューターノード121は、PE122とDP実行可能ファイル138を保存するメモリ124のセットを、1セット以上有する。PE122は、DP実行ファイル138を実行し、そしてその実行結果をメモリ124に保存する。特に、図5において示され、以下に詳説されるように、PE122は、DP実行可能ファイルを実行して、入力インデックスタイプ14にタイルコミュニケーションオペレーター12を適用することにより、出力インデックスタイプ18を生成する。
【0093】
データ並列処理(すなわち、DPプログラム又はアルゴリズムの実行)のために最適化されたハードウェアアーキテクチャを備える一つ以上のコンピュータリソースを有するコンピューターノード121は、DP最適化コンピューターノード121と呼ばれる。DP最適化コンピューターノード121の例として、PE122のセットが一つ以上のGPUを含むものと、PE122のセットが汎用プロセッサパッケージ中にSIMDユニットのセットを含むものが挙げられる。データ並列処理のための最適化されたハードウェアアーキテクチャを有するコンピュータリソースを全く備えていないコンピューターノード121(例えば、汎用プロセッシングエレメント102のみ有するプロセッサパッケージ等)は、非DP最適化コンピューターノード121と呼ばれる。各コンピューターノード121においては、メモリ124は、メモリシステム104(例えば、GPUにて使用されるGPUメモリ)又はメモリシステム104の1部(例えば、汎用プロセッサパッケージに含まれるSIMDユニットに使用される)とは区別されうる。
【0094】
ホスト101は、コンピューターノード121に対して、コンピューターノード121が実行するためのDP実行可能ファイル138を提供し、且つ、相互接続部114を使用してDP実行可能ファイル138が生成した応答を受信するよう設計されたホストコンピュータノードを形成する。ホストコンピュータノードは、メモリ階層(すなわち、メモリシステム104)を共有する汎用コンピュータリソース(すなわち、汎用プロセッシングエレメント102)の集合体を有する。例えば、ホストコンピュータノードは、SMP(symmetric multiprocessing architecture)で設計されていてもよく、そして、また、NUMA(non−uniform memory access)アーキテクチャを採用して、メモリシステム104の局所参照性(memory locality)を最大化し得るように構成されていてもよい。
【0095】
ホストコンピュータノードのOS132は、DPの call siteを実行して、DP最適化コンピューターノード又は非DP最適化ノード121がDP実行可能ファイル138を実行するように構成されている。メモリ124をメモリシステム104と区別する実施形態においては、ホストコンピュータノードは、DP実行可能ファイル138および一つ以上の入力インデックスタイプ14がメモリシステム104からメモリ124に対してコピーされるようにする。メモリシステム104がメモリ124を含む実施形態においては、ホストコンピュータノードが、メモリシステム104におけるDP実行可能ファイル138、及び/又は、一つ以上の入力インデックスタイプ14のコピーをメモリ124として指定するか、DP実行ファイル138及び/又は一つ以上の入力インデックスタイプ14を、メモリシステム104におけるある領域からメモリ124を構成するメモリシステム104の他の領域にコピーしてもよい。非同期と指定されない限り、コンピューターノード121とホストコンピュータノード間のコピー処理は、同期ポイントであっても良い。
【0096】
ホストコンピュータノードと各コンピューターノード121は、互いにコードの実行をそれぞれ独立して同時に行っても良い。ホストコンピュータノードと各コンピューターノード121は、同期ポイントにおいて、相互に作用することにより、ノードでの計算を連携させることができる。
【0097】
ある実施形態においては、コンピュータエンジン120は、グラフィックカードを表し、そこでは一つ以上のグラフィックプロセッシングユニット(GPU)がPE122及びメモリシステム104から分離されたメモリ124を有する。その実施形態においては、グラフィックカードのドライバ(図示されていない)によって、DP実行可能ファイル138のバイトコード又はDP実行ファイル138の中間表現(IL)を、GPUのPE122が実行しうる処理命令の形式に変換しても良い。
【0098】
他の実施形態においては、コンピュータエンジン120は、一つ以上の汎用プロセッシングエレメント102、及び、メモリ124を含むメモリシステム104から構成されるプロセッサパッケージに含まれる一つ以上のGPU(すなわち、プロセッシングエレメント122)の組み合わせによって形成されていても良い。その実施形態においては、DP実行可能ファイル138のバイトコード又はDP実行ファイル138の中間表現(IL)をGPUが実行しうる処理命令の形式に変換するために、追加のソフトウェアがコンピューターシステム100において提供されても良い。
【0099】
その他の実施形態においては、コンピュータエンジン120は、プロセッシングエレメント102、及び、メモリ124を含むメモリシステム104から構成される一つ以上のプロセッサパッケージにおける、一つ以上のSIMDユニットの組み合わせによって形成されていてもよい。その実施形態においては、DP実行可能ファイル138のバイトコード又はDP実行可能ファイル138の中間表現(IL)を、プロセッサパッケージに含まれるSIMDユニットが実行しうる処理命令の形式に変換するために、追加のソフトウェアがコンピューターシステム100において提供されても良い。
【0100】
また、その他の実施形態においては、コンピュータエンジン120は、プロセッシングエレメント102、及びメモリ124を含むメモリシステム104から構成される一つ以上のプロセッサパッケージに含まれる、一つ以上のスカラ又はベクタプロセッシングパイプラインの組み合わせによって形成されていてもよい。その実施形態においては、DP実行可能ファイル138のバイトコード又はDP実行可能ファイル138の中間表現(IL)を、プロセッサパッケージに含まれるスカラプロセッシングパイプラインが実行しうる処理命令の形式に変換するために、追加のソフトウェアがコンピューターシステム100において提供されても良い。
【0101】
ある特定の実施形態がこの明細書中において示され、詳説されているが、当業者は、本発明の趣旨を逸脱しない範囲内において、本明細書において説明されている実施形態に種々の変更を加え、及び/又は同等の実装形態(インプレメンテーション)に代替することが可能であろう。本出願は、本明細書において説明されている特定の実施形態における応用やバリエーションを包含するものである。それゆえに、本発明は、請求項に記載された事項や、請求項に記載されているに等しい事項に限定されるべきではない。
図1
図2
図3
図4
図5