(57)【特許請求の範囲】
【請求項１】
コンピュータシステムによって実行される時に、該コンピュータシステムに、
特殊目的アーキテクチャを有する１または複数のデータ並列最適化計算ノード上での実行のために構成されたデータ並列ソースコード内のアジャイル通信演算子に応答して、入力インデックス可能型およびリソースマップからアジャイルインデックス可能型を生成するステップであって、前記データ並列ソースコードがデータ並列特徴を含み、該データ並列特徴は前記データ並列最適化計算ノードが有する前記特殊目的アーキテクチャを利用して、データ並列演算を実施可能とし、前記アジャイル通信演算子が、前記データ並列最適化計算ノードにまたがって計算空間を分散させるために、前記リソースマップに基づいてセグメント化した前記計算空間を生成する、ステップと、
前記アジャイルインデックス可能型を使用してデータ並列アルゴリズムを実行するステップと
を含む方法を実行させるコンピュータ実行可能命令を格納する、コンピュータ可読記憶媒体。
【請求項２】
前記アジャイルインデックス可能型が、前記リソースマップによって定義される複数のセグメントを有する、請求項１記載のコンピュータ可読記憶媒体。
【請求項３】
請求項１記載のコンピュータ可読記憶媒体であって、前記方法が更に、
前記１または複数のデータ並列最適化計算ノードのうちの第１の１つ上で前記アジャイルインデックス可能型の第１のセグメントを使用し、また、前記１または複数のデータ並列最適化計算ノードのうちの第２の１つ上で前記アジャイルインデックス可能型の第２のセグメントを使用して、前記データ並列アルゴリズムを実行するステップを含む、コンピュータ可読記憶媒体。
【請求項４】
前記データ並列アルゴリズムが、前記アジャイルインデックス可能型のフルグローバルビュー表現を用いてコーディングされる、請求項１記載のコンピュータ可読記憶媒体。
【請求項５】
前記データ並列アルゴリズムが、前記アジャイルインデックス可能型のローカルグローバルビュー表現を用いてコーディングされる、請求項１記載のコンピュータ可読記憶媒体。
【請求項６】
前記データ並列ソースコードが、データ並列拡張を有するプログラミング言語で記述される、請求項１記載のコンピュータ可読記憶媒体。
【請求項７】
前記データ並列ソースコードが、高水準データ並列プログラミング言語で記述される、請求項１記載のコンピュータ可読記憶媒体。
【請求項８】
前記１または複数のデータ並列最適化計算ノードが、少なくとも１つのグラフィックス処理ユニットを含む、請求項１記載のコンピュータ可読記憶媒体。
【請求項９】
前記１または複数のデータ並列最適化計算ノードが、少なくとも１つの汎用プロセッサを含む、請求項１記載のコンピュータ可読記憶媒体。
【請求項１０】
コンピュータシステム内でコンパイラによって実行される方法であって、
特殊目的アーキテクチャを有する１または複数のデータ並列最適化計算ノード上での実行のために構成されたデータ並列ソースコード内のアジャイル通信演算子を識別するステップであって、前記データ並列ソースコードがデータ並列特徴を含み、該データ並列特徴は前記データ並列最適化計算ノードが有する前記特殊目的アーキテクチャを利用して、データ並列演算を実施可能とする、ステップと、
入力インデックス可能型およびリソースマップからアジャイルインデックス可能型を生成することによって、データ並列実行可能コードが前記アジャイル通信演算子を実装するように、前記データ並列ソースコードから前記データ並列実行可能コードを生成するステップであって、前記アジャイル通信演算子が、前記データ並列最適化計算ノードにまたがって計算空間を分散させるために、前記リソースマップに基づいてセグメント化した前記計算空間を生成する、ステップと
を含む、方法。
【請求項１１】
前記アジャイルインデックス可能型が、前記リソースマップによって定義される複数のセグメントを有する、請求項１０記載の方法。
【請求項１２】
請求項１０記載の方法であって、更に、
前記１または複数のデータ並列最適化計算ノードのうちの第１の１つ上で前記アジャイルインデックス可能型の第１のセグメントを使用し、また、前記１または複数のデータ並列最適化計算ノードのうちの第２の１つ上で前記アジャイルインデックス可能型の第２のセグメントを使用することによって、前記データ並列実行可能コードが前記アジャイル通信演算子を実装するように、前記データ並列ソースコードから前記データ並列実行可能コードを生成するステップを含む、方法。
【請求項１３】
前記データ並列ソースコードが、前記アジャイルインデックス可能型のフルグローバルビュー表現を用いてコーディングされる、請求項１０記載の方法。
【請求項１４】
前記データ並列ソースコードが、前記アジャイルインデックス可能型のローカルグローバルビュー表現を用いてコーディングされる、請求項１０記載の方法。
【請求項１５】
前記データ並列ソースコードが、データ並列拡張を有する高水準汎用プログラミング言語で記述される、請求項１０記載の方法。
【請求項１６】
前記データ並列ソースコードが、高水準データ並列プログラミング言語で記述される、請求項１０記載の方法。
【請求項１７】
前記１または複数のデータ並列最適化計算ノードが、少なくとも１つのグラフィックス処理ユニットを含む、請求項１０記載の方法。
【請求項１８】
前記１または複数のデータ並列最適化計算ノードが、少なくとも１つの汎用プロセッサを含む、請求項１０記載の方法。
【請求項１９】
コンピュータシステムによって実行される時に、
複数のセグメントを有するアジャイルインデックス可能型を生成するリソースマップにしたがって、アジャイル通信演算子を、第１のランクおよび第１の要素型を有する入力インデックス可能型に適用するステップと、
前記アジャイルインデックス可能型を使用してデータ並列アルゴリズムを実行するステップと
を含む方法を実行させるコンピュータ実行可能命令を格納し、
前記アジャイル通信演算子が、データ並列拡張を有する高水準汎用プログラミング言語で記述されるデータ並列ソースコードに含まれ、前記データ並列拡張が、１または複数のデータ並列最適化計算ノードが有する特殊目的アーキテクチャを利用して、データ並列演算を実施可能とし、
前記アジャイル通信演算子が、前記データ並列最適化計算ノードにまたがって計算空間を分散させるために、前記リソースマップに基づいてセグメント化した前記計算空間を生成する、コンピュータ可読記憶媒体。
【請求項２０】
前記データ並列ソースコードが、少なくとも１つのグラフィックス処理ユニットを含む前記１または複数のデータ並列最適化計算ノード上で実行されるように構成される、請求項１９記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本願は、アジャイル通信演算子に関する。
【背景技術】
【０００２】
コンピュータシステムは、しばしば、１つまたは複数の汎用プロセッサ（たとえば、ＣＰＵ（中央処理装置））および１つまたは複数の特殊化されたデータ並列計算ノード（たとえば、ＣＰＵ内のＧＰＵ（グラフィックス処理ユニット）またはＳＩＭＤ（単一命令複数データ）実行ユニット）を含む。汎用プロセッサは、一般に、コンピュータシステム上で汎用処理を実行し、データ並列計算ノードは、一般に、コンピュータシステム上でデータ並列処理（たとえば、グラフィックス処理）を実行する。汎用プロセッサは、しばしば、データ並列アルゴリズムを実施する能力を有するが、データ並列計算ノード内に見られる最適化されたハードウェアリソースを用いずに（データ並列アルゴリズムを）実施する。その結果、汎用プロセッサは、データ並列アルゴリズムの実行において、データ並列計算ノードよりはるかに非効率的である可能性がある。
【０００３】
データ並列計算ノードは、従来、コンピュータシステム上でプログラムを実行する際に、汎用プロセッサに対してサポートする役割を演じてきた。データ並列アルゴリズムに最適化されたハードウェアの役割が、データ並列計算ノード処理能力の機能強化に起因して増えるにつれて、データ並列計算ノードをプログラムするプログラマの能力を高め、データ並列計算ノードのプログラミングをより簡単にすることが望ましくなるであろう。
【０００４】
データ並列アルゴリズムは、しばしば、複数のコンピューティングプラットフォームにまたがって分散される可能性があるデータの大きいセットに作用する。データの大きいセットは、データを記述するデータ構造の表現および追跡ならびに複数のプラットフォームにまたがるデータの移動における難題を提供する。その結果、複数のコンピューティングプラットフォームにまたがってデータの大きいセットを管理するプロセスは、しばしば、複雑で実施がむずかしい。
【発明の概要】
【０００５】
この要約は、下の詳細な説明でさらに説明する選択された概念を簡潔な形式で紹介するために提供される。この要約は、請求項に係る主題の主要な特徴または本質的特徴を識別することを意図されたものではなく、請求項に係る主題の範囲を限定するのに使用されることも意図されていない。
【０００６】
高水準プログラミング言語は、計算ノードにまたがって計算空間を分散させるためにリソースマップに基づいてセグメント化された計算空間を生成するアジャイル通信演算子を提供する。アジャイル通信演算子は、計算空間をセグメントに分解し、セグメントを計算ノードに割り当てさせ、ユーザが計算ノードの間でのセグメントの移動を中央で管理し、自動化することを可能にする。セグメント移動を、セグメントのフルグローバルビュー表現またはローカルグローバルビュー表現のいずれかを使用して管理することができる。
【図面の簡単な説明】
【０００７】
添付図面は、実施形態のさらなる理解を提供するために含まれ、本明細書に組み込まれ、その一部を構成する。図面は、実施形態を図示し、この説明と一緒に、実施形態の原理を説明する役に立つ。他の実施形態および実施形態の所期の利点の多くは、次の詳細な説明を参照することによってよりよく理解されるので、たやすく了解されるであろう。図面の要素は、必ずしもお互いに関して原寸通りではない。同様の符号は、対応する類似する部分を表す。
【図１】アジャイル通信演算子を用いるコードの実施形態を示すコンピュータコード図である。
【図２】入力インデックス可能型にアジャイル通信演算子を適用する実施形態を示すブロック図である。
【図３Ａ】アジャイルインデックス可能型を生成し、使用する例を示すブロック図である。
【図３Ｂ】アジャイルインデックス可能型を生成し、使用する例を示すブロック図である。
【図３Ｃ】アジャイルインデックス可能型を生成し、使用する例を示すブロック図である。
【図４】アジャイル通信演算子を含むデータ並列コードをコンパイルし、実行するように構成されたコンピュータシステムの実施形態を示すブロック図である。
【発明を実施するための形態】
【０００８】
次の詳細な説明では、添付図面を参照し、添付図面は、本明細書の一部を形成し、添付図面には、本発明を実践できる特定の実施形態が例として示されている。これに関して、「最上部」、「最下部」、「前」、「後」、「前端」、「後端」、その他などの方向用語が、説明される図面（１つまたは複数）の方位に関して使用される。実施形態の構成要素を、複数の異なる方位で配置することができるので、方向用語は、例示のために使用され、決して限定的ではない。他の実施形態を利用することができ、構造的変更または論理的変更を本発明の範囲から逸脱せずに行えることを理解されたい。したがって、次の詳細な説明は、限定的な意味で解釈してはならず、本発明の範囲は、添付の特許請求の範囲によって定義される。本明細書で説明されるさまざまな例示的実施形態の特徴は、特に注記されない限り、互いに組み合わせ可能であることを理解されたい。
【０００９】
図１は、アジャイル通信演算子１２を用いるコード１０の実施形態を示すコンピュータコード図である。コンパイルされ実行される時に、アジャイル通信演算子１２は、計算ノード（たとえば、図４に示され、下でさらに詳細に説明される計算ノード１２１）にまたがって計算空間を分散させるためにリソースマップに基づいてセグメント化された計算空間を生成する。アジャイル通信演算子は、計算空間（図１の実施形態では入力インデックス可能型１４によって表される）を、アジャイルインデックス可能型１８（図３Ｂの例にも図示）のセグメント２０に分解し、セグメント２０を計算ノードに割り当てさせ、ユーザが計算ノードの間でのセグメント２０の移動を中央で管理し、自動化することを可能にする。セグメント移動を、以下にさらに詳細に説明するように、セグメントのフルグローバルビュー表現またはローカルグローバルビュー表現のいずれかを使用して管理することができる。
【００１０】
コード１０は、１つまたは複数のＤＰ最適計算ノード（たとえば、図４に示されたＤＰ最適計算ノード１２１）による実行のために１つまたは複数の実行可能ファイル（たとえば、図４に示されたＤＰ実行可能ファイル１３８）にコンパイルされ得る、高水準汎用プログラミング言語または高水準データ並列プログラミング言語からの命令のシーケンスを含む。
【００１１】
一実施形態では、コード１０は、１つまたは複数のモジュールのセットに格納されたプログラムを形成するデータ並列拡張を伴う高水準汎用プログラミング言語（以下ではＧＰ言語）からの命令のシーケンスを含む。ＧＰ言語は、プログラムを異なる部分（すなわち、モジュール）で記述することを可能にすることができ、各モジュールを、コンピュータシステムによってアクセス可能な別々のファイルまたは位置に格納することができる。ＧＰ言語は、１つまたは複数の汎用プロセッサおよび１つまたは複数の特殊目的ＤＰ最適計算ノードを含むコンピューティング環境をプログラムする単一の言語を提供する。ＤＰ最適計算ノードは、通常、汎用プロセッサのＧＰＵ（グラフィック処理ユニット）またはＳＩＭＤユニットであるが、汎用プロセッサのスカラ実行ユニットもしくはベクトル実行ユニット、ＦＰＧＡ（フィールドプログラマブルゲートアレイ）、またはいくつかのコンピューティング環境内の他の適切なデバイスを含むこともできる。ＧＰ言語を使用して、プログラマは、汎用プロセッサとＤＰとの両方のソースコードを、それぞれ汎用プロセッサおよびＤＰ計算ノードによる実行のためにコード１０に含めることができ、汎用プロセッサソースコードおよびＤＰソースコードの実行を調整することができる。コード１０は、この実施形態では、アプリケーション、ライブラリ関数、またはオペレーティングシステムサービスなど、任意の適切なタイプのコードを表すことができる。
【００１２】
ＧＰ言語を、データ並列特徴を含めるために、ＣまたはＣ＋＋などの広く採用されている高水準の汎用プログラミング言語を拡張することによって形成することができる。ＤＰ特徴が現れることのできる汎用言語の他の例は、Ｊａｖａ（登録商標）、ＰＨＰ、Ｖｉｓｕａｌ  Ｂａｓｉｃ、Ｐｅｒｌ、Ｐｙｔｈｏｎ（商標）、Ｃ＃、Ｒｕｂｙ、Ｄｅｌｐｈｉ、Ｆｏｒｔｒａｎ、ＶＢ、Ｆ＃、ＯＣａｍｌ、Ｈａｓｋｅｌｌ、Ｅｒｌａｎｇ、ＮＥＳＬ、Ｃｈａｐｅｌ、およびＪａｖａＳｃｒｉｐｔ（登録商標）を含む。ＧＰ言語実施態様は、プログラムの異なる部分を異なるモジュールに含めることを可能にする、豊富なリンク能力を含むことができる。データ並列特徴は、データ並列動作を汎用プロセッサ（すなわち、非ＤＰ最適計算ノード）より高速にまたはより効率的に実行することを可能にするために、ＤＰ最適計算ノードの特殊目的アーキテクチャを利用するプログラミングツールを提供する。ＧＰ言語は、プログラマが汎用プロセッサとＤＰ最適計算ノードとの両方についてプログラムすることを可能にする別の適切な高水準汎用プログラミング言語とすることもできる。
【００１３】
もう１つの実施形態では、コード１０は、プログラムを形成する高水準データ並列プログラミング言語（以下、「ＤＰ言語」という。）からの命令のシーケンスを含む。ＤＰ言語は、１つまたは複数のＤＰ最適計算ノードを有するコンピューティング環境内でＤＰ最適計算ノードをプログラミングするための特殊化された言語を提供する。ＤＰ言語を使用して、プログラマは、ＤＰ最適計算ノードでの実行を意図された、コード１０内のＤＰソースコードを生成する。ＤＰ言語は、データ並列動作を汎用プロセッサより高速にまたはより効率的に実行することを可能にするためにＤＰ最適計算ノードの特殊目的アーキテクチャを利用するプログラミングツールを提供する。ＤＰ言語は、ＨＬＳＬ、ＧＬＳＬ、Ｃｇ、Ｃ、Ｃ＋＋、ＮＥＳＬ、Ｃｈａｐｅｌ、ＣＵＤＡ、ＯｐｅｎＣＬ、Ａｃｃｅｌｅｒａｔｏｒ、Ｃｔ、ＰＧＩ  ＧＰＧＰＵ  Ａｃｃｅｌｅｒａｔｏｒ、ＣＡＰＳ  ＧＰＧＰＵ  Ａｃｃｅｌｅｒａｔｏｒ、Ｂｒｏｏｋ＋、ＣＡＬ、ＡＰＬ、Ｆｏｒｔｒａｎ  ９０（および上位）、Ｄａｔａ  Ｐａｒａｌｌｅｌ  Ｃ、ＤＡＰＰＬＥ、またはＡＰＬなどの既存のＤＰプログラミング言語とすることができる。コード１０は、この実施形態では、アプリケーション、ライブラリ関数、またはオペレーティングシステムサービスなど、任意の適切なタイプのＤＰソースコードを表すことができる。
【００１４】
コード１０は、ＤＰ最適計算ノードでの実行のために指定されたコード部分を含む。コード１０がＧＰ言語を用いて記述される図１の実施形態では、ＧＰ言語は、プログラマが、ベクトル関数を定義する時に注釈２６（たとえば、＿＿ｄｅｃｌｓｐｅｃ（ｖｅｃｔｏｒ）…）を使用してＤＰソースコードを指定することを可能にする。注釈２６は、ＤＰ最適計算ノードでの実行を意図されたベクトル関数の関数名２７（たとえば、ｖｅｃｔｏｒ＿ｆｕｎｃ）に関連付けられる。コード１０は、呼出し場所（たとえば、ｆｏｒａｌｌ、ｒｅｄｕｃｅ、ｓｃａｎ、またはｓｏｒｔ）でのベクトル関数の１つまたは複数の呼出し２８（たとえば、ｆｏｒａｌｌ…，ｖｅｃｔｏｒ＿ｆｕｎｃ，…）を含むこともできる。呼出し場所に対応するベクトル関数を、カーネル関数と称する。カーネル関数は、コード１０内で他のベクトル関数（すなわち、他のＤＰソースコード）を呼び出すことができ、ベクトル関数呼出しグラフのルートと考えることができる。カーネル関数は、コード１０によって定義される型（たとえば、クラスまたは構造体）を使用することもできる。型に、ＤＰソースコードとして注釈を付けても付けなくてもよい。他の実施形態では、他の適切なプログラミング言語構造体を使用して、ＤＰソースコードおよび／または汎用プロセッサコードとしてコード１０の諸部分を指定することができる。さらに、注釈２６を、コード１０がＤＰ言語で記述される実施形態では省略することができる。
【００１５】
図２は、アジャイルインデックス可能型１８を作るために入力インデックス可能型１４にアジャイル通信演算子１２を適用する実施形態を示すブロック図である。本明細書用いられるように、インデックス可能型は、１つまたは複数の添字演算子として、非負の整数であるランクおよびｅｌｅｍｅｎｔ＿ｔｙｐｅと表される型が指定されているものであればどのようなデータ型でもよい。ｉｎｄｅｘ＜Ｎ＞が、整数（すなわち、任意のタイプの整数データ型）のＮ−タプルを表す型である場合には、ｉｎｄｅｘ＜Ｎ＞のインスタンスは、Ｎ個の整数の集合｛ｉ０，ｉ１，…，ｉｍ｝であり、ここで、ｍは、Ｎ−１と等しい（すなわち、Ｎ−タプル）。ランクＮのインデックス演算子は、ｉｎｄｅｘ＜Ｎ＞のＮ−タプルインスタンスをとり、そのインスタンスに要素型と呼ばれる型のもう１つのインスタンスを関連付け、要素型は、インデックス可能型内の各要素を定義する。一実施形態では、インデックス可能型は、次の演算子のうちの１つまたは複数を定義する。
【００１６】
0006027021.tif 000002
【００１７】
他の実施形態では、演算子を、関数、ファンクタ（Ｆｕｎｃｔｏｒ）、またはより一般的な表現とすることができる。インデックス可能型の形は、それに関して上の添字演算子のうちの１つが定義されるｉｎｄｅｘ＜ｒａｎｋ＞の集合である。インデックス可能型は、通常、ポリトープである形状を有する、すなわち、インデックス可能型を、座標軸の線形関数によって形成される有限個数の半空間の共通部分として代数的に表すことができる。
【００１８】
図１および２を参照すると、コード１０の高水準言語は、一実施形態で、データ並列コンピューティング環境で入力インデックス可能型１４を使用するためにアジャイル通信演算子１２を提供する。入力インデックス可能型１４は、ランク（たとえば、図１の実施形態ではランクＮ）および要素型（たとえば、図１の実施形態では要素型Ｔ）を有し、アジャイル通信演算子１２によって作用される計算空間を定義する。アジャイル通信演算子１２は、入力インデックス可能型１４およびリソースマップ１６（たとえば、図１の例のｒｅｓｏｕｒｃｅ＿ｍａｐ）を受け取る。入力インデックス可能型１４およびリソースマップ１６から、アジャイル通信演算子１２は、リソースマップ１６によって指定される、サブグリッドとも称するセグメント２０を有するアジャイルインデックス可能型１８を生成する（図３Ｂの例にも図示）。コード１０に示されているように、アジャイル通信演算子１２を使用して、アジャイルインデックス可能型１８をＤＰ呼出し場所（たとえば、図１の例のｆｏｒａｌｌ）に渡すことができる。それを行うことによって、アジャイル通信演算子１２は、呼出し場所によって指定されるベクトル関数を、すべての計算ノード（たとえば、図４に示された計算ノード１２１）上で複製させ、各計算ノードは、その計算ノードに割り当てられたセグメント２０を受け取る。
【００１９】
アジャイル通信演算子１２は、入力インデックス可能型１４をセグメント２０に分解させ、リソースマップ１６によって指定されるとおりに計算ノードに各セグメント２０を割り当てる。リソースマップ１６は、メモリすなわち入力インデックス可能型１４が少なくとも１つの計算ノードにまたがってどこに格納されるのかの指定を提供する。リソースマップ１６は、セグメント２０の集合がオーバーラップなしでアジャイルインデックス可能型１８をカバーするように、セグメント２０を指定する。リソースマップ１６は、セグメント２０が、同一のもしくは異なるブロックサイズおよび／または規則的なもしくは不規則なブロック組合せを伴って指定されることを可能にする。
【００２０】
図３Ａ〜３Ｃは、アジャイルインデックス可能型１８（１）を生成し、使用する例を示すブロック図である。図３Ａ〜３Ｃの例では、アジャイル通信演算子１２は、対応するリソースマップ１６（図２に図示）によって指定されるように、０から３５までの番号を付けられた要素を有する６ｘ６行列（すなわち、入力インデックス可能型１４（１））を、図３Ｂに示されたアジャイルインデックス可能型１８（１）内の９つのセグメント２０に区分する。各セグメント２０は、図３Ｂでは異なる陰付けによって表される。たとえば、第１のセグメント２０（１）は、要素０、１、６、および７を含み、第２のセグメント２０（２）は、要素２、３、８、および９を含むなどである。また、アジャイル通信演算子１２は、リソースマップ１６内のプロトコルによって指定され、図３Ｃの矢印によって示されるように、セグメント２０（１）〜２０（９）を、１つまたは複数の計算ノード１２１（１）〜１２１（Ｑ）の集合に割り当てさせ、ここで、Ｑは、１以上の整数である。
【００２１】
リソースマップ１８は、ブロック分解、巡回分解（ｃｙｃｌｉｃ  ｄｅｃｏｍｐｏｓｉｔｉｏｎ）、ブロックブロック分解、またはブロック巡回分解など、任意の適切な割当プロトコルを組み込むことができる。次のプロトコル例は、３つの計算ノード１２１（１）〜１２１（３）（すなわち、Ｑ＝３）または４つの計算ノード１２１（１）〜１２１（４）（すなわち、Ｑ＝４）があり、セグメント２０が、第１の（すなわち、最上部の）行から始めて行を横切って左から右へ２０（１）〜２０（９）の番号を付けられると仮定する。
【００２２】
行ブロック分解およびＱ＝３について、入力インデックス可能型１４（１）の３６個の要素は、３つに分割され、各計算ノード１２１が１２個の要素を割り当てられるようになる。したがって、リソースマップ１８は、要素０から１１まで（すなわち、セグメント２０（１）〜２０（３））を計算ノード１２１（１）に割り当てさせ、要素１２から２３まで（すなわち、セグメント２０（４）〜２０（６））を計算ノード１２１（２）に割り当てさせ、要素２４から３５まで（すなわち、セグメント２０（７）〜２０（９））を計算ノード１２１（３）に割り当てさせる。
【００２３】
行ブロック分解およびＱ＝４について、入力インデックス可能型１４（１）の３６個の要素は、４つに分割され、各計算ノード１２１が９つの要素を割り当てられるようになる。したがって、リソースマップ１８は、要素０から８までを計算ノード１２１（１）に割り当てさせ、要素９から１７までを計算ノード１２１（２）に割り当てさせ、要素１８から２６までを計算ノード１２１（３）に割り当てさせ、要素２７から３６までを計算ノード１２１（４）に割り当てさせる。
【００２４】
列ブロック分解およびＱ＝３について、リソースマップ１８は、セグメント２０の第１の列および第２の列（すなわち、セグメント２０（１）、２０（４）、および２０（７））を計算ノード１２１（１）に割り当てさせ、セグメント２０の第３の列および第４の列（すなわち、セグメント２０（２）、２０（５）、および２０（８））を計算ノード１２１（２）に割り当てさせ、セグメント２０の第５の列および第６の列（すなわち、セグメント２０（３）、２０（６）、および２０（９））を計算ノード１２１（３）に割り当てさせる。
【００２５】
行巡回分解およびＱ＝３について、リソースマップ１８は、要素（３＊ｋ）（ただし、ｋ＝０から１１まで）を計算ノード１２１（１）に割り当てさせ、要素（３＊ｋ＋１）を計算ノード１２１（２）に割り当てさせ、要素（３＊ｋ＋２）を計算ノード１２１（３）に割り当てさせる。
【００２６】
行巡回分解およびＱ＝４について、リソースマップ１８は、要素（４＊ｋ）（ただし、ｋ＝０から８まで）を計算ノード１２１（１）に割り当てさせ、要素（４＊ｋ＋１）を計算ノード１２１（２）に割り当てさせ、要素（４＊ｋ＋２）を計算ノード１２１（３）に割り当てさせ、要素（４＊ｋ＋３）を計算ノード１２１（４）に割り当てさせる。
【００２７】
行ブロック巡回分解およびＱ＝３について、分解は、図３Ｂに示されたセグメント２０（１）〜２０（９）に対する巡回分解である。したがって、リソースマップ１８は、セグメント２０（１）、２０（４）、および２０（７）を計算ノード１２１（１）に割り当てさせ、セグメント２０（２）、２０（５）、および２０（８）を計算ノード１２１（２）に割り当てさせ、セグメント２０（３）、２０（６）、および２０（９）を計算ノード１２１（３）に割り当てさせる。
【００２８】
行ブロック巡回分解およびＱ＝４について、リソースマップ１８は、セグメント２０（１）、２０（５）、および２０（９）を計算ノード１２１（１）に割り当てさせ、セグメント２０（２）および２０（６）を計算ノード１２１（２）に割り当てさせ、セグメント２０（３）および２０（７）を計算ノード１２１（３）に割り当てさせ、セグメント２０（４）および２０（８）を計算ノード１２１（４）に割り当てさせる。
【００２９】
行ブロックブロック分解およびＱ＝３について、リソースマップ１８は、セグメント２０（１）〜２０（３）を計算ノード１２１（１）に割り当てさせ、セグメント２０（４）〜２０（６）を計算ノード１２１（２）に割り当てさせ、セグメント２０（７）〜２０（９）を計算ノード１２１（３）に割り当てさせる。
【００３０】
リソースマップ１６の行分解または列分解の判断を、メモリレイアウトに依存するものとすることができる。たとえば、列優先メモリレイアウトは、適切なプロトコルを使用する列分解を暗示することができる。
【００３１】
一実施形態では、リソースマップ１６は、リソースセグメントの集合を含み、各リソースセグメントは、セグメント２０をリソースビュー（すなわち、計算ノードの抽象化）（図示せず）に関連付ける。たとえば、
【００３２】
【数１】
0006027021.tif 000003
【００３３】
によって定義されるインデックス可能型１４について、ｇｒｉｄ＜ｒａｎｋ＞は、２つのデータメンバ
【００３４】
【数２】
0006027021.tif 000004
【００３５】
を含む。たとえば、図３Ｂの第２のセグメント２０（２）、形状またはグリッドは、＿Ｍ＿ｅｘｔｅｎｔ＝｛２，２｝および＿Ｍ＿ｏｆｆｓｅｔ＝｛０，１｝を有し、第６セグメント２０（６）は、＿Ｍ＿ｅｘｔｅｎｔ＝｛２，２｝および＿Ｍ＿ｏｆｆｓｅｔ＝｛１，２｝を有する。したがって、ｐａｒｅｎｔ＿ｇｒｉｄを、
【００３６】
【数３】
0006027021.tif 000005
【００３７】
を使用して分解することができ、ここで、Ｍ１，Ｍ２，Ｍ３＞０かつＭ１＞＝Ｍ２＞＝Ｍ３である。典型的には、Ｍ３はＭ２を割り切り、Ｍ２はＭ１を割り切る。ａｌｇｏｒｉｔｈｍｉｃ＿ｂｌｏｃｋｓ、ｍｅｍｏｒｙ＿ｂｌｏｃｋｓ、およびｃｏｍｐｕｔｅ＿ｎｏｄｅｓの３つすべてが、オーバーラップなしでｐａｒｅｎｔ＿ｇｒｉｄをカバーする。ａｌｇｏｒｉｔｈｍｉｃ＿ｂｌｏｃｋｓは、実施されるアルゴリズム内で使用される分解を表す。ｍｅｍｏｒｙ＿ｂｌｏｃｋｓは、必要な時にメモリブロックがノードの間で移動される粒度を表す。ｃｏｍｐｕｔｅ＿ｎｏｄｅｓは、計算ノードが対応するデータを格納するために割り当てられる粒度を表す。
【００３８】
関連付けがあり、その結果、すべてのａｌｇｏｒｉｔｈｍｉｃ＿ｂｌｏｃｋまたはｍｅｍｏｒｙ＿ｂｌｏｃｋが、それがｃｏｍｐｕｔｅ＿ｎｏｄｅ上のどこに格納されるのかをルックアップすることができるようになり、その結果、各ａｌｇｏｒｉｔｈｍｉｃ＿ｂｌｏｃｋが、それがｍｅｍｏｒｙ＿ｂｌｏｃｋ上のどこに格納されるのかをルックアップすることができるようになると仮定する。子グリッドとｒｅｓｏｕｒｃｅ＿ｖｉｅｗとの間の関連付けを形成するｒｅｓｏｕｒｃｅ＿ｓｅｇｍｅｎｔｓを用いて、ｒｅｓｏｕｒｃｅ＿ｍａｐと呼ばれるクラスを生成することができる。
【００３９】
【数４】
0006027021.tif 000006
【００４０】
アジャイル通信演算子１２を使用して、アジャイルインデックス可能型１８のデータに、そのデータが現在常駐している計算ノードの知識をユーザが有することなくシームレスにアクセスすることができる。形状ｐａｒｅｎｔ＿ｇｒｉｄを有する例のインデックス可能型１４  Ａについて、Ａのストレージは、ｒｅｓｏｕｒｃｅ＿ｓｅｇｍｅｎｔのインスタンスによって判定される。
【００４１】
【数５】
0006027021.tif 000007
【００４２】
にあるＡの要素にアクセスするために、＿Ｉｎｄｅｘを含む子グリッドが、まず見つけられ、次に、オフセット
【００４３】
【数６】
0006027021.tif 000008
【００４４】
が、
【００４５】
【数７】
0006027021.tif 000009
【００４６】
になるように決定される。ｒｅｓｏｕｒｃｅ＿ｓｅｇｍｅｎｔ表記を用いると、この関係は、
【００４７】
【数８】
0006027021.tif 000010
【００４８】
である。
【００４９】
ルックアップの速度を高めるために、次のチェックを実行して、＿Ｉｎｄｅｘ（＿Ｉｎｄｅｘが変化するので）がまだ＿Ｒｅｓｏｕｒｃｅ＿ｓｅｇｍｅｎｔ．＿Ｍ＿ｃｈｉｌｄに属するかどうかを判定する。
【００５０】
【数９】
0006027021.tif 000011
【００５１】
所与の＿Ｉｎｄｅｘが属する子グリッドまたは＿Ｒｅｓｏｕｒｃｅ＿ｓｅｇｍｅｎｔの判定は、分解パターンに依存する。ワーストケースで、すべての次元での二分検索を使用することができるが、回避することはできない。しかし、たとえば、すべてのタイルが等しい広がりを有する２０４８ｘ２０４８タイル分解を用いて、＿Ｍ＿ｃｈｉｌｄ．＿Ｍ＿ｏｆｆｓｅｔが
【００５２】
【数１０】
0006027021.tif 000012
【００５３】
と等しい＿Ｒｅｓｏｕｒｃｅ＿ｓｅｇｍｅｎｔを見つけられたい。その＿Ｒｅｓｏｕｒｃｅ＿ｓｅｇｍｅｎｔ（すなわち、現在のｒｅｓｏｕｒｃｅ＿ｓｅｇｍｅｎｔ）は、
【００５４】
【数１１】
0006027021.tif 000013
【００５５】
に違反するまで使用することができ、これに違反した場合には、新しい＿Ｉｎｄｅｘを＿Ｔｉｌｅによってもう一度分割し、繰り返されたい。この機構は、新しい含むｒｅｓｏｕｒｃｅ＿ｓｅｇｍｅｎｔｓが低い頻度で見つけられることだけを必要とする、局所性を有するアルゴリズムについて、最適である可能性がある。
【００５６】
以下に説明されるローカルグローバルビュー表現では、ユーザインデックス演算子は、ユーザがすべてのアクセスの際に境界内にあると信頼されるので、ｉｆチェック（本明細書では境界チェックと称する）を省略することができる。
【００５７】
【数１２】
0006027021.tif 000014
【００５８】
所与のｒｅｓｏｕｒｃｅ＿ｓｅｇｍｅｎｔが使い果たされ、別のｒｅｓｏｕｒｃｅ＿ｓｅｇｍｅｎｔが使用される場合には、ユーザは、現在のｒｅｓｏｕｒｃｅ＿ｓｅｇｍｅｎｔをリセットする関数を呼び出すと信頼される。ローカルグローバルビューの最も単純な形では、３つの分解のすべて
【００５９】
【数１３】
0006027021.tif 000015
【００６０】
が、同一のサイズのブロックまたはタイルを有して規則的である。インデックス可能型をタイルに区分するタイル通信演算子を、最初の分解に適応して、
【００６１】
【数１４】
0006027021.tif 000016
【００６２】
を得ることができる。含まれるｍｅｍｏｒｙ＿ｂｌｏｃｋｓ［ｋ１］およびｃｏｍｐｕｔｅ＿ｎｏｄｅｓ［ｋ２］が判定される。所有者ｃｏｍｐｕｔｅ＿ｎｏｄｅｓ［ｋ３］が、次に判定され、その後、ｍｅｍｏｒｙ＿ｂｌｏｃｋｓ［ｋ１］が、ｃｏｍｐｕｔｅ＿ｎｏｄｅｓ［ｋ２］からｃｏｍｐｕｔｅ＿ｎｏｄｅｓ［ｋ３］に移動される。
【００６３】
自動メモリ移動粒度は、しばしば、セグメント２０のサブグリッド分解より微細な粒度である。たとえば、図３の行列Ａが、６１４４ｘ６１４４要素行列を表す、すなわち、各番号付きのアルゴリズムブロックが、１０２４ｘ１０２４個のデータ要素を表すと仮定する。６１４４ｘ６１４４行列が、図３Ｂのように、２０４８ｘ２０４８個のｃｏｍｐｕｔｅ＿ｎｏｄｅｓブロックに分解されると仮定する。さらに、Ｑ＝４であり、計算ノード１２１（１）、１２１（２）、１２１（３）、および１２１（４）が、ブロック巡回分解に従って２０４８ｘ２０４８ブロック（すなわち、セグメント２０（１）〜２０（９））に割り当てられると仮定する。その後、セグメント２０（１）、２０（５）、２０（９）は、計算ノード１２１（１）に割り当てられ、セグメント２０（２）、２０（６）は、計算ノード１２１（２）に割り当てられ、セグメント２０（３）および２０（７）は、計算ノード１２１（３）に割り当てられ、セグメント２０（４）および２０（８）は、計算ノード１２１（４）に割り当てられる。メモリを、この例では１０４４ｘ１０２４ブロックで移動することができる。したがって、計算が、１０２４ｘ１０２４ブロックから単一のデータ要素を移動しようとする場合には、１０２４ｘ１０２４ブロック全体が移動される。
【００６４】
アジャイル通信演算子１２は、データ並列（ＤＰ）アルゴリズムを、アジャイルインデックス可能型１８のセグメント２０のフルグローバルビュー表現またはローカルグローバルビュー表現を用いてコーディングして、計算ノードの間でのセグメント２０の移動を管理することを可能にする。
【００６５】
フルグローバルビュー表現は、水面下で自動的に発生する所有者コピーによるメモリ移動（owner-copy memory movement）とともに、ＤＰアルゴリズムが単一の計算ノード上で実行されようとしているかのようにＤＰアルゴリズムをコーディングすることを可能にする。行列加算を用いる例として、Ａ、Ｂ、およびＣが、図３Ａに示された６１４４ｘ６１４４行列であり、各番号付きのブロックが、１０２４ｘ１０２４個のデータ要素を表すと仮定する。ＡおよびＢは、有効なデータを担持するが、Ｃは、割り当てられるが必ずしもデータを担持しない。さらに、Ａ、Ｂ、およびＣが、それぞれ計算ノード１２１（１）〜１２１（Ｑ）上で割り当てられ、Ｑは、この場合には４と等しく、Ａ、Ｂ、およびＣのそれぞれのセグメント２０（１）〜２０（９）が、それぞれ計算ノード１２１（１）〜１２１（Ｑ）上で格納されると仮定する。次の計算
【００６６】
【数１５】
0006027021.tif 000017
【００６７】
を用いると、各（ｉ，ｊ）は、１０２４ｘ１０２４個の要素を表す。
【００６８】
所有者コピーは、回答すなわちＣが計算されつつある場合に、必要であればデータが計算ノード１２１に移動されることを意味する。この例では、ＡおよびＢのブロックは、計算が規定するように、計算ノード１２１の、Ｃの対応するブロックが格納されるところに移動される。しかし、単純な行列加算について、ＡおよびＢのブロックが、Ｃの対応するブロックと同一の計算ノード１２１上に格納されるので、移動は必要ではない。計算
【００６９】
【数１６】
0006027021.tif 000018
【００７０】
は、Ａ、Ｂ、およびＣのそれぞれについて図３Ｂのブロック８を使用する。ブロック８は、Ａ、Ｂ、およびＣのそれぞれについて計算ノード１２１（２）上に格納されるセグメント２０（２）の部分であり、したがって、データ移動は発生しない。同様に、次の計算は、対応するセグメント２０および計算ノード１２１上で発生する。
【００７１】
【数１７】
0006027021.tif 000019
【００７２】
ここで、セグメントは、分解の１要素を指す。
【００７３】
【数１８】
0006027021.tif 000020
【００７４】
実際には、
【００７５】
【数１９】
0006027021.tif 000021
【００７６】
であり、ここで、ａｌｇｏｒｉｔｈｍｉｃ＿ｂｌｏｃｋｓは、広がり１０２４ｘ１０２４を有し、ｍｅｍｏｒｙ＿ｂｌｏｃｋｓは、広がり２０４８ｘ１０２４を有し、ｃｏｍｐｕｔｅ＿ｎｏｄｅｓは、広がり２０４８ｘ２０４８を有する。したがって、行列加算は、かなり基本的な例である。
【００７７】
上の仮定を用いるもう１つの例では、Ｂの転置行列がＡに加算されて、次のようにＣを生成する。
【００７８】
【数２０】
0006027021.tif 000022
【００７９】
ここで、各（ｉ，ｊ）は、１０２４ｘ１０２４個の要素を表し、Ｂ（ｊ，ｉ）Ｔは、基礎になる１０２４ｘ１０２４ブロックの転置行列である。
【００８０】
この場合に、Ｂ（ｊ，ｉ）は、計算ノード１２１に移動され、ここで、Ｃ（ｉ，ｊ）（およびＡ（ｉ，ｊ））は、セグメント２０（１）、２０（５）、および２０（９）内のブロックを除くすべてのブロックについて格納される。たとえば、セグメント２０（１）のブロックは、Ｃのセグメント２０（１）のブロックに関する計算が、
【００８１】
【数２１】
0006027021.tif 000023
【００８２】
なので、移動される必要がない。しかし、Ｃのセグメント２０（４）のブロックについて、
【００８３】
【数２２】
0006027021.tif 000024
【００８４】
であり、Ｂブロックは、計算ノード１２１（２）上に格納されたセグメント２０（２）のブロックからであり、Ｃブロックは、計算ノード１２１（４）上に格納されたセグメント２０（４）のブロックからである。したがって、Ｂのブロック２の１０２４ｘ１０２４個の要素（すなわち、Ｂ（０，２）Ｔ）は、計算ノード１２１（４）に移動され、Ａ（２，０）に加算され、Ｃ（２，０）に割り当てられ、Ｂのブロック８の１０２４ｘ１０２４個の要素（すなわち、Ｂ（１，２）Ｔ）は、計算ノード１２１（４）に移動され、Ａ（２，１）に加算され、Ｃ（２，１）に割り当てられ、Ｂのブロック３の１０２４ｘ１０２４個の要素（すなわち、Ｂ（０，３）Ｔ）は、計算ノード１２１（４）に移動され、Ａ（３，０）に加算され、Ｃ（３，０）に割り当てられ、Ｂのブロック９の１０２４ｘ１０２４個の要素（すなわち、Ｂ（１，３）Ｔ）は、計算ノード１２１（４）に移動され、Ａ（３，１）に加算され、Ｃ（３，１）に割り当てられる。
【００８５】
フルグローバルビュー表現を用いると、各ブロックが、どの計算ノード１２１がそのブロックを格納するのかの情報を担持するので、メモリ移動は、自動的に行われる。計算を、計算ノード１２１のいずれかまたは、図４に示され下でさらに詳細に説明されるホスト１０１などのホストから指示することができる。
【００８６】
上の例の他の変形形態では、計算ノード１２１の個数が、セグメント２０の個数未満である場合に、複数のセグメント２０を、同一の計算ノード１２１に割り当てることができる。さらに、計算ノード１２１の処理能力に重みを付けることができ、より高速の計算ノード１２１に、より低速の計算ノード１２１より多数のセグメント２０を割り当てることができる。割当を、１つまたは複数の上記で説明したプロトコルに従って実行することができる。
【００８７】
ワークスティール（ｗｏｒｋ−ｓｔｅａｌｉｎｇ）を使用する自動負荷平衡化を、上記の変形形態で実施することもできる。ある計算ノード１２１がその計算を完了する時に、その計算ノード１２１は、他のノード１２１に割り当てられた計算を盗むことを試みる。計算を指示する計算ノード１２１またはおそらくはホストは、作業項目のワークスティールキューを格納することができ、ここで、このキューは、所有者行列（たとえば、Ｃ）上のメモリ移動粒度（たとえば、１０２４ｘ１０２４）の計算を表すタスクを含む。
【００８８】
Ｂ転置を伴う上の行列加算の例からのＡ、Ｂ、およびＣと、４つの等しい重みを与えられた計算ノード１２１（１）〜１２１（４）およびブロック巡回分解プロトコルとに関して、次の４つのワークスティールキューを、次のように格納することができる。
【００８９】
したがって、上の状況、Ｃ＝Ａ＋ＢＴ、メモリ移動粒度＝１０２４ｘ１０２４、等しい重みを与えられた４つのマシン（ｗ０＝ｗ１＝ｗ２＝ｗ３＝１）、およびブロック巡回分解について、
キュー０は１２個のタスクすなわち、セグメント２０（１）、２０（５）、および２０（９）のそれぞれの４つの１０２４ｘ１０２４ブロックからなり、
キュー１は８個のタスクすなわち、セグメント２０（２）および２０（６）のそれぞれの４つの１０２４ｘ１０２４ブロックからなり、
キュー２は８個のタスクすなわち、セグメント２０（３）および２０（７）のそれぞれの４つの１０２４ｘ１０２４ブロックからなり、
キュー３は８個のタスクすなわち、セグメント２０（４）および２０（８）のそれぞれの４つの１０２４ｘ１０２４ブロックからなる。
たとえば、キュー２は、タスク
【００９０】
【数２３】
0006027021.tif 000025
【００９１】
を含む。各計算ノード１２１は、その対応するワークスティールキューからのすべてのタスクが完了するまで、そのワークスティールキューの最上部からタスクをとる。計算ノード１２１のワークスティールキューが空である時には、計算ノード１２１は、別の計算ノード１２１に対応するワークスティールキューの最下部からタスクを盗む。ローカルグローバルビューは、通常、粒度のａｌｇｏｒｉｔｈｍｉｃ＿ｂｌｏｃｋｓレベルでタイル通信演算子を介して使用可能にされる。規則的なタイル分解を仮定すると、タイル通信演算子は、第１のタイルに適用されて、
【００９２】
【数２４】
0006027021.tif 000026
【００９３】
を作る。個々のタイルは、
【００９４】
【数２５】
0006027021.tif 000027
【００９５】
である。所有者コピーが、
【００９６】
【数２６】
0006027021.tif 000028
【００９７】
に対して開始される時には、含むｍｅｍｏｒｙ＿ｂｌｏｃｋｓ［ｋ１］およびｃｏｍｐｕｔｅ＿ｎｏｄｅｓ［ｋ２］が決定される。次に、所有者ｃｏｍｐｕｔｅ＿ｎｏｄｅｓ［ｋ３］が決定され、その後、ｍｅｍｏｒｙ＿ｂｌｏｃｋｓ［ｋ１］が、ｃｏｍｐｕｔｅ＿ｎｏｄｅｓ［ｋ２］からｃｏｍｐｕｔｅ＿ｎｏｄｅｓ［ｋ３］に移動される。このすべてが、ａｌｇｏｒｉｔｈｍｉｃ＿ｔｉｌｅｓ（＿ｔｉｌｅ＿ｉｎｄｅｘ）にアクセスするレベルで行われる。アルゴリズムを実施する時に、要素（または、再帰的に、より微細なブロック）は、
【００９８】
【数２７】
0006027021.tif 000029
【００９９】
としてアクセスされる。
【０１００】
フルグローバルビュー表現とは対照的に、ローカルグローバルビュー表現は、メモリ移動をユーザによって明示的に指定することを可能にする。上のフルグローバルビュー表現の例では、メモリ移動粒度は、１０２４ｘ１０２４ブロックであり、計算ノード１２１がブロック内の単一の要素にアクセスする場合に、１０２４ｘ１０２４ブロック全体が計算ノード１２１に移動された。
【０１０１】
いくつかの計算では、計算の粒度は、メモリ移動粒度より微細であり、ローカルグローバルビュー表現は、すべてのメモリブロックが移動されなければならない場合をユーザが明示的に指示することを超える利点を提供する。たとえば、メモリ移動粒度が、フルグローバルビュー表現の例で２０４８ｘ１０２４である、すなわち、ある要素が２つのブロックのいずれかから移動される時はいつでも、２つのブロックが移動されると仮定する。したがって、Ｃ＝Ａ＋ＢＴについて、Ｃのセグメント２０（４）のブロックの計算は、
【０１０２】
【数２８】
0006027021.tif 000030
【０１０３】
である。各場合で、Ｂブロックは、計算ノード１２１（２）上に格納され、ＣブロックおよびＡブロック（Ｃが所有者である）は、計算ノード１２１（４）上に格納される。したがって、上のステートメントの最初の２つは、Ｂのブロック２の任意の要素（すなわち、Ｂ（０，２）Ｔ）を計算ノード１２１（４）に移動しなければならないことを明示的に指示することによって実行される。２０４８ｘ１０２４メモリ粒度のゆえに、最初の２つのステートメントの加算を計算ノード１２１（４）によって実行することを可能とするために、Ｂのブロック２とブロック８との両方（すなわち、Ｂ（０，２）ＴおよびＢ（１，２）Ｔ）が、計算ノード１２１（４）に移動される。同様に、上のステートメントの最後の２つは、Ｂのブロック３の任意の要素（すなわち、Ｂ（０，３）Ｔ）を計算ノード１２１（４）に移動しなければならないことを明示的に指示することによって実行される。２０４８ｘ１０２４メモリ粒度のゆえに、、最後の２つのステートメントの加算を計算ノード１２１（４）によって実行することを可能とするために、Ｂのブロック３とブロック９との両方（すなわち、Ｂ（０，３）ＴおよびＢ（１，３）Ｔ）が、計算ノード１２１（４）に移動される。
【０１０４】
これらの例が示すように、計算の粒度を、メモリ移動粒度より微細にすることができ、メモリ移動粒度を、計算ノード粒度より微細にすることができ、その結果、１つまたは複数のアルゴリズムを用いて所与のメモリ移動ブロック上で実行される多数のタスクがあるものとすることができるようになる。ブロックの要素を移動する単一のディレクティブは、ブロック上で動作しつつあるタスクをより効率的に実行することを可能にする。ユーザと実施態様との両方が、指示するアルゴリズムが別のメモリ移動ブロックを操作し始めるまで、メモリブロックを移動する必要があるかどうかを調べるチェックを省略することができ、上からわかるように、ａｌｇｏｒｉｔｈｍｉｃ＿ｂｌｏｃｋｓ分解に対応するタイル通信演算子は、実際に、必要な時にメモリ移動を指示する。１０２４ｘ１０２４タイル（たとえば、ブロック３）を移動しなければならない場合には、含まれる２０４８ｘ１０２４メモリ移動ブロック（たとえば、メモリ移動ブロック３）が、含まれる２０４８ｘ２０４８計算ノードブロック（たとえば、セグメント２０（２））から所有者コピーによって判定された２０４８ｘ２０４８ブロック（たとえば、セグメント２０（４））に移動される。ブロック９が、今移動されなければならない場合には、対応するタイルへのアクセスは、それを含むメモリ移動ブロックをルックアップし、それが既にセグメント２０（４）に移動されており、したがって移動は必要ないと判定する。上で示した境界チェックは、正しいメモリ移動がタイル内の実際のデータ要素アクセスの前にタイルレベルで行われているので、省略することができる。すなわち、
【０１０５】
【数２９】
0006027021.tif 000031
【０１０６】
は、すべての必要なメモリ移動を生成し、その後、
【０１０７】
【数３０】
0006027021.tif 000032
【０１０８】
に、各＿ｌｏｃａｌ＿ｉｎｄｅｘを境界チェックせずにアクセスすることができる。たとえば、上の計算では、メモリ移動ブロックごとに２つのアルゴリズムタスクがある。
【０１０９】
実際には、所有者メモリ（たとえば、Ｃ）上の所与のメモリブロックに対して実行されるすべての計算を、大きいタスクにグループ化することができ、タスク内の最初のステートメントを、単一のメモリ移動ディレクティブとすることができる。このディレクティブは、一実施形態では、次のようにタスクに対する標準Ｃ＋＋注釈の形とすることができる。
【０１１０】
【数３１】
0006027021.tif 000033
【０１１１】
この注釈を使用して、コンパイラは、メモリ移動および計算を最適化し、インターリーブすることができる。
【０１１２】
次のコードは、一実施形態のアジャイル通信演算子１２の実施態様の概要を提供する。
【０１１３】
0006027021.tif 000034
【０１１４】
0006027021.tif 000035
【０１１５】
0006027021.tif 000036
【０１１６】
0006027021.tif 000037
【０１１７】
0006027021.tif 000038
【０１１８】
図４は、アジャイル通信演算子１２を含むデータ並列コード１０をコンパイルし、実行するように構成されたコンピュータシステム１００の実施形態を示すブロック図である。
【０１１９】
コンピュータシステム１００は、１つまたは複数のプロセッサパッケージ（図示せず）内に収容された１つまたは複数の処理要素（ＰＥ）１０２およびメモリシステム１０４を有するホスト１０１を含む。コンピュータシステム１００は、０個以上の入出力デバイス１０６、０個以上の表示デバイス１０８、０個以上の周辺デバイス１１０、および０個以上のネットワークデバイス１１２をも含む。コンピュータシステム１００は、さらに、１つまたは複数のＤＰ最適計算ノード１２１を有する計算エンジン１２０を含み、各ＤＰ最適計算ノード１２１は、１つまたは複数の処理要素（ＰＥ）１２２のセットと、ＤＰ実行可能ファイル１３８を格納するメモリ１２４とを含む。
【０１２０】
ホスト１０１、入出力デバイス１０６、表示デバイス１０８、周辺デバイス１１０、ネットワークデバイス１１２、および計算エンジン１２０は、任意の適切なタイプ、個数、および構成のコントローラ、バス、インターフェース、および／または他の有線接続もしくは無線接続を含む相互接続１１４のセットを使用して通信する。
【０１２１】
コンピュータシステム１００は、汎用または特殊目的のために構成された任意の適切な処理デバイスを表す。コンピュータシステム１００の例は、サーバ、パーソナルコンピュータ、ラップトップコンピュータ、タブレットコンピュータ、スマートホン、ＰＤＡ（携帯情報端末）、携帯電話機、およびオーディオ／ビデオデバイスを含む。コンピュータシステム１００のコンポーネント（すなわち、ホスト１０１、入出力デバイス１０６、表示デバイス１０８、周辺デバイス１１０、ネットワークデバイス１１２、相互接続１１４、および計算エンジン１２０）を、共通のハウジング（図示せず）内または任意の適切な個数の別々のハウジング（図示せず）内に含めることができる。
【０１２２】
処理要素１０２は、それぞれ、メモリシステム１０４内に格納された命令（すなわち、ソフトウェア）を実行するように構成された実行ハードウェアを形成する。各プロセッサパッケージ内の処理要素１０２は、同一のまたは異なるアーキテクチャおよび／または命令セットを有することができる。たとえば、処理要素１０２は、インオーダ実行要素、スーパースカラ実行要素、およびデータ並列実行要素（たとえば、ＧＰＵ実行要素）の任意の組合せを含むことができる。各処理要素１０２は、メモリシステム１０４内に格納された命令にアクセスし、これを実行するように構成される。命令は、ＢＩＯＳ（基本入出力システム）またはファームウェア（図示せず）、ＯＳ（オペレーティングシステム）１３２、コード１０、コンパイラ１３４、ＧＰ実行可能ファイル１３６、およびＤＰ実行可能ファイル１３８を含むことができる。各処理要素１０２は、入出力デバイス１０６、表示デバイス１０８、周辺デバイス１１０、ネットワークデバイス１１２、および／または計算エンジン１２０から受け取られた情報に関連してまたはこれに応答して命令を実行することができる。
【０１２３】
ホスト１０１は、ＯＳ  １３２をブートし、実行する。ＯＳ  １３２は、コンピュータシステム１００のコンポーネントを管理し、プログラムがコンポーネントにアクセスし、これを使用することを可能にする機能のセットを提供するために、処理要素によって実行可能な命令を含む。一実施形態では、ＯＳ  １３２は、Ｗｉｎｄｏｗｓ（登録商標）オペレーティングシステムである。他の実施形態では、ＯＳ  １３２は、コンピュータシステム１００と共に使用するのに適する別のオペレーティングシステムである。
【０１２４】
コンピュータシステムが、コード１０をコンパイルするためにコンパイラ１３４を実行する時に、コンパイラ１３４は、１つまたは複数の実行可能ファイル、たとえば、１つまたは複数のＧＰ実行可能ファイル１３６および１つまたは複数のＤＰ実行可能ファイル１３８を生成する。他の実施形態では、コンパイラ１３４は、それぞれが１つまたは複数のＤＰ実行可能ファイル１３８を含む１つまたは複数のＧＰ実行可能ファイル１３６を生成することができ、または、ＧＰ実行可能ファイル１３６を全く生成せずに１つまたは複数のＤＰ実行可能ファイル１３８を生成することができる。ＧＰ実行可能ファイル１３６および／またはＤＰ実行可能ファイル１３８は、コード１０のすべてまたは選択された部分をコンパイルするための、データ並列拡張を有するコンパイラ１３４の呼出しに応答して生成される。この呼出しを、たとえば、プログラマもしくはコンピュータシステム１００の他のユーザ、コンピュータシステム１００内の他のコード、または別のコンピュータシステム（図示せず）内の他のコードによって生成することができる。
【０１２５】
ＧＰ実行可能ファイル１３６は、１つまたは複数の汎用処理要素１０２（たとえば、ＣＰＵ（中央処理装置））上での実行を目的としたプログラムを表す。ＧＰ実行可能ファイル１３６は、１つまたは複数の汎用処理要素１０２の命令セットからの低水準命令を含む。
【０１２６】
ＤＰ実行可能ファイル１３８は、１つまたは複数のデータ並列（ＤＰ）最適計算ノード１２１上での実行を目的とされ、そのために最適化されたデータ並列プログラムまたはデータ並列アルゴリズム（たとえば、シェーダ）を表す。一実施形態では、ＤＰ実行可能ファイル１３８は、ＤＰ最適計算ノード１２１上で実行される前にデバイスドライバ（図示せず）を使用してＤＰ最適計算ノード１２１の命令セットからの低水準命令に変換されるＤＰバイトコードまたはある他の中間表現（ＩＬ）を含む。他の実施形態では、ＤＰ実行可能ファイル１３８は、１つまたは複数のＤＰ最適計算ノード１２１の命令セットからの低水準命令を含み、この低水準命令は、コンパイラ１３４によって挿入されたものである。したがって、ＧＰ実行可能ファイル１３６は、１つまたは複数の汎用プロセッサ（たとえば、ＣＰＵ）によって直接に実行可能であり、ＤＰ実行可能ファイル１３８は、１つまたは複数のＤＰ最適計算ノード１２１によって直接に実行可能であるか、ＤＰ最適計算ノード１２１の低水準命令に変換された後に１つまたは複数のＤＰ最適計算ノード１２１によって実行可能であるかのいずれかである。
【０１２７】
コンピュータシステム１００は、１つまたは複数の処理要素１０２を使用してＧＰ実行可能ファイル１３６を実行することができ、コンピュータシステム１００は、以下にさらに詳細に説明するように、１つまたは複数のＰＥ  １２２を使用してＤＰ実行可能ファイル１３８を実行することができる。
【０１２８】
メモリシステム１０４は、命令およびデータを格納するように構成された、任意の適切なタイプ、個数、および構成の、揮発性のストレージデバイスまたは不揮発性のストレージデバイスを含む。メモリシステム１０４のストレージデバイスは、ＯＳ  １３２、コード１０、コンパイラ１３４、ＧＰ実行可能ファイル１３６、およびＤＰ実行可能ファイル１３８を含むコンピュータ実行可能命令（すなわち、ソフトウェア）を格納するコンピュータ可読記憶媒体を表す。命令は、本明細書で説明するように、ＯＳ  １３２、コード１０、コンパイラ１３４、ＧＰ実行可能ファイル１３６、およびＤＰ実行可能ファイル１３８の関数およびメソッドを実行するために、コンピュータシステム１００によって実行可能である。メモリシステム１０４は、処理要素１０２、入出力デバイス１０６、表示デバイス１０８、周辺デバイス１１０、ネットワークデバイス１１２、および計算エンジン１２０から受け取られる命令およびデータを格納する。メモリシステム１０４は、格納された命令およびデータを処理要素１０２、入出力デバイス１０６、表示デバイス１０８、周辺デバイス１１０、ネットワークデバイス１１２、および計算エンジン１２０に供給する。メモリシステム１０４内のストレージデバイスの例は、ハードディスクドライブ、ＲＡＭ（ランダムアクセスメモリ）、ＲＯＭ（読取専用メモリ）、フラッシュメモリドライブおよびフラッシュメモリカード、ならびにＣＤおよびＤＶＤなどの磁気ディスクおよび光ディスクを含む。
【０１２９】
入出力デバイス１０６は、ユーザからコンピュータシステム１００に命令またはデータを入力し、コンピュータシステム１００からユーザに命令またはデータを出力するように構成された、任意の適切なタイプ、個数、および構成の入出力デバイスを含む。入出力デバイス１０６の例は、キーボード、マウス、タッチパッド、タッチスクリーン、ボタン、ダイヤル、ノブ、およびスイッチを含む。
【０１３０】
表示デバイス１０８は、コンピュータシステム１００のユーザにテキスト情報および／またはグラフィカル情報を出力するように構成された、任意の適切なタイプ、個数、および構成の表示デバイスを含む。表示デバイス１０８の例は、モニタ、ディスプレイスクリーン、およびプロジェクタを含む。
【０１３１】
周辺デバイス１１０は、一般的な処理機能または特定の処理機能を実行するためにコンピュータシステム１００内の１つまたは複数の他のコンポーネントと共に動作するように構成された、任意の適切なタイプ、個数、および構成の周辺デバイスを含む。
【０１３２】
ネットワークデバイス１１２は、コンピュータシステム１００が１つまたは複数のネットワーク（図示せず）にまたがって通信することを可能にするように構成された、任意の適切なタイプ、個数、および構成のネットワークデバイスを含む。ネットワークデバイス１１２は、情報をコンピュータシステム１００によってネットワークに送信しまたはコンピュータシステム１００によってネットワークから受信することを可能にするために、任意の適切なネットワーキングプロトコルおよび／または構成に従って動作することができる。
【０１３３】
計算エンジン１２０は、ＤＰ実行可能ファイル１３８を実行するように構成される。計算エンジン１２０は、１つまたは複数の計算ノード１２１を含む。各計算ノード１２１は、メモリ階層を共有する計算リソースのコレクションである。各計算ノード１２１は、１つまたは複数のＰＥ  １２２のセットと、ＤＰ実行可能ファイル１３８を格納するメモリ１２４とを含む。ＰＥ  １２２は、ＤＰ実行可能ファイル１３８を実行し、ＤＰ実行可能ファイル１３８によって生成された結果をメモリ１２４に格納する。具体的には、ＰＥ  １２２は、図４に示され、上でさらに詳細に説明されるように、出力インデックス可能型１８を生成するために入力インデックス可能型１４にアジャイル通信演算子１２を適用するためにＤＰ実行可能ファイル１３８を実行する。
【０１３４】
データ並列計算（すなわち、ＤＰプログラムまたはＤＰアルゴリズムの実行）に最適化されたハードウェアアーキテクチャを有する１つまたは複数の計算リソースを有する計算ノード１２１を、ＤＰ最適計算ノード１２１と称する。ＤＰ最適計算ノード１２１の例は、ＰＥ  １２２のセットが１つまたは複数のＧＰＵを含むノード１２１と、ＰＥ  １２２のセットが汎用プロセッサパッケージ内のＳＩＭＤユニットのセットを含むノード１２１とを含む。データ並列計算に最適化されたハードウェアアーキテクチャを有する計算リソースを全く有しない計算ノード１２１（たとえば、汎用処理要素１０２だけを有するプロセッサパッケージ）を、非ＤＰ最適計算ノード１２１と称する。各計算ノード１２１内では、メモリ１２４を、メモリシステム１０４とは別々（たとえば、ＧＰＵによって使用されるＧＰＵメモリ）またはメモリシステム１０４の一部（たとえば、汎用プロセッサパッケージ内のＳＩＭＤユニットによって使用されるメモリ）とすることができる。
【０１３５】
ホスト１０１は、実行のために計算ノード１２１にＤＰ実行可能ファイル１３８を供給し、相互接続１１４を使用してＤＰ実行可能ファイル１３８によって生成された結果を受け取るように構成されたホスト計算ノードを形成する。ホスト計算ノードは、メモリ階層（すなわち、メモリシステム１０４）を共有する汎用計算リソース（すなわち、汎用処理要素１０２）のコレクションを含む。ホスト計算ノードを、たとえば、ＳＭＰ（対称型マルチプロセッシングアーキテクチャ）を用いて構成することができ、ＮＵＭＡ（ｎｏｎ−ｕｎｉｆｏｒｍ  ｍｅｍｏｒｙ  ａｃｃｅｓｓ）アーキテクチャを使用してメモリシステム１０４のメモリ局所性を最大化するように構成することもできる。
【０１３６】
ホスト計算ノードのＯＳ  １３２は、ＤＰ最適または非ＤＰ最適の計算ノード１２１によってＤＰ実行可能ファイル１３８を実行させるために、ＤＰ呼出し場所を実行するように構成される。メモリ１２４がメモリシステム１０４とは別々の実施形態では、ホスト計算ノードは、ＤＰ実行可能ファイル１３８および１つまたは複数のインデックス可能型１４をメモリシステム１０４からメモリ１２４にコピーさせる。メモリシステム１０４がメモリ１２４を含む実施形態では、ホスト計算ノードは、メモリシステム１０４内のＤＰ実行可能ファイル１３８および／または１つもしくは複数の入力インデックス可能型１４のコピーをメモリ１２４として指定することができ、かつ／またはＤＰ実行可能ファイル１３８および／または１つもしくは複数の入力インデックス可能型１４をメモリシステム１０４のある部分からメモリシステム１０４のうちでメモリ１２４を形成する別の部分にコピーすることができる。計算ノード１２１とホスト計算ノードとの間のコピープロセスは、非同期として指定されない限り、同期ポイントとすることができる。
【０１３７】
ホスト計算ノードおよび各計算ノード１２１は、互いに独立してコードを同時に実行することができる。ホスト計算ノードおよび各計算ノード１２１は、同期ポイントで相互作用して、ノード計算を連携させることができる。
【０１３８】
一実施形態では、計算エンジン１２０は、１つまたは複数のＧＰＵ（グラフィックス処理ユニット）がＰＥ  １２２およびメモリシステム１０４とは別々のメモリ１２４を含む、グラフィックスカードを表す。この実施形態では、グラフィックスカードのドライバ（図示せず）は、ＤＰ実行可能ファイル１３８のバイトコードまたはある他の中間表現（ＩＬ）を、ＧＰＵのＰＥ  １２２による実行のためにＧＰＵの命令セットに変換することができる。
【０１３９】
もう１つの実施形態では、計算エンジン１２０は、１つまたは複数の汎用処理要素１０２およびメモリシステム１０４のうちでメモリ１２４を含む部分との、プロセッサパッケージ内に含まれる１つまたは複数のＧＰＵ（すなわち、ＰＥ  １２２）の組合せから形成される。この実施形態では、追加ソフトウェアをコンピュータシステム１００上で提供して、ＤＰ実行可能ファイル１３８のバイトコードまたはある他の中間表現（ＩＬ）を、プロセッサパッケージ内のＧＰＵの命令セットに変換することができる。
【０１４０】
さらなる実施形態では、計算エンジン１２０は、処理要素１０２とメモリシステム１０４のうちでメモリ１２４を含む部分とを含むプロセッサパッケージのうちの１つまたは複数内の１つまたは複数のＳＩＭＤユニットの組合せから形成される。この実施形態では、追加ソフトウェアをコンピュータシステム１００上で提供して、ＤＰ実行可能ファイル１３８のバイトコードまたはある他の中間表現（ＩＬ）を、プロセッサパッケージ内のＳＩＭＤユニットの命令セットに変換することができる。
【０１４１】
もう１つの実施形態では、計算エンジン１２０は、処理要素１０２とメモリシステム１０４のうちでメモリ１２４を含む部分とを含むプロセッサパッケージのうちの１つまたは複数内の１つまたは複数のスカラ処理パイプラインまたはベクトル処理パイプラインの組合せから形成される。この実施形態では、追加ソフトウェアをコンピュータシステム１００上で提供して、ＤＰ実行可能ファイル１３８のバイトコードまたはある他の中間表現（ＩＬ）を、プロセッサパッケージ内のスカラ処理パイプラインの命令セットに変換することができる。
【０１４２】
特定の実施形態を図示し、本明細書で説明したが、当業者は、さまざまな代替のおよび／または同等の実施態様を、本発明の範囲から逸脱せずに、図示され説明された特定の実施形態と置換できることを了解するであろう。本出願は、本明細書で述べられた特定の実施形態のすべての適合または変形形態を包含することが意図されている。したがって、本発明が、特許請求の範囲およびその同等物のみによって限定されることが意図されている。
【図１】
0006027021.tif 000039
【図２】
0006027021.tif 000040
【図３Ａ】
0006027021.tif 000041
【図３Ｂ】
0006027021.tif 000042
【図３Ｃ】
0006027021.tif 000043
【図４】
0006027021.tif 000044