(58)【調査した分野】(Int.Cl.,DB名)
それぞれの前記原子処理要素の連鎖内の前記原子処理要素を、互いに独立した複数の前記原子処理要素を有する原子処理要素グループ(PEG)にグループ化するステップを有し、
前記計算タスクの前記原子処理要素をワープ内に配置するステップは、ある特定の原子処理要素グループと当該グループより前に位置する異なる原子処理要素グループにおいて、前記前に位置する異なる原子処理要素グループ内の1つの原子処理要素の後に実行されるべき原子処理要素を、前記特定の原子処理要素グループが有しないように、前記原子処理要素グループを前記原子処理要素の連鎖内に配置するステップを有する、
ことを特徴とする請求項1に記載の方法。
前記マルチプロセッサ装置を呼び出すステップは、前記マルチプロセッサ装置に対し、前記マルチプロセッサ装置の組み込みスケジュールポリシーに拘わらず前記第2の数の、前記原子処理要素の連鎖を並列で実行させるステップを有する、
ことを特徴とする請求項1に記載の方法。
それぞれの前記プロセッサは、前記定義された前記原子処理要素のタイプのそれぞれを走らせることが可能な、ソフトウェア符号からなる1つの前記スレッドを動作させ、そして1つの所定の前記スレッドは、前記所定のスレッドにより実行されるべき前記原子処理要素の実際のタイプを、前記所定のスレッドにより読まれたデータに応答して決定する、ことを特徴とする請求項1−4のいずれかに記載の方法。
前記原子処理要素を前記原子処理要素の前記第2の数の連鎖内に配置するステップは、前記マルチプロセッサ装置により同時に実行可能な数の、原子処理要素の連鎖内に前記原子処理要素を配置するステップを有する、ことを特徴とする請求項1−3のいずれかに記載の方法。
【発明を実施するための形態】
【0029】
(概要)
広い分野での様々なタイプのコンピュータ計算タスクが依存問題として、即ち、実行依存性を有する原子処理要素の1組として表わすことが可能である。依存問題は多くの場合大規模で複雑であり、その実行にはコンピュータ計算の高度な複雑さと長い実行時間が伴う。従って依存問題を並列で動作する多重のプロセッサで実行することが有利となる。しかし、処理要素間の実行依存性は、しばしば並行コンピュータ計算タスクに分割することが困難な依存性問題を引き起こす。
【0030】
本発明の実施形態は、依存性問題を並列プロセッサで実行する、改善された方法及びシステムを提供する。開示された方法及びシステムは、実行依存性を有する原子処理要素(PE)からなる依存性問題上で動作する。(1対の処理要素間の実行依存性とは、1つの処理要素が他の1つの処理要素が生成した入力に対して動作することを意味する。このように実行依存性は処理要素の実行の順序に制約を課す。)依存性問題は多重プロセッサからなる画像処理ユニット(GPU)のような1つの
マルチプロセッサ装置上での同時実行のためにコンパイルされる。
【0031】
コンパイル工程は、マルチプロセッサ装置の
プロセシングコア により並行して実行される多重の実行連鎖
(PEの連鎖)の
中に、実行依存性を損なうことなくPEを
配置する。典型的に、コンパイル工程は実行連鎖を有する静的呼び出しデータベース(SID)を生成する。マルチプロセッサ装置は、依存性問題の結果を生成するため、SIDを実行するソフトウェア符号を走らせるために
呼び出される。
【0032】
実行依存性は、同一の実行連鎖の中に相互依存PEを配置する試み、及び必要な場合異なる実行連鎖のPE間で同期を取ることにより維持される。典型的なマルチプロセッサ装置では、プロセッサは幾つかのグループの中に配置され、各グループのプロセッサは相互作用し、データを共有メモリ経由で交換することが出来る。ある実施形態では、SID内の各実行連鎖は、各連鎖の中のPEが同じグループのプロセッサにより実行され、そのグループの共有メモリを経由してデータを交換出来ることを保障するため、スレッドのブロックとしてマルチプロセッサ装置に供給される。
【0033】
静的呼び出しデータベース(SID)の中の実行連鎖の数は、マルチプロセッサ装置が同時に実行できるスレッドブロックの最大数を越えないように選択される。結果として、実行連鎖は同時実行を保障され、そして一般的にマルチプロセッサ装置のいかなる組み込みスケジュールポリシーにも影響されない。この動作モードは、通常マルチプロセッサ装置を多数のスレッドブロックで溢れさせ、並行処理の実現をマルチプロセッサ装置の内部スケジューリングに頼る、既知の呼び出し構成とは明確に異なっている。反対に、ここに記載される方法とシステムでは、多重並列プロセッサの間の依存問題の並列処理化は、完全に決定論的であり実行時よりむしろコンパイル時に画定される。このようにマルチプロセッサ装置の内部スケジュールポリシーは効率的に迂回され、PEの実行順序は、SIDで画定される実行連鎖及び同期化構造により完全に制御される。高効率SIDsを生成する工程の
1つの例がここに示される。
【0034】
さらに、SID実行中に行われる多数のメモリアクセス動作を管理するための、幾つかの方法とシステムがここに記載される。詳細には、開示された技術は、PE実行連鎖によりマルチプロセッサ装置のデバイスメモリ及び共有メモリを効率的に使用する。(典型的なマルチプロセッサ装置では、デバイスメモリは、大きなメモリ空間を提供するが、しかし高いアクセスレイテンシを負い、大きな粒度でアクセスされ、アドレスアライメント制約を課する。反対に、共有メモリは、制限されたメモリ空間を有し、しかし高速なアクセス時間を提供し、アライメント制約は殆どないか全くない。)開示された技術は、メモリアクセス動作のパターンはSIDコンパイル中に完全に決定されるという事実を使用して、効率的で決定論的なメモリアクセスを達成する。
【0035】
(システムの記述)
図1は本発明の実施形態に基づく、依存問題を実行するためのシステム20のブロック図である。様々な種類のコンピュータ計算タスクが依存問題、即ち、実行依存性を有する原子処理タスク
の1組として表わされる。依存性問題は広範な分野及びアプリケーションで見られ、例えば、デジタルハードウェア設計シミュレーション、リアルタイムビデオ処理、画像処理、ソフトウェア定義ラジオ(SDR)、様々な通信アプリケーションにおけるパケット処理、及び誤り訂正符号などである。システム20は依存性問題として表示可能な全ての適合するタスクの効率的な実行に使用可能である。特定のコンピュータ計算タスクの幾つかの事例と、それらタスクに対する開示された技術の適用可能性について以下で記述する。
【0036】
この事例では、システム20は、サーバ24を有し、サーバ24は1つのインタフェース26と、1つのCPU28と、1つ以上の画像処理ユニット(GPU)32を有する。サーバ24は適合するワークステーション又は計算プラットホームを有してもよい。以下に記述されるように、各GPUは並列に動作する多数の
プロセシングコア を有する。ここに記載される方法及びシステムは、GPUコアの並列使用を最大化するソフトウェア符号を生成し、従ってシステム20が高度に複雑な依存問題を、比較的短い実行時間で実行することを可能にする。
【0037】
サーバ24はユーザ基地36経由でユーザと相互作用する。サーバ24は、インタフェース26経由でユーザから、実行される依存問題を受け取る。サーバは入力依存問題をコンパイルしてソフトウェア符号を生成し、CPU28及びGPUs32
上でその符号を走らせる。実行結果はインタフェース26経由でユーザに提供される。システム20の機能性は、アプリケーションにより様々なやり方で、CPU28とGPUs32の間で分別される。この実施形態は単一CPUに関しているが、一般的には、所望の数のCPUが使用されてよい。
【0038】
典型的に、CPU28は、以下に記載する機能を実行するようにソフトウェアでプログラムされている、1つの汎用プロセッサを有する。ソフトウェアはプロセッサに、例えばネットワーク上で、電子形態でダウンロードされてもよい。または或いは、磁気、光、又は電子メモリのような接触可能媒体により提供及び/又は保存されてもよい。
【0039】
システム20の構成は一例であり、概念の明確化のために選択されたものである。他の適合するシステム構成も使用可能である。例えば、ユーザ基地36はサーバ24とローカルに又は通信網経由で通信してもよい。他の実施形態では、ユーザ基地
機能性は直接サーバ24上で実現されてもよい。
【0040】
システム20のようなシステムを論理設計シミュレーションに使用する
幾つかの局面は、「並列プロセッサを使用した設計シミュレーション」という名称の特許文献14に記載され、この出願人は本出願の出願人と同一であり、この文献の開示はここに参照され、採り入れられる。
【0041】
図2は本発明の実施形態に基づく、画像処理ユニット(GPU)32の
内部構造のブロック図である。この例では、GPU32は多重のマルチプロセッサ40を有する。各マルチプロセッサ装置40は、「
プロセシングコア 」とも呼ばれる多重のプロセッサ44を有する。ある実施形態では、各マルチプロセッサ装置40は
従来技術で既知の1つの単一命令多重スレッド(SIMT)プロセッサを有する。他の実施形態では、各マルチプロセッサ装置40は単一命令多重データ(SIMD)プロセッサを有し、そこでは全てのプロセッサ44は各クロックサイクルの間同じ命令を実行する。(しかし、異なるプロセッサは同じ命令を異なるデータ上で実行
してもよい。)典型的なアプリケーションでは、GPU全体の全てのプロセッサは、同じ命令を実行する。異なるプロセッサの機能の間の差別化は、データによりもたらされる。開示された技術はSIMD及びSIMTの両方に適用可能である。
【0042】
各プロセッサ44は複数のローカルレジスタ48にアクセス可能である。所与のマルチプロセッサ装置40内の異なるプロセッサはデータを共有メモリ52に保存可能である。この共有メモリは所与のマルチプロセッサ装置内のプロセッサ44にアクセス可能であるが、しかし他のマルチプロセッサ装置内のプロセッサにはアクセス出来ない。典型的GPUでは、各マルチプロセッサ装置は命令ユニット60を有し、それはマルチプロセッサ装置の動作を管理する。典型的なマルチプロセッサ装置では、命令ユニット60は
コンカレントな複数のスレッドを生成し、管理し、実行する。詳しくは、命令ユニット60は、マルチプロセッサ装置で走る異なるスレッドの動作を同期させる、ハードウェア機構を有してもよい。
【0043】
GPU32はさらにデバイスメモリ56を有し、それはここでは「外部メモリ」とも呼ばれる。デバイスメモリ56は典型的にDRAMからなる。共有メモリ52と異なり、デバイスメモリ56は、典型的に全てのマルチプロセッサ装置内のプロセッサ44にアクセス可能である。一方で、デバイスメモリ56へのアクセスはレイテンシと
処理能力の
点で高価である。効率よくデバイスメモリ56へアクセスするには、連続し、かつ列をなすメモリアドレス、へ書込み、又から読み込むことが典型的に好適である。ここに記載される幾つかの方法は、デバイスメモリ56に効率的にアクセスする符号の生成に関する。
【0044】
ある所与の瞬間に各プロセッサ44が実行する基本ソフトウェア符号ユニットは「スレッド」と呼ばれる。典型的にCPU28は、スレッドのブロックをGPUに提供することにより、GPU32を呼び出す。スレッドの所与のブロックは、単一のマルチプロセッサ装置40のプロセッサ上で、SIMD又はSIMTモードで走ることが
保証されている。このように、ある所与のブロック内のスレッドは共通メモリ52を経由して互いに通信可能である。
【0045】
典型的に、ブロック当りのスレッドの数は1つのマルチプロセッサ装置内のプロセッサの数より大きいことが可能である。
一般的にGPUに提供されるブロックの数は、マルチプロセッサ装置の数より大きいことが可能である。GPUはブロックマネージャ64を有し、それは、実行されるブロックをCPU28より受け取り、ブロックとスレッドの実行を一定の内部基準に従ってスケジュール管理する。このような基準は「組み込みスケジュールポリシー」と呼ばれる。
【0046】
このように、所与のブロックのスレッドが同一のマルチプロセッサ装置で実行されるという
保証以外に、所与のブロックのスレッドがマルチプロセッサ装置内で実行される順番については何の保証もない。又、異なるブロックがGPU内で実行される順番についても何の保証もない。言い換えれば、CPU28は一般的に、GPUの内部スケジュールポリシーについて制御していない。
【0047】
ここに記載されるある方法及びシステムは、そしてある所与のブロック内のスレッドの間でデータを
同期化し共有する能力のような、GPUの構造的特徴を利用した符号を生成する。依存問題をスレッドに分割する場合、開示された方法及びシステムでは、GPUにおいてスレッドとブロックの実行が保障されない性質を前提として、(即ち、GPUのスケジュールポリシーと関係なく)、異なる原子処理タスクの間で伝えられた依存性を維持する。
【0048】
詳細には、GPUは典型的に、一定の数のブロックを同時に実行するように特定されている。GPUが大量のブロックで呼び出された場合、ブロックはブロックマネージャ64によりスケジュール管理される。ここに記載されるある方法及びシステムの幾つかは、GPUをその同時処理可能な最大ブロック数を超えない数のブロックで呼び出す。結果としてブロックマネージャ64の内部スケジュールポリシーは
有効に迂回される。これらの特徴は更に以下で詳述される。
【0049】
図2のGPU構成は構成の1つの例であり、概念の明確化のためにのみ選択されたものである。他の実施形態では、他の適合するGPU構成が使用可能である。この目的のために使用可能な典型的なGPUは、NVIDIA社(米国、カリフォルニア州サンタクララ市)で製造されるGTX285装置である。この装置は其々8個の
プロセシングコア を有する30個のマルチプロセッサ装置からなる。さらに或いは、ここに記載される実施形態はGPUの使用に関しているが、開示された方法及びシステムは、多重の
プロセシングコア を並列で操作する、デジタル信号処理器(DSP)や多重コアCPUのような他の様々なタイプのプロセッサで使用可能である。
【0050】
(依存図を使用した依存問題の表示)
CPU28は、入力依存問題を、以後「処理要素」(PE)と呼ばれる原子実行タスクにより表示する。依存問題がGPU32により実行される場合、各PEはあるプロセッサ44により実行される1つのスレッドに対応する。CPUは典型的にPEのタイプのライブラリを保持し、その各タイプはある一定の原子タスクを遂行する(例えば参照テーブルの参照、フリップフロップ、バッファ操作、メモリアクセス操作、マルチプレクス操作、算術計算、論理操作または他の適合するタスクタイプ)。各PEは1つのタイプに属し、一定のデータ上で動作する。
【0051】
プロセッサ44が
単一命令多重スレッド(SIMT)モードで動作する場合、各スレッドは典型的に異なる処理要素PEのタイプを走らせることが出来る符号からなる。スレッドが実行される場合、スレッドに実行される実際の処理要素PEのタイプはデータにより選択される。スレッドに読み込まれるデータは、例えば、所望の処理要素PE機能性を実行する1つのプログラムアドレスにジャンプすることにより、又は他の適合する選択手段を使用して、実際の処理要素PEタイプを選択可能である。1つの典型的なスレッドはこのように以下のフローを実行する:
・所望の処理要素PEタイプを
デバイスメモリ56から読み、この処理要素PEタイプを実行する適切なアドレスにジャンプする。
・処理要素PEパラメータおよび
入力値をデバイスメモリ56から
読む。
・所望の処理要素PE機能性を実行する。
・処理要素PE出力値をデバイスメモリ56に書き込む。
(デバイスメモリ56に効率的にアクセスするため、CPU28は処理要素PEを処理要素PEグループ(PEG)に分割する。この特徴は以下に詳述されるが、上記の特許文献14にも記載されている。)典型的にスレッドのロード及び保存操作は、スレッドの処理要素PEパラメータとはリンクしていない。例えば、所与のPEGはデバイスメモリから共有メモリへの64個までのロード命令をサポートするかもしれない。所与のスレッドはその
スレッドの処理要素PEに使用されないデータをロードするかもしれない。
【0052】
上記の技術を
1つの単一命令多重スレッド(SIMT)プロセッサで使用する場合、ユニットがSIMTモードで効率的に動作するため、
1つの所与の多重プロセッサSIMTユニットで同時に実行される予定のスレッドは、同一の処理要素PEタイプを実行することが一般的に望ましい。
【0053】
図3は本発明の実施形態に基づく、依存図で表示された依存問題である。CPU28は、実行依存性によって相互接続された多重の処理要素PEを使用して依存問題を示す。所与の1つの依存性は、ある処理要素PE(「駆動」処理要素PEと呼ばれる)の出力が他の1つの処理要素PE(「
従動」処理要素PEと呼ばれる)の入力として使用されることを特定する。言い換えれば、
従動処理要素PEは駆動処理要素PEに依存する。このような依存性は、駆動処理要素PEが
従動処理要素PEに先だって実行されることを意味する。何故ならば、そうでなければ
従動処理要素PEの入力は有効ではないからである。
【0054】
図3は依存
図72に変換される依存問題68の例である。依存
図72は処理要素PEを示す多重の頂点76と、実行依存性を示す方向性のエッジ80とを有する。所与のエッジは、駆動処理要素PEから
従動処理要素PEに向いている。ある実施形態では、CPU28は多重のサブ
図78を依存
図72から生成する。一般的に循環的な依存
図72と異なり、サブ
図78は
非循環的である。
【0055】
以下に記述される方法は所与の
非循環的サブ図をGPU32上で実行される符号に変換する。多重のサブ図を使用した依存問題が示されると、開示された方法は典型的に各サブ図に別個に適用される。ある実施形態では、異なるサブ図の変数の共通性が計算の効率性を高めるのに利用される。これらの特徴は以下で更に記述される。
【0056】
(静的呼び出しデータベース(SID)を使用した依存図の表示と実行)
ある実施形態では、CPU28は入力依存問題をコンパイルし、以後「静的呼び出しデータベース(SID)」と呼ばれる呼び出しデータ構造を生成する。SIDは実行のためGPU32に提供される。CPU28は、典型的にSIDを生成するコンパイルプログラムを実行する。以下の説明では、CPU28で遂行されるアクションは、
ときどき明確化のため、コンパイラにより実行されると表現される。しかし他の実施形態では、コンパイラはSIDを生成するため適合する
いかなるプロセッサ上で
も走る。生成されたSIDは実行のためシステム20に提供される。
【0057】
SIDは、互いに並行して、そしてGPUの内部スケジュールポリシーに関係なく特定の順番で走ることを保障された、1組の処理要素PE実行連鎖を有する。GPUがSIDで呼び出された場合、各実行連鎖はGPUにスレッドの1ブロックとして提供される。このように、各連鎖の中の処理要素PEはGPU32内の同一のマルチプロセッサ装置40で走ることが保障される。また、SID内の実行連鎖の数はGPUにより同時に実行される最大ブロック数を越えない。その結果実行連鎖はGPU内で同時に実行されることを保障され、そして一般的にブロックマネージャ64の内部スケジュールポリシーに影響されない。言い換えれば、GPUの内部スケジュールポリシーは、効率的に迂回され、処理要素PEの実行順序は完全にSIDにより制御される。
【0058】
図4は本発明の実施形態に基づく、
静的呼び出しデータベース(SID)90の概略図である。SID90は1組の実行連鎖、本事例では4つの連鎖98A...98Dを有する。しか一般的に、1より大きく、GPUが同時に実行可能なブロックの最大数を越えない、適合する数の連鎖が使用可能である。各実行連鎖は次から次へ実行される一連のPEG94を有する。(処理要素PEのPEGへのグループ化は以下で記述される。)
【0059】
GPUが同時に実行可能なブロックの数は典型的にマルチプロセッサ装置40の数に其々のマルチプロセッサ装置により同時に実行可能なブロックの数を乗じた値により与えられる。実際のマルチプロセッサ装置当りの同時に実行可能なブロックの数は、マルチプロセッサ装置の資源(例えば、レジスタ、共有メモリ又はスレッドカウント)により
制限されうるので、特定されたマルチプロセッサ装置当りの同時実行可能ブロック数より小さい。
【0060】
ある場合には、実際のマルチプロセッサ装置当りの同時実行可能ブロック数は次式で表わされる。
【数1】
例えばGTX285 GPUは、30個のマルチプロセッサ装置40を有する。各マルチプロセッサ装置は16,384個のレジスタと16Kバイトの共有メモリを有し、1,024個のスレッドと8個のブロックを同時にサポートする。1つの例示実施形態では、コンパイラに生成されたGPU符号は、1スレッド当り2KBの共有メモリと15個のレジスタを使用し、各ブロックは64個のスレッドからなる。この符号は1ブロック当り総計15x64=240個のレジスタを有する。この例では、マルチプロセッサ装置当りの同時ブロックの数は次式で与えられる。
【数2】
GPU全体の同時実行可能ブロック数は従って8X30=240個となる。
【0061】
異なる実行連鎖は一般的に異なる長さ、即ち、異なる実行時間を有する。典型的にCPU28は依存性問題を実行時間が最小の
静的呼び出しデータベース(SID)にコンパイルするように試みる。言い換えれば、CPUは最大許容連鎖数を越えることなく、最短実行連鎖のSIDを生成するように試みる。この種のSID生成工程の事例は以下で詳述される。
【0062】
各実行連鎖は同一のマルチプロセッサ装置40で動作することを保障されたスレッドのブロックを有するので、ある所与の連鎖の中のPEGは正しい順序で実行されることを保障されている。このように同一の実行連鎖の中で駆動処理要素PEを其々の
従動処理要素PEの前に配置することは処理要素PEの間の実行依存性が破られないことを保障する。さらに、同一の実行連鎖に属するPEGは、この連鎖を実行するマルチプロセッサ装置の共通メモリ52を使用してデータを交換してもよい。
【0063】
しかし多くの依存性問題では、同一の実行連鎖に全ての依存する処理要素PEのペアを配置するという制約は厳しすぎる。このような制約はしばしば少数の非常に長い実行連鎖を生成し、従って実行時間を増加させ、到達可能な
並列化を制限する。多くの場合、実行依存性を維持しながら異なる実行連鎖に依存
性処理要素PEを配置することが好ましい。
【0064】
ある実施形態では、異なる連鎖内に配置された処理要素PEの間の依存性を維持するため、コンパイラがSID内の異なる実行連鎖の間の同期化を強制する。例えば
図4では、連鎖98B内のPEG102が連鎖98A内のPEG106に、依存性110に示されるように、依存する。(より正確には、PEG102は、PEG106の1つの処理要素PEに依存する1つの処理要素PEを含む。)PEG106がPEG102より完全に前に実行を開始することを保障するために、コンパイラは同期化要素、例えば、SYNC PEG114を、連鎖98B内においてPEG102より前に配置する。SYNC114は連鎖98Bの実行を、PEG106が実行を完了し有効な出力を生成するまで、停止する。PEG106の出力はその後入力としてPEG102に提供され、そして連鎖98Bは実行を開始してもよい。同様に、連鎖98C内のPEG118は連鎖98D内のPEG122に、依存性126が示すように、依存する。この依存性を維持するため、コンパイラはSYNC PEG130を連鎖98C内のPEG118の前に配置する。
【0065】
連鎖間の同期化は典型的にデバイスメモリ56を使用して遂行される。例えば、駆動PEGはデバイスメモリ56内のある領域に書き込むことにより、その実行状況の信号を送る。SYNC PEGは、この領域を調査し、駆動PEGが実行を完了した場合にだけ、その連鎖の実行を再開する。
【0066】
しかし、異なる連鎖内の依存
性処理要素PEのペアのすべてが、SYNC PEGの追加を必要とするわけではないことに注意する必要がある。例えば、連鎖98C内の最後のPEGが連鎖98Dの最初のPEGに依存すると仮定する。この場合連鎖98Cにもう1つのSYNC PEGを追加する必要はない。何故ならば、現存するSYNC PEG130が既に連鎖98Dの最初のPEGが実行を完了するまでは、連鎖98C内の最後のPEGは実行しないことを保障しているからである。
【0067】
一般的に、あるSYNC PEGは、所望の数の連鎖の中の所望の数のPEGに依存する、即ち、既定の組の駆動PEGが実行を完了するまで、所与の連鎖の実行を停止する。ある実施形態では、同期化機能性は、独自のSYNC PEGを使用することなく、
従動PEGに埋め込まれる。
【0068】
連鎖の間の同期を強制することは、異なる連鎖の実行時間をバランスさせる上で非常に有効であり、それにより
並列化を増大させる。他方で、同期化構造はレイテンシをもたらし、デバイスメモリ56への高価なアクセスをもたらす。以下に記述するように、コンパイラは典型的に、
静的呼び出しデータベース(SID)の総実行時間を最短にするため、これらの利点と欠点を相殺するように試みる。
【0069】
図5は本発明の実施形態に基づく、依存問題を実行する方法を示すフロー図である。方法は、図の入力ステップ134において、CPU28が依存図で表わされる依存問題の入力を受け取ることから始まる。CPUは、分割ステップ138において、依存図を、
非循環性の指向性サブ図に分割する。依存図の
非循環性の指向性サブ図への分割は上記特許文献14に記載されている。各サブ図に対し、CPUは、グループ分けステップ142において、処理要素PEをPEGにグループ分けし、
静的呼び出しデータベース(SID)構築ステップ146において、SID内にPEGを配置する。CPUは、呼び出しステップ150において、SIDを実行するためGPU32を呼び出す。GPUはSID内のPEG連鎖を実行し、コンピュータ計算タスクの結果を生成する。
【0070】
(効率的
な静的呼び出しデータベース(SID)生成)
上述のように、CPU28上のコンパイラの実行は、典型的に、所与の最大実行連鎖数に対して最短実行時間のSIDを生成するように試みる。このような工程に対する入力は、SIDに変換される、指向性の
非循環性の処理要素PEの依存性サブ図である。ある実施形態では、コンパイラは、処理要素PE間の実行依存性を維持するような方法で、2次元のワープのグリッドを
処理要素PEで徐々に満たすことにより、SIDを生成する。
【0071】
ワープは、所与のマルチプロセッサ装置で同時にかつ効率的に走る同じタイプのスレッドのグループである。1つのワープの最大スレッド数(従って最大処理要素PE数)はGPU
タイプごとに異なる。例えばNVIDIA社のGTX285では、各ワープは32個のスレッドを走らせる。以下に示すように、複数のワープが後に集合され1つのPEGを形成する。
【0072】
図6は本発明の実施形態に基づく、SID生成に使用されるワープグリッドを示す図である。グリッド160は多重の実行連鎖164からなり、その其々は多重のワープスロット168からなる。ワープスロットは当初は空であり、コンパイラは徐々にそれを処理要素PEで満たす。異なる実行連鎖間の同期を強制するため、コンパイラは時々SYNCワープ172を連鎖に挿入する。(SYNCワープは実行するスレッドを含まない点で通常のワープとは異なる。SYNCワープは、連鎖に挿入されるSYNC動作のレイテンシを真似する。)工程の
終わりには、入力サブ図内の各処理要素PEはワープスロットの1つに配置される(各ワープスロットは多重の同タイプの処理要素PEを有してよい)。その後コンパイラは、PEG176をそのワープから形成する。ある場合には所定の連鎖の中の2つ以上の隣接するワープを合体させて1つのPEGを形成する。PEGのグリッドは所望の
静的呼び出しデータベース(SID)として出力される。
【0073】
典型的に、グリッド160内の実行連鎖164の数は、GPUが同時に実行できる最大スレッドブロック数を超えないように設定され、その結果としてのSIDの実行はGPUの内部スケジュール管理に影響されない。1連鎖あたりワープスロット数は、典型的に、入力サブ図の中の最長パスの長さが初期
値としてセットされる。
【0074】
処理要素PE間の依存性により、各処理要素PEは、グリッド160の
列のある部分的サブ組の内にのみ配置可能である。このサブ組は処理要素PEの「割当間隔」と呼ばれる。例えば、他の処理要素PEに依存する1つの処理要素PEはそのワープグリッドの第1列には配置出来ない(即ち、実行連鎖の最初には)。何故ならば、駆動処理要素PEが最初に実行されなければならないからである。同様に、他の処理要素PEを駆動する処理要素PEはグリッドの最後の列には配置出来ない。
【0075】
一般的に、サブ図内の各処理要素PEは、ある割当間隔を有し、それは処理要素PEが
潜在的に配置可能
なグリッド160の列を画定する。1つの処理要素
PExの割当間
隔は、
PExの後方位相(BP(x)と表示される)及び、前方位相(FP(x)と表示される)の2つのパラメータに依存する。所与の処理要素PEの後方位相は、サブ図内の最長パスに沿ったこの処理要素PEに至る処理要素PEの数で定義される。所与の処理要素PEの前方位相は、サブ図内の最長パスに沿ったこの処理要素PEから始まる処理要素PEの数で定義される。
【0076】
この言葉を使用して、サブ図の中の最長パスの長さは(従って、ワープグリッドの列の数は)L=max(BP(x)+FP(x))+1で与えられ、ここに最大値はサブ図内の全ての処理要素PExを対象と
して得られる。処理要素PExの割当間隔は[BP(x),L−FP(x)]で与えられる。これらの割当間隔は、割当工程の最初の状態を反映する。割当間隔は典型的に、割当工程が進行するにつれ変化する。
【0077】
図7は本発明の実施形態に基づく、ワープのグリッド内
に処理要素PEを
配置するための割当間隔を示す図である。
図7は例示としてのサブ
図180に関し、それはA...Hで示される8個の処理要素PE
76を有する。処理要素PEは2つの連鎖164を持つワープグリッドに配置される。この図を貫通する最長パスは3処理要素PE長の長さなので、各連鎖164はこの例では3つのワープスロット168を有する。
【0078】
8つの処理要素PEの前方及び後方位相は次の表で与えられる:
【表1】
【0079】
割当工程の最初に、即ちワープグリッドがまだ空の時に、8つの処理要素PEは図にしめすような割当間隔184を有する。この例では、処理要素PEのAとBは、それぞれ2つの処理要素PEのパスを駆動するため、グリッドの第1列にのみ配置可能である。処理要素PEのCは1つの処理要素PEのパスを駆動するため、最後の列を除くどの列にも配置可能である。処理要素PEのDとEは、それぞれ、1つの処理要素PEに駆動され、かつ1つの処理要素PEを駆動するため、第2列にのみ配置可能である。処理要素PEのFは1つの処理要素PEパスに駆動されるので第1列を除くどの列にも配置可能である。処理要素PEのGとHはそれぞれ2つの処理要素PEパスに駆動されるため、最後の列にのみ配置可能である。
【0080】
図7の事例は、ある処理要素PEは、グリッド160内の配置可能性という点で、他の処理要素PEよりもより重い制約を受けることを示す。短い割当間隔を持つ処理要素PEは重く制約され、一方長い割当間隔を持つ処理要素PEは割当の自由度が大きい。
【0081】
図8は本発明の実施形態に基づく、
静的呼び出しデータベース(SID)を生成する方法を示すフロー図である。方法は、入力ステップ190において、CPU28上で走るコンパイラが、SIDに変換される依存性サブ図を受け取ることから始まる。ある実施形態では、コンパイラは、サブ図が由来する完全な依存図をも受け取り、その依存図は典型的に追加の処理要素PEと依存性を有する。他のSIDに関係なく単一のSIDを生成する場合には、通常、完全な依存図を受け取る必要はない。しかしコンパイラは、同じ依存図内の他のサブ図のSIDを考慮する場合に、完全な依存図を使用する。この特徴は以下で更に記述される。更に、コンパイラは、実行連鎖の数N、ワープスロットユニット内のSYNCのレイテンシD、ワープ寸法(即ち1ワープ当りの処理要素PEの数)及び処理要素PEタイプ、を入力として受け取ってもよい。
【0082】
コンパイラは、インターバル初期化ステップ194において、サブ図内の処理要素PEに対する割当間隔を初期化する。上述のように、処理要素PExの最初の割当間隔は[BP(x),L−FP(x)] で与えられる。
【0083】
コンパイラは、グループ定義ステップ198において、処理要素PE入力及び出力グループを定義する。入力グループは、1つの共通の入力を有する1グループの処理要素PEからなる(即ち、同じ駆動処理要素PEから駆動される処理要素PE)。共通の駆動処理要素PEはグループのピボットと呼ばれる。出力グループは1つの共通の出力を有する1グループの処理要素PEからなる(即ち、同じ
従動処理要素PEを駆動する処理要素PE)。共通の
従動処理要素PEはグループのピボットと呼ばれる。
【0084】
例えば、コンパイラは、依存図全体の各処理要素PExに対し
その処理要素PExがピボットである1つの出力グループを作成してもよい。この出力グループ内の処理要素PEは、サブ図内のその処理要素PExを駆動する処理要素PEからなる。同様にコンパイラは、依存図全体の各処理要素PExに対し
その処理要素PExがピボットである1つの入力グループを作成してもよい。この入力グループ内の処理要素PEは、サブ図内のその処理要素PExにより駆動される処理要素PEからなる。この例では、コンパイラは、依存図全体の各処理要素PEに対し入力及び出力グループを生成することに注意する。しかし、グループ内の処理要素PEは、サブ図からのみ選択され、依存図全体からは選択されない。
【0085】
入力及び出力グループを構築する理由は、共通の入力及び/又は出力を有する処理要素PEを同じ実行連鎖の中に配置することが一般的に望ましいからである(異なるワープの中に配置する可能性はあるが)。依存図全体を考慮する理由は、他の
静的呼び出しデータベース(SID)において処理要素PEの共通の入力又は出力として機能する処理要素PEを、同じ連鎖に配置することが望ましい場合があるからである。コンパイラは、サブ図内の各処理要素PEに、その処理要素PEを含む入力及び出力グループの数として定義される、グループスコアを割り当てる。
コンパイラは、グリッド初期化ステップ202において、それぞれL個のワープスロットを有するN個の実行連鎖からなるワープのグリッドを初期化する。
【0086】
ある実施形態では、コンパイラは、保存ステップ206において、サブ図の処理要素PEを事前ソートする。コンパイラは、割当間隔の寸法の小さい順に処理要素PEをソートする。割当間隔の寸法が同じ処理要素PEはグループスコアの大きい順にソートする。その後コンパイラは、ソートされた順番に従ってグリッド内での配置のため処理要素PEを選択する。このように割当間隔の寸法
が最短の処理要素PEがグリッド内に最初に配置される。ある所与の割当間隔の寸法に対して、グループスコアの大きい処理要素PE(
多数の入力及び/又は出力グループのメンバーである処理要素PE)が先に配置される。他の実施形態では、コンパイラは、割当間隔寸法
が最短のM個(Mは既定の整数)の処理要素PEを選択することにより、グリッド内での配置のため
の次の処理要素PEを選択する。これらの処理要素PEから、コンパイラは、最大グループスコアの処理要素PEを選択する。上記の割当順序は最も制約の重い処理要素PEを最初に割り当て、その後の割当の繰り返しに出来るだけ自由度を残すように試みている。
【0087】
コンパイラはこの処理要素PEの選択ステップ210において、グリッド内に配置するため
の次の処理要素PEをソートされた処理要素PEの中から選択する。次にコンパイラは、コスト計算ステップ214において、この処理要素PEをグリッド内に配置する可能性
について其々の割当コストを計算する。典型的に、コンパイラは、N個の実行連鎖に亘って、
処理要素PEの割当間隔内のワープスロットを吟味する。(ある場合にはたとえ処理要素PEの割当間隔内にあっても、ある一定のワープは所与の処理要素PEを配置する候補にはならない。例えば、そのワープがすでに満員であり、
又はそのワープが、吟味される処理要素PEとタイプが異なる処理要素PEを有する場合である。)
【0088】
ある実施形態では、コンパイラは、ある所与の処理要素PEの
割当間隔内の僅かに外側にあるワープを吟味してもよい。例えば、
ある場合には、処理要素PEをその割当間隔を越えて故意に外側に配置する(そしてそれによりSID実行時間を
僅かに増加させる)ことが好ましく、これはSYNCを追加すること(これはSID実行時間に更に悪い影響を与える)と
対照的である。このようにある実施形態では、コンパイラは、割当間隔に追加して、SYNCによってもたらされたレイテンシの順に並んだ複数のワープスロットを吟味する。
コンパイラは、各潜在的ワープスロットの割当コストを計算する。割当コストは数量的基準であり処理要素PEをある特定のワープスロットに配置する潜在的ペナルティを示す。
【0089】
コンパイラは、割当コストの計算に、ど
のような適合する判断基準又は常識的なルールを適用
してもよい。例示として以下のルールが使用可能である:
・処理要素PEを対象のワープスロットに配置することにより引き起こされる、全体のSID実行時間の中の其々のワープスロットの遅れに対し、コストを1000だけ増大する。このルールは全体実行時間を増大させることに対し厳しいペナルティを課す。
・
吟味されるワープスロットと同じ連鎖内に既に配置され、そして
吟味される処理要素PEを含んだ入力又は出力グループの一員である、各処理要素PEに対しコストを10だけ減少させる。このルールは入力又は出力グループのメンバーを同じ連鎖に配置すること
を優先させる。
・
吟味される処理要素PEに
付随し、
残りの一方の処理要素PEが
吟味されるワープスロットと同じ連鎖内にある、実行依存性(直接又は間接、前方又は後方)に対しコストを
それぞれ10だけ減らす。このルールは、1つの実行依存性の両端を同じ連鎖内に配置すること
を優先させる。
・
吟味される処理要素PEの最適な列からの列距離に従ってコストを増大させる。処理要素PExの最適な列はBP(x)・L/ORIG_Lで定義され、ここにLはそのグリッド内の空でない列の現在の数を示し、L_ORGはサブ図内の最長パスを示す。最適な列はその処理要素PEの割当間隔の外にあるかもしれないことに注意する。
【0090】
ある実施形態では、コンパイラは、その処理要素PEがある一定のワープスロットに配置されたと仮定して、その処理要素PEを横切るサブ図の異なるクリティカルパスを吟味し、それらの存続時間を計算することにより、割当コストを計算してもよい。この種の計算は、潜在的に追加される追加のSYNC
及びそれらの関連するコストを
考慮する。さらにあるいは、コンパイラは
吟味される処理要素PEの割当間隔内の異なるワープスロットに、適合する判断基準又は常識的なルールを使用して、割当コストを割り当ててもよい。
【0091】
コンパイラは、配置ステップ218において、その処理要素PEを最小割当コストのワープスロットに配置する。新規の配置のため必要な場合、コンパイラは、挿入ステップ222において、1つのSYNCを挿入する。1つのSYNCは整数の数のワープスロット、例えば2つのワープスロットの既定の持続時間を有する。各SYNCは、SYNCが自身の連鎖の実行を開始する前にその実行を終了しなければならない、1つのリスト
内の1つ以上のワープを有する。ある所定のSYNCにより選ばれたワープは、どんな数の連鎖の中に存在してもよい。そのリストは典型的に同じ連鎖からの多重のワープを含まない。
コンパイラは、割当間隔更新ステップ226において、新しい配置の後の配置可能性を反映するため、残る割当されていない処理要素PEの割当間隔を
更新する。
【0092】
ある実施形態では、コンパイラは、
更新ステップ230において、新しい配置の後で残った処理要素PEのグループスコアを更新する。例えば、コンパイラは、新規に配置された処理要素PEと同じ入力又は出力グループを共有する処理要素PEのグループスコアを増大させてもよい。このルールは、それらのメンバーが既に部分的に割り当てられている入力又は出力グループを
優先させる。他の例として、コンパイラは、1つの実行依存性を共有する(直接又は間接に、前方又は後方)処理要素PEのグループスコアを増加させてもよい。
【0093】
コンパイラは、チェックステップ234において、サブ図の中の全ての処理要素PEがワープグリッド内に配置されたかをチェックする。割当されていない処理要素PEが有る場合、方式のループはステップ210に戻り、コンパイラが次に配置される処理要素PEを選択する。全ての処理要素PEが割り当てられていた場合、コンパイラは、PEG生成ステップ238において、
連続するワープをPEGにグループ化する。典型的に、各PEGは、例えば、最大2ワープと1つの追加SYNCのような、ある一定の数の同じ連鎖内の
連続するワープのみを有する。更に、1つのPEGは互いに独立した処理要素PEのみを有する、何故ならばPEG内の処理要素PE実行の順番に保障が無いからである。例えば上記
図6では、あるPEG176は単一のワープからなり、他は2つのワープからなり、あるPEGは1つのワープと1つのSYNCからなる。
【0094】
この段階
において、コンパイラは、出力ステップ242において、満員のワープグリッド(N個のPEG実行連鎖の1組)を所望のSIDとして出力する。
典型的に、上記のSID生成工程は、ワープスロットの継続時間が、ロード、同期化、実行及び保存のような異なるPEG動作の継続時間を考慮していると仮定している。しかしある場合には、ロード及び保存命令の継続時間は無視してもよい。上記の記述は、全てのワープが同じ継続時間であり、SYNCの継続時間はワープスロットの整数倍である、と仮定している。記述は又、PEGの継続時間がそのワープとSYNCの合計継続時間と等しいと仮定している。しかし、これら全ての仮定は強制ではなく、他のSID生成の構成
では他の仮定を設定し
てもよい。
【0095】
ある場合には、コンパイラは、最大実行連鎖長、即ち、SID合計実行時間を増大する必要がある。例えば、コンパイラがある一定の処理要素PEをPE割当間隔内のどのワープにも配置出来ない場合、Lの増加は必要かもしれない。Lは又SYNCの挿入の後で増加されてもよいが、SYNCの挿入は必ずしもLの増加をもたらさない。Lの増加は典型的に、ある一定の列より先の従前に配置されたワープ及びSYNCが、右方向に押しやられることを意味する。この押しは、他のワープやSYNCを右押しする動作の、その後の連鎖の引き金となる。ある一定のワープ位置の割当コストを計算する場合(上記ステップ214で)、SIDの総実行時間Lを増加させる右押し動作に
対してのみ、コストは通常増大される。Lを変えない右押し動作は、割当コストを生じない。
【0096】
多くの場合、コンパイラは、所与の処理要素PEの配置に関し幾つかの選択肢に遭遇する。ある場合には、所与の処理要素PEを最小コストの位置に配置する(上記ステップ218において)ことは、この配置が将来の処理要素PE配置において重大なペナルティを引き起こすため、総体的に最適でないことがある。従ってコンパイラは、2つ以上の選択できるSIDを並行して考慮し、これらSIDの中で2つ以上のそれぞれの割当工程を実行することにより、処理要素PE割当工程を改善してもよい。「Aスター」構成のような、種々の検索方法あるいは汎用の検索アルゴリズムも、全体として最善のSIDを探すために使用可能である。
【0097】
(効率的なSID操作のためのメモリ管理)
認識できるように、GPU32上でのSIDの実行は、多数のメモリアクセス動作を伴う。GPU内では、データはデバイスメモリ56又は共有メモリ52に保管可能である。デバイスメモリ56は、典型的に、大きな保存空間を提供する(例えば、数ギガバイト)が、このメモリへのアクセスはレイテンシの観点でコストが高い。典型的に、マルチプロセッサ装置40は大きな粒度(例えば、一度に512ビット)でデバイスメモリ
56にアクセスする。このように、デバイスメモリ56に対する単一ビットの読み取り又は書込みのコストは、512ビットの読み取り又は書込みのコストとほぼ等しい。デバイスメモリ56に対する読み取り又は書込みの命令は、典型的に、これら大粒度アドレスに揃えられている。それに対して各マルチプロセッサ装置内の共有メモリ52は、マルチプロセッサ装置の各プロセッサ44により、
アライメントすることなく小さな粒度で比較的早いアクセス時間でアクセス可能である。しかし共有メモリ52の大きさは、デバイスメモリに比べて非常に小さい(例えば、ギガバイトに対しキロバイト程度である)。
【0098】
本発明のある実施形態では、デバイスメモリ56に効率的にアクセスし、付随するレイテンシのペナルティを最小にするため、SID内のPEG連鎖は共有メモリ52をキャッシュメモリとして使用する。以下の記述では、「共有メモリ」と「キャッシュ」は
場合により互換性を持って使用される。
【0099】
ここに記載されるキャッシュおよびメモリ管理構造は、コンパイルの間に完全に決定され、SIDの実行の間中、決定論的
であり続けることが重要である。この特徴は、動作が実行時のデータにより変化し、従って本質的に統計的な既知のキャッシュ構造とは異なっている。ここに記載された技術の中で、データが異なるPEG連鎖により呼び出され生成される、パターンとタイミングは
コンパイル中に経験的に知られ
る。コンパイラはこの知識を利用して、デバイスメモリ56にアクセスする最適なメモリ管理方法(例えば、一定の変数を一定のタイミングでキャッシュイン又はアウトし、又は多重の読み出し要求を1つの読み出し動作に統合する)を決定する。このような方法は、実行時間に
おいてGPUにより決定論的に実行される。
【0100】
図9は本発明の実施形態に基づく、キャッシュ管理体系の概略図である。
図9はP1,P2...P9で示される9個のPEGからなる特定の1つのPEG実行連鎖に関している。PEGはA...Fで示される6個の変数を入力として使用し、各PEGはこれら変数のある一定のサブ組を使用する。この事例では、共有メモリ52はある時点で最大3個の変数を保持出来る。コンパイラは、決定論的にキャッシュパターンを定義し、それは共有メモリ52の限られた容量を最適に使用し、またデバイスメモリ56からの読み出し回数を最小化するため、いつ
ある変数がデバイスメモリ56から共有メモリ52に取得され、そしていつ
ある変数が廃棄されるかを特定する。
【0101】
図の上側の領域250は、各PEGにより入力として使用される変数を示す。例えばPEG P1は入力として変数AとBを使用し、PEG P2は変数BとCを使用し、PEG P3は変数Aのみを使用、等々である。上向き矢印は対応するPEGによりデバイスメモリ56から共有メモリ52に取得された変数を示す。下向き矢印は、次のPEGで必要とされる空間を空けるため、PEGの実行の後共有メモリから廃棄される変数を示す。太字で囲われた変数は、キャッシュヒット、即ち、キャッシュ内に既に存在していてデバイスメモリから取得する必要のない変数を示す。例えば、PEG P2の実行の準備においては、変数Bは従前のPEGから共有メモリ52に存在するため、変数Bをデバイスメモリから取得する必要はない。
【0102】
図9の下方の領域254は、各PEGの始まりにおける共有メモリ52の内容を示す。例えば、PEG P1の始まりにおいては、共有メモリは変数AとBを保持する。変数CはPEG P2の始まりに取得され、共有メモリは変数A、BとCを保持する。キャッシュはPEG P3とPEG P4の間は変化しないが、変数Dを入力として必要とする。そのため変数AはPEG P3の終わりに廃棄され、変数DがPEG P4の初めに取得される。工程はPEG連鎖の実行の間続く。
【0103】
ある時点において共有メモリに存在する各変数に対し、コンパイラはこの変数を入力として要求する連鎖内の次のPEGの識別を記録する。コンパイラは典型的に、PEG連鎖を実行順序に従ってスキャンすることにより、これらPEGの識別を決定する。記録されたPEGの識別は図の下方の領域254内に示される。例えば、変数AとBがPEG P1の初めに取得される場合、コンパイラは、変数Aは次にPEG P3により要求され、変数Bは次にPEG P2により要求されると認識する。他の事例は、PEG P3の初めにコンパイラは変数Aが次にPEG P5に要求され、変数BとCは共に次にPEG P4に要求されると認識する。文字∞はある変数がその連鎖の後続のPEGでは要求されないことを示す。
【0104】
これらの記録を使用して、コンパイラは、共有メモリ内の空間を開ける必要がある場合、どの変数が廃棄されるかを決定する。ある変数を廃棄する必要がある時、コンパイラは、典型的に連鎖の中で最も遠いPEG、即ちこのPEGから最も距離が離れたPEGから要求される変数を廃棄する。例えば、PEG P3の終わりの状況を考えてみる。この時点ではすでに共有メモリは変数A,BとCを保持している。PEG P4で変数Dを取得してくるには、いずれかの変数が廃棄されなければならない。AはPEG P5で要求される予定であり、BとCはそれより早くPEG P4で要求される予定であるので、変数Aが廃棄される。
【0105】
図9の例は、特定の連鎖、特定の変数及び特定のキャッシュ容量に関している。しかし一般的に、このキャッシュ管理体系は、他の適合するPEG連鎖、変数の組及びキャッシュ容量に使用可能である。他の実施形態では、コンパイラは共有メモリ52内の変数のキャッシュイン及びキャッシュアウトを他の適合する基準を使用して設計する。GPUにより一定のPEG連鎖を実行するように指定されたマルチプロセッサ装置40は、コンパイラにより設定された決定論的なパターンに従って、デバイスメモリ56から共有メモリ52へ変数を取得する。典型的に、同様の工程がSID内の各PEG連鎖に対して実行される。コンパイラは、異なる変数を要求するPEGを記録するため、適合するデータ構造を使用する。
【0106】
ある実施形態では、コンパイラは、デバイスメモリからのコスト高な取得動作の回数を減少させるため、デバイスメモリ56から共有メモリ52への多重の変数の取得を、単一の取得命令に集約する。上述のように、典型的なGPUでは、単一の変数をデバイスメモリから取得する手間は、512ビットを占有する変数を取得する手間とほぼ同じであり、従って集約して1つの命令で多数の変数を取得することは有利である。
【0107】
図10Aと10Bは、本発明の実施形態に基づく、変数事前取得体系を示す概略図である。この例は、P1,P2...P9で示される9個のPEGからなる特定の1つのPEG実行連鎖に関している。PEGはA..D,S,Tで示される6個の変数を入力として使用する。変数A..DはこのSIDの内部で使用され、一方変数SとTはSID間の変数である。各
図10Aと10Bにおいて、各列は連鎖の中のある一定のPEGに対応し、各行は変数に対応する。
【0108】
各変数はある一定のPEGによりこの変数が入力として要求された時から、斜線を記される。例えば、変数Bは最初にPEG P3から要求され、従ってこの変数はPEG P3から先は斜線を記される。垂直線258は、このPEG連鎖と他の連鎖との間のSYNCsを示し、それは後続のPEGにより実行される。この事例では、SYNCはPEG P1,P4そしてP7により実行される。其々のSYNC258に対し、1つ以上の標識262はSYNCにより同期化された特定の変数を示す。例えば、PEG P4により実行されたSYNCは、変数CとDがもう1つの連鎖により準備が整うまで、実行を停止する。
【0109】
ある実施形態では、コンパイラは、PEG連鎖をスキャンし、各命令により取得される変数とともに、デバイスメモリの取得命令のタイミングを設定する。典型的に、コンパイラは、(1)各変数を必要とするPEGへの距離と(2)効率的と考えられる1命令当りの取得動作の数、を考慮しながら、取得命令のタイミングと内容を設定しようとする。この情報に基づき、コンパイラは2つ以上の変数の取得を1つの命令に統合させようとする。
【0110】
ある実施形態では、コンパイラはPEG連鎖を逆順序(即ち、実行順序と逆に)でスキャンする。各変数に対し、コンパイラは其々の取得間隔、即ち、変数が取得される間の時間間隔を標識付けする。この時間間隔はその変数が有効になった時に始まり、この変数を最初に入力として要求するPEGで終わる。コンパイラはその後取得動作のタイミングと内容をこれら時間間隔に基づいて設定する。
【0111】
典型的に、各変数に対し、又各PEGに対し、コンパイラは、変数が有効である限り、PEGとこの変数を最初に要求するPEGとの距離(PEGのユニット数での)を標識付けする。所定の変数は、この変数を伴う直近のSYNC258の後に有効と見做されうる。本事例におけるコンパイラにより標識付けされた距離は
図10Aと
図10Bに示される。例えば変数DはPEG P4に最初に要求され、PEG P4以降(この変数を待つSYNCの後)何時でも取得可能である。コンパイラは標識付けされた距離に基づき取得動作のタイミングと内容を設定する。例えば、コンパイラは、PEG連鎖を実行順序に沿ってスキャンし、取得する必要のある変数を識別し、効率的な取得命令を生成するため他の変数の取得と合体させてもよい。コンパイラは、取得間隔が重複する2つ以上の変数を合体させてもよい。統合された取得命令はこの重複の間に配置される。
【0112】
例えば、2つの変数を取得する命令が効率的であり、1つの変数を取得する命令が効率的でない、と考えられたと仮定する。
図10Bの事例では、PEG P1,P2にたいする準備として、どの変数も取得される必要が無い。しかしPEG P3は変数Bを入力として必要とし、従ってコンパイラは、PEG P3に対する準備として実行されるデバイスメモリ56からの取得命令を画定する。デバイスメモリに効率的にアクセスするため、コンパイラは、もう1つの変数取得を同じ命令内に集める。コンパイラは、このPEGからの距離が最小(即ち、このPEGからこの変数を最初に要求するPEGまでの距離)の有効な変数を選択する。
【0113】
この事例では、変数SとTはこの時点で有効であり、変数Tはより小さい距離を有している(6に対し3)。従ってコンパイラは、変数BとTを取得するための取得命令を画定する。一度これら変数が取得されると、これらは再び取得されないようにリストから×印で取り消される。工程は同様の論理を使用して続き、コンパイラは、2つの追加の取得命令を画定する。1つはPEG P4の前に変数CとDを取得する命令であり、他の1つはPEG P9の前に変数AとSを取得する命令である。この技術を使用して各変数は、それが有効となった後でかつ最初に入力として必要とされる前に取得され、取得命令は、1つの命令当りの多重の変数の取得を統合することにより、効率的に画定される。
【0114】
図10Aと
図10Bの例は、特定の連鎖、特定の変数、1命令当り特定の数の取得、及び特定の選択基準に関している。しかし一般的には、コンパイラは、他の適合するPEG連鎖、変数、1命令当りの取得数、及び選択基準を有する事前取得体系を適用してもよい。典型的に類似の工程がSID内の各PEG連鎖に対し実行される。コンパイラは、上記の時間間隔と距離を記録するため、適合するいかなるデータ構造を使用してもよい。
【0115】
ある実施形態では、コンパイラは変数のデバイスメモリ56への保存(PEGにより生成される出力)を遅らせ、1保存命令に多重の変数を集める。1保存命令に多重の変数を集めることは、デバイスメモリ56への保存に伴うレイテンシと手間を減少させる。この種の遅延保存体系は
図10Aと
図10Bの事前取得体系に類似した基準を使用して実行可能である。例えばコンパイラは、それぞれの変数に対して、変数の値を生成したPEGから変数が入力として必要とされる時点までの時間間隔(例えば、異なるSIDに属する可能性のある別の連鎖による、)を識別する。変数が他のSIDの連鎖により入力として必要な場合、コンパイラは、この変数を生成する連鎖の終端(そしてこの連鎖内の個々のPEGではない)を変数が準備を完了した時点と見做す。その後コンパイラは、多重の変数の保存命令を、これら時間間隔に基づいて画定する。
【0116】
図9の上部に示すように、所与のマルチプロセッサ装置40が所与のPEG連鎖を実行する場合、マルチプロセッサ装置は変数をデバイスメモリ56から特定の決定論的な順番でロードし、共有メモリ内にキャッシュし、それらを連鎖内の異なるPEGに入力として供給する。ある実施形態では、コンパイラは、PEG連鎖が変数をロードする命令に従って、デバイスメモリ56内の変数を事前
注文する。この体系を使用する場合は、ある所与のPEG連鎖は、命令された取得動作の順番を使用して、変数をデバイスメモリ56から連続するメモリアドレスに取得することが出来る。
【0117】
図11は本発明の実施形態に基づく、変数事前
注文体系を示す概略図である。
図11の事例は上述した
図9のキャッシング体系を示す。図の上部の領域266は、その連鎖内の異なるPEGによりキャッシュされ共有メモリ52から取り出された変数をしめす。領域270は各PEGのための準備としてデバイスメモリ56から取得された変数を示す。太字の枠はその連鎖内の従前のPEGにより既に読まれ、その間に共有メモリから取り出された変数を標識付けする。
【0118】
ある実施形態では、コンパイラは、変数をフィーダ領域274内のデバイスメモリ56に保存する。あるPEG連鎖のフィーダ領域274では、変数は、そのPEG連鎖により変数が取得される順番で保存される。ある所与の変数は、フィーダ領域に沿って2つ以上の異なる位置に保存されることに注意する。これはキャッシュ容量が限られるため、PEG連鎖が同じ変数を再度読むことがあるからである。また、各PEG連鎖は、デバイスメモリ56内に対応するフィーダ領域を有することにも注意する。ある所与の変数は異なるPEG連鎖の多重のフィーダ領域に保存されうる。
【0119】
典型的に、事前
注文された変数はデバイスメモリ内で、GPUのメモリ配列と容量仕様に合致する、基礎セクションに配置される。これらのセクションはここでは以降「キャッシュライン」と呼ばれる。典型的なGPUでは、各キャッシュラインは512ビットからなる。典型的に、異なる連鎖内のPEGは、キャッシュラインユニット内の変数を生成し、使用し、交換する。
【0120】
(SID間及びSID内の通信)
上記のように、コンパイラは、各依存サブ木をSIDに変換する。ある実施形態では、1つのSID内の1つのPEGにより生成される変数は、他の1つのSID内の1つのPEGにより入力として使用される。異なるSID内のPEG間の通信は、典型的に、デバイスメモリ56経由で行われる。ある実施形態では、コンパイラは、「メールボックス」と呼ばれるデータ構造
内にSID間で通信される変数を保存する。各メールボックス、は共通のPEG連鎖により生成され及び/又は使用された変数からなる。SIDs間の通信はメールボックスとの間でキャッシュラインを書込み、そして読み出すことにより行われる。このようにデバイスメモリ56へのアクセスは、異なる変数間の使用と生成の共通性を利用することにより、効率的に実行される。
【0121】
図12は、本発明の実施形態に基づく、多重
静的呼び出しデータベース(SID)を示す概略図である。この事例は、SID−XとSID−Yと記される2つのSIDからなる。SID−Xは2つのPEG連鎖からなり、それらは其々4つのPEG280からなる。SID−Yは2つのPEG連鎖からなり、それらは其々2つのPEG280からなる。各PEGは最大3つの入力変数(各ブロックの左側に示される)を受け取ることが出来、そして1つの出力変数(各ブロックの右側に示される)を生成出来る。例えばPEG1/1は、変数AとCを入力として受け入れ、変数Dを生成する。それぞれのSID内には、SID−X内のPEG2/3とPEG1/4のように、幾つかの連鎖間の依存性も存在する。
【0122】
ある変数は進入変数及び排出変数、即ち、それぞれCPU(又は他のホスト環境)から入力され、CPUに出力する変数として定義される。この事例では、進入変数はA,B,C,FとQからなる。排出変数はS,G,HとPからなる。
【0123】
ある
所与のSIDにおいて、変数は生成された変数(SIDにより生成された)、使用された変数(SID内のPEGにより入力として使用された)および入力変数(SID内のPEGにより入力として使用されたが、SID内で生成されていない)にクラス分けされる。異なるクラス間で重複は存在する。本事例では、変数のクラス区分は次の表に示される:
【表2】
【0124】
図13は、本発明の実施形態に基づく、SID間通信の方法を示すフロー図である。方式は、SID間識別ステップ284において、コンパイラが1組のSID間変数を識別することから始まる。SID間変数は、進入変数でも排出変数でもなく、かつ異なるSID間で交換される変数からなる。コンパイラは、(1)全てのSIDの全ての入力変数の組を識別する、(2)この組から進入変数と排出変数を取り除く、ことによりSID間変数を識別する。この事例では、SID−XとSID−Yの入力変数の組は、{A,B,C,E,F,M,L,Q,N,V,P}であり、進入変数の組は、{A,B,C,F,Q}であり、排出変数の組は、{S,G,H,P}である。従ってSID間変数の組は、{E,M,L,N,V}である。
【0125】
次に使用/生成マッピングステップ288において、コンパイラは、異なるSIDの異なるPEG連鎖による使用と生成に関して、SID間変数をマップする。本事例では、異なるSID間変数の使用と生成は、次の表で与えられる:
【表3】
ここにおいて、例えばM→(X1)は変数MがSID−X内の連鎖1により生成されることを示す。一般的に、所与のSID間変数は、いかなる所望の数のSIDに属する、いかなる所望の数の連鎖によっても生成され、及び/又は使用される。
【0126】
次にコンパイラは、グループ化ステップ292において、共通の連鎖により生成され、かつ共通の連鎖により使用されたSID間変数をグループに統合する。コンパイラは、メールボックスと呼ばれるデータ構造を其々のグループに対して定義する。これらメールボックスはデバイスメモリ56内の一定の領域に保存される。各メールボックスは、典型的に、1つ以上のキャッシュラインを有する。本事例では、コンパイラは、次の4つのメールボックスを定義する:
【表4】
【0127】
SID間通信ステップ296において、実行時に異なるSIDは、キャッシュラインをメールボックスに書込み、そしてキャッシュラインをメールボックスから読み
出すことにより、互いに通信する。各メールボックスは、同じ連鎖により生成され、同じ連鎖により使用されるSID間変数を有するため、デバイスメモリ56へのアクセスは効率的である。
【0128】
メールボックス機構の効率は、少なくとも部分的に、処理要素PEの各SID内のPEG連鎖への割当に依存する。
図8で説明したように、コンパイラは、他のSID内の同じ処理要素PEと通信する処理要素PEを、同じPEG連鎖の中にグル−プ化しようとする。このグループ化が成功して適切に定義されている場合、
図13の方法は、各メールボックスが比較的多数の変数を有する、比較的少数のかつ適切に定義されたメールボックスのグループを生成する。
【0129】
ある実施形態では、コンパイラは、各メールボックス内の変数をPEG連鎖により要求される順番に従って整理することにより、デバイスメモリ56へのアクセス効率をさらに向上させる。
【0130】
ある実施形態では、同じSIDの中の異なるPEG連鎖が互いに変数を移送する。この通信の形はここでは「SID内通信」と呼ぶ。同じSIDの中のPEG連鎖は、典型的に、変数値からなるキャッシュラインを、デバイスメモリ56経由で交換することにより通信する。SID内通信は典型的に変数の有効性の制約を受ける。言い換えれば、あ
るPEG連鎖は、その変数を生成するPEGが実行を完了した後にのみ、1つの変数を他の1つの連鎖に送る。ある実施形態では、コンパイラは、実行依存性を維持し、(キャッシュライン解決における)処理の回数を最小化するようなやり方で、PEG連鎖間の通信処理を定義する。SID内通信は、典型的に、連鎖の間に
導入されたSYNC要素上で実行される。言い換えれば、1つの連鎖の実行を他の連鎖内の1つ以上のPEGが実行を完了するまで停止するSYNC要素はまた、変数をこれら他の連鎖から、停止された連鎖に送ってもよい。
【0131】
図14Aと14Bは、本発明の実施形態に基づく、SID内通信体系を示す概略図である。
図14Aは、3つのPEG連鎖を有するSIDの例を示す。其々のPEGに対し、入力変数はPEGブロックの左側に示され、出力変数はブロックの右側に示される。
【0132】
図14Bは4つのキャッシュライン300を示し、それらは、
図14AのSID内のPEG連鎖間の変数の送信に対してコンパイラが定義したものである。各キャッシュラインにより渡された変数は図内で括弧{}で囲まれている。コンパイラは、キャッシュライン300を定義するために、種々の動的プログラミング技術のような、いかなる適合する工程を使用してもよい。典型的に、解決策は一意ではなく、多重の解決策が可能である。コンパイラは、キャッシュライン300の数を最小化するような、既定の基準に合致する解決策を識別するように試みる。
【0133】
(SID間通信の効率を改善する技術)
上記のように、異なるSID間のSID間変数の交換は、変数をデバイスメモリ56内のメールボックスに保存することにより実施される。各メールボックスは1つ以上のキャッシュラインを有し、1つ以上のソース実行連鎖(1つ以上のソースSID内の)と、1つ以上のターゲット実行連鎖(1つ以上のターゲットSID内の)を伴う。典型的に、SID間変数は次のようにメールボックスに指定される:(1)同じSIDの組と実行連鎖により生成され使用された変数は、同じメールボックスを指定される(2)同じSIDsの組と実行連鎖により生成され使用されない変数は、同じキャッシュラインを共有しないよう、異なるメールボックスを指定される(3)各変数は正確に1度だけメールボックスの集合の中に現れる。
【0134】
しかしある場合には、SID間変数の生成と使用は、変数のメールボックスへの効率的なグループ化を可能にしない。そのようなグループ化は少数の変数からなるメールボックスを生成するかもしれない。デバイスメモリが、キャッシュラインに存在する実際の変数の数に関係なく、キャッシュラインユニット内で読まれるため、少数の変数からなるメールボックスがキャッシュラインの有効利用を減ずるかもしれない。
【0135】
ある実施形態では、コンパイラは、閑散としたメールボックスからの2つ以上のSID間のキャッシュラインを合体させ、混雑したキャッシュラインを生成する。キャッシュラインを統合することにより、デバイスメモリからのロード動作の回数は減少されうる。減少の程度は、統合されるキャッシュラインの選択による。例えば、コンパイラは、比較的重複の大きいターゲット実行連鎖の組の中でSID間キャッシュラインを統合するように試みる。
【0136】
例として連鎖S1とS2に使用される1つのキャッシュラインAと、連鎖S1,S2及びS3に使用される1つのキャッシュラインBを考えてみる。キャッシュライン容量制限を超えることなくそれらを新しいキャッシュラインCに統合することが可能なように、キャッシュラインAもBも十分に余裕があるものと仮定する。この例では、キャッシュラインAとBを統合してキャッシュラインCを形成した後、連鎖S1とS2のそれぞれは、2つのキャッシュラインの代わりに、1つのキャッシュライン(統合キャッシュラインC)だけをロードする必要がある。連鎖S3も又、1つのキャッシュライン(キャッシュラインBの代わりに統合キャッシュラインC)だけをロードする必要がある。全体として、デバイスメモリからのロード動作の回数は、キャッシュラインAとBを統合させた結果減少する。他の実施形態では、コンパイラは所望の数のキャッシュラインを統合する。
【0137】
あるいは、コンパイラは、SID内通信機構を使用して(即ち、連鎖間の同期化要素を使用して)、ターゲットSID内のターゲット実行連鎖の間で変数が転送可能なSID間キャッシュラインを統合する。 SID間通信を改善するために利用の少ないSID内通信資源を利用する考え方は以下に詳述される。例えばS1,S2とS3の3つの実行連鎖と、A,B、Cの3つのキャッシュラインの構成を考える。この例では、連鎖S1はキャッシュラインAからの入力変数を持ち、連鎖S2はキャッシュラインBからの入力変数を持ち、そして連鎖S3はキャッシュラインCからの入力変数を持つ。また連鎖間の同期化機構が連鎖S1から連鎖S2へのデータ転送を可能にすると仮定する。連鎖S2内では、キャッシュラインBからの入力変数は、連鎖S1との同期化の後ろに位置するPEGからのみ必要とされる。この状態では、キャッシュラインAとキャッシュラインBを統合し、キャッシュラインBの変数を連鎖S1と連鎖S2の同期化機構上で転送することが有利である。このような仕組みを使用する場合、連鎖S2は、キャッシュラインBの変数を連鎖S1から同期化機構上で受け取るため、キャッシュラインBをロードする必要はない。このようにコンパイラは、(1)異なるターゲット連鎖により使用されるキャッシュラインを統合する(2)SID内通信を使用して、1つのターゲット連鎖から他のターゲット連鎖へ変数を転送する、ことにより、デバイスメモリからのロード動作の回数を減少させる。
【0138】
SID間キャッシュラインが統合されているか否かに拘わらず、コンパイラは、以下に説明されるように、使用の少ないSID内通信資源を利用して、デバイスメモリからのSID間のキャッシュラインのロード動作回数を減少することが出来る。
【0139】
図15は、本発明の実施形態に基づく、SID間通信及びSID内通信の両方を使用するSID310を示す概略図である。SID310は、他の1つのSIDからSID間キャッシュライン314をロードすることにより、SID間変数を受信する。この例では、キャッシュライン314からのSID内変数は、SID310内の3つの実行連鎖318A、318B,318Cにより使用される。(SID310は、このSID間キャッシュラインからの変数を使用しない、他の追加の実行連鎖を有してもよい。)
【0140】
SID間変数を送信するためにSID内資源を使用しなければ、3つの実行連鎖318A、318B,318Cの各々は、入力変数を取得するため、デバイスメモリ56の適切なメールボックスから、キャッシュライン314を個別にロードしなくてはならない。このように3つの個別のロード動作が必要となる。或いは、キャッシュライン314はそれら連鎖のサブ組(例えば、単一の連鎖)のみによりロードされ、他の連鎖はSID内通信を使用して変数を受け取ってもよい。
【0141】
SID310では、例えばSYNC326Aが、連鎖318A内のあるPEGに対し
連鎖318B内のあるPEGを同期化し、SYNC326Bが、連鎖318B内のあるPEGに対し連鎖318C内のあるPEGを同期化する。各SYNCは、SID内キャッシュラインを伴い、それは変数をSYNCに依存し同期化する連鎖から同期化される連鎖へ転送する。(又はより正確には、同期化するPEGから同期化されるPEGへ)。例えば、SYNC326Aは、変数を連鎖318Aから318Bに転送する1つのSID内キャッシュラインを伴う。
【0142】
SID内キャッシュラインが未割当のバンド幅を有すると仮定すると、
それらSID内キャッシュラインは連鎖318Aから連鎖318Bへ、及び連鎖318Bから連鎖318Cへデータを送信するのに使用可能である。このように、ある場合には、連鎖318Aだけにデバイスメモリからキャッシュラインを実際にロードさせ、その後その変数を、SYNCs326Aと326Bに依存するSID内キャッシュライン上で、連鎖318Bと318Cに転送させることにより、3つ連鎖318A・・・Cの全てがSID間キャッシュライン314の変数を取得できる。
【0143】
この解決法は、所与の連鎖において、SID間変数を使用するPEGがSYNCの後に配置され、そのSYNCのSID内キャッシュラインがその変数をその連鎖に転送するのに使用される、と仮定すれば可能である。連鎖318AはSID間キャッシュラインをデバイスメモリ56から実際にロードする連鎖であるため、連鎖318A内のPEG322Aは、SID間変数にアクセスできる。連鎖318Bでは、PEG322Bは、SYNC326Aの後に位置するため、送信された変数にアクセスできる。連鎖318Cでは、PEG322Dは、SYNC326Bの後に位置するため、送信された変数にアクセスできる。PEG322Cは、SYNC326Bの前に位置するため、送信された変数にアクセスできない。
【0144】
もしPEG322CがSID間キャッシュライン314からの変数を使用する必要がある場合、連鎖318Cは、追加のロード動作を受けて、このSID間キャッシュラインを別個にロードする必要がある。このシナリオでは、SYNC326BのSID内キャッシュラインは、SID間キャッシュライン314からの変数転送に使用されない。
【0145】
ある実施形態では、コンパイラは、所与のSIDにより実行される、SID間キャッシュライン動作の回数を、SID間変数を運ぶための変数資源をSID内SYNCs上で割り当てることにより、減らすように試みる。この工程は典型的に各SIDに対して実行される。この種の工程の1例が以下の
図16、
図17で示される。しかし或いは、他の適合する工程も使用可能である。
【0146】
図16と
図17の工程はFとPで記される2つの関数を使用する。所与の実行連鎖sと1つのSID間変数aに対して,関数F(s,a)は、変数aを入力として使用する連鎖s内
に最初のエントリー(PEG)を返す、静的関数である。言い換えれば、変数aは連鎖sの共通メモリに、F(s,a)より遅れずに、供給されなければならない。変数aが連鎖sのどこでも入力として使用されない場合は、F(s,a)=∞である。
【0147】
関数P(s_seq,s_off,t_seq,t_off,req_size)は1組の(1つ以上の)パスをSID経由で返し、その上で、所与の寸法req_sizeのデータが1つのソース連鎖s_seqからターゲット連鎖t_seqに転送されうる。返されたパスは、ソース連鎖の中でオフセットs_off以降に始まり、ターゲット連鎖にt_off以前に到着する。関数Pは、SID内通信資源の割当に対応して、コンパイル中に変化しうる。ある実施形態では、Pも又、t_offで使用が必要な1列の変数を受け取る。関数Pは、典型的に、変数の幾つかは既に連鎖間の同期化経由で転送されていることを考慮に入れる。ある実施形態では、Pは、データ転送に使用可能な多重のパスの組合せを返す。
【0148】
工程は又、Hと記されるデータベースを使用する。SIDに使用される各SID間キャッシュラインに対し、データベースHは、このキャッシュラインを使用する連鎖の複数のクラスへのクラス分けを保持する。クラスは典型的に其々のリストで表わされる。この事例では、連鎖は6つのクラスにクラス分けされる:
・マストロード(ML):SID内SYNCs上でSID間変数を受信できないため、SID間キャッシュラインをデバイスメモリ56からロードしなければならない連鎖。
・シュッドロード(SL):ML連鎖ではないが、工程から、SID間キャッシュラインをデバイスメモリ56からロードするように要求された連鎖。
・配置されたロード(PL):SID間キャッシュラインをデバイスメモリ56からロードすることなく、他の連鎖からSID間変数を受信する連鎖で、それに対し適切な資源がSID内キャッシュライン上で割り当てられている連鎖。
・ルート依存(RD):いまだSL,ML又はPLクラスに指定されていない連鎖であって、SID内キャッシュライン経由でSL,ML又はPLクラスの少なくとも1つの連鎖に到達可能な連鎖。
・遠い依存(FD):SL,ML又はPLクラスのどの連鎖によっても到達出来ない連鎖。
・未分解(U):クラスが未分解な連鎖。(FDとUの差異は、FDクラスの連鎖は、RDまたはFDクラスの連鎖からは到達可能であるが、SL,ML又はPLクラス
の連鎖から
は到達出来ないことである。)
【0149】
以下の記述は、連鎖のクラスへのクラス分けを伴う、所与のSID間キャッシュラインに関している。以下の工程は各SID間キャッシュラインに対し繰り返される。
【0150】
ある所与の時
点において、各クラスはどんな数の連鎖を有してもよいが、所与の1つの連鎖は1つのクラスにしか現れない。上記のように、対象となるSID間キャッシュラインからの変数を使用する連鎖のみがクラス分けされる。
図16と
図17の工程は、相互作用工程であり、全ての連鎖がUクラスであるところから始まる。(典型的に、Uクラスは最初、対象となるSID間キャッシュライン上で運ばれる変数を使用する、連鎖のみを有する。他の連鎖は典型的に、無視される。)工程はUクラスが空で、全ての連鎖がSL,ML又はPLに指定されて終了する。工程が終了すると、SLとMLクラスの各連鎖は、個別にSID間キャッシュラインをロードするように定義され、PLクラスの連鎖は、キャッシュラインをロードすることなく、SID間変数を他の連鎖から受け取るように定義される。SID間SYNCの適切な資源がSID間変数をPLクラスの連鎖に届けるために割り当てられる。
【0151】
図16は、本発明の実施形態に基づく、SID間通信を減らす方法を示す状態遷移
図330である。状態遷移
図330は、それぞれU,ML、SL,PL,RDとFDクラスを示す状態334,338,342,346,348及び350を有する。状態間の遷移は矢印で示される。繰り返し割当工程は、Uクラスが空で、全ての連鎖がSL,ML又はPLに指定されるまで、連鎖をクラスからクラスへ(状態から状態へ)これら遷移上で移動させる。
【0152】
図17は、本発明の実施形態に基づく、SID間通信を減らす方法を示すフロー図である。(工程は典型的に、各SID間キャッシュラインに対して繰り返される。)方法は、初期化ステップ360において、コンパイラがデータベースHを初期化することから始まる。現在処理されているSID間キャッシュラインは、「c」と記される。キャッシュラインcを使用する各連鎖s(即ち、式F(s,c)≠∞を満たす連鎖)に対し、コンパイラは、その連鎖をUクラスに追加する。
【0153】
コンパイラは次に、分解ステップ364において、関数SとPを使用して、キャッシュラインcを分解するように(即ち、Uクラス内の連鎖をクラス分けするように)試みる。分解ステップは、以下の連続する複数の段階からなる:
1)ML分解段階:Uクラス内の各連鎖sに対して、コンパイラは、連鎖sで使用されるキャッシュラインcの変数がこのキャッシュラインを使用する他の連鎖から得られるかどうかをチェックする。(関数Fを使用して変数を提供する可能性のある連鎖が識別される。関数Pを使用して変数を転送する可能性のあるパスが識別される。)連鎖sに対し変数を取得するための連鎖やパスが見つからない場合は、コンパイラは連鎖sをUクラスから除外しMLクラスに追加する。
2)RD分解段階:Uクラス内の各連鎖に対し、コンパイラは、(FとPを使用して)必要な変数をキャッシュラインcから取得できる連鎖を、SL,ML又はPLクラス内の連鎖から識別する。コンパイラは識別された連鎖をUクラスから除外しRDクラスに追加する。
【0154】
3)コンパイラは、Uクラスが空になるまで次の3つのサブ段階を繰り返す:
a)RDサブ段階:コンパイラは、関数FとPを使用し、必要な変数をSLクラス内の連鎖からのキャッシュラインcから取得できる連鎖を、識別する。コンパイラは識別された連鎖をUクラスから除外しRDクラスに追加する。
b)FDサブ段階:コンパイラは、関数FとPを使用し、必要な変数をRDまたはFDクラス内の連鎖からのキャッシュラインcから取得できる連鎖を、識別する。コンパイラは識別された連鎖をUクラスから除外しFDクラスに追加する。少なくとも1つの連鎖が発見された場合、FDサブ段階は繰り返される。
c)SLサブ段階:この段階は循環依存性パターンを2つ以上の連鎖の間で識別し、分解する。循環依存性は上記特許文献5のセクション10.3.1.2.4に記載されている。
1.コンパイラは、連鎖sをキャッシュラインcのUクラスリストから選択する。req_offsetと記される変数はF(s,c)に設定される。
2.コンパイラは、関数Pを使用して、Uクラス内の連鎖(連鎖sを除く)をスキャンし、連鎖sが必要なキャッシュラインcの変数を、req_offsetより遅くないオフセットにおいて提供可能な、ソース連鎖を識別するように試みる。
3.ソース連鎖ssが発見された場合、sはs=ssとなるように設定され、req_offsetは、その中でssがキャッシュラインcを使用可能にする必要があるオフセットに設定される。
4.ソース連鎖が発見されない場合、コンパイラは連鎖sをUクラスから除外し、SLクラスに追加する。
【0155】
分解ステップ364を終了後は、所定の1つのSID間キャッシュラインcに対し、Uクラスは空であり、キャッシュラインcを使用する連鎖はML,SL,RDおよびFDにクラス分けされている。MLとSLクラスの連鎖は、キャッシュラインcを個別にデバイスメモリ56からロードする、と定義され、そしてこの定義は、後続の工程の繰り返しの間不変である。
【0156】
コンパイラは、配置ステップ368において、SID間変数をRDクラスの連鎖に提供するための、SID内資源を割り当てるように試みる。典型的に、データベースH内のRDクラスリストのいずれかに連鎖が残っている限り、コンパイラは、所定のSID間キャッシュラインcに対し次の工程を実行する:
1)キャッシュラインcのRDクラス内の連鎖の中から、コンパイラは、このキャッシュラインから必要とするデータ寸法が最小の、連鎖sを選択する。コンパイラは、(関数Pを使用して)要求された変数を、これら変数を既に持つ連鎖から、連鎖sへ届けるために、SID内キャッシュライン資源を最小量使用する1つのパスp(又は多重のパスの組合せ)を選択する。パスpが1つより多いホップを横切る(即ち、1つ以上の中間連鎖を経由して連鎖sに到達する)場合、そのパスに沿う多重のSID内キャッシュライン上の資源は考慮されなければならない、ことに注意が必要である。
2)適合するパスpが発見されない場合、ステップ368は終了する。
3)適合するパスpが発見された場合、コンパイラは連鎖sをRDクラスから除外し、PLクラスに追加する。
4)コンパイラは、連鎖sに要求されたキャッシュラインcのSID間変数を運ぶため、パスp上でのSID内キャッシュラインの使用をコミット(割当)する。コンパイラは、新しく割り当てられた資源に起因する可能
なパス内の可能
な変化を反映するため、関数Pをリフレッシュする。
【0157】
この段階において、コンパイラは、典型的に、SID内通信資源をRDクラス内の幾つかの連鎖に付託しており、それに従いそれら連鎖をPLクラスに移動した。クラスRDに残っている連鎖に対し、コンパイラは、それら連鎖に必要なSID間変数を提供するための、使用可能な資源を有するパスを発見できなかった。
【0158】
コンパイラは、次に再シャッフルステップ372において、RDとFDクラス内の連鎖を再シャッフルする。このステップでコンパイラは、RDとFDクラス内の全ての連鎖(残っていれば)をUクラスに移動する。コンパイラは、空チェックステップ376において、Uクラスが空か否かチェックする。Uクラスに残っている連鎖があれば、方式は先のステップ364に戻り、コンパイラは、現在未分解の連鎖を分解するように試みる。Uクラスが空の場合は、全ての連鎖がML,SL又はPLにクラス分けされており、方式は終了ステップ380において、終了する。MLおよびSLクラス内の各連鎖は、個別にSID間キャッシュラインをデバイスメモリからロードする。
【0159】
PLクラス内の各連鎖は、事前に定義され、かつ事前に割り当てられた、1つ以上のSID内キャッシュラインのパス上で、必要なSID間変数を他の連鎖から受け取る。このように、この技術を使用する場合、SID間キャッシュラインのデバイスメモリ56からのロード動作の回数が減少され、それにより、全体的なSID実行時間が短縮される。
【0160】
(依存性問題アプリケーションの事例)
ここに記述される方法とシステムは、広範囲の分野と応用における依存性問題を解くのに使用可能である。一般的に、1組の実行依存性を有する処理要素(処理要素PE)で表示可能なコンピュータ計算タスクは、開示された技術により、並行かつ効率的に処理可能である。以下の記述は、幾つかの依存問題のタイプを概観する。開示された技術は、決してこれら事例に制限されず、他の適合するタイプの依存問題の解決に使用可能である。
【0161】
ある実施形態では、システム20により解決される依存性問題は、シミュレーションによりハードウェア設計を評価するタスクを有する。このアプリケーションは上記の特許文献14に詳述されている。典型的な設計評価アプリケーションでは、
図1のサーバ24は、使用者、例えば評価技術者からシミュレートされる設計の定義を受け取る。設計は典型的に、VHDLまたはVerlogのようなハードウェア記述言語(HDL)で記載された、1つ以上のファイルとして受け取る。サーバは又、設計の評価環境を特定する、テストベンチの定義を受け取る。テストベンチは設計に適用される外部同期イベント(例えば、クロック信号、レセット信号及び種々の入力)を特定する。テストベンチは又、シミュレートされた設計に適用されるテストを特定する。テストベンチは典型的に、C、Verilog又は、E又はSystem−Verilogのような評価特有の言語で記述されたソフトウェアを有する。
【0162】
CPU28上で走るコンパイラは、テストベンチと設計をコンパイルし、シミュレーション符号を生成し、そしてその後シミュレーション符号をCPU28とGPU32上で走らせる。詳しくは、コンパイラは、設計とテストベンチを処理要素PEと依存性を有する依存図の中に再度差し出し、
非循環サブ図を依存図より抽出し、そして各サブ図のSIDを生成する。GPUは、シミュレーション結果を作成するため、異なるSIDを実行するように呼び出される。シミュレーション結果(例えば、テストの良否、疑わしい誤り、誤りの位置、および使用者が設計を評価するのに役立つ他の情報)が使用者に提供される。
【0163】
あるいは、ここに記載された方法とシステムは、リアルタイムビデオ処理、画像処理、ソフトウェア定義ラジオ(SDR)、種々の通信アプリケーションにおけるパケット処理、及び誤り訂正符号のようなアプリケーションで遭遇する、コンピュータ計算タスクを実行するのに使用可能である。これら全てのアプリケーションは、典型的に、例えば、デジタルフィルタリングや高速フーリエ変換(FFT)などのような、依存性問題として表わされる複雑な計算タスクを含む。このようなタスクは、並列化やここに記載された方法やシステムを使用した解決に自然に適応できる。デジタルフィルタやFFT計算要素を示す特定の事例は、それぞれ
図18と
図19に示される。繰り返すが、計算タスク(例えば、ここに示される事例や他のタスク)は、依存図として表現され、それは並列化され、ここに記載される方法とシステムにより解決可能である。上記のように、依存図は1組のサブ図に変換でき、各サブ図は、コンパイルされて1つのSIDを生成し、そして、GPUはSIDを実行して結果を生成する。
【0164】
図18は、本発明の実施形態に基づく、有限インパルス応答(FIR)デジタルフィルタを表わす依存
図400である。依存
図400で表わされたデジタルフィルタは、入力信号x[n]を、a
0,...a
N−1で記されるフィルタ係数の1組Nによりフィルタし、フィルタされた出力信号y[n]を生成する。フィルタ動作は次式で与えられる。
【数3】
この種のFIRフィルタは、通信受信機、送信機、画像処理分野、医療画像分野など、多くの信号処理のアプリケーションで一般的である。
【0165】
図400は、例えば共通クロック信号に同期したフリップフロップ処理要素PE410、乗算器処理要素PE414及び1つの加算器処理要素PE418のような、幾つかのタイプの処理要素PEを有する。実行依存性は図の中に矢印でしめされる。例えば、あるクロックサイクルにおいて、所与の乗算器処理要素PE414は、所与のフリップフロップ処理要素PE410の出力に、フリップフロップ処理要素PEが実行を完了し、その出力が有効な時にだけ、対応するフィルタ係数を乗じることが出来る。無限インパルス応答(IIR)等の他の種類のデジタルフィルタも依存図として同様に表現される。
【0166】
図19は、本発明の実施形態に基づく、高速フーリエ変換(FFT)計算要素を表わす依存
図420である。周知のように、FFT計算は、1組の基礎的計算要素、ときに「蝶」と呼ばれるが、によって効率的に実行される。依存
図420は単一の計算要素を示す。典型的なFFTアプリケーションでは、多重のこのような要素が直列及び/又は並列に接続される。依存
図420は加算器/乗算器処理要素PE424からなる。各処理要素PE424は2つの入力を受ける。ある処理要素PE入力が重みW
NKで標識付けされる場合、その処理要素PEは、入力を他の入力に加算する前に、入力にその重みを乗ずる。例えば、図の最上部左側の処理要素PEはv[0]+v[1]・W
40 で与えられる出力を生成する。W
NKは次式で与えられる:
【数4】
N=4の場合の典型的な実施例では、重みは、W
40=1、W
41=i,W
42=−1,W
43=−iで与えられる。或いは、他の適合する重み値が使用可能である。この種のFFT生産要素は、周波数領域信号処理及び誤り訂正符号(ECC)等、広い分野での応用アプリケーションで一般的である。
【0167】
(追加実施形態及び変化形)
ある実施形態では、コンパイラは、処理要素PEをPEGに合体させる工程を適用する。この工程の出力は、頂点(PEGを示す)とエッジ(PEG間依存性を示す)からなる図である。工程は典型的に、PEG間依存性の数を最小化する方法で、処理要素PEをPEGにグループ化しようと試みる。この種のグループ化は、典型的に、より少ない連鎖間SYNCを有するSIDをもたらす。統合工程の例は前掲の特許文献3のセクション5.5.1に記載されている。
【0168】
ある実施形態では、コンパイラは、処理要素PEの実行時間に沿って進みながら、SIDを繰り返し構築するように試みる。この工程では、コンパイラは、長い前方位相(FP)を有する処理要素PEを最初に配置し、そしてそれらを混雑していない実行連鎖内に配置する。さらにコンパイラは、SYNCの追加を必要としない連鎖の中に処理要素PEを配置することを高い優先順位に置く。SID生成工程の事例は前掲の特許文献3のセクション6.3.6に記載されている。コンパイラは、一般的に、処理要素PEのFP長さ、実行連鎖の占有レベル及び/又はSYNCの可能性のある追加を考慮する、他の基準又は経験に基づいて、処理要素PEを実行連鎖内に配置してもよい。
【0169】
ある実施形態では、CPUとGPUは共同して、依存問題をシミュレートするイベント駆動(EDE)シミュレータを走らせる。イベント駆動工程は、前掲の特許文献1のセクション6.8に記載されている。詳しくは、コンパイラは、CPU上で走るシミュレーションの即時更新が必要な中で、あるSIDの実行が他の1つのSIDの実行の引き金となるケースを識別してもよい。この仕組みはGPUとCPUの相互作用のレイテンシを節約する。この技術は前掲の特許文献2のセクション5.2.1に記載されている。
【0170】
上記の実施形態は、例として示され、本発明は上記で詳細に示され記述されたものに限定されない。むしろ本発明の範囲はここに記載された種々の特徴の組合せやサブ組合せを含み、この記述を読んだ当業者が想起する、従来技術で開示されていない、変化形や変更を含む。