(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-10-31
(45)【発行日】2024-11-11
(54)【発明の名称】共有データ構造
(51)【国際特許分類】
G06F 8/41 20180101AFI20241101BHJP
【FI】
G06F8/41
(21)【出願番号】P 2023502613
(86)(22)【出願日】2021-07-13
(86)【国際出願番号】 EP2021069524
(87)【国際公開番号】W WO2022013253
(87)【国際公開日】2022-01-20
【審査請求日】2023-03-10
(32)【優先日】2020-07-14
(33)【優先権主張国・地域又は機関】GB
(73)【特許権者】
【識別番号】518371892
【氏名又は名称】グラフコアー リミテッド
【氏名又は名称原語表記】Graphcore Limited
【住所又は居所原語表記】11-19 Wine Street,Bristol,BS1 2PH,United Kingdom
(74)【代理人】
【識別番号】100169904
【氏名又は名称】村井 康司
(74)【代理人】
【識別番号】100221372
【氏名又は名称】岡崎 信治
(72)【発明者】
【氏名】リチャード ルーク サウスウェル オズボーン
【審査官】久々宇 篤志
(56)【参考文献】
【文献】特開平06-060047(JP,A)
【文献】米国特許出願公開第2020/0174828(US,A1)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 8/00-11/36
(57)【特許請求の範囲】
【請求項1】
複数の処理ユニットを有するコンピュータ上においてコードを保存する方法であって、
それぞれの処理ユニットは、
実行可能コードシーケンスを含む読み出し専用要素を保存するように構成されたローカルメモリと、前記ローカルメモリ内において保存された前記実行可能コードシーケンスの少なくともいくつかを実行するための実行ステージと、を有し、前記方法は、
マスタ処理ユニットとして前記コンピュータの複数の処理ユニットの少なくとも1つを識別することと、
前記コンピュータの前記処理ユニット内に読み込むために実行可能コードシーケンスを含む読み出し専用要素を、少なくとも1つの共有可能な読み出し専用要素を前記マスタ処理ユニットに割り当てるようコンパイルすることと、
他の少なくとも1つの前記処理ユニットの実行ステージによって使用されるように指定された少なくとも1つの共有可能な読み出し専用要素、及び、コンパイル時に判定された時点において前記マスタ処理ユニットの前記実行ステージにおいて演算されるように指定された、前記処理ユニットが前記共有可能な読み出し専用要素を識別し他の少なくとも1つの処理ユニットによる受信のために送信され、前記共有可能な読み出し専用データ要素を有するメッセージを生成するための送信交換コードシーケンスを前記マスタ処理ユニットの前記ローカルメモリ内において保存することと、
を有する方法。
【請求項2】
前記共有可能な読み出し専用要素は、他の少なくとも1つの処理ユニットの前記実行ステージにおいて実行される実行可能コードシーケンスを有する請求項1に記載の方法。
【請求項3】
前記実行可能コードシーケンスは、アプリケーショングラフ内のバーテックスのインスタンスを有する請求項2に記載の方法。
【請求項4】
前記実行可能コードシーケンスは、前記コンピュータの前記処理ユニット内におけるコードシーケンスの実行を管理するための制御コードを有する請求項2に記載の方法。
【請求項5】
前記共有可能な読み出し専用要素は、一定の値を有する請求項1に記載の方法。
【請求項6】
前記一定の値は、
バーテックス状態、
バーテックス記述子、及び、
フィールドデータ、
の1つである請求項5に記載の方法。
【請求項7】
前記コンパイルすることは、前記複数の処理ユニットの少なくとも1つに対して少なくとも1つの非共有可能な読み取り専用要素を割り当てることを有する請求項1乃至6のいずれか1項に記載の方法。
【請求項8】
前記少なくとも1つの共有可能な読み出し専用要素は、複数の共有可能な読み出し専用要素を有する共有データ構造内において収容されている請求項1乃至7のいずれか1項に記載の方法。
【請求項9】
前記少なくとも1つの共有可能な読み出し専用要素を割り当てることは、前記処理ユニットのそれぞれの個々のアドレスに対して複数の共有可能な読み出し専用要素を割り当て、前記共有可能な読み出し専用要素のアドレス制約を解決することを有する請求項1乃至8のいずれか1項に記載の方法。
【請求項10】
他の少なくとも1つの処理ユニットの前記実行ステージにおいて実行されるように指定された受信交換コードシーケンスを、他の少なくとも1つの処理ユニットの前記ローカルメモリ内において保存することを有し、
前記受信交換コードシーケンスは、他の少なくとも1つの処理ユニットが他の少なくとも1つの処理ユニットの前記ローカルメモリ内の割り当てられたアドレスにおいて前記メッセージ内において受け取られた前記共有可能な読み出し専用要素を保存するようにしている請求項1乃至9のいずれか1項に記載の方法。
【請求項11】
前記マスタ処理ユニットに対して少なくとも1つの共有可能な読み出し専用要素を割り当てることは、
コンパイル対象のプログラムフロー内の複数の共有可能な読み出し専用要素を有する少なくとも1つの共有データ構造を識別することと、
前記共有データ構造のメモリ内のストレージ要件を前記送信交換コードシーケンスのメモリ内のストレージ要件と比較することと、
前記比較に基づいて、前記マスタ処理ユニットに対して共有可能なデータ構造として前記読み出し専用要素を割り当てるかどうか又は複数の処理ユニットにわたって前記データ構造を複製するかどうかを判定することと、
を有する請求項1乃至10のいずれか1項に記載の方法。
【請求項12】
前記プログラムフローは、アプリケーショングラフを表している請求項11に記載の方法。
【請求項13】
コンピュータであって、
複数の処理ユニットを有し、それぞれの処理ユニットは、実行可能コードシーケンスを含む読み出し専用要素を保存するように構成されたローカルメモリと、前記ローカルメモリ内において保存されている前記実行可能コードシーケンスの少なくともいくつかを実行するための実行ステージと、を有し、前記複数の処理ユニットの少なくとも1つは、マスタ処理ユニットを有し、
前記ローカルメモリは、他の少なくとも1つの処理ユニットの実行ステージによって使用されるように指定された少なくとも1つの共有可能な読み出し専用要素と、前記マスタ処理ユニットの前記実行ステージにおいて実行されるように指定され、前記マスタ処理ユニットが前記共有可能な読み出し専用要素を識別し、他の少なくとも1つの処理ユニットによる受信のために送信されるメッセージを生成するようにする送信交換コードシーケンスと、を保存するように構成されており、
他の少なくとも1つの処理ユニットは、他の少なくとも1つの処理ユニットが前記メッセージから前記共有可能な読み出し専用要素を受け取り、使用期間にわたってのみそのローカルメモリ内のアドレスにおいてこれを保存するようにする受信交換コードシーケンスをそのローカルメモリ内において保存しており、他の少なくとも1つの処理ユニットは、前記使用期間の後にそのローカルメモリから前記
共有可能な読み出し専用要素を削除するように構成されている、コンピュータ。
【請求項14】
前記送信交換コードによって生成される前記メッセージは、前記共有可能なデータ読み出し専用要素が他の少なくとも1つの処理ユニットにおいて保存されることを要するアドレスを有する請求項13に記載のコンピュータ。
【請求項15】
前記マスタ処理ユニットの前記メモリ内において保存されている前記少なくとも1つの共有可能な読み出し専用要素は、複数の共有可能な読み出し専用要素を有する共有データ構造の一部分を形成している請求項13又は14に記載のコンピュータ。
【請求項16】
複数のマスタ処理ユニットを有する請求項13~15のいずれかに記載のコンピュータ。
【請求項17】
前記共有データ構造は、実行可能なコードシーケンスを有する請求項
15に記載のコンピュータ。
【請求項18】
前記共有データ構造は、一定の値の組を有する請求項
15に記載のコンピュータ。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、それぞれが1以上のプロセッサモジュール又は「タイル」を有する1つ又は複数のプロセッサチップを有する処理システム上において稼働するようにグラフに基づいたプログラムをコンパイルすることに関する。本開示は、コンパイルされたコードが読み込まれている処理システムに更に関する。
【背景技術】
【0002】
プログラムは、通常、ハイレベルプログラミング言語において記述されている。ハイレベルプログラミング言語は、プロセッサの特定のアーキテクチャの少なくともいくつかから抽出された、従って、ターゲットプロセッサによって実行されるローレベル機械コード命令よりも人間にとって理解可能である言語を意味している。コンパイルは、ハイレベル言語において記述されているプログラムを取得し、これをプロセッサによって実行可能な形態に引き下げる(lower)、即ち、ハイレベルプログラムをプロセッサによって実行可能な機械コード命令を有するローレベルプログラムに変換するプロセスを意味している。本開示を目的とした「命令」は、機械コード命令、即ち、プロセッサの実行ユニットが認識及び実行するように構成された基本的命令タイプのセットの1つのインスタンスを意味している。このセットは、当技術分野においては、プロセッサの命令セットと呼称されている。命令セット内のそれぞれの命令タイプは、実行ユニット内の対応する演算のタイプに対する異なる個々のオペコードマッピングにより、演算の個々のゼロ個以上のオペランドを有するためのゼロ以上のオペランドフィールドにより定義されている。
【0003】
現在、ハイレベルプログラムは、しばしば、グラフの形態を有している。例えば、これは、プロセッサがしばしば「タイル」とも呼称される複数のプロセッサモジュールを有するケースに該当し得る。それぞれのタイルは、独自のメモリ及び(通常は、同一命令セットによってそれぞれが構成されている)実行ユニットを有する。これらのタイルは、異なるタイル上において稼働するコード片が同一のチップ(即ち、ダイ)上のタイルの間において相互に通信することを可能にするオンチップ相互接続を介して互いに接続されている。また、いくつかのケースにおいて、システムは、複数のタイルをそれぞれが有する複数のチップを有し得る。このケースにおいては、チップは、異なるチップ上のタイルが相互に通信することを可能にする外部相互接続を介して互いに接続することができる。グラフは、複数のデータノード、コンピュートバーテックス(vertex)、並びに、ノード及び/又はバーテックスの間のエッジについて記述している。その他のものに加えて、いずれのタイル上においていずれのデータノード及びいずれのバーテックスが実装されるべきかを判定することがコンパイラのタスクである。従って、プログラムコードの別個の部分をタイルの異なるもの上において並行して実行することができる。従って、複数の独立的な処理リソースを互いにハイレベルの並行性を有して接続することができる。
【0004】
例示用の並列処理のアプリケーションは、機械知能において見出される。機械知能の技術分野における当業者にはよく知られているように、機械知能アルゴリズムは、「知識モデル」に対する反復的な更新の実行に基づいており、知識モデルは、複数の相互接続されたノード又は「ニューロン」のネットワークによって表すことができる。それぞれのニューロンは、その入力の関数を表している。いくつかのニューロンは、ネットワークに対する入力を受け取り、いくつかのものは、1つ又は複数のその他のニューロンから入力を受け取っている一方で、いくつかのニューロンの出力は、その他のニューロンの入力を形成し、いくつかのニューロンの出力は、ネットワークの出力を提供している。更には、それぞれのニューロンにおける関数は、しばしば、(必ずしも乗法的重みを意味してはいないが、それが1つの可能性である)重みと呼称される1つ又は複数の個々のパラメータによってパラメータ化されている。学習ステージにおいては、狙いは、全体としてのネットワークが、可能な入力の範囲について望ましい出力を生成することになるように、経験的な入力データの組に基づいて、様々な重みの値を見出す、というものである。確率的勾配降下法に基づいた逆伝播アルゴリズムなどのこれを実行するための様々なアルゴリズムが当技術分野においては知られている。入力データに基づいた複数の反復において、重みは、その誤差を減少させるように徐々にチューニングされ、ネットワークは、解に向かって収束する。次いで、後続のステージにおいて、規定された入力の組が付与された場合に出力の予測を実施するために、或いは、規定された出力の組が付与された場合に入力(原因)に関する推定を実施するために、学習済みのモデルを使用することができる。
【0005】
それぞれのニューロンの実装は、データの処理を伴っており、グラフの相互接続は、ニューロンの間において交換されるデータに対応している。通常、それぞれのニューロンの処理の少なくともいくつかは、ネットワーク内のニューロンのいくつかの又はすべてのその他のものとは独立的に実行することが可能であり、大きなニューラルネットワークは、並行性のための絶好の機会を提供している。
【0006】
グラフに基づいた方式は、決してマルチタイルプロセッサ又は並列処理に限定されるものでもなく、ニューラルネットワーク又は機械知能アプリケーションに限定されるものでもない。一般に、グラフは、演算とデータの間の任意の複雑なフロー又は相互関係性を記述するために使用することができる。
【0007】
並列処理の有用性を極大化するには、特定のチップが許容することになるのと同数のタスクが並行して実行されることが望ましい。即ち、理想的には、すべてのタイルが、時間の大きな部分にわたって同時に有効になっている(コードを実行している)。タイルが有効になるために、タイルの実行ユニットは、タイルのローカルメモリ内において保存されているローカルプログラムの一部分を形成する命令を実行している。グラフのいくつかのタイプ(特に機械学習及びニューラルネットワークグラフ)は、同一の演算が複数のタイル内において同時に実行されることを必要としている。これを実現するには、同一のローカルプログラムがそれぞれのタイル上において利用可能となる必要がある。これは、チップがグラフを実装するように構成されている際には、プログラムのコンパイルされたバージョンをそれぞれのタイル上に引き下げることにより、実現することができる。
【発明の概要】
【発明が解決しようとする課題】
【0008】
本発明者らは、この結果、容量需要がチップ内のそれぞれのタイルのローカルメモリに対して課されることを認識した。ローカルプログラムがタイル上においてバイナリ(機械可読)形態において永久的に保存されたら、それは、タイルによって現時点において実行されているかどうかとは無関係に、そのメモリ空間を使い果たすことになる。このような永久的なストレージは、しばしば、バイナリへの「ベーキング」と呼称されている。
【0009】
本発明者らは、類似の考慮事項が、ローカルプログラムに提供され得るデータにも適用されることを更に認識した。このデータは、プログラムによって必要とされ、定数を必要とする特定のプログラムを有するすべてのタイルに跨って複製される必要ある定数を含み得る。
【0010】
本開示は、これら及びその他の課題に対処している。
【課題を解決するための手段】
【0011】
本開示の一態様は、複数の処理ユニットを有するコンピュータ上においてコードを保存する方法を提供しており、それぞれの処理ユニットは、実行可能コードシーケンスを含む読み出し専用要素を保存するように構成されたローカルメモリと、ローカルメモリ内において保存されている実行可能コードシーケンスの少なくともいくつかを実行するための実行ステージと、を有し、方法は、
コンピュータの複数の処理ユニットの少なくとも1つをマスタ処理ユニットとして識別することと、
コンピュータの処理ユニット内に読み込むための実行可能コードシーケンスを含む読み出し専用要素を、少なくとも1つの共有可能な読み出し専用要素を前記マスタ処理ユニットに割り当てるようコンパイルすることと、
他の少なくとも1つの処理ユニットの実行ステージによって使用されるように指定された少なくとも1つの共有可能な読み出し専用要素、及び、コンパイル時において判定された時点においてマスタ処理ユニットの実行ステージにおいて実行されるように指定された、処理ユニットが共有可能な読み出し専用要素を識別し他の少なくとも1つの処理ユニットによる受信のために送信され、共有可能な読み出し専用データ要素を有するメッセージを生成するための送信交換コードシーケンスをマスタ処理ユニットのローカルメモリ内において保存することと、
を有する。
【0012】
共有可能な読み出し専用要素は、他の少なくとも1つの処理ユニットの実行ステージにおいて実行される実行可能なコードシーケンスを有することができる。
【0013】
例えば、実行可能なコードシーケンスは、アプリケーショングラフ内のバーテックスのインスタンスを有することができる。
【0014】
別の例において、実行可能なコードシーケンスは、コンピュータの処理ユニット内におけるコードシーケンスの実行を管理するための制御コードを有することができる。
【0015】
別の例において、共有可能な読み出し専用要素は、一定の値を有しており、これは、
バーテックス状態、
バーテックス記述子、及び、
フィールドデータ、
のうちの1つであってよい。
【0016】
いくつかの実施形態において、コンパイルすることは、少なくとも1つの非共有可能な読み出し専用要素を複数の処理ユニットの少なくとも1つに割り当てることを有する。
【0017】
いくつかの実施形態において、少なくとも1つの共有可能な読み出し専用要素は、複数の共有可能な読み出し専用要素を有する共有データ構造内において収容されている。
【0018】
少なくとも1つの共有可能な読み出し専用要素を割り当てることは、複数の共有可能な読み出し専用要素を処理ユニットのそれぞれの個々のアドレスに割り当てることと、共有可能な読み出し専用要素のアドレス制約を解決することと、を有することができる。
【0019】
いくつかの実施形態において、方法は、他の少なくとも1つの処理ユニットの実行ステージにおいて実行されるように指定された受信交換コードシーケンスを、他の少なくとも1つの処理ユニットのローカルメモリ内において保存することを有し、受信交換コードシーケンスは、他の少なくとも1つの処理ユニットが、他の少なくとも1つの処理ユニットのローカルメモリ内の割り当てられたアドレスにおいてメッセージ内において受け取られた共有可能な読み出し専用要素を保存するようにしている。
【0020】
いくつかの実施形態において、少なくとも1つの共有可能な読み出し専用要素をマスタ処理ユニットに対して割り当てることは、
コンパイル対象のプログラムフロー内において複数の共有可能な読み出し専用要素を有する少なくとも1つの共有データ構造を識別することと、
共有データ構造のメモリ内のストレージ要件を送信交換コードシーケンスのメモリ内のストレージ要件と比較することと、
比較に基づいて、読み出し専用要素を共有可能なデータ構造としてマスタ処理ユニットに割り当てるかどうか又は複数の処理ユニット上においてデータ構造を複製するかどうかを判定することと、
を有する。
【0021】
プログラムフローは、アプリケーショングラフを表すことができる。
【0022】
本開示の別の態様は、コンピュータを提供しており、コンピュータは、
複数の処理ユニットを有し、それぞれの処理ユニットは、実行可能なコードシーケンスを含む読み出し専用要素を保存するように構成されたローカルメモリ及びローカルメモリ内において保存されている実行可能コードシーケンスの少なくともいくつかを実行するための実行ステージを有し、この場合に、複数の処理ユニットの少なくとも1つは、マスタ処理ユニットを有し、
ローカルメモリは、他の少なくとも1つの処理ユニットの実行ステージによって使用されるように指定された少なくとも1つの共有可能な読み出し専用要素と、マスタ処理ユニットの実行ステージにおいて実行されるように指定され、マスタ処理ユニットが共有可能な読み出し専用要素を識別し、他の少なくとも1つの処理ユニットによる受信のために送信されるメッセージを生成するようにする、送信交換コードシーケンスと、を保存するように構成されており、
この場合に、他の少なくとも1つの処理ユニットは、他の少なくとも1つの処理ユニットがメッセージから共有可能な読み出し専用要素を受け取り、使用期間にわたってのみそのローカルメモリ内のアドレスにおいてこれを保存するようにする受信交換コードシーケンスをそのローカルメモリ内において保存しており、他の少なくとも1つの処理ユニットは、使用期間の後にそのローカルメモリから共有可能な読み出し専用要素を削除するように構成されている。ローカルメモリから共有可能な読み出し専用要素を除去するための削除ポリシーを有する必要性は存在していない。いくつかの実施形態においては、新しい値が書き込まされる際には、その値は、コンパイル時において判定されるように上書きすることができる。コンパイル時には、もはや必要とされていないプログラム内のポイントが留意されており、これは、これが後から上書きされ得ることを意味している。これは、即座に上書きされなくてもよく、実際に、これは、まったく上書きされなくてもよく、コンパイラが、オーバーラップするアドレスに対して割り当てられ得る後から書き込まれる別の変数を見出すかどうかに依存し得る。
【0023】
送信交換コードによって生成されるメッセージは、共有可能なデータ読み出し専用要素が他の少なくとも1つの処理ユニットにおいて保存されるべき読み込みアドレスを有することができる。読み込みアドレスは、メッセージ内又は交換コード内に位置し得る。いくつかの実施形態において、受信されたデータを書き込むためのアドレスは、受信交換コード内において規定されている。
【0024】
マスタ処理ユニットのメモリ内において保存されている少なくとも1つの共有可能な読み出し専用要素は、複数の共有可能な読み出し専用要素を有する共有データ構造の一部分を形成することができる。
【0025】
いくつかの実施形態において、コンピュータは、複数のマスタ処理ユニットを有する。
【0026】
共有データ構造は、実行可能コードシーケンス又は一定の値の組を有することができる。
【0027】
いくつかの実施形態において、少なくとも1つの共有可能な読み出し専用要素をマスタ処理ユニットに対して割り当てるステップは、
コンパイル対象のプログラムフロー内において複数の共有可能な読み出し専用要素を有する少なくとも1つの共有データ構造を識別することと、
共有データ構造のメモリ内のストレージ要件を送信交換コードシーケンスのメモリ内のストレージ要件と比較することと、
比較に基づいて、読み出し専用要素を共有可能なデータ構造としてマスタ処理ユニットに対して割り当てるかどうか又は複数の処理ユニット上においてデータ構造を複製するかどうかを判定することと、
を有する。
【0028】
プログラムフローは、アプリケーショングラフを表すことができる。
【0029】
本開示の実施形態の理解を支援するためにこのような実施形態が実施され得る方式を示すために、例としてのみ、以下の添付図面を参照されたい。
【図面の簡単な説明】
【0030】
【
図1】複数のタイルを有するシステムの概略ブロック図である。
【
図2】プロセッサモジュールの概略ブロック図である。
【
図3】異なる変数をアドレス指定するポインタを有するコードシーケンスを保存したタイルを示す。
【
図4】同一アドレス制約される対象の変数を保存するタイルの組を示す。
【
図6】アドレスを保持したレジスタに対するポインタを保存するタイルの組を示す。
【
図7】二次元ベクトルを有するポインタを保存するタイルを示す。
【
図8】ベクトルリストを有するポインタを保存するタイルを示す。
【
図9】プログラムをコンパイルする方法を概略的に示す。
【
図11】入力及び出力エッジを有するグラフのバーテックスを概略的に示す。
【
図13】制約ソルバプロセスの概略フローチャートである。
【
図14】2つのタイルのそれぞれのもの上のプログラムの一例を示す。
【発明を実施するための形態】
【0031】
以下の記述されている本発明の実施形態においては、コンピュータと、コンピュータ用のコンパイルする方法と、が記述されており、この場合には、コンピュータの処理ユニットの間において共有され得る読み出し専用要素を識別することにより、メモリ使用法を最適化することができる。「共有構造」又は「共有データ構造」という用語は、本明細書においては、共有され得る読み出し専用要素を意味するために使用されている。複数の処理ユニットが同一の読み出し専用要素を必要としている場合には、1つの選択肢は、コンピュータ上において複製が存在するように、それぞれの処理ユニットごとにコンパイルされたそれぞれのプログラム内において適切な共有データ構造を含む、というものである。本発明の実施形態によれば、代替技法が提供されており、この場合には、共有データ構造がマスタ処理ユニット内において保存され、必要とされる際に1つ又は複数のその他の処理ユニットに送信されている。共有データ構造の保存のために必要とされるメモリの量と、処理ユニットの間においてデータ構造を共有するために必要とされる交換コードの保存のみならずプログラムが稼働している際に付随する通信及び時間オーバーヘッドとの間には、トレードオフが存在している。共有データ構造が(使い果たすメモリリソースの観点において)相対的に小さい場合には、記述されている実施形態の共有技法を使用するよりも、コンパイルされたプログラム内において複数の処理ユニットに跨ってこれを複製することのほうが相対的に適切であり得る。
【0032】
本明細書において記述されている一態様においては、共有方式を使用するかどうか又は複数の処理ユニットに跨ってデータ構造を複製するかどうかについて通知する分析が実行されている。
【0033】
読み出し専用要素は、コード又は一定の変数であってよい。
【0034】
図1は、コンパイルされたプログラムが本明細書において開示されている実施形態に従って実行され得るコンピュータ100の形態において例示用の処理システムを示している。コンピュータは、タイルと呼称される複数のプロセッサモジュール4a、4b、4c、などを有する。タイル4a、4b、4cは、1つ又は複数のプロセッサチップ2上において実装されていてもよく、この場合には、それぞれのチップ(即ち、ダイ)上に複数のタイル4が存在している。
図2を参照すれば、例えば、タイル4aなどのそれぞれの個々のタイルは、その独自の個々の処理ユニット10を有し、それぞれの処理ユニットは、機械コード命令を実行するためのその独自の個々の実行ユニット18を有する。また、それぞれの個々のタイルは、データ及びコードを保存するためのその独自の個々のメモリ22aを有する。従って、コンピュータ100は、ハイレベルの並行性をサポートし、これにより、タイル4a、4b、4c、などの異なるもの上における全体的なプログラムの異なる個々の部分の並列実行を可能にしている。例えば、チップ2は、≧10、≧20、≧50、≧100、≧200、≧500、或いは、場合によっては≧1000個のタイルを有し得るであろう。例えば、例示用の実装形態においては、1216又は1280個のタイル/チップが存在し得る。更には、実施形態において、それぞれの処理ユニットは、同一のパイプラインを通じて複数の同時スレッドをインターリーブするためのマルチスレッド型処理ユニットの形態を有することもできる。但し、これは、この目的のために必須ではない。
【0035】
また、コンピュータ100は、例えば、タイル4aなどの1つのタイルによって実行された演算の結果が、例えば、その他のタイル4cなどに送信され得るように、データを交換するために、異なるタイル4a、4b、4c、などが相互に通信することを可能にする交換メカニズムの一部分を形成するハードウェアロジックを有する相互接続6をも有する。相互接続6は、同一チップ2上のタイル4aの間における通信のために、チップ2上において少なくとも内部(オンチップ)相互接続を有する。また、本発明の実施形態によれば、相互接続6は、共有データ構造がタイルメモリの間において交換されることを可能にしている。
【0036】
コンパイルプロセスの一部分として、プログラムの異なる部分は、他のタイル4において稼働するように、全体として全体プログラムを実装するべく一緒に動作するために相互にデータ交換するように、割り当てられている。例えば、プログラムは、ニューラルネットワークを有する機械学習アルゴリズムを有することができると共に、異なるタイルは、ニューラルネットワークの異なるバーテックスを表すプログラムの一部分を実行することができる。プログラムの異なる部分は、コンパイルされた際に、バルク同期パラレル(BSP)、ランデブー、又はポストボックス方式などの適切な同期方式に従って相互に同期化されるように構成されている。好ましくは、BSP方式が使用されている。
【0037】
BSPに従って、それぞれのタイルは、コンピュートフェーズ及び交換フェーズを交互に変化する方式で実行している。コンピュートフェーズにおいては、それぞれのタイルは、タイル上においてローカルに1つ又は複数の演算タスクを実行しているが、その演算の任意の結果をタイルの任意のその他のものとの間において伝達してはいない。交換フェーズにおいては、それぞれのタイルは、先行するコンピュートフェーズからの演算の1つ又は複数の結果をグループ内のタイルの1つ又は複数のその他のものとの間において交換することが許容されているが、タイルがその交換フェーズを終了する時点まで新しいコンピュートフェーズを開始することはない。更には、このBSP原理の形態によれば、バリア同期化が、コンピュートフェーズから交換フェーズに遷移する接合部又は交換フェーズからコンピュートフェーズに遷移する接合部又はこれらの両方において配置されている。即ち、(a)グループ内の任意のものが次の交換フェーズに進むことが許容される前にすべてのタイルがその個々のコンピュートフェーズを完了させる必要がある、或いは、(b)グループ内の任意のタイルが次のコンピュートフェーズに進むことが許容される前にグループ内のすべてのタイルがその個々の交換フェーズを完了させる必要がある、或いは、(c)これらの両方である。本明細書において使用されている際には、「コンピュートフェーズと交換フェーズの間」というフレーズは、すべてのこれらの選択肢を包含している。
【0038】
データがBSPに従って交換される際には、それぞれのタイルは、その同期状態を同期モジュールに通知している。それぞれのタイルがデータを送信するための準備が完了していることが確立されたら、同期化プロセスは、システムが交換フェーズに入るようにしている。この交換フェーズにおいては、データ値がタイルの間において(実際には、メモリ間データ移動においては、タイルのメモリの間において)移動している。交換フェーズにおいては、タイルプログラムの間の同時性ハザードを誘発し得る演算は、存在していない。
【0039】
タイルの間におけるデータ又はコードの交換は、任意の適切な交換メカニズムによるものであってよい。Graphcoreによって開発された1つのこのようなメカニズムが、本発明者らの特許出願である欧州特許出願公開第PWF-REF-408525EP号明細書、米国特許出願公開第20190121387A1号明細書において記述されており、この内容は、引用により、本明細書に包含される。交換フェーズにおいては、それぞれの共有要素は、タイルから特定の交換経路への出口を提供している接続ワイヤに沿って移動している。それぞれのクロックサイクルにおいて、共有要素は、パイプライン型の方式で、(例えば、ラッチからラッチまでなどの)その経路に沿って、特定の距離を移動している。共有要素がタイルから発行される際に、その共有要素は、受信タイルを識別するヘッダを有する状態において発行されてはいない。その代わりに、受信タイルは、自身が特定の時点において特定の送信タイルに対して要素を要求することになることを知っている。その特定の時点において要素を受け取るために、交換受信タイルは、受信タイルの入力を送信タイルの交換経路に接続するように、スイッチを制御している。これは、「時間決定論的(time deterministic)」と呼称されている。それぞれのタイルは、プログラマによって又はコンパイラの稼働によって自身に割り当てられたプログラムを動作させており、この場合に、プログラマ又はコンパイラ機能は、特定の時点において特定のタイルによって送信されることになるもの及び特定の時点において受信タイルによって受け取られる必要があるものに関する知識を有する。これを実現するために、SEND命令が、それぞれのタイル上のプロセッサによって実行されるローカルプログラム内に含まれており、この場合に、SEND命令の実行の時点は、コンピュータ内においてその他のタイル上において実行されるその他の命令のタイミングとの関係において既定されている。
【0040】
時間決定論を実装するために、コンパイラは、要素が送信エンドの受信タイルの間において移動するのに所要する時間(タイル間遅延)に基づいてタイルのプログラムをコンパイルしている。以下、グラフをコンパイルするコンパイラの機能について説明する。コンパイラは、相互接続されたノード及びリンクのグラフを受け取っている。ノード及びリンクは、バーテックス(vertex)又はエッジとも呼称され得る。コンパイラは、グラフ内の機能をローカルプログラム内に収容されている多数のコードレットにコンパイルしている。それぞれのローカルプログラムは、コンピュータの特定のタイルに読み込まれるように設計されている。それぞれのプログラムは、1つ又は複数のコードレットと、これに加えて、それぞれが命令のシーケンスから形成されたスーパーバイザサブプログラムと、を有する。特定の実施形態において、コンパイラは、時間において相互にリンクされるように、即ち、時間決定論的となるように、プログラムを生成している。これを実行するために、コンパイラは、タイルの物理的相対場所と、従って、コンパイラが時間決定論的な方法でローカルプログラムを生成するために理解する必要があるタイル間遅延と、を通知するタイル識別子を含むタイルデータにアクセスしている。遅延は、タイルデータに基づいて演算することができる。この代わりに、タイルデータは、これらの遅延がルックアップテーブルを通じて利用可能であるデータ構造を内蔵することもできる。
【0041】
図1の構成は、例として付与されたものに過ぎないことを理解されたい。更に一般的には、システム100は、同一のチップ2上に位置した、或いは、1つ又は複数のプロセッサモジュール4/チップ2の状態において複数のチップ2に跨って分散された、複数のプロセッサモジュール(処理ユニット)4を有することができる。原理的に、本明細書において記述されている技法は、同一のチップ上に複数のプロセッサモジュールが存在している状況、又は、プロセッサモジュールが複数のチップに跨って分散している状況において適用することができる。但し、データ構造をチップ上の複数のタイルの間において共有している際に本明細書において記述されている技法を使用することには、特に(本明細書において記述されている実施形態の1つにおけるように、1216又は1280個などの)多数のタイル/チップが存在している環境においては、相対的に大きな利益が存在することになるものと予想される。データ構造を単一チップ内の多数のタイルの間において共有した後には、チップの間における共有からのメモリ低減が、使用されている合計メモリとの関係において無視可能となり得るように、共有データ構造のために使用されるメモリの量の大きな低減が既に存在している。更には、チップの間において共有する際には、ランタイムコストを考慮する際に、チップの間の合計帯域幅が1つのチップ上のもの未満になるという事実を考慮する必要もある。
【0042】
本開示は、例えば、
図1において示されているタイプのマルチタイルチップ用のコードをコンパイルすることに関する。並行性の利益を極大化させるために、多くのタイルは、同時に同一のバーテックス状態において同一のバーテックスの組(コンピュートセット)を実行していてもよい。これは、必要なコード及びデータがこれらのタイル上において利用可能であることを必要としている。但し、これは、重複したメモリ使用法をもたらし、チップ上において稼働され得るモデルのサイズを制限する可能性がある。これを克服するために、本開示は、ランタイムにおけるタイルの間における特定の構造の共有を可能にしている。
図5は、本明細書において論じられているコア原理を示している。これらの原理は、通常は常に複数のタイルの間においてライブ状態にある一定のデータの特定の部分を共有する方法に属している。このような部分は、本明細書においては、「共有構造」として呼称されている場合がある。以下、この実行に伴う意図されている利益について説明する。この環境においては、通常常にライブ状態にあるデータは、一定の変数などの実行可能コードによって消費される実行可能コード又はデータ要素であってよい。通常常にライブ状態にあるデータは、読み出し専用データである。このようなデータは、例えば、バーテックス状態データであってよい。バーテックス状態は、(i)データに対するポインタ(このポインタは、読み出し専用である)及び/又は(ii)データ(読み取り専用であってもよく又はそうでなくてもよい)を収容することができる。以下において更に十分に説明するように、それぞれのバーテックス状態構造ごとに、ポインタ及び読み取り専用データのみを収容しているかどうかを確認するためにチェックが実行されている。ポインタ及び読み取り専用データのみを収容している場合には、そのバーテックス状態構造は、共有される候補である。変化し得るデータを含むバーテックス状態構造は、本明細書において記述されている技法に従って共有されるのに適してはいない。
【0043】
利益の1つは、タイル上において必要とされている時点においてのみライブ状態となるように、以前には一定であった複数のタイルの間において常にライブ状態にあったデータを共有する能力である。タイル上の利用可能なメモリが乏しいケースにおいては、そのタイルは、いつでも常に継続的に保存する代わりに、必要とされるのに伴って又は必要とされている際に共有データ構造を受け取るように選択することができる。この結果、メモリが乏しいタイル上においてメモリ容量が解放される。共有データ構造は、割り当てるための多くの自由空間を有するその他のタイルに移動させることができる。このようなタイルは、共有構造をその他のタイルに送信するためのマスタ又はストレージタイルとなり得る。
【0044】
本明細書において記述されている技法の別の利益は、共有データの単一のコピーを保存し同一のデータを必要としているタイルに必要とされている際にブロードキャストすることにより、タイルに跨るデータの複製を低減する能力である。
【0045】
本明細書において記述されているシステムは、データのマルチキャスト交換を目的として使用される際には、特定の利点を有しており、この場合には、共有データ構造が、タイルの同期化されたグループの同一の交換フェーズにおいてマスタタイルから複数のレシピエントタイルに送信されていることに留意されたい。即ち、それぞれのタイル上において重複を保存するのではなく、必要とされている際に読み出し専用データ要素を共有することは、データを受け取るタイルの数が増大することから、相対的に有益となる。
【0046】
また、複数の読み出し専用データ要素が交換フェーズにおいて共有されている際には、読み出し専用データ要素の1つ又は複数は、それらが共有された交換フェーズに直接後続しているコンピュートフェーズにおいて使用されるように提供され得ることに留意されたい。但し、読み出し専用データ要素の1つ又は複数は、それらが共有された交換フェーズに直接的に後続してはいないコンピュートフェーズにおいて使用されるように提供することもできる。例えば、コードのラインは、交換フェーズにおいて、マスタタイルと1つ又は複数の受信タイルの間において共有することができる。いくつかのケースにおいて、コードは、コードが1つ又は複数の受信タイルにおいて受け取られた交換フェーズに直接的に後続してはいないコンピュートフェーズにおいて実行を要するプログラムを定義することができる。読み取り専用データ要素が共有される以前の交換-コンピュートサイクルが小さいほど、保存の利益が大きくなることに留意されたい。
【0047】
要すれば、本技法は、最も必要とされているタイル上のメモリリソースに対する負担を低減するという狙いを伴って、タイルの間においてデータを交換するためにタイル上において必要とされている処理サイクルと、常にライブ状態にあるデータを保存するために必要とされているメモリ容量との間におけるトレードオフが実施されることを可能にしている。
【0048】
図5は、本明細書において記述されている原理を示している。
図5は、
図1に示されているように、チップ2のいくつかのタイル4a、4b、4c、4d、4eを示している。本明細書において記述されている1つの特徴によれば、チップのタイルアレイ内のいくつかのタイルは、複数のタイルに跨った使用のために必要とされている常にライブ状態にあるデータ(共有構造)用のストレージタイルとして使用されるように割り当てられている。例えば、
図5において、タイル4a及び4bは、ストレージタイルとして割り当てられている。これらは、本明細書においては、マスタタイルと呼称されている場合がある。マスタタイルという用語は、任意の特定の階層構造又は制御機能を意味するものではなく、これらのタイルが、システム2内のその他のタイル内において使用され得る常にライブ状態にあるデータ用のストレージタイルであることのみを意味していることを理解されたい。それぞれのマスタタイルは、メモリを有する。
図5においては、タイル4aは、メモリ22aを有するものと示されており、タイル4bは、メモリ22bを有するものと示されている。それぞれのメモリは、後述することになる異なる部分又は領域を有する。メモリの特定の部分は、常にライブ状態にあるデータ55a、55bを保存するように割り当てられていてもよく、これらは、チップ2内のその他のタイルと共有されていてもよい。メモリのその他の部分又は領域は、ローカルタイル(例えば、ローカルタイル4a、4b)がその処理機能を実行している際の動作においてのみ使用されるように割り当てることができる。即ち、それぞれのタイル上のメモリ22a、22bは、その他のタイルとの間において共有され得る常にライブ状態にあるデータとそのタイル上においてのみ使用され得る常にライブ状態にあるデータとの混合体を保持することができる。また、ローカルタイルによって処理された変数の書き込み及び読み取りのために割り当てられたメモリ内の特定量のアドレス空間も存在している。交換のために利用可能である常にライブ状態にあるデータは、それぞれのタイルごとにバイナリコードにおいて永久的に保存される代わりに、チップ2上において実装された交換メカニズムを介してその他のタイルにコピーできる。例えば、矢印100cは、メモリ22aからのデータ55aの一部分がチップの交換メカニズムを介して別のタイル4cに供給される状況を表記している。同様に、矢印100dは、代替タイル4dとの間におけるデータ55aのこの同一の部分の共有を表記しており、矢印100eは、更なる代替タイル4eとの間におけるデータ55aのこの部分の共有を示している。これらの矢印は、図式的なものであるに過ぎず、実際的な実施形態においては、共有は、相互接続6を介したものである。メモリ22bからのデータ55bの一部分も同様に交換され得ることに留意されたい。また、メモリ22aの異なる部分も、異なるタイルとの間において共有され得ることに留意されたい(これは、常にタイル4c、4d、4eなどにブロードキャストされる同一の部分でなくてもよい)。
図5には、5つのタイルのみが示されているが、実際には、アレイは、
図1を参照して記述されているように、多くのタイルを有していてもよく、この場合には、小さな数のタイルがマスタ(ストレージ)タイルとして割り当てられており、別のタイルの組は、必要になるのに伴って及び必要な際には常にライブ状態にあるデータを受け取るように割り当てられていることに更に留意されたい。この環境においては、小さな数のタイルは、2つ又は3つであるものと見なされているが、任意の特定のチップ上のアレイ内のタイルの完全な組ではない場合には、任意の数であり得るであろう。一般に、これは、チップ上のタイルの合計数の3分の1未満の数がストレージタイルとして指定され、残りのタイルがレシピエントタイルとして指定されていない限り、有用性を失うことになろう。
【0049】
常にライブ状態にあるデータの完全性がこれらの項目を必要とし得るチップのそれぞれのタイルにおいて利用可能となることを必要としてはいないことにより、プログラムの実行における任意の一時点において常にライブ状態にあるデータを保存するために使用されるメモリの量を低減することができる。これは、モデルに必要とされるタイルの数又はメモリ容量を増大させることなしに、相対的に大きなモデルがチップ上にフィットすることを許容している。
【0050】
交換メカニズムは、それぞれのタイル4内のローカルプログラム内において提供されている命令の組を有する交換コードシーケンスを使用している。この交換コードシーケンスは、データをチップ上の別のタイルとの間において交換することを要するごとに、タイルの実行ユニット18によって実行することを要する。共有対象のデータは、本明細書において記述されているように、ローカル処理の出力(結果)であることが可能であり、及び/又は、共有構造であり得るであろう。タイルの間のデータの交換は、相互接続6を介したものである。受け取られたデータが保存されるメモリ内のアドレスは、本明細書において記述されているように、コンパイル時において判定されている。交換シーケンスは、ストレージタイルから受信タイルにデータを送信するためのコードを有することに留意されたい。受信タイル上の交換コードは、データの受け取りを可能にするために使用されている。また、ローカルプログラム内における交換コードの場所は、コンパイル時におけるコンパイラの責任であることにも留意されたい。チップ上においてコンパイル及び保存されるコードが、本明細書において記述されるように、グラフの形態においてモデルを実行するためのものである際には、常にライブ状態にあるデータは、
ホスト及びグローバル交換パケットヘッダ、
スタック、
バーテックスインスタンス、
コピー記述子、
ベクトルリスト記述子、
バーテックスフィールドデータ、
制御コード、
バーテックスコード、
内部及びホスト交換コード、
のうちの1つ又は複数を有することができる。
【0051】
これらのそれぞれは、例えば、異なる数のバイトを必要としているなどのように、異なるメモリストレージ要件を有し得る。
【0052】
以下においては、バーテックスコード、バーテックス状態、及び制御コードというカテゴリを共有する環境において、本技法について説明する。また、本明細書において記述されている技法は、メモリ内の常にライブ状態にあるその他のタイプのデータにも適用され得ることが容易に理解されよう。
【0053】
本明細書において更に詳細に記述するように、バーテックスコードは、グラフに追加され、コンピュートセットに追加されたバーテックスによって使用されるコードレットのために生成されるコードである。それぞれのタイル上においてインスタンス化されたバーテックスのそれぞれごとに、バーテックスコードの1つのコピーが必要とされている。
【0054】
バーテックス状態は、それぞれのタイル上におけるバーテックスクラスのインスタンス化のメンバを定義している。
【0055】
制御コードは、コンピュートセット内のすべてのバーテックスを実行するために、制御フローを処理するために、それぞれのタイル上のローカルプログラムの一部分を形成している制御プログラム内のその他の制御機能を実行するために、生成されたコードを有する。上述のように、「共有構造」という用語は、本明細書においては、タイルの間において交換される常にライブ状態にあるデータアイテムを表記するために使用されている。即ち、共有構造は、受信タイルによって必要とされている時点において、マスタ(ストレージ)タイルの1つから1つ又は複数の受信タイルに送信することができる。共有構造が受信タイルによって必要とされている時点は、コンパイル時に判定されている。これは、絶対時間ではなく、受信タイル上において稼働しているプログラムのその他の側面との関係における時間であることに留意されたい。コンパイラは、タイルのすべてに跨るプログラムの実行シーケンスを理解しており、適切な時点において共有構造の交換をスケジューリングすることができる。
【0056】
コンパイラは、特定のモデル用のプログラムツリーをコンパイルしている際に、プログラムツリー内の所定のポイントにおいて共有構造交換コードシーケンスを導入することができる。このような共有構造交換コードシーケンスは、プログラム内のそのポイントにおいて共有構造が交換されることを可能にしている。これを変更する、それぞれのタイル上において関連する共有構造を保存することが全体的な最大ライブメモリを増大させることになると判定されるポイントにおいて新しい共有構造交換コードシーケンスを挿入するように試みる前に、プログラムツリーのライブネス分析を実行することができる。即ち、共有構造のサイズを、これを送信及び受信するために使用されている交換コードシーケンスのサイズと比較することにより、(すべてのタイルに跨る)プログラム全体の最大ライブメモリにおける全体的な低減を実現することができるものと判定される。ここで、「サイズ」は、メモリ内において共有構造を保存するために必要とされているバイトの数を表記していることに留意されたい。
【0057】
本明細書において「同一アドレス制約」と呼称されるものを使用することにより、タイルに跨って共通するデータの量を増大させることができる(即ち、共有構造のサイズを増大させることにより)。
【0058】
図3は、コードシーケンスなどの読み出し専用データを示しており、これは、例えば、第1及び第2ポインタP1、P2を有する。2つのポインタは、一例であり、1つ又は複数のポインタが存在し得ることを理解されたい。それぞれのポインタは、長さが4バイトであってよいであろう。ポインタは、任意のタイプ又は任意の長さを有し得ることを理解されたい。様々なフォーマットのポインタについては、後述する。読み出し専用データは、マスタタイル4a上のメモリ22aの一部分においてインストールされた共有構造55aであってよい。コードが受信タイルの組において使用されることを要する際には、(このケースにおいては、例として示されているように、共有構造55aを受信タイル4b及び4cに送信するために、交換コードシーケンスがタイル4a上の実行ユニットによって実行される)。コードは、受け取られ得る共に、タイル4b内のADDRiにインストールすることができる。コードは、タイル4c内のADDRjにインストールすることができる。
【0059】
受信タイルごとにコンパイルされたローカルプログラムが、コードを実行するためにコードを配置するべき場所について理解している場合には、コード部分などの到来した読み出し専用データが受信タイルのそれぞれ内の同一のアドレスにおいて保存されることは、不要であることに留意されたい。但し、コードが、本例におけるように、1つ又は複数のポインタを含んでいる際には、これらのポインタは、コードによって使用される変数をアドレス指定することができる。
図3は、4つの別個の変数(VAR1、VAR2、VAR3、VAR4)を示しており、この場合に、VAR1及びVAR2は、タイル4b上に位置しており、VAR3及びVAR4は、タイル4c上に位置している。変数は、共有構造内に位置してはいないが、構造からポインティングされている。変数は、同一の値又はサイズを有する必要はない。
【0060】
同一アドレス制約を変数VAR1及びVAR3に対して適用することにより、これらが同一のアドレスにおいて割り当てられることが保証されている。従って、VAR1がタイル4b内においてADDR1において保存される場合には、VAR3も、タイル4c内のADDR1において保存されている。両方を参照するために、共有構造内の同一の1つ又は複数のポインタを使用することができる。対応する方式で、VAR2及びVAR4も、アドレス制約することができると共に、ポインティングすることができる。
【0061】
例えば、ポインタP1は、変数VAR1をアドレス指定することができると共に、ポインタP2は、変数VAR2をアドレス指定することができる。相対的に複雑なポインタフォーマットについては、後述する。同一アドレス制約が適用された場合には、変数VAR1がタイル4b内において特定のアドレスにおいて保存され、VAR3がタイル4c内において同一のアドレスにおいて保持されるように制約されている。例えば、両方のタイルにおいてVAR1/VAR3を保存するために、ADDR1を使用することができる。すべてのタイルは、共通アドレス指定ポリシーを有していることに留意されたい。同様に、変数VAR2も、タイル4b内のADDR2において保存され得ると共に、VAR4も、タイル4c内のADDR2内において保存され得る。従って、コード部分がタイル4b又はタイル4c上において稼働するかどうかとは無関係に、ポインタP1は、常にADDR1において変数VAR1/VAR3を指し示し、ポインタP2は、常にADDR2において変数VAR2/VAR4を指し示している。
【0062】
例えば、バーテックスコードの断片内の命令のシーケンスは、原則的に、バーテックスコードを実行する責任を担うチップ内のタイルのすべてにおいて使用することができる。バーテックス状態又は制御コードは、アクセスデータ(変数)に対するポインタを使用することにより、共有することできる。
【0063】
共有バーテックス状態のケースにおいては、変数は、バーテックスが作用しているデータ(即ち、バーテックスがエッジを介してグラフに接続されている変数)を表すことになろう。その結果、共有制御コードのケースにおいては、変数は、バーテックス状態(共有制御コードがバーテックス状態をポインティングするのに伴って出現し得る実行命令)を表し得るであろう。
【0064】
異なる共有構造がコード及びデータのために使用され得るが、その理由は、メモリレイアウトに対するその他の制約が、いくつかのケースにおいては、これらを一緒に保存することが常に可能であるわけではないことを意味し得るからである。制御コードのみならず、これが参照しているバーテックス状態が共有することが可能であり、このケースにおいては、共有制御コード内のポインタは、バーテックス状態共有構造の内側のアドレスを指し示すことになり、バーテックス状態共有構造は、同一アドレス制約されることになる。
【0065】
変数は、そのタイルが制約対象の変数の組についてタイルの組と交差している任意のその他の変数との間において既に同一アドレス制約されていない限り、同一アドレス制約することができる。
【0066】
例えば、
図4を参照されたい。
図4Aにおいて、タイルの第1の組は、タイル1、タイル2、及びタイル3として示されている。変数Aは、タイル1上に位置し、変数Bは、タイル2上において位置し、変数Cは、タイル3上において位置している。変数A、B、及びCは、同一アドレス制約される対象の変数の組を表記している。変数A、B、及びCが同一の等しいアドレスセット内に位置している場合には、それぞれの個々のタイル上のそれぞれの変数のアドレスは、同一となるように制約されている。これは、
図4においては、ADDR1上において示されている。
【0067】
以下、タイル1、4、及び5上において保存される対象の変数D、E、及びFの更なる組について検討する(
図4Aを参照されたい)。同様の制約が適用されている。このケースにおいては、変数A及びDが異なるアドレスにおいて割り当てられ得る一方で、変数B及びC並びにE及びFは(タイル1内において点線状態において示されている)そのタイル1のものと同一のアドレスに制約されるように、変数A及びDのみが同一のタイル上に位置していることから、これら2つの同一アドレスセットが存在することができる。
【0068】
図4は、タイルメモリのアドレス空間内の位置が関連する矩形の場所によって示されている変数の2つの組を示している。変数A、B、及びCは、アドレス制約されている。従って、セット1内において、変数Aは、タイル1上のADDR1に位置しており、変数Bは、タイル2上のADDR1に位置しており、且つ、変数Cは、タイル3上のADDR1に位置している。第2セット内においては、変数D、E、及びFは、同一のアドレスADDR2において割り当てられるように制約されている。A及びDは、同一のタイル(タイル1)上に位置していることから、これらは、同一のアドレスにおいて割り当てることが不可能であり、A、B、及びCのアドレスは、D、E、及びFとは異なっていなければならない。
【0069】
但し、
図4Bの代替ケースを検討すれば、この場合には、第1変数セットは、タイル1上のA、タイル2上のB、及びタイル3上のCであり、第2変数セットは、タイル1上のD、タイル2上のB、及びタイル3上のCである。
図4Bにおいては、これらの2つのセットを同一アドレス制約することが可能ではなく、その理由は、変数B及びCが同一のアドレスに位置する必要があるからであり、これは、変数A及びDも、同一のアドレスに位置する必要があることになるという効果を有することになることに留意されたい。但し、変数A及びDの両方がタイル1において存在することに伴って、クラッシュを生成することになろう。
【0070】
割当の前の段階で、アドレスADDR1及び2は、既定のアドレス場所ではないことに留意されたい。但し、これらは、コンパイラがコードの全体に対するアドレスの割当を終了した後には、既定のアドレス場所に変化することになる。その一方で、これらは、アドレス制約されたものとしてマーキングされている。
【0071】
制約され得るバーテックス状態の内側には、ポインタのいくつかのフォーマットが存在している。これらが制約され得る場合には、バーテックス状態は、共有構造の一部分を形成することができる。
【0072】
バーテックス状態構造は、メモリ内に保存されている。これは、ポインタを含むことができる。このようなケースにおいては、バーテックス状態構造の内側のいくつかのオフセットにおいて、そのメモリの場所の値が、ポインタが指し示しているメモリのブロックのアドレスとなる。
【0073】
ポインタフォーマットの最も単純な形態は、一次元ベクトルである。これらは、単純にメモリの連続的なブロックをポインティングしている。これらを共有するには、メモリのこのブロックを同一アドレス制約しなければならない。例えば、
図6を参照すれば、ポインタPnは、メモリ22aの一部分を形成しているメモリブロックの場所ADDRnを指し示している。ADDRnは、変数VARを保持している。
【0074】
ポインタの別のフォーマットは、余分なレベルの方向を含む二次元ベクトルである。ベースポインタPbは、その他のポインタP1、P2などの連続的なブロックBを指し示している。
図7を参照すれば、Pbは、アドレスADDRqにおいてメモリの場所を識別しており、これは、ブロックBのベースを識別している。例えば、上述のバーテックスフィールドデータは、ポインタのブロックを有することができる。これを共有するために、ポインタの連続的ブロックをアドレス制約する必要がある。バーテックスコードが共有され得る及び/又はバーテックス状態が共有され得ることに留意されたい。バーテックス状態を共有するかどうかの選択肢は、バーテックスコードを共有するかどうかとは独立している。
【0075】
ポインタの別の形態は、ベクトルリストなどのデータ構造であり、これは、(上述の二次元ベクトルのように)余分なレベルの方向を含んでおり、この場合に、余分なレベルも、メモリの連続的なブロックであり、
図8を参照されたい。即ち、第1ポインタP
V1が(レジスタ26を介して)ポインティングしているメモリブロックADDRvは、ベースポインタP
b1によって表されるメモリADDRwの第2レベル内へのオフセットを含む間接層である。外側メモリ位置の場所は、バーテックス状態内にベーキングされており、これは、この層も制約されなければならないことを意味し、或いは、共有された内部状態が同一にならないことを意味している。ベクトルリストは、バーテックス状態内において保存された2つのポインタを有する。一方は、オフセットを含むメモリのブロックに対するポインタP
r1であり、他方は、ベクトルリストが参照している変数のアドレスを形成するためにオフセットが追加されるベースポインタP
B1である。ベクトルリストを含むバーテックス状態を共有するには、オフセットを含むメモリのブロックのアドレスを同一アドレス制約する必要があり、この場合に、ベースポインタがポインティングしているメモリ場所も、同一アドレス制約しなければならない。
【0076】
変数の組が制約されているバーテックス状態の断片を表す共有構造を生成することが可能ではない場合には、コンパイラは、バーテックス状態を2つの同一の断片に制約する作業の一環として、変数の相対的に小さなサブセットをアドレス制約するように試みることになる。これは、ローカルタイルプログラム用のバーテックス状態を含む共有構造を複数回にわたって提供することができる。
【0077】
また、バーテックスコードは、共有構造にコンパイルすることもできる。それぞれのものがコンピュートセット内のバーテックスの単一の通知に固有であるバーテックス状態とは異なり、バーテックスコードは、プログラムの生存期間に跨って再使用される。バーテックスコードは、以下の方式により、共有構造として形成することができる。
【0078】
1つの方式によれば、すべてのバーテックスコードは、単一マスタ(ストレージタイル)上において保存されており、共有構造の生存期間において必要とされるバーテックスコードを含む共有構造が動的に構築されている。
【0079】
別の方式によれば、共有構造は、コンパイル時において構築され、これにより、複数のコンピュートセット内において使用される任意のバーテックスコードがコピーされている。
【0080】
第2の方式は、第1の方式よりも単純であるが、これは、チップに跨って相対的に大きなメモリを使用することになる。但し、バーテックスコードのコピーに伴う余分なメモリの使用は、単純さとの関係において大きな影響を有してはいないことが見出されている。それぞれのバーテックスは、自身が有する入力及び出力を定義するタイプと、バーテックスが稼働する際に実行されるコードと、を有する。特定のタイプのそれぞれのインスタンスは、しばしば、コードレットと呼称されている。複数のバーテックスは、同一のコードレットを有することができる。それぞれのバーテックスは、別個のバーテックス状態構造を有するが、同一のコードレットを共有しているすべてのバーテックスについて同一のコードが使用されている。
【0081】
タイプC0及びC1のバーテックスを含むコンピュートセットA及びタイプC0及びC2のバーテックスを含むコンピュートセットBという2つのコンピュートセットが存在しているシナリオを検討する。共有構造の複写がそれぞれのコンピュートセットの前に挿入されてもよく、これは、コンピュートセットAの前の共有構造のコピー内のC0及びC1及びコンピュートセットBの前の共有構造のコピー内のC0及びC2を含む。このケースにおいては、C0及びC1を含むもの及びC0及びC2を含むものという2つの共有構造がマスタタイル上において生成されており、即ち、C0がコピーされ、マスタタイル上において2回にわたって保存されている。C0をコピーする利益は、それぞれの共有構造の複写に必要とされているバーテックスコードのすべてが、1つの連続的なブロック内に位置しており、コピーすることが簡単であるという点にある。
【0082】
また、この結果、ポインタを介してコードが参照しているすべてのもの自体が共有される又は同一アドレス制約されるように、コードを共有することができる。
【0083】
制御コードは、実装対象の機能に依存するスーパーバイザコードを有する異なるプログラムタイプを有する。それぞれの異なるタイプの制御コードプログラムごとに、異なる順列のスーパーバイザコードが共有構造内において配置されており、それぞれのタイル上の制御プログラムは、呼び出し命令を使用して正しいオフセットに分岐しており、共有プログラムの端部に位置したら制御プログラムに戻るように分岐している。
【0084】
いくつかのアプリケーションにおいては、それぞれのプログラムは、わずかな量のアセンブリコードのみを有することができる。例えば、コンピュート内においてバーテックスを実行するために必要とされる制御コードは、4つの命令ほどにわずかなものであってもよいが、これは、例であるに過ぎず、命令のその他の数を使用することができる。このようなケースにおいては、1つに折り畳まれた連続的プログラムとの間においてプログラムを共有することにより、相対的に大きな利益が得られる。これは、2つの共有プログラムの間においてすべてのタイルの結合を得ることにより、実現することができる。
【0085】
図14は、2つのタイルのそれぞれにおいて実装され得る論理フローの例を示している。タイル4aは、この環境においては、マスタタイルであり、タイル4cは、いくつかの受信タイルのうちの1つである。タイル4cは、コンピュートセットを実行する責任を担っており、例えば、それぞれのコンピュートセットは、バーテックスの組であってよい。同一のバーテックスを異なるバーテックス状態において稼働させることができる。これらのコンピュートセットは、個々のタイルに事前コンパイル可能であり、或いは、それ自体をマスタタイルから共有することもできる。コンピュートセットが実行されるバーテックス及び/又はバーテックス状態の実行を制御する制御コードは、共有することができる。本明細書における共有構造パラダイムによれば、これは、まず、これらの共有構造をマスタタイルから受け取る必要がある。受信タイル4cは、まず、バーテックス状態又は制御コードなどの第1共有構造を受け取るために交換コードを使用する交換を実行するステップを実行している。コンピュートセットCS1、CS2が第1バーテックス状態上の制御コードの制御下において実行され、結果が(タイル上の)ローカルメモリにコピーされている。この後に、同一のタイルは、第2バーテックス状態を表す異なるデータセット上の同一のコンピュートセットCS1、CS2を実行する必要があり得る。第2バーテックス状態の第2共有データ構造を受け取るために、別の交換を実行するステップが実行されている。共有データ構造は、必要とされる際に実行のそれぞれのステージの前において交換されてもよく、或いは、必要とされる際の数サイクルだけ前にコンピュートセットを受け取るルックアヘッド機能が存在し得ることに留意されたい。
【0086】
マスタタイル4aは、交換を実行するステップのシーケンスを有するものとして示されており、それぞれが、常にライブ状態にあるデータを受信タイル4cに送信している。例えば、共有データ構造は、コンパイル時において判定されることにより、受信タイルによって必要とされている際に送信されている。また、現実には、マスタタイルは、更なる機能を実行することになるが、この説明を目的として、そのコア機能は、共有構造を受信タイルに送信するというものである。
【0087】
受信タイル内のコンピュートセットの実行との関係におけるマスタタイル内において実行される交換のタイミングは、コンパイル時において、それぞれのローカルプログラムが個々のタイル内に保存される前に、コンパイラによって判定されていることに留意されたい。
【0088】
上述のように、
図2は、プロセッサモジュール、或いは、例えば、タイル4aなどのタイル、の概略的な例を付与している。複数のタイルのケースにおいては、いくつかの実施形態において、それぞれのタイルは、プロセッサモジュール4の同一のインスタンスを有することができる。但し、メモリ22a内において保持されている保存データは、本明細書において記述されるように、タイルの間において異なり得ることに留意されたい。処理ユニット10は、実行ユニット18、1つ又は複数のレジスタファイル26、命令フェッチステージ(図示されてはいない)、及び命令デコーディングステージ(図示されてはいない)を有する。
【0089】
メモリ22aは、複数の別個のメモリバンク又は領域230、231、232などを有する。実施形態において、それぞれのバンク23は、サイズが16kBであるが、任意の適切なサイズを実装することができる。上述のように、メモリ22aの特定の領域は、実行ユニット18によって実行されるコードによって作用される対象のデータと、実行ユニット18によって実行されるコードによって実行される演算の結果として得られるデータと、を保存するように構成されている。メモリ22aのその他の領域は、コード自体を保存するために使用されている。メモリのその他の領域は、共有構造を保存することができる。実行ユニット18は、フェッチステージによってメモリ22aからフェッチされ、デコーディングステージによってデコーディングされた機械コード命令27を受け取り実行するように構成されている。実行ユニット18は、命令のタイプを定義する特定の命令セットを認識するように構成されており、この場合に、それぞれの命令タイプは、異なる個々のオペコードによって定義されており、対応するゼロ個以上のオペランドフィールドを有する。実行ユニット18内に発行される命令27のそれぞれは、実行ユニット18の命令セットによって定義されたこれらの命令タイプの1つのもののインスタンスである。
【0090】
これらの命令タイプは、メモリアクセス命令(ロード及びストアタイプ命令)、論理命令(整数算術命令及び浮動小数点命令)、及び(ローカルプログラムを管理するための)制御命令を含むことができる。実行ユニット18は、メモリアクセス命令のインスタンスを実行するためのロード-ストアユニット(LSU)55と、整数算術命令のインスタンスを実行するための整数算術論理ユニット(IALU)56と、浮動小数点命令のインスタンスを実行するための浮動小数点論理ユニット(FPU)59と、を有する。実行ユニット18は、制御命令のインスタンスを実行するための更なるユニット(図示されてはいない)を有する。実行ユニット18は、実行された命令のタイプに関連する対応した動作を実行するために、それぞれの命令のオペコードによってトリガされるように構成されたハードウェアロジックを有する。
【0091】
それぞれのメモリアクセス命令は、実行された際に、メモリアクセス命令の特定のタイプに応じて少なくとも1つのロード動作又は1つのストア動作を実行するようにロード-ストアユニット(LSU)55をトリガしている。ロード動作は、メモリ22a内のソースアドレスからレジスタファイル26の1つのもの内のレジスタの少なくとも1つ内にデータを読み込むことを有する。ソースメモリアドレス及びレジスタ場所は、命令のオペランドによって規定されている。実施形態において、上述のように、ソースメモリアドレスは、ポインタを利用して規定されている(即ち、命令のオペランドは、メモリアドレスを直接的に規定するのではなく、ソースメモリアドレスが保持されているレジスタファイル26の1つのもの内のレジスタを識別している)。ストア動作は、レジスタファイル26の少なくとも1つからメモリ22a内の宛先アドレスにデータを保存することを有する。宛先メモリアドレス及びレジスタ場所は、命令のオペランドによって規定されている。実施形態において、宛先メモリアドレスは、ポインタを利用して規定されている(即ち、命令のオペランドは、宛先メモリアドレスが保持されているレジスタファイル26の1つのものの内のレジスタを識別している)。異なるポインタフォーマットは、上述のように、異なる方向のレベルを有することができる。
【0092】
浮動小数点及び整数算術命令などの論理命令は、オペコードに対してマッピングされた数学的演算のタイプを実行するために、浮動小数点ユニット(FPU)59又は整数論理ユニット(IALU)56をトリガしている。命令のオペランドは、作用される対象の値を取得する1つ又は複数のソースレジスタを規定した1つ又は複数のソースオペランドと、命令によって実行された演算の1つ又は複数の結果を配置するための1つ又は複数の宛先レジスタを規定した1つ又は複数の宛先オペランドと、を有することができる。例えば、単純な加算命令は、通常、2つのソース及び1つの宛先という少なくとも3つのオペランドを有する。実行された際に、これは、実行ユニット18が2つのソースレジスタ内において値を取得し、これらを加算し、結果的に得られた合計を宛先レジスタ内において配置するようにしている。類似のロジックは、例えば、単純な減算、乗算、及び除算命令の場合に適用されている。また、例えば、ベクトル乗算、マトリックス乗算、及び畳み込み命令などの論理命令の様々なその他のタイプが命令セット内において含まれ得る。制御命令は、上述のように、ローカルプログラムを管理するために実行されている。
【0093】
従って、処理モジュール上において稼働するコードは、メモリ22aからレジスタファイル26にデータを読み込むために、レジスタファイル26内においてデータに対して動作を実行するために、結果をメモリ22aに保存して戻すために、プログラムフローを管理するために、使用することができる。
【0094】
命令は、命令発行サイクルのシーケンスにわたって実行されている。それぞれの命令発行サイクルにおいて、フェッチステージは、実行のために少なくとも1つの命令29を実行ユニット18に提供している。実施形態において、実行ユニット18は、パイプライン化することができる。更には、いくつかの実施形態において、実行ユニット18は、複数のパラレルパイプラインを有することができる。
【0095】
実施形態において、処理ユニット10は、バレルスレッド処理ユニットとも呼称されるマルチスレッド処理ユニットであってよい。これは、フェッチステージが、異なるプログラムスレッドから命令をフェッチするように、通常は、ラウンドロビン又は重み付けされたラウンドロビンスケジュールに従って異なる時間スロット内において実行ユニット18を通じて時間的にインターリーブするように、構成されていることを意味している。更に一般的には、実行ユニット18は、単一のパイプラインを有することも可能であり、或いは、パイプライン化される必要がない可能性もあり、処理ユニット10は、マルチスレッド化することも可能であり、或いは、単一プログラムスレッドのみを実行するように構成することもできよう。
【0096】
図9は、
図1及び
図2との関係において記述されているものなどのコンピュータシステム100上において稼働するために、ハイレベルなグラフに基づいたプログラムをローレベルの機械コードプログラムにコンパイルするための装置を示している。
【0097】
装置は、コンピュータ504を有し、これは、1つ又は複数の地理的サイトにおける1つ又は複数のサーバーユニット、或いは、デスクトップコンピュータなどの1つ又は複数のユーザー端末、或いは、サーバーと1つ又は複数のユーザー端末の組合せを有するサーバーの形態を有し得るであろう。コンピュータ504は、コンピュータ504のコンピュータ可読ストレージ(例えば、1つ又は複数の内部及び/又は外部磁気ディスクドライブ及び/又はEEPROM)上において保存されたソフトウェアの形態を有する、コンピュータ504の1つ又は複数のプロセッサ(例えば、1つ又は複数のCPU)上において稼働するように構成されたコンパイラ508を稼働させるように構成されている。コンパイラ508は、コンピュータ504上において稼働した際に、入力グラフ502を受け取るように、次いで、
図1及び
図2との関係において記述されているものなどのマルチタイルコンピュータシステム100上において稼働し得る実行可能プログラム506を生成するために入力グラフ502をコンパイルするように、構成されている。
【0098】
図10には、入力グラフの一例が示されている。入力グラフ502は、複数のデータノード512、複数のコンピュートバーテックス514、並びに、データノード及びバーテックスの個々のペアの間においてそれぞれが接続している複数の方向性エッジ516を有する。
【0099】
それぞれのデータノード512は、データ要素を表しており、これは、本明細書においては、変数を意味している。演算又はコンピュータ科学の環境においては、「変数」という用語は、必ずしも、変数の値がランタイムにおいて変化しなければならないことを意味してはおらず、これは、変化することも可能であり、又は、一定に留まることもできる(即ち、定数は、演算の意味においては、変数の1つのタイプと見なされ得る)ことに留意されたい。これが、「変数」という用語が本明細書において使用されている意味である。また、その他の環境との間における混乱を回避するために、「データ要素」という用語が採用されている場合もある。また、本明細書において参照されているデータ要素又は変数は、数値的データオブジェクト又は任意の1つの時点においてそのオブジェクトの特定の値から抽出された構造を意味していることに留意されたい。例えば、変数又はデータ要素は、一定の値を有することがあり得る、或いは、その値がコンパイルされたプログラムの実行の際に1回又は複数回にわたって変化し得る、ハイレベル言語においてVar1というラベルが付与された数値的オブジェクトであり得るであろう。
【0100】
それぞれのエッジ516は、コンピュートバーテックス514からデータノード512への出力を表しており、又は、逆もまた真である。それぞれのコンピュートバーテックス514(即ち、コンピュートノード)は、1つ又は複数のデータノード512から出力された1つ又は複数のエッジ上において受け取られた1つ又は複数の入力に対して実行される対象の1つ又は複数の演算を表しており、その1つ又は複数の結果は、個々のコンピュートバーテックス514から1つ又は複数の出力エッジ上の1つ又は複数のデータノード512(通常は、1つ又は複数のその他のデータノード)に出力されている。また、
図10において示されている特定のグラフトポロジーは、例であるに過ぎず、実際には、グラフ502は、潜在的に更に多くの複雑な構成において、多くの更なるノード512、エッジ516、及びバーテックス514を有する傾向を有することになることを理解されたい。
図10は、例示を目的としてグラフの例示用の断片を示しているものと見なすことができる。また、入力グラフ502は、コンピュータ504の外部に由来するものとして概略的に示されており、これは1つの可能性であるが、これは、同一のコンピュータ504内に由来する(例えば、図示されてはいない適切なオーサリングツールを使用してその上部においてオーサリング及び/又は保存される)こともできることに留意されたい。
【0101】
入力グラフ502は、開発者が所望するデータフロー及び演算を実装するように、人間開発者によって設計することができる(「開発者」は、ここでは、1人の人間又は1つのチームであり得るであろう)。例えば、グラフ502は、ニューラルネットワークの一部分としてテンソルフローを有することができる。グラフ502がニューラルネットワークを実装しているケースにおいては、ニューラルネットワークのそれぞれのノード又は「ニューロン」は、グラフ502の(即ち、プログラムのプログラム構造の)1つ又は複数のコンピュートバーテックス514及び1つ又は複数のデータノード512を有することができることに留意されたい。即ち、ニューラルネットワークのトポグラフィーは、プログラムのグラフ502よりも高い抽象化のレベルにおいて記述することができる。
【0102】
図11は、第1変数Aを表すデータノード512からの入力Xと、第2変数Bを表す第2データノード512に対する出力Yと、を有する特定のコンピュートバーテックス514の一例を示している。また、図示されているように、バーテックス514は、1つ又は複数のコードレット518を有することもできる。コードレットは、しばしば、「アトミック」スレッドとも呼称されている特定のタイプのスレッドである。これは、スレッドの開始時点から(起動の時点から)実行するために自身が必要としている入力情報のすべてを有しており、即ち、これは、起動された後にプログラムの任意のその他の部分から又はメモリからなんらの入力をも取得してはいない。更には、プログラムのその他の部分も、終了する(完了する)時点まで、スレッドの任意の出力(結果)を使用することにはならない。エラーに遭遇しない限り、終了することが保証されている。また、いくつかの文献は、コードレットを状態なしとして、即ち、2回にわたって稼働した場合にその第1の実行からなんらかの情報をも継承し得ないものとして、定義しているが、この更なる定義は、必ずしもここでは採用されていない。コードレットは、グラフ502を分割するための便利な方法であり、この結果、コンパイラ508によって引き下げられた際に、バーテックス514は、異なるスレッド、タイル4、及び/又はチップ2の間において相対的に容易に分離可能なものとなる。実施形態において、それぞれのバーテックス514は、コードレットのみから形成することができる。但し、これは、すべての実施形態において必須であるわけではなく、更に一般的には、バーテックス514は、コードの任意の部分を表することができる。
【0103】
また、いくつかの表現においては、同一のグラフ502は、エッジによって相互に接続されたコンピュートノード(バーテックス)によって等価的に表され得ると共に、データ要素(変数)は、データノード512として明示的にではなく、エッジ上の注釈として示されていることにも留意されたい。これは、
図12の左手側において示されている。いずれの表現も等価的に使用することができる。エッジ上のデータの注釈は、データノードを記述するための概略的に等価な方法であり、任意の所与のツールにおいて任意の所与の観点において人間開発者に対してこれらが提示される方法は、実質的に、データノードと呼称され得るデータのアイテムが、依然としてグラフの基礎をなす演算的構造内に存在しており、依然として本明細書において開示されているデータノード512上に読み取られ得るという事実を排除してはいないことを理解されたい。別の表現をすれば、データによって注釈が付与されたエッジの表現は、1つのコンピュートバーテックスからの入力エッジ及び別のバーテックスへの出力エッジを有するデータノードを表す熟慮された方法である(
図12を参照されたい)。後者の表現は、本明細書においては、概念の説明のために採用されており、実質的に、本明細書において主張されているグラフは、人間に提示される概念的又はグラフィカルな方式ではなく、基礎をなす演算グラフを意味していることを理解されたい。即ち、グラフ502は、関数及び関数を通じたデータのフローを有する基礎をなすデータ構造を意味しており、この場合に、関数は、コンピュートバーテックス514と呼称することが可能であり、このような関数との間のデータ入力は、データノード512と呼称することが可能であり、この場合に、関数/バーテックス内への又はこれから外へのデータの任意の論理フローがエッジと呼称されている。
【0104】
コンパイラ508がグラフ502をコンパイルし、これにより、1つ又は複数のプロセッサモジュール4の1つ又は複数の実行ユニット上において稼働するように引き下げた際に、入力エッジ516のローレベルな実装形態は、ロードタイプ命令によって実行されるロード動作を有することができると共に、出力エッジ516のローレベル実装形態は、ストアタイプ命令によって実行されるストア動作を有することができる。
【0105】
本開示の実施形態によれば、コンパイラ508は、グラフ502をコンパイルする際に1つ又は複数の制約を適用するように構成された制約ソルバを有するアロケータ511を有する。
【0106】
ハイレベルグラフ502のコンパイルの一部分として、コンパイラ508は、グラフを、例えば、チップ2上の個々のタイル4a、4b、4cなどに引き下げている。個々のタイルは、ハイレベルグラフ内において記述されているエッジ516のために割り当てられた変数を有する。それぞれの変数には、メモリ22a内のメモリ空間の連続的な部分が割り当てられており、これは、メモリの1つ又は複数の連続的なバイトであってよい(即ち、所与の変数は、メモリの非連続的な部分に対して割り当てることができない)。また、任意の場所における変数に対する参照は、定数の選択肢を排除してはいないことにも留意されたい。「データ要素」という用語は、本明細書の任意の場所における「変数」という用語を置換するために使用できる。従って、「データ要素」又は「変数」は、コードを含み得るであろう。異なる種類の変数が存在し得る。例えば、ユーザーによって提供されるハイレベルグラフ内に存在していた変数と、コンパイラが作用する対象のローレベルグラフ内に存在している変数とが区別され得るであろう。
【0107】
例えば、ユーザーによって生成された入力グラフ内には、コードを含む変数が存在してはいない。ユーザーは、使用するコードレットを選択することにより、実行する対象のコードを規定するが、このコード用のストレージは、黙示的であり、ハイレベルグラフ内においてこれにアクセスする可能性は存在していない。コンパイルプロセスの一部分として、ハイレベル入力グラフは、更に低いレベルのグラフに変換されており、この場合には、ストレージを必要とする任意のものをバーテックス状態及びバーテックスコードを含む変数として表すことができる。
【0108】
図13は、エッジ516に対応する異なる変数の制約を解決するためにこれらをメモリ22内の個々の領域に割り当てるために、アロケータ511内の制約ソルバによって実行され得る例示用の方法のフローチャートを示している。要約すれば、方法は、順番にすべての変数のリストに目を通すことと、それぞれの変数ごとに、その変数をリスト内の任意の予め割り当てられた変数と衝突することにならないメモリの一部分に対して割り当てることと、を有する。
【0109】
実際のメモリアドレスは、コンパイルプロセスの末尾に向かう複数のステップにおいて割り当てられている。アドレスを割り当てるために、第1に、制約が定義されている。(処理ユニットに跨るコピーではなく)データ構造を共有するという判定が下された場合には、1つ又は複数のアドレス制約を提供することができる。共有データ構造(例えば、関数呼び出し又はその他のジャンプ)がなにか別のものに対するポインタを含んでいる状況においては、これが指し示している変数も、コードが共有されているすべてのタイル上において同一のアドレスに位置するように制約しなければならないことに留意されたい。
【0110】
相対的に大規模な共有を促進するために、同一アドレス制約がアロケータに追加されており、このアロケータが同一のアドレスにおいて割り当てられなければならない複数のタイルに跨る変数の組を規定している。
【0111】
ステップS0において、同一アドレス制約を有するすべての変数が、まず、タイルに跨って割り当てられており、制約されていない変数が、タイルごとに後から割り当てられている。
【0112】
同一アドレス制約された変数セットは、そのセット内のそれぞれのタイル上のすべての変数のすべての等価性クラスの干渉の結合及びそれらが要素制約を共有する変数との間の干渉の結合などを有する単一変数として取り扱われている。等価性クラスについては、後述する。割当は、すべての同一アドレス制約された組の変数について、このポイントから前方に向かって類似の方式で発生している。すべての制約された変数が割り当てられたら、これらの割当は、ステップS5において個々のタイルアロケータに分配されており、割当は、後述するように、残りの制約されていない変数についてタイルごとに継続している。
【0113】
ステップS10において、方法は、それぞれのタイルごとに、そのタイル用の制約されていない変数に対して順序を割り当てることを有する。任意の順序を使用することができる。実施形態において、特定の順序は、コンパイル時間及び/又は割当の品質(即ち、必要とされるタイルメモリの量)を改善するために、最適化として使用することができる。但し、方法は、使用される順序とは無関係に依然として機能することになり、最適化の1つが使用される場合よりも、わずかに低速化することになるのみである。例えば、この代わりに、順序は、ランダムなものになり得るであろう。従って、どのような順序が選択された場合にも、ステップS10は、割当を待っている変数の順序付けされたリストを結果的にもたらすことになる。
【0114】
ステップS20において、方法は、割当を始めるためにリスト内の第1の制約されていない変数を選択することを有する。ステップS30において、方法は、検討対象の現時点の変数のためにメモリ22a内の空間を見出すことを有しており、これは、この時点(第1反復)においては、リスト内の第1変数である。制約されている変数は、この時点においては、メモリ場所に対して既に割り当て済みであることに留意されたい。第1変数用のメモリの領域を選択する際には、任意の同一アドレス制約された変数の割当を考慮する必要がある。第1変数は、例えば、規定されたタイプのメモリ内においてアドレス範囲を選択するなどのその他の非関連(non-relational)制約を有することができる。ステップS40において、方法は、検討対象の現時点の変数をメモリ22内の選択された領域に対して割り当てることを有する。
【0115】
ステップS50において、方法は、ステップS40において割り当てられた変数がリストの最後のものであったかどうかを判定することを有する。最後のものではない場合には、方法は、順序リスト内の次の変数を割り当てるようにメモリ22aの領域を探索するためにステップS30に戻っている。これは、いまや、任意の非関連制約のみならず、任意の関連(relational)制約をも考慮する必要がある。例えば、関連制約は、2つの変数のデータが同時に同一のメモリバンク23から読み込まれる又はこれに保存されることができないというものであってよい。実施形態においては、これは、変数は、そのデータが同一時間の少なくとも一部分にわたって、即ち、オーバーラップする時間期間にわたって、「ライブ」状態となる場合には、同一のバンクに対して割り当てられ得ないという制約として実装することができる。本明細書において、変数が「ライブ」状態になると表現されている場合には、これは、変数のデータがメモリ22aに書き込まれることと、これがプログラムによって読み取られることとの間のランタイムにおける時間を意味している。この制約が充足されているかどうかを評価するために、制約ソルバ511は、プログラムがコンパイルされ実行された後に、どの変数がどの時間にわたってライブ状態となるのか、どの変数がオーバーラップした時間においてライブ状態となるのかを判定するために、「ライブネス」分析を実行することができる。2つの変数がオーバーラップした時間においてライブ状態となっている場合には、これらは、(コンパイラ508がこれらを同一のメモリバンク23に割り当てることを試みた際に、メモリバンク23のアクセスロジックは、これらの両方に同時にサービスすることができないという意味において)相互に衝突又は干渉していると表現することができる。
【0116】
従って、ステップS30において、順序付けされたリスト内のそれぞれの、但し、第1変数ごとに、方法は、それまでに割り当てられた任意のその他の変数(順序付けされたリスト内の任意のその他の先行する変数)と衝突(干渉)しない変数用のメモリ22aの領域を見出すことを有する。即ち、これは、同一の時間の少なくとも一部分にわたってライブ状態となる、それまでに割り当てられた任意のその他の変数との間において共有されていないメモリバンク23内のアドレス範囲を見出している。別の表現をすれば、リスト内の現時点の変数は、任意のその他の衝突する既に割り当てられた変数と同一のバンク23内に含まれてはいない(未だ割り当てられてはいない)メモリ22a内の残りのアドレス空間に割り当てられている。ステップS40において、方法は、リスト内の現時点の変数をメモリ22a内の選択された領域に対して割り当てることを有する。
【0117】
ステップS50において、リスト内の最後の変数が割り当てられたことが判定された場合に、方法は、ステップS70に進み、ここで、そのタイル用のコンパイルを完了させている。すべてのタイルが完了した際に、実行可能なプログラムが生成されてもよく、この場合には、割り当てられたメモリアドレス空間が、それぞれ、それぞれの変数のデータを保存するために使用され、ランタイムにおいて必要とされる際に、これから、そのデータが読み込まれることになる(必要に応じて、潜在的に再び保存されることになる)。コンパイルは、当然のことながら、当業者が習熟しているその他の従来のコンパイルステップを伴うことができる。
【0118】
上述のように、実施形態においては、ステップS10において判定された順序付けされたリストは、単純に任意の順序を有することができる。但し、好適な実施形態においては、特定の順序は、制約解決プロセスの速度の最適化を試みるように選択されている。この最適化は、いくつかの技法のうちの任意の1つ、複数、又はすべてを有することができる。
【0119】
実施形態において、ステップS10は、特定の1つ又は複数のメトリックに従って変数を順序付けすることを有することができる。例えば、変数を順序付ける1つの方法は、サイズ(即ち、メモリ内において占有される空間の量)によるものであり、この場合には、変数のサイズが大きいほどリストの上位に位置し、変数のサイズが小さいほど下位となる。これは、相対的に大きな変数がまず割り当てられ、相対的に小さなものは後になることを意味している。これは、高速となる且つパッキングを改善する傾向を有しており、その理由は、割当がその他の方法で実行される場合よりも、大きなものの周りにおいて相対的に小さな変数を挿入する相対的に大きな機会が存在しているからである。類似の理由から、変数を順序付ける別の方法は、変数がライブ状態となる時間量によるものであり、この場合には、相対的に長期にわたってライブ状態である変数が、リストの上位に配置され、第1に割り当てられ、相対的に短期にわたってライブ状態である変数は、リストの下位となり、相対的に長期にわたってライブ状態である変数の後に割り当てられている。変数を順序付けするための別の例示用のメトリックは、変数がライブ状態となるプログラムライン範囲のサイズによるものであり、この場合にも、理由は類似している(最も長期にわたってライブ状態である変数をまず割り当て、次いで、それらの周りにおいて相対的に短期にわたってライブ状態である変数を挿入することにより、始まっている)。
【0120】
実施形態においては、変数を順序付けするために、例えば、サイズによってまずは順序付けし、次いで、ライブネス時間によって同一のサイズの任意の変数を順序付けする又は逆もまた真であるなどのように、これらのメトリック及び/又はその他のメトリックの2つ以上のものの組合せを使用することもできよう。
【0121】
この代わりに、又はこれに加えて、ステップS10における順序付けは、変数の「等価性クラス」へのグループ化を有することができる。それぞれの等価性クラスは、同一のその他の変数のいくつか又はすべてとの間においてそれぞれが干渉する変数の組である。例えば、変数A及びBが両方とも変数D、C、及びEとの間において干渉している場合には、A及びBは、1つの等価性クラス内において配置され得る一方で、D、C、及びEは、別の等価性クラス内において配置することができる(その理由は、A及びBは、Cとの間において時間においてオーバーラップしており、必ずしもA及びBが相互にオーバーラップすることを意味してはいないからであることに留意されたい)。構造化されたプログラムにおいては、同一のその他の変数との間において干渉する変数のグループとなる傾向が存在している。実施形態において、順序付けは、クラス内の変数の数(まずは、最も大きなクラス)、バイトを単位とするクラスの合計サイズ(まずは、最も大きなクラス)、クラスがカバーしている合計ライブ時間(まずは、最も長期にわたってライブ状態にあるクラス)などのようなメトリックに従って等価性クラスを順序付けすることを有することができる。等価性クラスへのグループ化の利点は、制約ソルバプロセスの処理時間が低減されるという点にあり、その理由は、これが、アロケータ511内の制約ソルバが、クラス内のそれぞれの個々の変数を割り当てるごとに干渉情報を再演算する必要がないことを意味しているからである。
【0122】
また、実施形態においては、変数は、例えば、この場合にも、変数サイズ又はライブネス時間などのメトリックに従って、等価性クラス内において順序付けすることもできる。従って、変数は、まず、クラスにより、次いで、それぞれのクラス内の1つ又は複数のメトリックにより、順序付けすることができる。
【0123】
実施形態において、制約ソルバ内の変数制約ビルダは、課されている関連制約のタイプを有するペアごとの制約を構築している。また、非関連制約情報も、制約ビルダによるハイレベル制約記述から抽出されている。
【0124】
グラフのライブネス分析は、同様に影響を受ける変数を等価性クラスにグループ化している。これは、それぞれの変数のライブネス情報を別個に維持する負担を低減している。また、ライブネス分析は、どの等価性クラスが相互に干渉し得るのか、干渉し得ないのか(即ち、いずれの変数が同時にライブ状態であるのか、ライブ状態ではないのか)のテーブルをも構築している。変数の制約情報と共に、この情報は、メモリアロケータによって使用されている。
【0125】
実施形態においては、以下のステップが、それぞれのタイルごとに、制約ソルバ511内のメモリアロケータ機能により、踏襲されている。
i.同一アドレス制約された変数用の同一アドレス制約された割当を受け取る。
ii.なんらかのメトリックに従って等価性クラスを順序付けする。使用される一般的なメトリックは、等価性クラス内の合計変数のサイズ又はそれが干渉しているクラスの数である。
iii.なんらかのメトリックに従ってそれぞれの等価性クラス内の変数を順序付けする。使用される一般的なメトリックは、サイズ及びアライメントである。
iv.変数割当の順序付けは、ステップi及びステップiiによって判定された等価性クラスの順序付けに従って実行されている。
v.順序付けされた等価性クラス内のそれぞれの変数vごとに、変数に対するすべての制約が充足されるように、vが、vが属するクラスと干渉する等価性クラスのために既に割り当てられている任意の変数とクラッシュしないように、メモリ内の空間を見出す。変数に対する制約は、すべての関連及び非関連制約を含む。関連制約の場合には、これは、vがv1との間において関連制約を有し、v1が既に割り当てられている場合には、関連制約は、非関連制約と共に充足されなければならないことを意味している。vが関連制約を共有している変数が割り当てられていない場合には、非関連制約のみが充足されている。
【0126】
上述の実施形態は、例として記述されたものであるに過ぎないことを理解されたい。当業者には、本明細書における開示が付与された場合に、開示されている技法のその他の変形又はユースケースが明らかとなり得るであろう。本開示の範囲は、記述されている実施形態によってではなく、添付の請求項によってのみ制限されている。