(57)【特許請求の範囲】
【請求項１】
コンピュータ計算の方法であって、
中央処理装置を使用して、原子処理要素のタイプのライブラリを定義するステップと、
前記中央処理装置を使用して、実行依存性を有する多重の原子処理要素からなる、計算タスクを受け取るステップと、
ここにそれぞれの前記実行依存性は、それぞれ第１の原子処理要素がそれぞれ第２の原子処理要素よりも前に実行されることを特定し、
前記中央処理装置を使用して、マルチプロセッサ装置上での前記計算タスクの同時実行のため前記計算タスクをコンパイルするステップと、
ここにおいて前記マルチプロセッサ装置は、多重のプロセッサを有し、
前記多重のプロセッサは、前記計算タスクの第１の数の原子処理要素を、１より大きく前記第１の数を越えない第２の数の、原子処理要素の連鎖内に前記実行依存性を破ることなく配置することにより、前記第１の数の原子処理要素を同時に実行可能であり、
前記中央処理装置を使用して、前記マルチプロセッサ装置を呼び出し、ソフトウェア符号を走らせて、前記原子処理要素の連鎖を前記多重のプロセッサ上で並行して実行し、前記計算タスクの結果を生成するステップと、
を有し、
ここにそれぞれの前記プロセッサは１つ以上の前記原子処理要素の連鎖を実行し、
前記中央処理装置を使用して前記計算タスクをコンパイルするステップは、
前記計算タスクの前記原子処理要素の前記タイプを前記ライブラリにおいて定義されたタイプの中から識別するステップと、
前記計算タスクの前記原子処理要素をワープ内に配置するステップと、
ここに前記ワープは同一のタイプのスレッドのグループであり、前記スレッドは基本ソフトウェア符号ユニットであり、前記ワープの少なくとも幾つかは複数の前記原子処理要素を有し、それぞれのワープ内の前記原子処理要素は全て同一の特定のタイプの原子タスクを実行し、そして
前記ワープを前記原子処理要素の連鎖内に配置するステップと、
を有する、ことを特徴とするコンピュータ計算の方法。
【請求項２】
それぞれの前記原子処理要素の連鎖内の前記原子処理要素を、互いに独立した複数の前記原子処理要素を有する原子処理要素グループ（ＰＥＧ）にグループ化するステップを有し、
前記計算タスクの前記原子処理要素をワープ内に配置するステップは、ある特定の原子処理要素グループと当該グループより前に位置する異なる原子処理要素グループにおいて、前記前に位置する異なる原子処理要素グループ内の１つの原子処理要素の後に実行されるべき原子処理要素を、前記特定の原子処理要素グループが有しないように、前記原子処理要素グループを前記原子処理要素の連鎖内に配置するステップを有する、
ことを特徴とする請求項１に記載の方法。
【請求項３】
前記マルチプロセッサ装置を呼び出すステップは、前記マルチプロセッサ装置に対し、前記マルチプロセッサ装置の組み込みスケジュールポリシーに拘わらず前記第２の数の、前記原子処理要素の連鎖を並列で実行させるステップを有する、
ことを特徴とする請求項１に記載の方法。
【請求項４】
前記マルチプロセッサ装置は前記プロセッサのグループを有し、
ここに前記プロセッサは、グループ内の前記プロセッサが１つの共有メモリを共有するという基準によりグループ分けされ、
前記マルチプロセッサ装置を呼び出すステップは、前記原子処理要素のそれぞれの連鎖を、前記グループの１つの中にある前記プロセッサにより実行される前記スレッドのそれぞれのブロックとして、提供するステップを有し、      
前記計算タスクをコンパイルするステップは、前記原子処理要素のある所定の連鎖内の前記原子処理要素に対し、前記プロセッサのグループの前記共有メモリ経由で、前記原子処理要素により計算されたデータを交換するようにさせるステップを有し、
ここに前記プロセッサのグループは前記原子処理要素の所定の連鎖を実行するように指定される、
ことを特徴とする請求項１−３のいずれかに記載の方法。
【請求項５】
それぞれの前記プロセッサは、前記定義された前記原子処理要素のタイプのそれぞれを走らせることが可能な、ソフトウェア符号からなる１つの前記スレッドを動作させ、そして１つの所定の前記スレッドは、前記所定のスレッドにより実行されるべき前記原子処理要素の実際のタイプを、前記所定のスレッドにより読まれたデータに応答して決定する、ことを特徴とする請求項１−４のいずれかに記載の方法。
【請求項６】
前記原子処理要素を前記原子処理要素の前記第２の数の連鎖内に配置するステップは、前記マルチプロセッサ装置により同時に実行可能な数の、原子処理要素の連鎖内に前記原子処理要素を配置するステップを有する、ことを特徴とする請求項１−３のいずれかに記載の方法。
【請求項７】
ある所与の実行依存性は、１つの駆動処理要素が１つの従動処理要素より前に実行されることを特定し、
前記原子処理要素を配置するステップは、
前記駆動処理要素を前記原子処理要素の第１の連鎖内に配置するステップと、
前記従動処理要素を前記原子処理要素の前記第１の連鎖とは異なる、前記原子処理要素の第２の連鎖内に配置するステップと、
前記駆動処理要素が完全に実行されるまで前記原子処理要素の前記第２の連鎖の実行を停止する、同期化要素を前記原子処理要素の前記第２の連鎖内に挿入するステップと、
を有することを特徴とする請求項１−３のいずれかに記載の方法。
【請求項８】
前記原子処理要素を配置するステップは、所与の１つの原子処理要素と前記原子処理要素の連鎖内の１組の可能性のある位置に対して、
前記所与の原子処理要素を前記可能性のある位置に配置することによりもたらされる、それぞれの割当コストを計算するステップと、
最低の割当コストを有する前記可能性のある位置の１つに前記所与の原子処理要素を配置するステップと、
を有する、ことを特徴とする請求項１−３のいずれかに記載の方法。
【請求項９】
前記計算タスクをコンパイルするステップは、
前記原子処理要素の所与の１つの連鎖に対し、前記原子処理要素の前記所与の１つの連鎖の実行の間に、前記マルチプロセッサ装置内のデバイスメモリからキャッシュメモリに変数を取得し、そして前記キャッシュメモリから前記変数の少なくとも幾つかを除去する、決定論的な１つのキャッシュパターンを定義するステップと、    
前記マルチプロセッサ装置に対し、前記原子処理要素の前記所与の１つの連鎖の実行時に、前記決定論的なキャッシュパターンを実行するようにさせるステップと、
を有する、ことを特徴とする請求項１−３のいずれかに記載の方法。
【請求項１０】
前記計算タスクをコンパイルするステップは、
前記原子処理要素の多重の連鎖を生成するステップと、
前記原子処理要素の多重の連鎖の少なくとも幾つかに対し、前記マルチプロセッサ装置の全てのプロセッサによりアクセス可能な、前記マルチプロセッサ装置のデバイスメモリにアクセスすることにより、変数を交換するようにさせるステップと、
を有する、ことを特徴とする請求項１−３のいずれかに記載の方法。
【請求項１１】
それぞれの実行連鎖は最初は空のスロットからなり、
ここにスロットは、前記原子処理要素の前記実行連鎖内の潜在的な候補となる位置であり、そして
前記原子処理要素を配置するステップは、
前記原子処理要素で始まる前記実行依存性のそれぞれの最長の鎖の長さと、
それぞれの前記実行連鎖の占有レベルと、
ここに前記占有レベルは前記原子処理要素による前記実行連鎖の占有の度合いを示し、そして
前記原子処理要素の配置によりもたらされた同期化要素と、
からなる要因のグループから選択された、少なくとも１つの要因に従って、前記空のスロット内に前記原子処理要素を配置するステップを有する、ことを特徴とする請求項１−３のいずれかに記載の方法。
【請求項１２】
計算タスクを受け取るステップと、
前記計算タスクは、実行依存性を持つ多重の原子処理要素を有し、
其々の前記実行依存性は、それぞれ第１の原子処理要素がそれぞれ第２の原子処理要素よりも前に実行されることを特定し、
前記計算タスクを、マルチプロセッサ装置上での同時実行のため前記実行依存性を破ることなく、前記原子処理要素を前記原子処理要素の多重の連鎖内に配置することにより、コンパイルするステップと、
前記マルチプロセッサ装置は、並列に動作する多重のプロセッサを有し、そして前記多重のプロセッサによる前記マルチプロセッサ装置の組み込みスケジュールポリシーに従った実行のため、前記原子処理要素のスケジュールを立て、    
前記計算タスクの結果を生成するため、前記マルチプロセッサ装置を呼び出し、並行にそして前記マルチプロセッサ装置の前記スケジュールポリシーに関係なく、前記原子処理要素の連鎖を実行するソフトウェア符号を走らせるステップと、
を有し、
ここにおいて前記計算タスクをコンパイルするステップは、
前記計算タスクの前記原子処理要素のタイプを識別するステップと、
前記計算タスクの前記原子処理要素をワープ内に配置するステップと、
ここに前記ワープは同一のタイプのスレッドのグループであり、前記スレッドは基本ソフトウェア符号ユニットであり、前記ワープの少なくとも幾つかは複数の前記原子処理要素を有し、それぞれのワープ内の前記原子処理要素は全て同一の特定の原子タスクを実行し、そして
前記ワープを前記原子処理要素の連鎖内に配置するステップと、
を有する、
ことを特徴とするコンピュータ計算の方法。
【請求項１３】
コンピュータ計算装置であって、
計算タスクを受け取るように接続されたインタフェースと、
前記計算タスクは、実行依存性を持つ多重の原子処理要素を有し、
其々の前記実行依存性は、それぞれ第１の原子処理要素がそれぞれ第２の原子処理要素よりも前に実行されることを特定し、
中央処理装置と、
を有し、
前記中央処理装置は、マルチプロセッサ装置上での同時実行のため、
前記原子処理要素のタイプのライブラリを定義するステップと、
前記計算タスクの前記原子処理要素の前記タイプを前記ライブラリにおいて定義されたタイプの中から識別するステップと、
ここに前記マルチプロセッサ装置は、第１の数の原子処理要素を同時に実行可能な多重のプロセッサを有し、
前記計算タスクの前記原子処理要素をワープ内に配置するステップと、
ここに前記ワープは同一のタイプのスレッドのグループであり、前記スレッドは基本ソフトウェア符号ユニットであり、前記ワープの少なくとも幾つかは複数の前記原子処理要素を有し、それぞれのワープ内の前記原子処理要素は全て同一の特定の原子タスクを実行し、
１より大きく前記第１の数を越えない、前記原子処理要素の第２の数の連鎖内に前記ワープを配置するステップと、
により前記計算タスクをコンパイルし、そして      
前記原子処理要素の連鎖を並行して実行するソフトウェア符号を走らせるため、前記マルチプロセッサ装置を呼び出す、
ように設定される、
ことを特徴とするコンピュータ計算装置。
【請求項１４】
コンピュータ計算装置であって、
計算タスクを受け取るように接続されたインタフェースと、
前記計算タスクは、実行依存性を持つ多重の原子処理要素を有し、
其々の前記実行依存性は、それぞれ第１の原子処理要素がそれぞれ第２の原子処理要素よりも前に実行されることを特定し、
中央処理装置と、
を有し、
前記中央処理装置は、
マルチプロセッサ装置上での同時実行のため前記計算タスクをコンパイルするように設定され、
前記マルチプロセッサ装置は、
並列に動作する多重のプロセッサを有し、
そして前記多重のプロセッサによる実行のため、前記マルチプロセッサ装置の組み込みスケジュールポリシーに従って前記原子処理要素のスケジュールを立て、
ここに前記原子処理要素のスケジュールを立てるステップは、
前記原子処理要素のタイプのライブラリを定義するステップと、
前記計算タスクの前記原子処理要素の前記タイプを前記ライブラリにおいて定義されたタイプの中から識別するステップと、
前記計算タスクの前記原子処理要素をワープ内に配置するステップと、
ここに前記ワープは同一のタイプのスレッドのグループであり、前記スレッドは基本ソフトウェア符号ユニットであり、前記ワープの少なくとも幾つかは複数の前記原子処理要素を有し、それぞれのワープ内の前記原子処理要素は全て同一の特定の原子タスクを実行し、および
前記実行依存性を破ることなく前記原子処理要素を多重の原子処理要素の連鎖内に配置するステップと、
を有し、
そして前記中央処理装置は、
前記計算タスクの結果を生成するため、前記マルチプロセッサ装置の前記スケジュールポリシーに関係なく、前記原子処理要素の連鎖を並行して実行するソフトウェア符号を走らせるための前記マルチプロセッサ装置を呼び出すように設定される、
ことを特徴とするコンピュータ計算装置。
【請求項１５】
コンピュータ計算装置であって、
第１の数の原子処理要素を同時に処理可能な多重のプロセッサを有するマルチプロセッサ装置と、
中央処理装置と、
を有し、
前記中央処理装置は、
実行依存性を持つ多重の原子処理要素からなる計算タスクを受け取り、
ここに各前記実行依存性は、それぞれの第１の原子処理要素がそれぞれ第２の原子処理要素の前に実行されることを特定し、
前記中央処理装置は、前記マルチプロセッサ装置上での同時実行のため、
前記原子処理要素のタイプのライブラリを定義するステップと、
前記計算タスクの前記原子処理要素の前記タイプを前記ライブラリにおいて定義されたタイプの中から識別するステップと、
前記計算タスクの前記原子処理要素をワープ内に配置するステップと、
ここに前記ワープは同一のタイプのスレッドのグループであり、前記スレッドは基本ソフトウェア符号ユニットであり、前記ワープの少なくとも幾つかは複数の前記原子処理要素を有し、それぞれのワープ内の前記原子処理要素は全て同一の特定の原子タスクを実行し、および
前記実行依存性を破ることなく、原子処理要素を１より大きく前記第１の数を越えない第２の数の、原子処理要素の連鎖内に配置するステップと、
により前記計算タスクをコンパイルし、そして
前記中央処理装置は、前記計算タスクの結果を生成するため、前記原子処理要素の連鎖を並行して実行するソフトウェア符号を走らせるための前記マルチプロセッサ装置を呼び出す、
ように設定される、
ことを特徴とするコンピュータ計算装置。
【請求項１６】
コンピュータ計算装置であって、
マルチプロセッサ装置と、
ここにおいて前記マルチプロセッサ装置は、並列に動作する多重のプロセッサを有し、そして前記多重のプロセッサによる実行のため、前記マルチプロセッサ装置の組み込みスケジュールポリシーに従って原子処理要素のスケジュールを立て、
中央処理装置と、
を有し、
前記中央処理装置は、
実行依存性を持つ多重の前記原子処理要素からなる計算タスクを受け取り、
ここに各前記実行依存性は、それぞれの第１の原子処理要素がそれぞれ第２の原子処理要素の前に実行されることを特定し、
前記中央処理装置は、前記マルチプロセッサ装置上での同時実行のため、
前記原子処理要素のタイプのライブラリを定義するステップと、
前記計算タスクの前記原子処理要素の前記タイプを前記ライブラリにおいて定義されたタイプの中から識別するステップと、前記計算タスクの前記原子処理要素をワープ内に配置するステップと、
ここに前記ワープは同一のタイプのスレッドのグループであり、前記スレッドは基本ソフトウェア符号ユニットであり、前記ワープの少なくとも幾つかは複数の前記原子処理要素を有し、それぞれのワープ内の前記原子処理要素は全て同一の特定の原子タスクを実行し、および
前記実行依存性を破ることなく前記原子処理要素を前記原子処理要素の多重の連鎖内に配置するステップと、
により前記計算タスクをコンパイルし、そして
前記中央処理装置は、前記計算タスクの結果を生成するため、前記マルチプロセッサ装置の前記スケジュールポリシーに関係なく、前記原子処理要素の連鎖を並行して実行するソフトウェア符号を走らせるための前記マルチプロセッサ装置を呼び出す、
ように設定される、
ことを特徴とするコンピュータ計算装置。
【請求項１７】
プログラム命令が保存されるコンピュータ読み取り可能記録媒体であって、
前記プログラム命令は、コンピュータに読み込まれた場合前記コンピュータに対し、
実行依存性を持つ多重の原子処理要素からなる計算タスクを受け取らせ、
ここに各前記実行依存性は、それぞれの第１の原子処理要素がそれぞれ第２の原子処理要素の前に実行されることを特定し、
第１の数の原子処理要素を同時に実行可能な多重のプロセッサを有するマルチプロセッサ装置上での同時実行のため、          
前記原子処理要素のタイプのライブラリを定義するステップと、
前記計算タスクの前記原子処理要素の前記タイプを前記ライブラリにおいて定義されたタイプの中から識別するステップと、
前記計算タスクの前記原子処理要素をワープ内に配置するステップと、
ここに前記ワープは同一のタイプのスレッドのグループであり、前記スレッドは基本ソフトウェア符号ユニットであり、前記ワープの少なくとも幾つかは複数の前記原子処理要素を有し、それぞれのワープ内の前記原子処理要素は全て同一の特定の原子タスクを実行し、および
前記実行依存性を破ることなく、原子処理要素を１より大きく前記第１の数を越えない第２の数の、原子処理要素の連鎖内に配置するステップと、
により前記計算タスクをコンパイルさせ、
前記計算タスクの結果を生成するため、前記原子処理要素の連鎖を並行して実行するソフトウェア符号を走らせるための前記マルチプロセッサ装置を呼び出させる、
ことを特徴とするコンピュータ読み取り可能記録媒体。
【請求項１８】
プログラム命令が保存されるコンピュータ読み取り可能記録媒体であって、
前記プログラム命令は、コンピュータに読み込まれた場合、前記コンピュータに対し、
実行依存性を持つ多重の原子処理要素からなる計算タスクを受け取らせ、
ここに各前記実行依存性は、それぞれの第１の原子処理要素がそれぞれ第２の原子処理要素の前に実行されることを特定し、
並列に動作する前記多重のプロセッサを有し、そして多重のプロセッサによる実行のためマルチプロセッサ装置の組み込みスケジュールポリシーに従って前記原子処理要素のスケジュールを立てる、前記マルチプロセッサ装置上での同時実行のため、
前記原子処理要素のタイプのライブラリを定義するステップと、
前記計算タスクの前記原子処理要素の前記タイプを前記ライブラリにおいて定義されたタイプの中から識別するステップと、  
前記計算タスクの前記原子処理要素をワープ内に配置するステップと、
ここに前記ワープは同一のタイプのスレッドのグループであり、前記スレッドは基本ソフトウェア符号ユニットであり、前記ワープの少なくとも幾つかは複数の前記原子処理要素を有し、それぞれのワープ内の前記原子処理要素は全て同一の特定の原子タスクを実行し、および
前記実行依存性を破ることなく前記原子処理要素を前記原子処理要素の多重の連鎖内に配置するステップと、
により前記計算タスクをコンパイルさせ、そして
前記計算タスクの結果を生成するため、前記マルチプロセッサ装置の前記スケジュールポリシーに関係なく、前記原子処理要素の連鎖を並行して実行するソフトウェア符号を走らせるための前記マルチプロセッサ装置を呼び出させる、
ことを特徴とするコンピュータ読み取り可能記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般的に並列計算に関し、特に並列プロセッサ上で依存問題を実行するための方法及びシステムに関するものである。
【背景技術】
【０００２】
（関連出願との相互対比）
本発明は下記特許文献１−５の恩恵を主張し、それらの開示事項はここに参照され、採り入れられる。
【０００３】
並列計算技術は様々な種類のコンピュータ計算タスクの実行に広く使用されている。論理設計シミュレーションの分野では、例えば、Ｃａｄａｍｂｉ他は極長命令ワード（ＶＬＩＷ）プロセッサに基づくシミュレーション加速器を下記非特許文献１の中で記載しており、それはここに参照され、採り入れられる。ＶＬＩＷプロセッサを使用した論理シミュレーションの側面は下記特許文献６−１３にも記載されており、それらはここに参照され、採り入れられる。  
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】米国暫定特許出願６１／０７９，４６１
【特許文献２】米国暫定特許出願６１／０８６，８０３
【特許文献３】米国暫定特許出願６１／１１０，６７６
【特許文献４】米国暫定特許出願６１／１８５，５８９
【特許文献５】米国暫定特許出願６１／１８５，６０９
【特許文献６】米国特許  ７，４４４，２７６
【特許文献７】米国特許出願公報２００７／０２１９７７１
【特許文献８】米国特許出願公報２００７／０１５０７０２
【特許文献９】米国特許出願公報２００７／０１２９９２６
【特許文献１０】米国特許出願公報２００７／０１２９９２４
【特許文献１１】米国特許出願公報２００７／００７４０００
【特許文献１２】米国特許出願公報２００７／００７３９９９
【特許文献１３】米国特許出願公報２００７／００７３５２８
【特許文献１４】ＰＣＴ出願  ＰＣＴ／ＩＬ２００９／０００３３０
【非特許文献】
【０００５】
【非特許文献１】‘Ａ  Ｆａｓｔ，  Ｉｎｅｘｐｅｎｓｉｖｅ  ａｎｄ  Ｓｃａｌａｂｌｅ  Ｈａｒｄｗａｒｅ  Ａｃｃｅｌｅｒａｔｉｏｎ  Ｔｅｃｈｎｉｑｕｅ  ｆｏｒ  Ｆｕｎｃｔｉｏｎａｌ  Ｓｉｍｕｌａｔｉｏｎ’Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  ３９ｔｈ  ＩＥＥＥ  ＡＣＭ  Ｄｅｓｉｇｎ  Ａｕｔｏｍａｔｉｏｎ  Ｃｏｎｆｅｒｅｎｃｅ（ＤＡＣ  ２００２），  Ｎｅｗ  Ｏｒｌｅａｎｓ，  Ｌｏｕｉｓｉａｎａ，  Ｊｕｎｅ  １０  −  １４，  ２００２，  Ｐａｇｅｓ  ５７０  −  ５７５
【発明の概要】
【０００６】
本発明の１実施形態によれば、コンピュータ計算の方法であって、原子オペレーションのタイプのライブラリを定義するステップと、実行依存性を有する多重の原子処理要素（ＰＥ）からなる計算タスクを受け取るステップと、ここにそれぞれの前記実行依存性は、それぞれ第１の処理要素（ＰＥ）がそれぞれ第２の処理要素（ＰＥ）よりも前に実行されることを特定し、第１の数の処理要素（ＰＥ）を同時に実行可能な多重のプロセッサを有するマルチプロセッサ装置上での同時実行のため、実行依存性を破ることなく計算タスクの処理要素（ＰＥ）を１より大きく第１の数を越えない第２の数のＰＥの連鎖内に配置することにより、計算タスクをコンパイルするステップと、計算タスクの結果を生成するため、ＰＥの連鎖を多重のプロセッサ上で並行して実行するソフトウェアコードを走らせるためのマルチプロセッサ装置を呼び出すステップと、を有し、ここにそれぞれのプロセッサは１つ以上の連鎖を実行し、計算タスクをコンパイルするステップは、計算タスクの原子ＰＥのタイプを識別するステップと、計算タスクの原子オペレーションをワープ内に配置するステップであって、ワープの少なくとも幾つかは複数のオペレーションを有し、それぞれのワープ内のオペレーションは全て同一の特定の原子タスクを実行する、ステップと、そしてワープをＰＥの連鎖内に配置するステップと、を有することを特徴とするコンピュータ計算の方法が提供される。
【０００７】
【０００８】
ある実施形態では、コンピュータ計算の方法は、それぞれの前記処理要素（ＰＥ）の連鎖内の前記処理要素（ＰＥ）を互いに独立した複数のオペレーションを有する処理要素グループ（ＰＥＧ）にグループ化するステップを有し、計算タスクの前記オペレーションをワープ内に配置するステップは、それぞれ特定のＰＥＧが、ＰＥの連鎖内において特定のＰＥＧの前に位置する１つの異なるＰＥＧ内の１つのＰＥの後に実行されるべきＰＥを有しないように、処理要素グループ（ＰＥＧ）を処理要素（ＰＥ）の連鎖内に配置するステップを有する。他の１実施形態では、マルチプロセッサ装置は、プロセッサによる実行のため、マルチプロセッサ装置の組み込みスケジュールポリシーに従って処理要素（ＰＥ）のスケジュールを定め、マルチプロセッサ装置を呼び出すステップは、マルチプロセッサ装置に対し、組み込みスケジュールポリシーに拘わらず第２の数のＰＥの連鎖を並列で実行させるステップを有する。他の実施形態では、多重のプロセッサは、グループのプロセッサ用の１つの共有キャッシュメモリを有するグループに整理され、マルチプロセッサ装置を呼び出すステップは、グループの１つの中にあるプロセッサにより実行される各ＰＥの連鎖を、其々のスレッドのブロックとして、提供するステップを有し、計算タスクをコンパイルするステップは、ある所定の処理要素（ＰＥ）の連鎖内の処理要素（ＰＥ）に対し、所定の処理要素（ＰＥ）の連鎖を実行する役割を与えられたプロセッサの１つのグループの１つの共有メモリ経由で、ＰＥにより計算されたデータを交換するようにさせるステップを有する。さらにある実施形態では、それぞれのプロセッサはそれぞれの定義されたオペレーションのタイプを走らせることが可能なコードを有する１つのスレッドを動作させ、そして実行されるべき実際の原子タスクは、スレッドにより読まれたデータに応答して決定される。
【０００９】
さらに他の実施形態では、処理要素（ＰＥ）を第２の数のＰＥの連鎖内に配置するステップは、マルチプロセッサ装置により同時に実行可能な複数の連鎖内に処理要素（ＰＥ）を配置するステップを有する。他の実施形態では、ある所与の実行依存性は、１つの駆動処理要素（ＰＥ）が１つの従動処理要素（ＰＥ）より前に実行されることを特定し、処理要素（ＰＥ）を配置するステップは、駆動処理要素（ＰＥ）を第１のＰＥの連鎖内に配置するステップと、従動処理要素（ＰＥ）を第１のＰＥの連鎖とは異なる第２のＰＥの連鎖内に配置するステップと、駆動処理要素（ＰＥ）が完全に実行されるまで第２のＰＥの連鎖の実行を停止する同期化要素を第２のＰＥの連鎖内に挿入するステップとを有する。
【００１０】
【００１１】
【００１２】
【００１３】
さらに他の実施形態では、処理要素（ＰＥ）を配置するステップは、所与の１つの処理要素（ＰＥ）とＰＥの連鎖内の１組の可能性のある位置に対して、    所与の処理要素（ＰＥ）を可能性のある位置に配置することによりもたらされる、それぞれの割当コストを計算するステップと、最低の割当コストの可能性のある位置に所与の処理要素（ＰＥ）を配置するステップと、を有する。
【００１４】
【００１５】
ある実施形態では、計算タスクをコンパイルするステップは、所与の１つのＰＥの連鎖に対し、所与のＰＥの連鎖の実行の間に、マルチプロセッサ装置内のデバイスメモリからキャッシュメモリに変数を取得し、そしてキャッシュメモリから変数の少なくとも幾つかを除去する、決定論的な１つのキャッシュパターンを定義するステップと、マルチプロセッサ装置に対し、所与のＰＥの連鎖の実行時に、決定論的なキャッシュパターンを実行させるようにするステップと、を有する。
【００１６】
【００１７】
【００１８】
【００１９】
【００２０】
１実施形態では、処理要素（ＰＥ）を配置するステップは、処理要素（ＰＥ）で始まる実行依存性のそれぞれの最長の鎖の長さと、スロットの連鎖のそれぞれの占有レベルと、処理要素（ＰＥ）の配置によりもたらされた同期化要素と、からなる要因のグループから選択された、少なくとも１つの要因に従って、最初は空のスロットの連鎖内に処理要素（ＰＥ）を配置するステップを有する。
【００２１】
本発明の１実施形態によれば、さらに計算タスクを受け取るステップと、計算タスクは、実行依存性を持つ多重の原子処理要素（ＰＥ）を有し、其々の実行依存性は、それぞれ第１の処理要素（ＰＥ）がそれぞれ第２の処理要素（ＰＥ）よりも前に実行されることを特定し、計算タスクを、マルチプロセッサ装置上での同時実行のためコンパイルするステップと、マルチプロセッサ装置は、並列に動作する多重のプロセッサを有し、そして多重のプロセッサによるマルチプロセッサ装置の組み込みスケジュールポリシーに従った実行のため、実行依存性を破ることなく、処理要素（ＰＥ）を多重のＰＥの連鎖内に配置することにより、処理要素（ＰＥ）のスケジュールを立て、計算タスクの結果を生成するため、マルチプロセッサ装置のスケジュールポリシーに関係なく、ＰＥの連鎖を並行して実行するソフトウェア符号を走らせるためのマルチプロセッサ装置を呼び出すステップと、を有し、ここにおいて計算タスクをコンパイルするステップは、計算タスクの原子ＰＥのタイプを識別するステップと、計算タスクの原子オペレーションをワープ内に配置するステップであって、ワープの少なくとも幾つかは複数のオペレーションを有し、それぞれのワープ内のオペレーションは全て同一の特定の原子タスクを実行する、ステップと、そしてワープをＰＥの連鎖内に配置するステップと、を有する、ことを特徴とするコンピュータ計算の方法、が提供される。
【００２２】
またさらに本発明の１実施形態によれば、コンピュータ計算装置であって、
計算タスクを受け取るように接続されたインタフェースと、計算タスクは、実行依存性を持つ多重の原子処理要素（ＰＥ）を有し、其々の実行依存性は、それぞれ第１の処理要素（ＰＥ）がそれぞれ第２の処理要素（ＰＥ）よりも前に実行されることを特定し、中央演算処理装置（ＣＰＵ）と、を有し、中央演算処理装置（ＣＰＵ）は、第１の数の処理要素（ＰＥ）を同時に実行可能な多重のプロセッサを有するマルチプロセッサ装置上での同時実行のため、計算タスクの原子ＰＥの前記タイプを識別するステップと、計算タスクの原子オペレーションをワープ内に配置するステップであって、ワープの少なくとも幾つかは複数のオペレーションを有し、それぞれのワープ内のオペレーションは全て同一の特定の原子タスクを実行する、ステップと、１より大きく第１の数を越えない、第２の数のＰＥの連鎖内にワープを配置するステップにより、計算タスクをコンパイルし、そしてＰＥの連鎖を並行して実行するソフトウェア符号を走らせるため、マルチプロセッサ装置を呼び出す、ように設定される、ことを特徴とするコンピュータ計算装置、が提供される。
【００２３】
【００２４】
【００２５】
【００２６】
【００２７】
本発明は以下の図を参照した実施形態の詳細な説明により、より十分に理解される。
【図面の簡単な説明】
【００２８】
【図１】本発明の実施形態に基づく、依存問題を実行するためのシステムのブロック図である。
【図２】本発明の実施形態に基づく、画像処理ユニット（ＧＰＵ）のブロック図である。
【図３】本発明の実施形態に基づく、依存図で表示された依存問題である。
【図４】本発明の実施形態に基づく、静的呼び出しデータベース（ＳＩＤ）の概略図である。
【図５】本発明の実施形態に基づく、依存問題を実行する方法を示すフロー図である。
【図６】本発明の実施形態に基づく、ＳＩＤ生成に使用されるワープのグリッドを示す図である。
【図７】本発明の実施形態に基づく、ワープのグリッド内の処理要素（ＰＥ）を割り当てるための割当間隔を示す図である。
【図８】本発明の実施形態に基づく、ＳＩＤを生成する方法を示すフロー図である。
【図９】本発明の実施形態に基づく、キャッシュ管理体系の概略図である。
【図１０Ａ】本発明の実施形態に基づく、変数事前取得体系を示す概略図である。
【図１０Ｂ】本発明の実施形態に基づく、変数事前取得体系を示す概略図である。
【図１１】本発明の実施形態に基づく、変数事前命令体系を示す概略図である。
【図１２】本発明の実施形態に基づく、多重ＳＩＤを示す概略図である。
【図１３】本発明の実施形態に基づく、ＳＩＤ間通信の方法を示すフロー図である。
【図１４Ａ】本発明の実施形態に基づく、ＳＩＤ内通信体系を示す概略図である。
【図１４Ｂ】本発明の実施形態に基づく、ＳＩＤ内通信体系を示す概略図である。
【図１５】本発明の実施形態に基づく、ＳＩＤ間通信及びＳＩＤ内通信を使用するＳＩＤを示す概略図である。
【図１６】本発明の実施形態に基づく、ＳＩＤ間通信を減らす方法を示す状態遷移図である。
【図１７】本発明の実施形態に基づく、ＳＩＤ間通信を減らす方法を示すフロー図である。
【図１８】本発明の実施形態に基づく、デジタルフィルタを表わす依存図である。
【図１９】本発明の実施形態に基づく、高速フーリエ変換（ＦＦＴ）計算要素を表わす依存図である。
【発明を実施するための形態】
【００２９】
（概要）
広い分野での様々なタイプのコンピュータ計算タスクが依存問題として、即ち、実行依存性を有する原子処理要素の１組として表わすことが可能である。依存問題は多くの場合大規模で複雑であり、その実行にはコンピュータ計算の高度な複雑さと長い実行時間が伴う。従って依存問題を並列で動作する多重のプロセッサで実行することが有利となる。しかし、処理要素間の実行依存性は、しばしば並行コンピュータ計算タスクに分割することが困難な依存性問題を引き起こす。
【００３０】
本発明の実施形態は、依存性問題を並列プロセッサで実行する、改善された方法及びシステムを提供する。開示された方法及びシステムは、実行依存性を有する原子処理要素（ＰＥ）からなる依存性問題上で動作する。（１対の処理要素間の実行依存性とは、１つの処理要素が他の１つの処理要素が生成した入力に対して動作することを意味する。このように実行依存性は処理要素の実行の順序に制約を課す。）依存性問題は多重プロセッサからなる画像処理ユニット（ＧＰＵ）のような１つのマルチプロセッサ装置上での同時実行のためにコンパイルされる。
【００３１】
コンパイル工程は、マルチプロセッサ装置のプロセシングコア  により並行して実行される多重の実行連鎖（ＰＥの連鎖）の中に、実行依存性を損なうことなくＰＥを配置する。典型的に、コンパイル工程は実行連鎖を有する静的呼び出しデータベース（ＳＩＤ）を生成する。マルチプロセッサ装置は、依存性問題の結果を生成するため、ＳＩＤを実行するソフトウェア符号を走らせるために呼び出される。
【００３２】
実行依存性は、同一の実行連鎖の中に相互依存ＰＥを配置する試み、及び必要な場合異なる実行連鎖のＰＥ間で同期を取ることにより維持される。典型的なマルチプロセッサ装置では、プロセッサは幾つかのグループの中に配置され、各グループのプロセッサは相互作用し、データを共有メモリ経由で交換することが出来る。ある実施形態では、ＳＩＤ内の各実行連鎖は、各連鎖の中のＰＥが同じグループのプロセッサにより実行され、そのグループの共有メモリを経由してデータを交換出来ることを保障するため、スレッドのブロックとしてマルチプロセッサ装置に供給される。
【００３３】
静的呼び出しデータベース（ＳＩＤ）の中の実行連鎖の数は、マルチプロセッサ装置が同時に実行できるスレッドブロックの最大数を越えないように選択される。結果として、実行連鎖は同時実行を保障され、そして一般的にマルチプロセッサ装置のいかなる組み込みスケジュールポリシーにも影響されない。この動作モードは、通常マルチプロセッサ装置を多数のスレッドブロックで溢れさせ、並行処理の実現をマルチプロセッサ装置の内部スケジューリングに頼る、既知の呼び出し構成とは明確に異なっている。反対に、ここに記載される方法とシステムでは、多重並列プロセッサの間の依存問題の並列処理化は、完全に決定論的であり実行時よりむしろコンパイル時に画定される。このようにマルチプロセッサ装置の内部スケジュールポリシーは効率的に迂回され、ＰＥの実行順序は、ＳＩＤで画定される実行連鎖及び同期化構造により完全に制御される。高効率ＳＩＤｓを生成する工程の１つの例がここに示される。
【００３４】
さらに、ＳＩＤ実行中に行われる多数のメモリアクセス動作を管理するための、幾つかの方法とシステムがここに記載される。詳細には、開示された技術は、ＰＥ実行連鎖によりマルチプロセッサ装置のデバイスメモリ及び共有メモリを効率的に使用する。（典型的なマルチプロセッサ装置では、デバイスメモリは、大きなメモリ空間を提供するが、しかし高いアクセスレイテンシを負い、大きな粒度でアクセスされ、アドレスアライメント制約を課する。反対に、共有メモリは、制限されたメモリ空間を有し、しかし高速なアクセス時間を提供し、アライメント制約は殆どないか全くない。）開示された技術は、メモリアクセス動作のパターンはＳＩＤコンパイル中に完全に決定されるという事実を使用して、効率的で決定論的なメモリアクセスを達成する。
【００３５】
（システムの記述）
図１は本発明の実施形態に基づく、依存問題を実行するためのシステム２０のブロック図である。様々な種類のコンピュータ計算タスクが依存問題、即ち、実行依存性を有する原子処理タスクの１組として表わされる。依存性問題は広範な分野及びアプリケーションで見られ、例えば、デジタルハードウェア設計シミュレーション、リアルタイムビデオ処理、画像処理、ソフトウェア定義ラジオ（ＳＤＲ）、様々な通信アプリケーションにおけるパケット処理、及び誤り訂正符号などである。システム２０は依存性問題として表示可能な全ての適合するタスクの効率的な実行に使用可能である。特定のコンピュータ計算タスクの幾つかの事例と、それらタスクに対する開示された技術の適用可能性について以下で記述する。
【００３６】
この事例では、システム２０は、サーバ２４を有し、サーバ２４は１つのインタフェース２６と、１つのＣＰＵ２８と、１つ以上の画像処理ユニット（ＧＰＵ）３２を有する。サーバ２４は適合するワークステーション又は計算プラットホームを有してもよい。以下に記述されるように、各ＧＰＵは並列に動作する多数のプロセシングコア  を有する。ここに記載される方法及びシステムは、ＧＰＵコアの並列使用を最大化するソフトウェア符号を生成し、従ってシステム２０が高度に複雑な依存問題を、比較的短い実行時間で実行することを可能にする。
【００３７】
サーバ２４はユーザ基地３６経由でユーザと相互作用する。サーバ２４は、インタフェース２６経由でユーザから、実行される依存問題を受け取る。サーバは入力依存問題をコンパイルしてソフトウェア符号を生成し、ＣＰＵ２８及びＧＰＵｓ３２上でその符号を走らせる。実行結果はインタフェース２６経由でユーザに提供される。システム２０の機能性は、アプリケーションにより様々なやり方で、ＣＰＵ２８とＧＰＵｓ３２の間で分別される。この実施形態は単一ＣＰＵに関しているが、一般的には、所望の数のＣＰＵが使用されてよい。
【００３８】
典型的に、ＣＰＵ２８は、以下に記載する機能を実行するようにソフトウェアでプログラムされている、１つの汎用プロセッサを有する。ソフトウェアはプロセッサに、例えばネットワーク上で、電子形態でダウンロードされてもよい。または或いは、磁気、光、又は電子メモリのような接触可能媒体により提供及び／又は保存されてもよい。
【００３９】
システム２０の構成は一例であり、概念の明確化のために選択されたものである。他の適合するシステム構成も使用可能である。例えば、ユーザ基地３６はサーバ２４とローカルに又は通信網経由で通信してもよい。他の実施形態では、ユーザ基地機能性は直接サーバ２４上で実現されてもよい。  
【００４０】
システム２０のようなシステムを論理設計シミュレーションに使用する幾つかの局面は、「並列プロセッサを使用した設計シミュレーション」という名称の特許文献１４に記載され、この出願人は本出願の出願人と同一であり、この文献の開示はここに参照され、採り入れられる。
【００４１】
図２は本発明の実施形態に基づく、画像処理ユニット（ＧＰＵ）３２の内部構造のブロック図である。この例では、ＧＰＵ３２は多重のマルチプロセッサ４０を有する。各マルチプロセッサ装置４０は、「プロセシングコア  」とも呼ばれる多重のプロセッサ４４を有する。ある実施形態では、各マルチプロセッサ装置４０は従来技術で既知の１つの単一命令多重スレッド（ＳＩＭＴ）プロセッサを有する。他の実施形態では、各マルチプロセッサ装置４０は単一命令多重データ（ＳＩＭＤ）プロセッサを有し、そこでは全てのプロセッサ４４は各クロックサイクルの間同じ命令を実行する。（しかし、異なるプロセッサは同じ命令を異なるデータ上で実行してもよい。）典型的なアプリケーションでは、ＧＰＵ全体の全てのプロセッサは、同じ命令を実行する。異なるプロセッサの機能の間の差別化は、データによりもたらされる。開示された技術はＳＩＭＤ及びＳＩＭＴの両方に適用可能である。
【００４２】
各プロセッサ４４は複数のローカルレジスタ４８にアクセス可能である。所与のマルチプロセッサ装置４０内の異なるプロセッサはデータを共有メモリ５２に保存可能である。この共有メモリは所与のマルチプロセッサ装置内のプロセッサ４４にアクセス可能であるが、しかし他のマルチプロセッサ装置内のプロセッサにはアクセス出来ない。典型的ＧＰＵでは、各マルチプロセッサ装置は命令ユニット６０を有し、それはマルチプロセッサ装置の動作を管理する。典型的なマルチプロセッサ装置では、命令ユニット６０はコンカレントな複数のスレッドを生成し、管理し、実行する。詳しくは、命令ユニット６０は、マルチプロセッサ装置で走る異なるスレッドの動作を同期させる、ハードウェア機構を有してもよい。
【００４３】
ＧＰＵ３２はさらにデバイスメモリ５６を有し、それはここでは「外部メモリ」とも呼ばれる。デバイスメモリ５６は典型的にＤＲＡＭからなる。共有メモリ５２と異なり、デバイスメモリ５６は、典型的に全てのマルチプロセッサ装置内のプロセッサ４４にアクセス可能である。一方で、デバイスメモリ５６へのアクセスはレイテンシと処理能力の点で高価である。効率よくデバイスメモリ５６へアクセスするには、連続し、かつ列をなすメモリアドレス、へ書込み、又から読み込むことが典型的に好適である。ここに記載される幾つかの方法は、デバイスメモリ５６に効率的にアクセスする符号の生成に関する。
【００４４】
ある所与の瞬間に各プロセッサ４４が実行する基本ソフトウェア符号ユニットは「スレッド」と呼ばれる。典型的にＣＰＵ２８は、スレッドのブロックをＧＰＵに提供することにより、ＧＰＵ３２を呼び出す。スレッドの所与のブロックは、単一のマルチプロセッサ装置４０のプロセッサ上で、ＳＩＭＤ又はＳＩＭＴモードで走ることが保証されている。このように、ある所与のブロック内のスレッドは共通メモリ５２を経由して互いに通信可能である。
【００４５】
典型的に、ブロック当りのスレッドの数は１つのマルチプロセッサ装置内のプロセッサの数より大きいことが可能である。一般的にＧＰＵに提供されるブロックの数は、マルチプロセッサ装置の数より大きいことが可能である。ＧＰＵはブロックマネージャ６４を有し、それは、実行されるブロックをＣＰＵ２８より受け取り、ブロックとスレッドの実行を一定の内部基準に従ってスケジュール管理する。このような基準は「組み込みスケジュールポリシー」と呼ばれる。
【００４６】
このように、所与のブロックのスレッドが同一のマルチプロセッサ装置で実行されるという保証以外に、所与のブロックのスレッドがマルチプロセッサ装置内で実行される順番については何の保証もない。又、異なるブロックがＧＰＵ内で実行される順番についても何の保証もない。言い換えれば、ＣＰＵ２８は一般的に、ＧＰＵの内部スケジュールポリシーについて制御していない。
【００４７】
ここに記載されるある方法及びシステムは、そしてある所与のブロック内のスレッドの間でデータを同期化し共有する能力のような、ＧＰＵの構造的特徴を利用した符号を生成する。依存問題をスレッドに分割する場合、開示された方法及びシステムでは、ＧＰＵにおいてスレッドとブロックの実行が保障されない性質を前提として、（即ち、ＧＰＵのスケジュールポリシーと関係なく）、異なる原子処理タスクの間で伝えられた依存性を維持する。
【００４８】
詳細には、ＧＰＵは典型的に、一定の数のブロックを同時に実行するように特定されている。ＧＰＵが大量のブロックで呼び出された場合、ブロックはブロックマネージャ６４によりスケジュール管理される。ここに記載されるある方法及びシステムの幾つかは、ＧＰＵをその同時処理可能な最大ブロック数を超えない数のブロックで呼び出す。結果としてブロックマネージャ６４の内部スケジュールポリシーは有効に迂回される。これらの特徴は更に以下で詳述される。
【００４９】
図２のＧＰＵ構成は構成の１つの例であり、概念の明確化のためにのみ選択されたものである。他の実施形態では、他の適合するＧＰＵ構成が使用可能である。この目的のために使用可能な典型的なＧＰＵは、ＮＶＩＤＩＡ社（米国、カリフォルニア州サンタクララ市）で製造されるＧＴＸ２８５装置である。この装置は其々８個のプロセシングコア  を有する３０個のマルチプロセッサ装置からなる。さらに或いは、ここに記載される実施形態はＧＰＵの使用に関しているが、開示された方法及びシステムは、多重のプロセシングコア  を並列で操作する、デジタル信号処理器（ＤＳＰ）や多重コアＣＰＵのような他の様々なタイプのプロセッサで使用可能である。
【００５０】
（依存図を使用した依存問題の表示）
ＣＰＵ２８は、入力依存問題を、以後「処理要素」（ＰＥ）と呼ばれる原子実行タスクにより表示する。依存問題がＧＰＵ３２により実行される場合、各ＰＥはあるプロセッサ４４により実行される１つのスレッドに対応する。ＣＰＵは典型的にＰＥのタイプのライブラリを保持し、その各タイプはある一定の原子タスクを遂行する（例えば参照テーブルの参照、フリップフロップ、バッファ操作、メモリアクセス操作、マルチプレクス操作、算術計算、論理操作または他の適合するタスクタイプ）。各ＰＥは１つのタイプに属し、一定のデータ上で動作する。
【００５１】
プロセッサ４４が単一命令多重スレッド（ＳＩＭＴ）モードで動作する場合、各スレッドは典型的に異なる処理要素ＰＥのタイプを走らせることが出来る符号からなる。スレッドが実行される場合、スレッドに実行される実際の処理要素ＰＥのタイプはデータにより選択される。スレッドに読み込まれるデータは、例えば、所望の処理要素ＰＥ機能性を実行する１つのプログラムアドレスにジャンプすることにより、又は他の適合する選択手段を使用して、実際の処理要素ＰＥタイプを選択可能である。１つの典型的なスレッドはこのように以下のフローを実行する：
・所望の処理要素ＰＥタイプをデバイスメモリ５６から読み、この処理要素ＰＥタイプを実行する適切なアドレスにジャンプする。
・処理要素ＰＥパラメータおよび入力値をデバイスメモリ５６から読む。
・所望の処理要素ＰＥ機能性を実行する。
・処理要素ＰＥ出力値をデバイスメモリ５６に書き込む。
（デバイスメモリ５６に効率的にアクセスするため、ＣＰＵ２８は処理要素ＰＥを処理要素ＰＥグループ（ＰＥＧ）に分割する。この特徴は以下に詳述されるが、上記の特許文献１４にも記載されている。）典型的にスレッドのロード及び保存操作は、スレッドの処理要素ＰＥパラメータとはリンクしていない。例えば、所与のＰＥＧはデバイスメモリから共有メモリへの６４個までのロード命令をサポートするかもしれない。所与のスレッドはそのスレッドの処理要素ＰＥに使用されないデータをロードするかもしれない。
【００５２】
上記の技術を１つの単一命令多重スレッド（ＳＩＭＴ）プロセッサで使用する場合、ユニットがＳＩＭＴモードで効率的に動作するため、１つの所与の多重プロセッサＳＩＭＴユニットで同時に実行される予定のスレッドは、同一の処理要素ＰＥタイプを実行することが一般的に望ましい。
【００５３】
図３は本発明の実施形態に基づく、依存図で表示された依存問題である。ＣＰＵ２８は、実行依存性によって相互接続された多重の処理要素ＰＥを使用して依存問題を示す。所与の１つの依存性は、ある処理要素ＰＥ（「駆動」処理要素ＰＥと呼ばれる）の出力が他の１つの処理要素ＰＥ（「従動」処理要素ＰＥと呼ばれる）の入力として使用されることを特定する。言い換えれば、従動処理要素ＰＥは駆動処理要素ＰＥに依存する。このような依存性は、駆動処理要素ＰＥが従動処理要素ＰＥに先だって実行されることを意味する。何故ならば、そうでなければ従動処理要素ＰＥの入力は有効ではないからである。
【００５４】
図３は依存図７２に変換される依存問題６８の例である。依存図７２は処理要素ＰＥを示す多重の頂点７６と、実行依存性を示す方向性のエッジ８０とを有する。所与のエッジは、駆動処理要素ＰＥから従動処理要素ＰＥに向いている。ある実施形態では、ＣＰＵ２８は多重のサブ図７８を依存図７２から生成する。一般的に循環的な依存図７２と異なり、サブ図７８は非循環的である。
【００５５】
以下に記述される方法は所与の非循環的サブ図をＧＰＵ３２上で実行される符号に変換する。多重のサブ図を使用した依存問題が示されると、開示された方法は典型的に各サブ図に別個に適用される。ある実施形態では、異なるサブ図の変数の共通性が計算の効率性を高めるのに利用される。これらの特徴は以下で更に記述される。
【００５６】
（静的呼び出しデータベース（ＳＩＤ）を使用した依存図の表示と実行）
ある実施形態では、ＣＰＵ２８は入力依存問題をコンパイルし、以後「静的呼び出しデータベース（ＳＩＤ）」と呼ばれる呼び出しデータ構造を生成する。ＳＩＤは実行のためＧＰＵ３２に提供される。ＣＰＵ２８は、典型的にＳＩＤを生成するコンパイルプログラムを実行する。以下の説明では、ＣＰＵ２８で遂行されるアクションは、ときどき明確化のため、コンパイラにより実行されると表現される。しかし他の実施形態では、コンパイラはＳＩＤを生成するため適合するいかなるプロセッサ上でも走る。生成されたＳＩＤは実行のためシステム２０に提供される。
【００５７】
ＳＩＤは、互いに並行して、そしてＧＰＵの内部スケジュールポリシーに関係なく特定の順番で走ることを保障された、１組の処理要素ＰＥ実行連鎖を有する。ＧＰＵがＳＩＤで呼び出された場合、各実行連鎖はＧＰＵにスレッドの１ブロックとして提供される。このように、各連鎖の中の処理要素ＰＥはＧＰＵ３２内の同一のマルチプロセッサ装置４０で走ることが保障される。また、ＳＩＤ内の実行連鎖の数はＧＰＵにより同時に実行される最大ブロック数を越えない。その結果実行連鎖はＧＰＵ内で同時に実行されることを保障され、そして一般的にブロックマネージャ６４の内部スケジュールポリシーに影響されない。言い換えれば、ＧＰＵの内部スケジュールポリシーは、効率的に迂回され、処理要素ＰＥの実行順序は完全にＳＩＤにより制御される。
【００５８】
図４は本発明の実施形態に基づく、静的呼び出しデータベース（ＳＩＤ）９０の概略図である。ＳＩＤ９０は１組の実行連鎖、本事例では４つの連鎖９８Ａ．．．９８Ｄを有する。しか一般的に、１より大きく、ＧＰＵが同時に実行可能なブロックの最大数を越えない、適合する数の連鎖が使用可能である。各実行連鎖は次から次へ実行される一連のＰＥＧ９４を有する。（処理要素ＰＥのＰＥＧへのグループ化は以下で記述される。）
【００５９】
ＧＰＵが同時に実行可能なブロックの数は典型的にマルチプロセッサ装置４０の数に其々のマルチプロセッサ装置により同時に実行可能なブロックの数を乗じた値により与えられる。実際のマルチプロセッサ装置当りの同時に実行可能なブロックの数は、マルチプロセッサ装置の資源（例えば、レジスタ、共有メモリ又はスレッドカウント）により制限されうるので、特定されたマルチプロセッサ装置当りの同時実行可能ブロック数より小さい。
【００６０】
ある場合には、実際のマルチプロセッサ装置当りの同時実行可能ブロック数は次式で表わされる。
【数１】
0005733860.tif 000002
例えばＧＴＸ２８５  ＧＰＵは、３０個のマルチプロセッサ装置４０を有する。各マルチプロセッサ装置は１６，３８４個のレジスタと１６Ｋバイトの共有メモリを有し、１，０２４個のスレッドと８個のブロックを同時にサポートする。１つの例示実施形態では、コンパイラに生成されたＧＰＵ符号は、１スレッド当り２ＫＢの共有メモリと１５個のレジスタを使用し、各ブロックは６４個のスレッドからなる。この符号は１ブロック当り総計１５ｘ６４＝２４０個のレジスタを有する。この例では、マルチプロセッサ装置当りの同時ブロックの数は次式で与えられる。
【数２】
0005733860.tif 000003
ＧＰＵ全体の同時実行可能ブロック数は従って８Ｘ３０＝２４０個となる。
【００６１】
異なる実行連鎖は一般的に異なる長さ、即ち、異なる実行時間を有する。典型的にＣＰＵ２８は依存性問題を実行時間が最小の静的呼び出しデータベース（ＳＩＤ）にコンパイルするように試みる。言い換えれば、ＣＰＵは最大許容連鎖数を越えることなく、最短実行連鎖のＳＩＤを生成するように試みる。この種のＳＩＤ生成工程の事例は以下で詳述される。
【００６２】
各実行連鎖は同一のマルチプロセッサ装置４０で動作することを保障されたスレッドのブロックを有するので、ある所与の連鎖の中のＰＥＧは正しい順序で実行されることを保障されている。このように同一の実行連鎖の中で駆動処理要素ＰＥを其々の従動処理要素ＰＥの前に配置することは処理要素ＰＥの間の実行依存性が破られないことを保障する。さらに、同一の実行連鎖に属するＰＥＧは、この連鎖を実行するマルチプロセッサ装置の共通メモリ５２を使用してデータを交換してもよい。
【００６３】
しかし多くの依存性問題では、同一の実行連鎖に全ての依存する処理要素ＰＥのペアを配置するという制約は厳しすぎる。このような制約はしばしば少数の非常に長い実行連鎖を生成し、従って実行時間を増加させ、到達可能な並列化を制限する。多くの場合、実行依存性を維持しながら異なる実行連鎖に依存性処理要素ＰＥを配置することが好ましい。
【００６４】
ある実施形態では、異なる連鎖内に配置された処理要素ＰＥの間の依存性を維持するため、コンパイラがＳＩＤ内の異なる実行連鎖の間の同期化を強制する。例えば図４では、連鎖９８Ｂ内のＰＥＧ１０２が連鎖９８Ａ内のＰＥＧ１０６に、依存性１１０に示されるように、依存する。（より正確には、ＰＥＧ１０２は、ＰＥＧ１０６の１つの処理要素ＰＥに依存する１つの処理要素ＰＥを含む。）ＰＥＧ１０６がＰＥＧ１０２より完全に前に実行を開始することを保障するために、コンパイラは同期化要素、例えば、ＳＹＮＣ  ＰＥＧ１１４を、連鎖９８Ｂ内においてＰＥＧ１０２より前に配置する。ＳＹＮＣ１１４は連鎖９８Ｂの実行を、ＰＥＧ１０６が実行を完了し有効な出力を生成するまで、停止する。ＰＥＧ１０６の出力はその後入力としてＰＥＧ１０２に提供され、そして連鎖９８Ｂは実行を開始してもよい。同様に、連鎖９８Ｃ内のＰＥＧ１１８は連鎖９８Ｄ内のＰＥＧ１２２に、依存性１２６が示すように、依存する。この依存性を維持するため、コンパイラはＳＹＮＣ  ＰＥＧ１３０を連鎖９８Ｃ内のＰＥＧ１１８の前に配置する。
【００６５】
連鎖間の同期化は典型的にデバイスメモリ５６を使用して遂行される。例えば、駆動ＰＥＧはデバイスメモリ５６内のある領域に書き込むことにより、その実行状況の信号を送る。ＳＹＮＣ  ＰＥＧは、この領域を調査し、駆動ＰＥＧが実行を完了した場合にだけ、その連鎖の実行を再開する。
【００６６】
しかし、異なる連鎖内の依存性処理要素ＰＥのペアのすべてが、ＳＹＮＣ  ＰＥＧの追加を必要とするわけではないことに注意する必要がある。例えば、連鎖９８Ｃ内の最後のＰＥＧが連鎖９８Ｄの最初のＰＥＧに依存すると仮定する。この場合連鎖９８Ｃにもう１つのＳＹＮＣ  ＰＥＧを追加する必要はない。何故ならば、現存するＳＹＮＣ  ＰＥＧ１３０が既に連鎖９８Ｄの最初のＰＥＧが実行を完了するまでは、連鎖９８Ｃ内の最後のＰＥＧは実行しないことを保障しているからである。
【００６７】
一般的に、あるＳＹＮＣ  ＰＥＧは、所望の数の連鎖の中の所望の数のＰＥＧに依存する、即ち、既定の組の駆動ＰＥＧが実行を完了するまで、所与の連鎖の実行を停止する。ある実施形態では、同期化機能性は、独自のＳＹＮＣ  ＰＥＧを使用することなく、従動ＰＥＧに埋め込まれる。
【００６８】
連鎖の間の同期を強制することは、異なる連鎖の実行時間をバランスさせる上で非常に有効であり、それにより並列化を増大させる。他方で、同期化構造はレイテンシをもたらし、デバイスメモリ５６への高価なアクセスをもたらす。以下に記述するように、コンパイラは典型的に、静的呼び出しデータベース（ＳＩＤ）の総実行時間を最短にするため、これらの利点と欠点を相殺するように試みる。
【００６９】
図５は本発明の実施形態に基づく、依存問題を実行する方法を示すフロー図である。方法は、図の入力ステップ１３４において、ＣＰＵ２８が依存図で表わされる依存問題の入力を受け取ることから始まる。ＣＰＵは、分割ステップ１３８において、依存図を、非循環性の指向性サブ図に分割する。依存図の非循環性の指向性サブ図への分割は上記特許文献１４に記載されている。各サブ図に対し、ＣＰＵは、グループ分けステップ１４２において、処理要素ＰＥをＰＥＧにグループ分けし、静的呼び出しデータベース（ＳＩＤ）構築ステップ１４６において、ＳＩＤ内にＰＥＧを配置する。ＣＰＵは、呼び出しステップ１５０において、ＳＩＤを実行するためＧＰＵ３２を呼び出す。ＧＰＵはＳＩＤ内のＰＥＧ連鎖を実行し、コンピュータ計算タスクの結果を生成する。
【００７０】
（効率的な静的呼び出しデータベース（ＳＩＤ）生成）
上述のように、ＣＰＵ２８上のコンパイラの実行は、典型的に、所与の最大実行連鎖数に対して最短実行時間のＳＩＤを生成するように試みる。このような工程に対する入力は、ＳＩＤに変換される、指向性の非循環性の処理要素ＰＥの依存性サブ図である。ある実施形態では、コンパイラは、処理要素ＰＥ間の実行依存性を維持するような方法で、２次元のワープのグリッドを処理要素ＰＥで徐々に満たすことにより、ＳＩＤを生成する。
【００７１】
ワープは、所与のマルチプロセッサ装置で同時にかつ効率的に走る同じタイプのスレッドのグループである。１つのワープの最大スレッド数（従って最大処理要素ＰＥ数）はＧＰＵタイプごとに異なる。例えばＮＶＩＤＩＡ社のＧＴＸ２８５では、各ワープは３２個のスレッドを走らせる。以下に示すように、複数のワープが後に集合され１つのＰＥＧを形成する。
【００７２】
図６は本発明の実施形態に基づく、ＳＩＤ生成に使用されるワープグリッドを示す図である。グリッド１６０は多重の実行連鎖１６４からなり、その其々は多重のワープスロット１６８からなる。ワープスロットは当初は空であり、コンパイラは徐々にそれを処理要素ＰＥで満たす。異なる実行連鎖間の同期を強制するため、コンパイラは時々ＳＹＮＣワープ１７２を連鎖に挿入する。（ＳＹＮＣワープは実行するスレッドを含まない点で通常のワープとは異なる。ＳＹＮＣワープは、連鎖に挿入されるＳＹＮＣ動作のレイテンシを真似する。）工程の終わりには、入力サブ図内の各処理要素ＰＥはワープスロットの１つに配置される（各ワープスロットは多重の同タイプの処理要素ＰＥを有してよい）。その後コンパイラは、ＰＥＧ１７６をそのワープから形成する。ある場合には所定の連鎖の中の２つ以上の隣接するワープを合体させて１つのＰＥＧを形成する。ＰＥＧのグリッドは所望の静的呼び出しデータベース（ＳＩＤ）として出力される。
【００７３】
典型的に、グリッド１６０内の実行連鎖１６４の数は、ＧＰＵが同時に実行できる最大スレッドブロック数を超えないように設定され、その結果としてのＳＩＤの実行はＧＰＵの内部スケジュール管理に影響されない。１連鎖あたりワープスロット数は、典型的に、入力サブ図の中の最長パスの長さが初期値としてセットされる。
【００７４】
処理要素ＰＥ間の依存性により、各処理要素ＰＥは、グリッド１６０の列のある部分的サブ組の内にのみ配置可能である。このサブ組は処理要素ＰＥの「割当間隔」と呼ばれる。例えば、他の処理要素ＰＥに依存する１つの処理要素ＰＥはそのワープグリッドの第１列には配置出来ない（即ち、実行連鎖の最初には）。何故ならば、駆動処理要素ＰＥが最初に実行されなければならないからである。同様に、他の処理要素ＰＥを駆動する処理要素ＰＥはグリッドの最後の列には配置出来ない。
【００７５】
一般的に、サブ図内の各処理要素ＰＥは、ある割当間隔を有し、それは処理要素ＰＥが潜在的に配置可能なグリッド１６０の列を画定する。１つの処理要素ＰＥｘの割当間隔は、ＰＥｘの後方位相（ＢＰ（ｘ）と表示される）及び、前方位相（ＦＰ（ｘ）と表示される）の２つのパラメータに依存する。所与の処理要素ＰＥの後方位相は、サブ図内の最長パスに沿ったこの処理要素ＰＥに至る処理要素ＰＥの数で定義される。所与の処理要素ＰＥの前方位相は、サブ図内の最長パスに沿ったこの処理要素ＰＥから始まる処理要素ＰＥの数で定義される。
【００７６】
この言葉を使用して、サブ図の中の最長パスの長さは（従って、ワープグリッドの列の数は）Ｌ＝ｍａｘ（ＢＰ（ｘ）＋ＦＰ（ｘ））＋１で与えられ、ここに最大値はサブ図内の全ての処理要素ＰＥｘを対象として得られる。処理要素ＰＥｘの割当間隔は［ＢＰ（ｘ），Ｌ−ＦＰ（ｘ）］で与えられる。これらの割当間隔は、割当工程の最初の状態を反映する。割当間隔は典型的に、割当工程が進行するにつれ変化する。
【００７７】
図７は本発明の実施形態に基づく、ワープのグリッド内に処理要素ＰＥを配置するための割当間隔を示す図である。図７は例示としてのサブ図１８０に関し、それはＡ．．．Ｈで示される８個の処理要素ＰＥ７６を有する。処理要素ＰＥは２つの連鎖１６４を持つワープグリッドに配置される。この図を貫通する最長パスは３処理要素ＰＥ長の長さなので、各連鎖１６４はこの例では３つのワープスロット１６８を有する。
【００７８】
８つの処理要素ＰＥの前方及び後方位相は次の表で与えられる：
【表１】
0005733860.tif 000004
【００７９】
割当工程の最初に、即ちワープグリッドがまだ空の時に、８つの処理要素ＰＥは図にしめすような割当間隔１８４を有する。この例では、処理要素ＰＥのＡとＢは、それぞれ２つの処理要素ＰＥのパスを駆動するため、グリッドの第１列にのみ配置可能である。処理要素ＰＥのＣは１つの処理要素ＰＥのパスを駆動するため、最後の列を除くどの列にも配置可能である。処理要素ＰＥのＤとＥは、それぞれ、１つの処理要素ＰＥに駆動され、かつ１つの処理要素ＰＥを駆動するため、第２列にのみ配置可能である。処理要素ＰＥのＦは１つの処理要素ＰＥパスに駆動されるので第１列を除くどの列にも配置可能である。処理要素ＰＥのＧとＨはそれぞれ２つの処理要素ＰＥパスに駆動されるため、最後の列にのみ配置可能である。
【００８０】
図７の事例は、ある処理要素ＰＥは、グリッド１６０内の配置可能性という点で、他の処理要素ＰＥよりもより重い制約を受けることを示す。短い割当間隔を持つ処理要素ＰＥは重く制約され、一方長い割当間隔を持つ処理要素ＰＥは割当の自由度が大きい。
【００８１】
図８は本発明の実施形態に基づく、静的呼び出しデータベース（ＳＩＤ）を生成する方法を示すフロー図である。方法は、入力ステップ１９０において、ＣＰＵ２８上で走るコンパイラが、ＳＩＤに変換される依存性サブ図を受け取ることから始まる。ある実施形態では、コンパイラは、サブ図が由来する完全な依存図をも受け取り、その依存図は典型的に追加の処理要素ＰＥと依存性を有する。他のＳＩＤに関係なく単一のＳＩＤを生成する場合には、通常、完全な依存図を受け取る必要はない。しかしコンパイラは、同じ依存図内の他のサブ図のＳＩＤを考慮する場合に、完全な依存図を使用する。この特徴は以下で更に記述される。更に、コンパイラは、実行連鎖の数Ｎ、ワープスロットユニット内のＳＹＮＣのレイテンシＤ、ワープ寸法（即ち１ワープ当りの処理要素ＰＥの数）及び処理要素ＰＥタイプ、を入力として受け取ってもよい。
【００８２】
コンパイラは、インターバル初期化ステップ１９４において、サブ図内の処理要素ＰＥに対する割当間隔を初期化する。上述のように、処理要素ＰＥｘの最初の割当間隔は［ＢＰ（ｘ），Ｌ−ＦＰ（ｘ）］  で与えられる。
【００８３】
コンパイラは、グループ定義ステップ１９８において、処理要素ＰＥ入力及び出力グループを定義する。入力グループは、１つの共通の入力を有する１グループの処理要素ＰＥからなる（即ち、同じ駆動処理要素ＰＥから駆動される処理要素ＰＥ）。共通の駆動処理要素ＰＥはグループのピボットと呼ばれる。出力グループは１つの共通の出力を有する１グループの処理要素ＰＥからなる（即ち、同じ従動処理要素ＰＥを駆動する処理要素ＰＥ）。共通の従動処理要素ＰＥはグループのピボットと呼ばれる。
【００８４】
例えば、コンパイラは、依存図全体の各処理要素ＰＥｘに対しその処理要素ＰＥｘがピボットである１つの出力グループを作成してもよい。この出力グループ内の処理要素ＰＥは、サブ図内のその処理要素ＰＥｘを駆動する処理要素ＰＥからなる。同様にコンパイラは、依存図全体の各処理要素ＰＥｘに対しその処理要素ＰＥｘがピボットである１つの入力グループを作成してもよい。この入力グループ内の処理要素ＰＥは、サブ図内のその処理要素ＰＥｘにより駆動される処理要素ＰＥからなる。この例では、コンパイラは、依存図全体の各処理要素ＰＥに対し入力及び出力グループを生成することに注意する。しかし、グループ内の処理要素ＰＥは、サブ図からのみ選択され、依存図全体からは選択されない。
【００８５】
入力及び出力グループを構築する理由は、共通の入力及び／又は出力を有する処理要素ＰＥを同じ実行連鎖の中に配置することが一般的に望ましいからである（異なるワープの中に配置する可能性はあるが）。依存図全体を考慮する理由は、他の静的呼び出しデータベース（ＳＩＤ）において処理要素ＰＥの共通の入力又は出力として機能する処理要素ＰＥを、同じ連鎖に配置することが望ましい場合があるからである。コンパイラは、サブ図内の各処理要素ＰＥに、その処理要素ＰＥを含む入力及び出力グループの数として定義される、グループスコアを割り当てる。
コンパイラは、グリッド初期化ステップ２０２において、それぞれＬ個のワープスロットを有するＮ個の実行連鎖からなるワープのグリッドを初期化する。
【００８６】
ある実施形態では、コンパイラは、保存ステップ２０６において、サブ図の処理要素ＰＥを事前ソートする。コンパイラは、割当間隔の寸法の小さい順に処理要素ＰＥをソートする。割当間隔の寸法が同じ処理要素ＰＥはグループスコアの大きい順にソートする。その後コンパイラは、ソートされた順番に従ってグリッド内での配置のため処理要素ＰＥを選択する。このように割当間隔の寸法が最短の処理要素ＰＥがグリッド内に最初に配置される。ある所与の割当間隔の寸法に対して、グループスコアの大きい処理要素ＰＥ（多数の入力及び／又は出力グループのメンバーである処理要素ＰＥ）が先に配置される。他の実施形態では、コンパイラは、割当間隔寸法が最短のＭ個（Ｍは既定の整数）の処理要素ＰＥを選択することにより、グリッド内での配置のための次の処理要素ＰＥを選択する。これらの処理要素ＰＥから、コンパイラは、最大グループスコアの処理要素ＰＥを選択する。上記の割当順序は最も制約の重い処理要素ＰＥを最初に割り当て、その後の割当の繰り返しに出来るだけ自由度を残すように試みている。
【００８７】
コンパイラはこの処理要素ＰＥの選択ステップ２１０において、グリッド内に配置するための次の処理要素ＰＥをソートされた処理要素ＰＥの中から選択する。次にコンパイラは、コスト計算ステップ２１４において、この処理要素ＰＥをグリッド内に配置する可能性について其々の割当コストを計算する。典型的に、コンパイラは、Ｎ個の実行連鎖に亘って、処理要素ＰＥの割当間隔内のワープスロットを吟味する。（ある場合にはたとえ処理要素ＰＥの割当間隔内にあっても、ある一定のワープは所与の処理要素ＰＥを配置する候補にはならない。例えば、そのワープがすでに満員であり、又はそのワープが、吟味される処理要素ＰＥとタイプが異なる処理要素ＰＥを有する場合である。）
【００８８】
ある実施形態では、コンパイラは、ある所与の処理要素ＰＥの割当間隔内の僅かに外側にあるワープを吟味してもよい。例えば、ある場合には、処理要素ＰＥをその割当間隔を越えて故意に外側に配置する（そしてそれによりＳＩＤ実行時間を僅かに増加させる）ことが好ましく、これはＳＹＮＣを追加すること（これはＳＩＤ実行時間に更に悪い影響を与える）と対照的である。このようにある実施形態では、コンパイラは、割当間隔に追加して、ＳＹＮＣによってもたらされたレイテンシの順に並んだ複数のワープスロットを吟味する。
コンパイラは、各潜在的ワープスロットの割当コストを計算する。割当コストは数量的基準であり処理要素ＰＥをある特定のワープスロットに配置する潜在的ペナルティを示す。
【００８９】
コンパイラは、割当コストの計算に、どのような適合する判断基準又は常識的なルールを適用してもよい。例示として以下のルールが使用可能である：
・処理要素ＰＥを対象のワープスロットに配置することにより引き起こされる、全体のＳＩＤ実行時間の中の其々のワープスロットの遅れに対し、コストを１０００だけ増大する。このルールは全体実行時間を増大させることに対し厳しいペナルティを課す。
・吟味されるワープスロットと同じ連鎖内に既に配置され、そして吟味される処理要素ＰＥを含んだ入力又は出力グループの一員である、各処理要素ＰＥに対しコストを１０だけ減少させる。このルールは入力又は出力グループのメンバーを同じ連鎖に配置することを優先させる。
・吟味される処理要素ＰＥに付随し、残りの一方の処理要素ＰＥが吟味されるワープスロットと同じ連鎖内にある、実行依存性（直接又は間接、前方又は後方）に対しコストをそれぞれ１０だけ減らす。このルールは、１つの実行依存性の両端を同じ連鎖内に配置することを優先させる。
・吟味される処理要素ＰＥの最適な列からの列距離に従ってコストを増大させる。処理要素ＰＥｘの最適な列はＢＰ（ｘ）・Ｌ／ＯＲＩＧ＿Ｌで定義され、ここにＬはそのグリッド内の空でない列の現在の数を示し、Ｌ＿ＯＲＧはサブ図内の最長パスを示す。最適な列はその処理要素ＰＥの割当間隔の外にあるかもしれないことに注意する。
【００９０】
ある実施形態では、コンパイラは、その処理要素ＰＥがある一定のワープスロットに配置されたと仮定して、その処理要素ＰＥを横切るサブ図の異なるクリティカルパスを吟味し、それらの存続時間を計算することにより、割当コストを計算してもよい。この種の計算は、潜在的に追加される追加のＳＹＮＣ及びそれらの関連するコストを考慮する。さらにあるいは、コンパイラは吟味される処理要素ＰＥの割当間隔内の異なるワープスロットに、適合する判断基準又は常識的なルールを使用して、割当コストを割り当ててもよい。
【００９１】
コンパイラは、配置ステップ２１８において、その処理要素ＰＥを最小割当コストのワープスロットに配置する。新規の配置のため必要な場合、コンパイラは、挿入ステップ２２２において、１つのＳＹＮＣを挿入する。１つのＳＹＮＣは整数の数のワープスロット、例えば２つのワープスロットの既定の持続時間を有する。各ＳＹＮＣは、ＳＹＮＣが自身の連鎖の実行を開始する前にその実行を終了しなければならない、１つのリスト内の１つ以上のワープを有する。ある所定のＳＹＮＣにより選ばれたワープは、どんな数の連鎖の中に存在してもよい。そのリストは典型的に同じ連鎖からの多重のワープを含まない。
コンパイラは、割当間隔更新ステップ２２６において、新しい配置の後の配置可能性を反映するため、残る割当されていない処理要素ＰＥの割当間隔を更新する。
【００９２】
ある実施形態では、コンパイラは、更新ステップ２３０において、新しい配置の後で残った処理要素ＰＥのグループスコアを更新する。例えば、コンパイラは、新規に配置された処理要素ＰＥと同じ入力又は出力グループを共有する処理要素ＰＥのグループスコアを増大させてもよい。このルールは、それらのメンバーが既に部分的に割り当てられている入力又は出力グループを優先させる。他の例として、コンパイラは、１つの実行依存性を共有する（直接又は間接に、前方又は後方）処理要素ＰＥのグループスコアを増加させてもよい。
【００９３】
コンパイラは、チェックステップ２３４において、サブ図の中の全ての処理要素ＰＥがワープグリッド内に配置されたかをチェックする。割当されていない処理要素ＰＥが有る場合、方式のループはステップ２１０に戻り、コンパイラが次に配置される処理要素ＰＥを選択する。全ての処理要素ＰＥが割り当てられていた場合、コンパイラは、ＰＥＧ生成ステップ２３８において、連続するワープをＰＥＧにグループ化する。典型的に、各ＰＥＧは、例えば、最大２ワープと１つの追加ＳＹＮＣのような、ある一定の数の同じ連鎖内の連続するワープのみを有する。更に、１つのＰＥＧは互いに独立した処理要素ＰＥのみを有する、何故ならばＰＥＧ内の処理要素ＰＥ実行の順番に保障が無いからである。例えば上記図６では、あるＰＥＧ１７６は単一のワープからなり、他は２つのワープからなり、あるＰＥＧは１つのワープと１つのＳＹＮＣからなる。
【００９４】
この段階において、コンパイラは、出力ステップ２４２において、満員のワープグリッド（Ｎ個のＰＥＧ実行連鎖の１組）を所望のＳＩＤとして出力する。
典型的に、上記のＳＩＤ生成工程は、ワープスロットの継続時間が、ロード、同期化、実行及び保存のような異なるＰＥＧ動作の継続時間を考慮していると仮定している。しかしある場合には、ロード及び保存命令の継続時間は無視してもよい。上記の記述は、全てのワープが同じ継続時間であり、ＳＹＮＣの継続時間はワープスロットの整数倍である、と仮定している。記述は又、ＰＥＧの継続時間がそのワープとＳＹＮＣの合計継続時間と等しいと仮定している。しかし、これら全ての仮定は強制ではなく、他のＳＩＤ生成の構成では他の仮定を設定してもよい。
【００９５】
ある場合には、コンパイラは、最大実行連鎖長、即ち、ＳＩＤ合計実行時間を増大する必要がある。例えば、コンパイラがある一定の処理要素ＰＥをＰＥ割当間隔内のどのワープにも配置出来ない場合、Ｌの増加は必要かもしれない。Ｌは又ＳＹＮＣの挿入の後で増加されてもよいが、ＳＹＮＣの挿入は必ずしもＬの増加をもたらさない。Ｌの増加は典型的に、ある一定の列より先の従前に配置されたワープ及びＳＹＮＣが、右方向に押しやられることを意味する。この押しは、他のワープやＳＹＮＣを右押しする動作の、その後の連鎖の引き金となる。ある一定のワープ位置の割当コストを計算する場合（上記ステップ２１４で）、ＳＩＤの総実行時間Ｌを増加させる右押し動作に対してのみ、コストは通常増大される。Ｌを変えない右押し動作は、割当コストを生じない。
【００９６】
多くの場合、コンパイラは、所与の処理要素ＰＥの配置に関し幾つかの選択肢に遭遇する。ある場合には、所与の処理要素ＰＥを最小コストの位置に配置する（上記ステップ２１８において）ことは、この配置が将来の処理要素ＰＥ配置において重大なペナルティを引き起こすため、総体的に最適でないことがある。従ってコンパイラは、２つ以上の選択できるＳＩＤを並行して考慮し、これらＳＩＤの中で２つ以上のそれぞれの割当工程を実行することにより、処理要素ＰＥ割当工程を改善してもよい。「Ａスター」構成のような、種々の検索方法あるいは汎用の検索アルゴリズムも、全体として最善のＳＩＤを探すために使用可能である。
【００９７】
（効率的なＳＩＤ操作のためのメモリ管理）
認識できるように、ＧＰＵ３２上でのＳＩＤの実行は、多数のメモリアクセス動作を伴う。ＧＰＵ内では、データはデバイスメモリ５６又は共有メモリ５２に保管可能である。デバイスメモリ５６は、典型的に、大きな保存空間を提供する（例えば、数ギガバイト）が、このメモリへのアクセスはレイテンシの観点でコストが高い。典型的に、マルチプロセッサ装置４０は大きな粒度（例えば、一度に５１２ビット）でデバイスメモリ５６にアクセスする。このように、デバイスメモリ５６に対する単一ビットの読み取り又は書込みのコストは、５１２ビットの読み取り又は書込みのコストとほぼ等しい。デバイスメモリ５６に対する読み取り又は書込みの命令は、典型的に、これら大粒度アドレスに揃えられている。それに対して各マルチプロセッサ装置内の共有メモリ５２は、マルチプロセッサ装置の各プロセッサ４４により、アライメントすることなく小さな粒度で比較的早いアクセス時間でアクセス可能である。しかし共有メモリ５２の大きさは、デバイスメモリに比べて非常に小さい（例えば、ギガバイトに対しキロバイト程度である）。
【００９８】
本発明のある実施形態では、デバイスメモリ５６に効率的にアクセスし、付随するレイテンシのペナルティを最小にするため、ＳＩＤ内のＰＥＧ連鎖は共有メモリ５２をキャッシュメモリとして使用する。以下の記述では、「共有メモリ」と「キャッシュ」は
場合により互換性を持って使用される。
【００９９】
ここに記載されるキャッシュおよびメモリ管理構造は、コンパイルの間に完全に決定され、ＳＩＤの実行の間中、決定論的であり続けることが重要である。この特徴は、動作が実行時のデータにより変化し、従って本質的に統計的な既知のキャッシュ構造とは異なっている。ここに記載された技術の中で、データが異なるＰＥＧ連鎖により呼び出され生成される、パターンとタイミングはコンパイル中に経験的に知られる。コンパイラはこの知識を利用して、デバイスメモリ５６にアクセスする最適なメモリ管理方法（例えば、一定の変数を一定のタイミングでキャッシュイン又はアウトし、又は多重の読み出し要求を１つの読み出し動作に統合する）を決定する。このような方法は、実行時間においてＧＰＵにより決定論的に実行される。
【０１００】
図９は本発明の実施形態に基づく、キャッシュ管理体系の概略図である。図９はＰ１，Ｐ２．．．Ｐ９で示される９個のＰＥＧからなる特定の１つのＰＥＧ実行連鎖に関している。ＰＥＧはＡ．．．Ｆで示される６個の変数を入力として使用し、各ＰＥＧはこれら変数のある一定のサブ組を使用する。この事例では、共有メモリ５２はある時点で最大３個の変数を保持出来る。コンパイラは、決定論的にキャッシュパターンを定義し、それは共有メモリ５２の限られた容量を最適に使用し、またデバイスメモリ５６からの読み出し回数を最小化するため、いつある変数がデバイスメモリ５６から共有メモリ５２に取得され、そしていつある変数が廃棄されるかを特定する。
【０１０１】
図の上側の領域２５０は、各ＰＥＧにより入力として使用される変数を示す。例えばＰＥＧ  Ｐ１は入力として変数ＡとＢを使用し、ＰＥＧ  Ｐ２は変数ＢとＣを使用し、ＰＥＧ  Ｐ３は変数Ａのみを使用、等々である。上向き矢印は対応するＰＥＧによりデバイスメモリ５６から共有メモリ５２に取得された変数を示す。下向き矢印は、次のＰＥＧで必要とされる空間を空けるため、ＰＥＧの実行の後共有メモリから廃棄される変数を示す。太字で囲われた変数は、キャッシュヒット、即ち、キャッシュ内に既に存在していてデバイスメモリから取得する必要のない変数を示す。例えば、ＰＥＧ  Ｐ２の実行の準備においては、変数Ｂは従前のＰＥＧから共有メモリ５２に存在するため、変数Ｂをデバイスメモリから取得する必要はない。
【０１０２】
図９の下方の領域２５４は、各ＰＥＧの始まりにおける共有メモリ５２の内容を示す。例えば、ＰＥＧ  Ｐ１の始まりにおいては、共有メモリは変数ＡとＢを保持する。変数ＣはＰＥＧ  Ｐ２の始まりに取得され、共有メモリは変数Ａ、ＢとＣを保持する。キャッシュはＰＥＧ  Ｐ３とＰＥＧ  Ｐ４の間は変化しないが、変数Ｄを入力として必要とする。そのため変数ＡはＰＥＧ  Ｐ３の終わりに廃棄され、変数ＤがＰＥＧ  Ｐ４の初めに取得される。工程はＰＥＧ連鎖の実行の間続く。
【０１０３】
ある時点において共有メモリに存在する各変数に対し、コンパイラはこの変数を入力として要求する連鎖内の次のＰＥＧの識別を記録する。コンパイラは典型的に、ＰＥＧ連鎖を実行順序に従ってスキャンすることにより、これらＰＥＧの識別を決定する。記録されたＰＥＧの識別は図の下方の領域２５４内に示される。例えば、変数ＡとＢがＰＥＧ  Ｐ１の初めに取得される場合、コンパイラは、変数Ａは次にＰＥＧ  Ｐ３により要求され、変数Ｂは次にＰＥＧ  Ｐ２により要求されると認識する。他の事例は、ＰＥＧ  Ｐ３の初めにコンパイラは変数Ａが次にＰＥＧ  Ｐ５に要求され、変数ＢとＣは共に次にＰＥＧ  Ｐ４に要求されると認識する。文字∞はある変数がその連鎖の後続のＰＥＧでは要求されないことを示す。
【０１０４】
これらの記録を使用して、コンパイラは、共有メモリ内の空間を開ける必要がある場合、どの変数が廃棄されるかを決定する。ある変数を廃棄する必要がある時、コンパイラは、典型的に連鎖の中で最も遠いＰＥＧ、即ちこのＰＥＧから最も距離が離れたＰＥＧから要求される変数を廃棄する。例えば、ＰＥＧ  Ｐ３の終わりの状況を考えてみる。この時点ではすでに共有メモリは変数Ａ，ＢとＣを保持している。ＰＥＧ  Ｐ４で変数Ｄを取得してくるには、いずれかの変数が廃棄されなければならない。ＡはＰＥＧ  Ｐ５で要求される予定であり、ＢとＣはそれより早くＰＥＧ  Ｐ４で要求される予定であるので、変数Ａが廃棄される。
【０１０５】
図９の例は、特定の連鎖、特定の変数及び特定のキャッシュ容量に関している。しかし一般的に、このキャッシュ管理体系は、他の適合するＰＥＧ連鎖、変数の組及びキャッシュ容量に使用可能である。他の実施形態では、コンパイラは共有メモリ５２内の変数のキャッシュイン及びキャッシュアウトを他の適合する基準を使用して設計する。ＧＰＵにより一定のＰＥＧ連鎖を実行するように指定されたマルチプロセッサ装置４０は、コンパイラにより設定された決定論的なパターンに従って、デバイスメモリ５６から共有メモリ５２へ変数を取得する。典型的に、同様の工程がＳＩＤ内の各ＰＥＧ連鎖に対して実行される。コンパイラは、異なる変数を要求するＰＥＧを記録するため、適合するデータ構造を使用する。
【０１０６】
ある実施形態では、コンパイラは、デバイスメモリからのコスト高な取得動作の回数を減少させるため、デバイスメモリ５６から共有メモリ５２への多重の変数の取得を、単一の取得命令に集約する。上述のように、典型的なＧＰＵでは、単一の変数をデバイスメモリから取得する手間は、５１２ビットを占有する変数を取得する手間とほぼ同じであり、従って集約して１つの命令で多数の変数を取得することは有利である。
【０１０７】
図１０Ａと１０Ｂは、本発明の実施形態に基づく、変数事前取得体系を示す概略図である。この例は、Ｐ１，Ｐ２．．．Ｐ９で示される９個のＰＥＧからなる特定の１つのＰＥＧ実行連鎖に関している。ＰＥＧはＡ．．Ｄ，Ｓ，Ｔで示される６個の変数を入力として使用する。変数Ａ．．ＤはこのＳＩＤの内部で使用され、一方変数ＳとＴはＳＩＤ間の変数である。各図１０Ａと１０Ｂにおいて、各列は連鎖の中のある一定のＰＥＧに対応し、各行は変数に対応する。
【０１０８】
各変数はある一定のＰＥＧによりこの変数が入力として要求された時から、斜線を記される。例えば、変数Ｂは最初にＰＥＧ  Ｐ３から要求され、従ってこの変数はＰＥＧ  Ｐ３から先は斜線を記される。垂直線２５８は、このＰＥＧ連鎖と他の連鎖との間のＳＹＮＣｓを示し、それは後続のＰＥＧにより実行される。この事例では、ＳＹＮＣはＰＥＧ  Ｐ１，Ｐ４そしてＰ７により実行される。其々のＳＹＮＣ２５８に対し、１つ以上の標識２６２はＳＹＮＣにより同期化された特定の変数を示す。例えば、ＰＥＧ  Ｐ４により実行されたＳＹＮＣは、変数ＣとＤがもう１つの連鎖により準備が整うまで、実行を停止する。
【０１０９】
ある実施形態では、コンパイラは、ＰＥＧ連鎖をスキャンし、各命令により取得される変数とともに、デバイスメモリの取得命令のタイミングを設定する。典型的に、コンパイラは、（１）各変数を必要とするＰＥＧへの距離と（２）効率的と考えられる１命令当りの取得動作の数、を考慮しながら、取得命令のタイミングと内容を設定しようとする。この情報に基づき、コンパイラは２つ以上の変数の取得を１つの命令に統合させようとする。
【０１１０】
ある実施形態では、コンパイラはＰＥＧ連鎖を逆順序（即ち、実行順序と逆に）でスキャンする。各変数に対し、コンパイラは其々の取得間隔、即ち、変数が取得される間の時間間隔を標識付けする。この時間間隔はその変数が有効になった時に始まり、この変数を最初に入力として要求するＰＥＧで終わる。コンパイラはその後取得動作のタイミングと内容をこれら時間間隔に基づいて設定する。
【０１１１】
典型的に、各変数に対し、又各ＰＥＧに対し、コンパイラは、変数が有効である限り、ＰＥＧとこの変数を最初に要求するＰＥＧとの距離（ＰＥＧのユニット数での）を標識付けする。所定の変数は、この変数を伴う直近のＳＹＮＣ２５８の後に有効と見做されうる。本事例におけるコンパイラにより標識付けされた距離は図１０Ａと図１０Ｂに示される。例えば変数ＤはＰＥＧ  Ｐ４に最初に要求され、ＰＥＧ  Ｐ４以降（この変数を待つＳＹＮＣの後）何時でも取得可能である。コンパイラは標識付けされた距離に基づき取得動作のタイミングと内容を設定する。例えば、コンパイラは、ＰＥＧ連鎖を実行順序に沿ってスキャンし、取得する必要のある変数を識別し、効率的な取得命令を生成するため他の変数の取得と合体させてもよい。コンパイラは、取得間隔が重複する２つ以上の変数を合体させてもよい。統合された取得命令はこの重複の間に配置される。
【０１１２】
例えば、２つの変数を取得する命令が効率的であり、１つの変数を取得する命令が効率的でない、と考えられたと仮定する。図１０Ｂの事例では、ＰＥＧ  Ｐ１，Ｐ２にたいする準備として、どの変数も取得される必要が無い。しかしＰＥＧ  Ｐ３は変数Ｂを入力として必要とし、従ってコンパイラは、ＰＥＧ  Ｐ３に対する準備として実行されるデバイスメモリ５６からの取得命令を画定する。デバイスメモリに効率的にアクセスするため、コンパイラは、もう１つの変数取得を同じ命令内に集める。コンパイラは、このＰＥＧからの距離が最小（即ち、このＰＥＧからこの変数を最初に要求するＰＥＧまでの距離）の有効な変数を選択する。
【０１１３】
この事例では、変数ＳとＴはこの時点で有効であり、変数Ｔはより小さい距離を有している（６に対し３）。従ってコンパイラは、変数ＢとＴを取得するための取得命令を画定する。一度これら変数が取得されると、これらは再び取得されないようにリストから×印で取り消される。工程は同様の論理を使用して続き、コンパイラは、２つの追加の取得命令を画定する。１つはＰＥＧ  Ｐ４の前に変数ＣとＤを取得する命令であり、他の１つはＰＥＧ  Ｐ９の前に変数ＡとＳを取得する命令である。この技術を使用して各変数は、それが有効となった後でかつ最初に入力として必要とされる前に取得され、取得命令は、１つの命令当りの多重の変数の取得を統合することにより、効率的に画定される。
【０１１４】
図１０Ａと図１０Ｂの例は、特定の連鎖、特定の変数、１命令当り特定の数の取得、及び特定の選択基準に関している。しかし一般的には、コンパイラは、他の適合するＰＥＧ連鎖、変数、１命令当りの取得数、及び選択基準を有する事前取得体系を適用してもよい。典型的に類似の工程がＳＩＤ内の各ＰＥＧ連鎖に対し実行される。コンパイラは、上記の時間間隔と距離を記録するため、適合するいかなるデータ構造を使用してもよい。
【０１１５】
ある実施形態では、コンパイラは変数のデバイスメモリ５６への保存（ＰＥＧにより生成される出力）を遅らせ、１保存命令に多重の変数を集める。１保存命令に多重の変数を集めることは、デバイスメモリ５６への保存に伴うレイテンシと手間を減少させる。この種の遅延保存体系は図１０Ａと図１０Ｂの事前取得体系に類似した基準を使用して実行可能である。例えばコンパイラは、それぞれの変数に対して、変数の値を生成したＰＥＧから変数が入力として必要とされる時点までの時間間隔（例えば、異なるＳＩＤに属する可能性のある別の連鎖による、）を識別する。変数が他のＳＩＤの連鎖により入力として必要な場合、コンパイラは、この変数を生成する連鎖の終端（そしてこの連鎖内の個々のＰＥＧではない）を変数が準備を完了した時点と見做す。その後コンパイラは、多重の変数の保存命令を、これら時間間隔に基づいて画定する。
【０１１６】
図９の上部に示すように、所与のマルチプロセッサ装置４０が所与のＰＥＧ連鎖を実行する場合、マルチプロセッサ装置は変数をデバイスメモリ５６から特定の決定論的な順番でロードし、共有メモリ内にキャッシュし、それらを連鎖内の異なるＰＥＧに入力として供給する。ある実施形態では、コンパイラは、ＰＥＧ連鎖が変数をロードする命令に従って、デバイスメモリ５６内の変数を事前注文する。この体系を使用する場合は、ある所与のＰＥＧ連鎖は、命令された取得動作の順番を使用して、変数をデバイスメモリ５６から連続するメモリアドレスに取得することが出来る。
【０１１７】
図１１は本発明の実施形態に基づく、変数事前注文体系を示す概略図である。図１１の事例は上述した図９のキャッシング体系を示す。図の上部の領域２６６は、その連鎖内の異なるＰＥＧによりキャッシュされ共有メモリ５２から取り出された変数をしめす。領域２７０は各ＰＥＧのための準備としてデバイスメモリ５６から取得された変数を示す。太字の枠はその連鎖内の従前のＰＥＧにより既に読まれ、その間に共有メモリから取り出された変数を標識付けする。
【０１１８】
ある実施形態では、コンパイラは、変数をフィーダ領域２７４内のデバイスメモリ５６に保存する。あるＰＥＧ連鎖のフィーダ領域２７４では、変数は、そのＰＥＧ連鎖により変数が取得される順番で保存される。ある所与の変数は、フィーダ領域に沿って２つ以上の異なる位置に保存されることに注意する。これはキャッシュ容量が限られるため、ＰＥＧ連鎖が同じ変数を再度読むことがあるからである。また、各ＰＥＧ連鎖は、デバイスメモリ５６内に対応するフィーダ領域を有することにも注意する。ある所与の変数は異なるＰＥＧ連鎖の多重のフィーダ領域に保存されうる。
【０１１９】
典型的に、事前注文された変数はデバイスメモリ内で、ＧＰＵのメモリ配列と容量仕様に合致する、基礎セクションに配置される。これらのセクションはここでは以降「キャッシュライン」と呼ばれる。典型的なＧＰＵでは、各キャッシュラインは５１２ビットからなる。典型的に、異なる連鎖内のＰＥＧは、キャッシュラインユニット内の変数を生成し、使用し、交換する。
【０１２０】
（ＳＩＤ間及びＳＩＤ内の通信）  
上記のように、コンパイラは、各依存サブ木をＳＩＤに変換する。ある実施形態では、１つのＳＩＤ内の１つのＰＥＧにより生成される変数は、他の１つのＳＩＤ内の１つのＰＥＧにより入力として使用される。異なるＳＩＤ内のＰＥＧ間の通信は、典型的に、デバイスメモリ５６経由で行われる。ある実施形態では、コンパイラは、「メールボックス」と呼ばれるデータ構造内にＳＩＤ間で通信される変数を保存する。各メールボックス、は共通のＰＥＧ連鎖により生成され及び／又は使用された変数からなる。ＳＩＤｓ間の通信はメールボックスとの間でキャッシュラインを書込み、そして読み出すことにより行われる。このようにデバイスメモリ５６へのアクセスは、異なる変数間の使用と生成の共通性を利用することにより、効率的に実行される。
【０１２１】
図１２は、本発明の実施形態に基づく、多重静的呼び出しデータベース（ＳＩＤ）を示す概略図である。この事例は、ＳＩＤ−ＸとＳＩＤ−Ｙと記される２つのＳＩＤからなる。ＳＩＤ−Ｘは２つのＰＥＧ連鎖からなり、それらは其々４つのＰＥＧ２８０からなる。ＳＩＤ−Ｙは２つのＰＥＧ連鎖からなり、それらは其々２つのＰＥＧ２８０からなる。各ＰＥＧは最大３つの入力変数（各ブロックの左側に示される）を受け取ることが出来、そして１つの出力変数（各ブロックの右側に示される）を生成出来る。例えばＰＥＧ１／１は、変数ＡとＣを入力として受け入れ、変数Ｄを生成する。それぞれのＳＩＤ内には、ＳＩＤ−Ｘ内のＰＥＧ２／３とＰＥＧ１／４のように、幾つかの連鎖間の依存性も存在する。
【０１２２】
ある変数は進入変数及び排出変数、即ち、それぞれＣＰＵ（又は他のホスト環境）から入力され、ＣＰＵに出力する変数として定義される。この事例では、進入変数はＡ，Ｂ，Ｃ，ＦとＱからなる。排出変数はＳ，Ｇ，ＨとＰからなる。
【０１２３】
ある所与のＳＩＤにおいて、変数は生成された変数（ＳＩＤにより生成された）、使用された変数（ＳＩＤ内のＰＥＧにより入力として使用された）および入力変数（ＳＩＤ内のＰＥＧにより入力として使用されたが、ＳＩＤ内で生成されていない）にクラス分けされる。異なるクラス間で重複は存在する。本事例では、変数のクラス区分は次の表に示される：
【表２】
0005733860.tif 000005
【０１２４】
図１３は、本発明の実施形態に基づく、ＳＩＤ間通信の方法を示すフロー図である。方式は、ＳＩＤ間識別ステップ２８４において、コンパイラが１組のＳＩＤ間変数を識別することから始まる。ＳＩＤ間変数は、進入変数でも排出変数でもなく、かつ異なるＳＩＤ間で交換される変数からなる。コンパイラは、（１）全てのＳＩＤの全ての入力変数の組を識別する、（２）この組から進入変数と排出変数を取り除く、ことによりＳＩＤ間変数を識別する。この事例では、ＳＩＤ−ＸとＳＩＤ−Ｙの入力変数の組は、｛Ａ，Ｂ，Ｃ，Ｅ，Ｆ，Ｍ，Ｌ，Ｑ，Ｎ，Ｖ，Ｐ｝であり、進入変数の組は、｛Ａ，Ｂ，Ｃ，Ｆ，Ｑ｝であり、排出変数の組は、｛Ｓ，Ｇ，Ｈ，Ｐ｝である。従ってＳＩＤ間変数の組は、｛Ｅ，Ｍ，Ｌ，Ｎ，Ｖ｝である。
【０１２５】
次に使用／生成マッピングステップ２８８において、コンパイラは、異なるＳＩＤの異なるＰＥＧ連鎖による使用と生成に関して、ＳＩＤ間変数をマップする。本事例では、異なるＳＩＤ間変数の使用と生成は、次の表で与えられる：
【表３】
0005733860.tif 000006
ここにおいて、例えばＭ→（Ｘ１）は変数ＭがＳＩＤ−Ｘ内の連鎖１により生成されることを示す。一般的に、所与のＳＩＤ間変数は、いかなる所望の数のＳＩＤに属する、いかなる所望の数の連鎖によっても生成され、及び／又は使用される。
【０１２６】
次にコンパイラは、グループ化ステップ２９２において、共通の連鎖により生成され、かつ共通の連鎖により使用されたＳＩＤ間変数をグループに統合する。コンパイラは、メールボックスと呼ばれるデータ構造を其々のグループに対して定義する。これらメールボックスはデバイスメモリ５６内の一定の領域に保存される。各メールボックスは、典型的に、１つ以上のキャッシュラインを有する。本事例では、コンパイラは、次の４つのメールボックスを定義する：
【表４】
0005733860.tif 000007
【０１２７】
ＳＩＤ間通信ステップ２９６において、実行時に異なるＳＩＤは、キャッシュラインをメールボックスに書込み、そしてキャッシュラインをメールボックスから読み出すことにより、互いに通信する。各メールボックスは、同じ連鎖により生成され、同じ連鎖により使用されるＳＩＤ間変数を有するため、デバイスメモリ５６へのアクセスは効率的である。
【０１２８】
メールボックス機構の効率は、少なくとも部分的に、処理要素ＰＥの各ＳＩＤ内のＰＥＧ連鎖への割当に依存する。図８で説明したように、コンパイラは、他のＳＩＤ内の同じ処理要素ＰＥと通信する処理要素ＰＥを、同じＰＥＧ連鎖の中にグル−プ化しようとする。このグループ化が成功して適切に定義されている場合、図１３の方法は、各メールボックスが比較的多数の変数を有する、比較的少数のかつ適切に定義されたメールボックスのグループを生成する。
【０１２９】
ある実施形態では、コンパイラは、各メールボックス内の変数をＰＥＧ連鎖により要求される順番に従って整理することにより、デバイスメモリ５６へのアクセス効率をさらに向上させる。
【０１３０】
ある実施形態では、同じＳＩＤの中の異なるＰＥＧ連鎖が互いに変数を移送する。この通信の形はここでは「ＳＩＤ内通信」と呼ぶ。同じＳＩＤの中のＰＥＧ連鎖は、典型的に、変数値からなるキャッシュラインを、デバイスメモリ５６経由で交換することにより通信する。ＳＩＤ内通信は典型的に変数の有効性の制約を受ける。言い換えれば、あるＰＥＧ連鎖は、その変数を生成するＰＥＧが実行を完了した後にのみ、１つの変数を他の１つの連鎖に送る。ある実施形態では、コンパイラは、実行依存性を維持し、（キャッシュライン解決における）処理の回数を最小化するようなやり方で、ＰＥＧ連鎖間の通信処理を定義する。ＳＩＤ内通信は、典型的に、連鎖の間に導入されたＳＹＮＣ要素上で実行される。言い換えれば、１つの連鎖の実行を他の連鎖内の１つ以上のＰＥＧが実行を完了するまで停止するＳＹＮＣ要素はまた、変数をこれら他の連鎖から、停止された連鎖に送ってもよい。
【０１３１】
図１４Ａと１４Ｂは、本発明の実施形態に基づく、ＳＩＤ内通信体系を示す概略図である。図１４Ａは、３つのＰＥＧ連鎖を有するＳＩＤの例を示す。其々のＰＥＧに対し、入力変数はＰＥＧブロックの左側に示され、出力変数はブロックの右側に示される。
【０１３２】
図１４Ｂは４つのキャッシュライン３００を示し、それらは、図１４ＡのＳＩＤ内のＰＥＧ連鎖間の変数の送信に対してコンパイラが定義したものである。各キャッシュラインにより渡された変数は図内で括弧｛｝で囲まれている。コンパイラは、キャッシュライン３００を定義するために、種々の動的プログラミング技術のような、いかなる適合する工程を使用してもよい。典型的に、解決策は一意ではなく、多重の解決策が可能である。コンパイラは、キャッシュライン３００の数を最小化するような、既定の基準に合致する解決策を識別するように試みる。
【０１３３】
（ＳＩＤ間通信の効率を改善する技術）  
上記のように、異なるＳＩＤ間のＳＩＤ間変数の交換は、変数をデバイスメモリ５６内のメールボックスに保存することにより実施される。各メールボックスは１つ以上のキャッシュラインを有し、１つ以上のソース実行連鎖（１つ以上のソースＳＩＤ内の）と、１つ以上のターゲット実行連鎖（１つ以上のターゲットＳＩＤ内の）を伴う。典型的に、ＳＩＤ間変数は次のようにメールボックスに指定される：（１）同じＳＩＤの組と実行連鎖により生成され使用された変数は、同じメールボックスを指定される（２）同じＳＩＤｓの組と実行連鎖により生成され使用されない変数は、同じキャッシュラインを共有しないよう、異なるメールボックスを指定される（３）各変数は正確に１度だけメールボックスの集合の中に現れる。
【０１３４】
しかしある場合には、ＳＩＤ間変数の生成と使用は、変数のメールボックスへの効率的なグループ化を可能にしない。そのようなグループ化は少数の変数からなるメールボックスを生成するかもしれない。デバイスメモリが、キャッシュラインに存在する実際の変数の数に関係なく、キャッシュラインユニット内で読まれるため、少数の変数からなるメールボックスがキャッシュラインの有効利用を減ずるかもしれない。
【０１３５】
ある実施形態では、コンパイラは、閑散としたメールボックスからの２つ以上のＳＩＤ間のキャッシュラインを合体させ、混雑したキャッシュラインを生成する。キャッシュラインを統合することにより、デバイスメモリからのロード動作の回数は減少されうる。減少の程度は、統合されるキャッシュラインの選択による。例えば、コンパイラは、比較的重複の大きいターゲット実行連鎖の組の中でＳＩＤ間キャッシュラインを統合するように試みる。
【０１３６】
例として連鎖Ｓ１とＳ２に使用される１つのキャッシュラインＡと、連鎖Ｓ１，Ｓ２及びＳ３に使用される１つのキャッシュラインＢを考えてみる。キャッシュライン容量制限を超えることなくそれらを新しいキャッシュラインＣに統合することが可能なように、キャッシュラインＡもＢも十分に余裕があるものと仮定する。この例では、キャッシュラインＡとＢを統合してキャッシュラインＣを形成した後、連鎖Ｓ１とＳ２のそれぞれは、２つのキャッシュラインの代わりに、１つのキャッシュライン（統合キャッシュラインＣ）だけをロードする必要がある。連鎖Ｓ３も又、１つのキャッシュライン（キャッシュラインＢの代わりに統合キャッシュラインＣ）だけをロードする必要がある。全体として、デバイスメモリからのロード動作の回数は、キャッシュラインＡとＢを統合させた結果減少する。他の実施形態では、コンパイラは所望の数のキャッシュラインを統合する。
【０１３７】
あるいは、コンパイラは、ＳＩＤ内通信機構を使用して（即ち、連鎖間の同期化要素を使用して）、ターゲットＳＩＤ内のターゲット実行連鎖の間で変数が転送可能なＳＩＤ間キャッシュラインを統合する。  ＳＩＤ間通信を改善するために利用の少ないＳＩＤ内通信資源を利用する考え方は以下に詳述される。例えばＳ１，Ｓ２とＳ３の３つの実行連鎖と、Ａ，Ｂ、Ｃの３つのキャッシュラインの構成を考える。この例では、連鎖Ｓ１はキャッシュラインＡからの入力変数を持ち、連鎖Ｓ２はキャッシュラインＢからの入力変数を持ち、そして連鎖Ｓ３はキャッシュラインＣからの入力変数を持つ。また連鎖間の同期化機構が連鎖Ｓ１から連鎖Ｓ２へのデータ転送を可能にすると仮定する。連鎖Ｓ２内では、キャッシュラインＢからの入力変数は、連鎖Ｓ１との同期化の後ろに位置するＰＥＧからのみ必要とされる。この状態では、キャッシュラインＡとキャッシュラインＢを統合し、キャッシュラインＢの変数を連鎖Ｓ１と連鎖Ｓ２の同期化機構上で転送することが有利である。このような仕組みを使用する場合、連鎖Ｓ２は、キャッシュラインＢの変数を連鎖Ｓ１から同期化機構上で受け取るため、キャッシュラインＢをロードする必要はない。このようにコンパイラは、（１）異なるターゲット連鎖により使用されるキャッシュラインを統合する（２）ＳＩＤ内通信を使用して、１つのターゲット連鎖から他のターゲット連鎖へ変数を転送する、ことにより、デバイスメモリからのロード動作の回数を減少させる。
【０１３８】
ＳＩＤ間キャッシュラインが統合されているか否かに拘わらず、コンパイラは、以下に説明されるように、使用の少ないＳＩＤ内通信資源を利用して、デバイスメモリからのＳＩＤ間のキャッシュラインのロード動作回数を減少することが出来る。
【０１３９】
図１５は、本発明の実施形態に基づく、ＳＩＤ間通信及びＳＩＤ内通信の両方を使用するＳＩＤ３１０を示す概略図である。ＳＩＤ３１０は、他の１つのＳＩＤからＳＩＤ間キャッシュライン３１４をロードすることにより、ＳＩＤ間変数を受信する。この例では、キャッシュライン３１４からのＳＩＤ内変数は、ＳＩＤ３１０内の３つの実行連鎖３１８Ａ、３１８Ｂ，３１８Ｃにより使用される。（ＳＩＤ３１０は、このＳＩＤ間キャッシュラインからの変数を使用しない、他の追加の実行連鎖を有してもよい。）
【０１４０】
ＳＩＤ間変数を送信するためにＳＩＤ内資源を使用しなければ、３つの実行連鎖３１８Ａ、３１８Ｂ，３１８Ｃの各々は、入力変数を取得するため、デバイスメモリ５６の適切なメールボックスから、キャッシュライン３１４を個別にロードしなくてはならない。このように３つの個別のロード動作が必要となる。或いは、キャッシュライン３１４はそれら連鎖のサブ組（例えば、単一の連鎖）のみによりロードされ、他の連鎖はＳＩＤ内通信を使用して変数を受け取ってもよい。
【０１４１】
ＳＩＤ３１０では、例えばＳＹＮＣ３２６Ａが、連鎖３１８Ａ内のあるＰＥＧに対し
連鎖３１８Ｂ内のあるＰＥＧを同期化し、ＳＹＮＣ３２６Ｂが、連鎖３１８Ｂ内のあるＰＥＧに対し連鎖３１８Ｃ内のあるＰＥＧを同期化する。各ＳＹＮＣは、ＳＩＤ内キャッシュラインを伴い、それは変数をＳＹＮＣに依存し同期化する連鎖から同期化される連鎖へ転送する。（又はより正確には、同期化するＰＥＧから同期化されるＰＥＧへ）。例えば、ＳＹＮＣ３２６Ａは、変数を連鎖３１８Ａから３１８Ｂに転送する１つのＳＩＤ内キャッシュラインを伴う。
【０１４２】
ＳＩＤ内キャッシュラインが未割当のバンド幅を有すると仮定すると、それらＳＩＤ内キャッシュラインは連鎖３１８Ａから連鎖３１８Ｂへ、及び連鎖３１８Ｂから連鎖３１８Ｃへデータを送信するのに使用可能である。このように、ある場合には、連鎖３１８Ａだけにデバイスメモリからキャッシュラインを実際にロードさせ、その後その変数を、ＳＹＮＣｓ３２６Ａと３２６Ｂに依存するＳＩＤ内キャッシュライン上で、連鎖３１８Ｂと３１８Ｃに転送させることにより、３つ連鎖３１８Ａ・・・Ｃの全てがＳＩＤ間キャッシュライン３１４の変数を取得できる。
【０１４３】
この解決法は、所与の連鎖において、ＳＩＤ間変数を使用するＰＥＧがＳＹＮＣの後に配置され、そのＳＹＮＣのＳＩＤ内キャッシュラインがその変数をその連鎖に転送するのに使用される、と仮定すれば可能である。連鎖３１８ＡはＳＩＤ間キャッシュラインをデバイスメモリ５６から実際にロードする連鎖であるため、連鎖３１８Ａ内のＰＥＧ３２２Ａは、ＳＩＤ間変数にアクセスできる。連鎖３１８Ｂでは、ＰＥＧ３２２Ｂは、ＳＹＮＣ３２６Ａの後に位置するため、送信された変数にアクセスできる。連鎖３１８Ｃでは、ＰＥＧ３２２Ｄは、ＳＹＮＣ３２６Ｂの後に位置するため、送信された変数にアクセスできる。ＰＥＧ３２２Ｃは、ＳＹＮＣ３２６Ｂの前に位置するため、送信された変数にアクセスできない。
【０１４４】
もしＰＥＧ３２２ＣがＳＩＤ間キャッシュライン３１４からの変数を使用する必要がある場合、連鎖３１８Ｃは、追加のロード動作を受けて、このＳＩＤ間キャッシュラインを別個にロードする必要がある。このシナリオでは、ＳＹＮＣ３２６ＢのＳＩＤ内キャッシュラインは、ＳＩＤ間キャッシュライン３１４からの変数転送に使用されない。
【０１４５】
ある実施形態では、コンパイラは、所与のＳＩＤにより実行される、ＳＩＤ間キャッシュライン動作の回数を、ＳＩＤ間変数を運ぶための変数資源をＳＩＤ内ＳＹＮＣｓ上で割り当てることにより、減らすように試みる。この工程は典型的に各ＳＩＤに対して実行される。この種の工程の１例が以下の図１６、図１７で示される。しかし或いは、他の適合する工程も使用可能である。
【０１４６】
図１６と図１７の工程はＦとＰで記される２つの関数を使用する。所与の実行連鎖ｓと１つのＳＩＤ間変数ａに対して，関数Ｆ（ｓ，ａ）は、変数ａを入力として使用する連鎖ｓ内に最初のエントリー（ＰＥＧ）を返す、静的関数である。言い換えれば、変数ａは連鎖ｓの共通メモリに、Ｆ（ｓ，ａ）より遅れずに、供給されなければならない。変数ａが連鎖ｓのどこでも入力として使用されない場合は、Ｆ（ｓ，ａ）＝∞である。
【０１４７】
関数Ｐ（ｓ＿ｓｅｑ，ｓ＿ｏｆｆ，ｔ＿ｓｅｑ，ｔ＿ｏｆｆ，ｒｅｑ＿ｓｉｚｅ）は１組の（１つ以上の）パスをＳＩＤ経由で返し、その上で、所与の寸法ｒｅｑ＿ｓｉｚｅのデータが１つのソース連鎖ｓ＿ｓｅｑからターゲット連鎖ｔ＿ｓｅｑに転送されうる。返されたパスは、ソース連鎖の中でオフセットｓ＿ｏｆｆ以降に始まり、ターゲット連鎖にｔ＿ｏｆｆ以前に到着する。関数Ｐは、ＳＩＤ内通信資源の割当に対応して、コンパイル中に変化しうる。ある実施形態では、Ｐも又、ｔ＿ｏｆｆで使用が必要な１列の変数を受け取る。関数Ｐは、典型的に、変数の幾つかは既に連鎖間の同期化経由で転送されていることを考慮に入れる。ある実施形態では、Ｐは、データ転送に使用可能な多重のパスの組合せを返す。
【０１４８】
工程は又、Ｈと記されるデータベースを使用する。ＳＩＤに使用される各ＳＩＤ間キャッシュラインに対し、データベースＨは、このキャッシュラインを使用する連鎖の複数のクラスへのクラス分けを保持する。クラスは典型的に其々のリストで表わされる。この事例では、連鎖は６つのクラスにクラス分けされる：
・マストロード（ＭＬ）：ＳＩＤ内ＳＹＮＣｓ上でＳＩＤ間変数を受信できないため、ＳＩＤ間キャッシュラインをデバイスメモリ５６からロードしなければならない連鎖。
・シュッドロード（ＳＬ）：ＭＬ連鎖ではないが、工程から、ＳＩＤ間キャッシュラインをデバイスメモリ５６からロードするように要求された連鎖。
・配置されたロード（ＰＬ）：ＳＩＤ間キャッシュラインをデバイスメモリ５６からロードすることなく、他の連鎖からＳＩＤ間変数を受信する連鎖で、それに対し適切な資源がＳＩＤ内キャッシュライン上で割り当てられている連鎖。
・ルート依存（ＲＤ）：いまだＳＬ，ＭＬ又はＰＬクラスに指定されていない連鎖であって、ＳＩＤ内キャッシュライン経由でＳＬ，ＭＬ又はＰＬクラスの少なくとも１つの連鎖に到達可能な連鎖。
・遠い依存（ＦＤ）：ＳＬ，ＭＬ又はＰＬクラスのどの連鎖によっても到達出来ない連鎖。
・未分解（Ｕ）：クラスが未分解な連鎖。（ＦＤとＵの差異は、ＦＤクラスの連鎖は、ＲＤまたはＦＤクラスの連鎖からは到達可能であるが、ＳＬ，ＭＬ又はＰＬクラスの連鎖からは到達出来ないことである。）
【０１４９】
以下の記述は、連鎖のクラスへのクラス分けを伴う、所与のＳＩＤ間キャッシュラインに関している。以下の工程は各ＳＩＤ間キャッシュラインに対し繰り返される。
【０１５０】
ある所与の時点において、各クラスはどんな数の連鎖を有してもよいが、所与の１つの連鎖は１つのクラスにしか現れない。上記のように、対象となるＳＩＤ間キャッシュラインからの変数を使用する連鎖のみがクラス分けされる。図１６と図１７の工程は、相互作用工程であり、全ての連鎖がＵクラスであるところから始まる。（典型的に、Ｕクラスは最初、対象となるＳＩＤ間キャッシュライン上で運ばれる変数を使用する、連鎖のみを有する。他の連鎖は典型的に、無視される。）工程はＵクラスが空で、全ての連鎖がＳＬ，ＭＬ又はＰＬに指定されて終了する。工程が終了すると、ＳＬとＭＬクラスの各連鎖は、個別にＳＩＤ間キャッシュラインをロードするように定義され、ＰＬクラスの連鎖は、キャッシュラインをロードすることなく、ＳＩＤ間変数を他の連鎖から受け取るように定義される。ＳＩＤ間ＳＹＮＣの適切な資源がＳＩＤ間変数をＰＬクラスの連鎖に届けるために割り当てられる。
【０１５１】
図１６は、本発明の実施形態に基づく、ＳＩＤ間通信を減らす方法を示す状態遷移図３３０である。状態遷移図３３０は、それぞれＵ，ＭＬ、ＳＬ，ＰＬ，ＲＤとＦＤクラスを示す状態３３４，３３８，３４２，３４６，３４８及び３５０を有する。状態間の遷移は矢印で示される。繰り返し割当工程は、Ｕクラスが空で、全ての連鎖がＳＬ，ＭＬ又はＰＬに指定されるまで、連鎖をクラスからクラスへ（状態から状態へ）これら遷移上で移動させる。  
【０１５２】
図１７は、本発明の実施形態に基づく、ＳＩＤ間通信を減らす方法を示すフロー図である。（工程は典型的に、各ＳＩＤ間キャッシュラインに対して繰り返される。）方法は、初期化ステップ３６０において、コンパイラがデータベースＨを初期化することから始まる。現在処理されているＳＩＤ間キャッシュラインは、「ｃ」と記される。キャッシュラインｃを使用する各連鎖ｓ（即ち、式Ｆ（ｓ，ｃ）≠∞を満たす連鎖）に対し、コンパイラは、その連鎖をＵクラスに追加する。
【０１５３】
コンパイラは次に、分解ステップ３６４において、関数ＳとＰを使用して、キャッシュラインｃを分解するように（即ち、Ｕクラス内の連鎖をクラス分けするように）試みる。分解ステップは、以下の連続する複数の段階からなる：
１）ＭＬ分解段階：Ｕクラス内の各連鎖ｓに対して、コンパイラは、連鎖ｓで使用されるキャッシュラインｃの変数がこのキャッシュラインを使用する他の連鎖から得られるかどうかをチェックする。（関数Ｆを使用して変数を提供する可能性のある連鎖が識別される。関数Ｐを使用して変数を転送する可能性のあるパスが識別される。）連鎖ｓに対し変数を取得するための連鎖やパスが見つからない場合は、コンパイラは連鎖ｓをＵクラスから除外しＭＬクラスに追加する。
２）ＲＤ分解段階：Ｕクラス内の各連鎖に対し、コンパイラは、（ＦとＰを使用して）必要な変数をキャッシュラインｃから取得できる連鎖を、ＳＬ，ＭＬ又はＰＬクラス内の連鎖から識別する。コンパイラは識別された連鎖をＵクラスから除外しＲＤクラスに追加する。
【０１５４】
３）コンパイラは、Ｕクラスが空になるまで次の３つのサブ段階を繰り返す：
ａ）ＲＤサブ段階：コンパイラは、関数ＦとＰを使用し、必要な変数をＳＬクラス内の連鎖からのキャッシュラインｃから取得できる連鎖を、識別する。コンパイラは識別された連鎖をＵクラスから除外しＲＤクラスに追加する。
ｂ）ＦＤサブ段階：コンパイラは、関数ＦとＰを使用し、必要な変数をＲＤまたはＦＤクラス内の連鎖からのキャッシュラインｃから取得できる連鎖を、識別する。コンパイラは識別された連鎖をＵクラスから除外しＦＤクラスに追加する。少なくとも１つの連鎖が発見された場合、ＦＤサブ段階は繰り返される。
ｃ）ＳＬサブ段階：この段階は循環依存性パターンを２つ以上の連鎖の間で識別し、分解する。循環依存性は上記特許文献５のセクション１０．３．１．２．４に記載されている。
１．コンパイラは、連鎖ｓをキャッシュラインｃのＵクラスリストから選択する。ｒｅｑ＿ｏｆｆｓｅｔと記される変数はＦ（ｓ，ｃ）に設定される。
２．コンパイラは、関数Ｐを使用して、Ｕクラス内の連鎖（連鎖ｓを除く）をスキャンし、連鎖ｓが必要なキャッシュラインｃの変数を、ｒｅｑ＿ｏｆｆｓｅｔより遅くないオフセットにおいて提供可能な、ソース連鎖を識別するように試みる。
３．ソース連鎖ｓｓが発見された場合、ｓはｓ＝ｓｓとなるように設定され、ｒｅｑ＿ｏｆｆｓｅｔは、その中でｓｓがキャッシュラインｃを使用可能にする必要があるオフセットに設定される。
４．ソース連鎖が発見されない場合、コンパイラは連鎖ｓをＵクラスから除外し、ＳＬクラスに追加する。
【０１５５】
分解ステップ３６４を終了後は、所定の１つのＳＩＤ間キャッシュラインｃに対し、Ｕクラスは空であり、キャッシュラインｃを使用する連鎖はＭＬ，ＳＬ，ＲＤおよびＦＤにクラス分けされている。ＭＬとＳＬクラスの連鎖は、キャッシュラインｃを個別にデバイスメモリ５６からロードする、と定義され、そしてこの定義は、後続の工程の繰り返しの間不変である。
【０１５６】
コンパイラは、配置ステップ３６８において、ＳＩＤ間変数をＲＤクラスの連鎖に提供するための、ＳＩＤ内資源を割り当てるように試みる。典型的に、データベースＨ内のＲＤクラスリストのいずれかに連鎖が残っている限り、コンパイラは、所定のＳＩＤ間キャッシュラインｃに対し次の工程を実行する：
１）キャッシュラインｃのＲＤクラス内の連鎖の中から、コンパイラは、このキャッシュラインから必要とするデータ寸法が最小の、連鎖ｓを選択する。コンパイラは、（関数Ｐを使用して）要求された変数を、これら変数を既に持つ連鎖から、連鎖ｓへ届けるために、ＳＩＤ内キャッシュライン資源を最小量使用する１つのパスｐ（又は多重のパスの組合せ）を選択する。パスｐが１つより多いホップを横切る（即ち、１つ以上の中間連鎖を経由して連鎖ｓに到達する）場合、そのパスに沿う多重のＳＩＤ内キャッシュライン上の資源は考慮されなければならない、ことに注意が必要である。
２）適合するパスｐが発見されない場合、ステップ３６８は終了する。
３）適合するパスｐが発見された場合、コンパイラは連鎖ｓをＲＤクラスから除外し、ＰＬクラスに追加する。
４）コンパイラは、連鎖ｓに要求されたキャッシュラインｃのＳＩＤ間変数を運ぶため、パスｐ上でのＳＩＤ内キャッシュラインの使用をコミット（割当）する。コンパイラは、新しく割り当てられた資源に起因する可能なパス内の可能な変化を反映するため、関数Ｐをリフレッシュする。
【０１５７】
この段階において、コンパイラは、典型的に、ＳＩＤ内通信資源をＲＤクラス内の幾つかの連鎖に付託しており、それに従いそれら連鎖をＰＬクラスに移動した。クラスＲＤに残っている連鎖に対し、コンパイラは、それら連鎖に必要なＳＩＤ間変数を提供するための、使用可能な資源を有するパスを発見できなかった。
【０１５８】
コンパイラは、次に再シャッフルステップ３７２において、ＲＤとＦＤクラス内の連鎖を再シャッフルする。このステップでコンパイラは、ＲＤとＦＤクラス内の全ての連鎖（残っていれば）をＵクラスに移動する。コンパイラは、空チェックステップ３７６において、Ｕクラスが空か否かチェックする。Ｕクラスに残っている連鎖があれば、方式は先のステップ３６４に戻り、コンパイラは、現在未分解の連鎖を分解するように試みる。Ｕクラスが空の場合は、全ての連鎖がＭＬ，ＳＬ又はＰＬにクラス分けされており、方式は終了ステップ３８０において、終了する。ＭＬおよびＳＬクラス内の各連鎖は、個別にＳＩＤ間キャッシュラインをデバイスメモリからロードする。
【０１５９】
ＰＬクラス内の各連鎖は、事前に定義され、かつ事前に割り当てられた、１つ以上のＳＩＤ内キャッシュラインのパス上で、必要なＳＩＤ間変数を他の連鎖から受け取る。このように、この技術を使用する場合、ＳＩＤ間キャッシュラインのデバイスメモリ５６からのロード動作の回数が減少され、それにより、全体的なＳＩＤ実行時間が短縮される。
【０１６０】
（依存性問題アプリケーションの事例）
ここに記述される方法とシステムは、広範囲の分野と応用における依存性問題を解くのに使用可能である。一般的に、１組の実行依存性を有する処理要素（処理要素ＰＥ）で表示可能なコンピュータ計算タスクは、開示された技術により、並行かつ効率的に処理可能である。以下の記述は、幾つかの依存問題のタイプを概観する。開示された技術は、決してこれら事例に制限されず、他の適合するタイプの依存問題の解決に使用可能である。
【０１６１】
ある実施形態では、システム２０により解決される依存性問題は、シミュレーションによりハードウェア設計を評価するタスクを有する。このアプリケーションは上記の特許文献１４に詳述されている。典型的な設計評価アプリケーションでは、図１のサーバ２４は、使用者、例えば評価技術者からシミュレートされる設計の定義を受け取る。設計は典型的に、ＶＨＤＬまたはＶｅｒｌｏｇのようなハードウェア記述言語（ＨＤＬ）で記載された、１つ以上のファイルとして受け取る。サーバは又、設計の評価環境を特定する、テストベンチの定義を受け取る。テストベンチは設計に適用される外部同期イベント（例えば、クロック信号、レセット信号及び種々の入力）を特定する。テストベンチは又、シミュレートされた設計に適用されるテストを特定する。テストベンチは典型的に、Ｃ、Ｖｅｒｉｌｏｇ又は、Ｅ又はＳｙｓｔｅｍ−Ｖｅｒｉｌｏｇのような評価特有の言語で記述されたソフトウェアを有する。
【０１６２】
ＣＰＵ２８上で走るコンパイラは、テストベンチと設計をコンパイルし、シミュレーション符号を生成し、そしてその後シミュレーション符号をＣＰＵ２８とＧＰＵ３２上で走らせる。詳しくは、コンパイラは、設計とテストベンチを処理要素ＰＥと依存性を有する依存図の中に再度差し出し、非循環サブ図を依存図より抽出し、そして各サブ図のＳＩＤを生成する。ＧＰＵは、シミュレーション結果を作成するため、異なるＳＩＤを実行するように呼び出される。シミュレーション結果（例えば、テストの良否、疑わしい誤り、誤りの位置、および使用者が設計を評価するのに役立つ他の情報）が使用者に提供される。
【０１６３】
あるいは、ここに記載された方法とシステムは、リアルタイムビデオ処理、画像処理、ソフトウェア定義ラジオ（ＳＤＲ）、種々の通信アプリケーションにおけるパケット処理、及び誤り訂正符号のようなアプリケーションで遭遇する、コンピュータ計算タスクを実行するのに使用可能である。これら全てのアプリケーションは、典型的に、例えば、デジタルフィルタリングや高速フーリエ変換（ＦＦＴ）などのような、依存性問題として表わされる複雑な計算タスクを含む。このようなタスクは、並列化やここに記載された方法やシステムを使用した解決に自然に適応できる。デジタルフィルタやＦＦＴ計算要素を示す特定の事例は、それぞれ図１８と図１９に示される。繰り返すが、計算タスク（例えば、ここに示される事例や他のタスク）は、依存図として表現され、それは並列化され、ここに記載される方法とシステムにより解決可能である。上記のように、依存図は１組のサブ図に変換でき、各サブ図は、コンパイルされて１つのＳＩＤを生成し、そして、ＧＰＵはＳＩＤを実行して結果を生成する。
【０１６４】
図１８は、本発明の実施形態に基づく、有限インパルス応答（ＦＩＲ）デジタルフィルタを表わす依存図４００である。依存図４００で表わされたデジタルフィルタは、入力信号ｘ［ｎ］を、ａ０，．．．ａＮ−１で記されるフィルタ係数の１組Ｎによりフィルタし、フィルタされた出力信号ｙ［ｎ］を生成する。フィルタ動作は次式で与えられる。
【数３】
0005733860.tif 000008
この種のＦＩＲフィルタは、通信受信機、送信機、画像処理分野、医療画像分野など、多くの信号処理のアプリケーションで一般的である。
【０１６５】
図４００は、例えば共通クロック信号に同期したフリップフロップ処理要素ＰＥ４１０、乗算器処理要素ＰＥ４１４及び１つの加算器処理要素ＰＥ４１８のような、幾つかのタイプの処理要素ＰＥを有する。実行依存性は図の中に矢印でしめされる。例えば、あるクロックサイクルにおいて、所与の乗算器処理要素ＰＥ４１４は、所与のフリップフロップ処理要素ＰＥ４１０の出力に、フリップフロップ処理要素ＰＥが実行を完了し、その出力が有効な時にだけ、対応するフィルタ係数を乗じることが出来る。無限インパルス応答（ＩＩＲ）等の他の種類のデジタルフィルタも依存図として同様に表現される。
【０１６６】
図１９は、本発明の実施形態に基づく、高速フーリエ変換（ＦＦＴ）計算要素を表わす依存図４２０である。周知のように、ＦＦＴ計算は、１組の基礎的計算要素、ときに「蝶」と呼ばれるが、によって効率的に実行される。依存図４２０は単一の計算要素を示す。典型的なＦＦＴアプリケーションでは、多重のこのような要素が直列及び／又は並列に接続される。依存図４２０は加算器／乗算器処理要素ＰＥ４２４からなる。各処理要素ＰＥ４２４は２つの入力を受ける。ある処理要素ＰＥ入力が重みＷＮＫで標識付けされる場合、その処理要素ＰＥは、入力を他の入力に加算する前に、入力にその重みを乗ずる。例えば、図の最上部左側の処理要素ＰＥはｖ［０］＋ｖ［１］・Ｗ４０  で与えられる出力を生成する。ＷＮＫは次式で与えられる：
【数４】
0005733860.tif 000009
Ｎ＝４の場合の典型的な実施例では、重みは、Ｗ４０＝１、Ｗ４１＝ｉ，Ｗ４２＝−１，Ｗ４３＝−ｉで与えられる。或いは、他の適合する重み値が使用可能である。この種のＦＦＴ生産要素は、周波数領域信号処理及び誤り訂正符号（ＥＣＣ）等、広い分野での応用アプリケーションで一般的である。
【０１６７】
（追加実施形態及び変化形）
ある実施形態では、コンパイラは、処理要素ＰＥをＰＥＧに合体させる工程を適用する。この工程の出力は、頂点（ＰＥＧを示す）とエッジ（ＰＥＧ間依存性を示す）からなる図である。工程は典型的に、ＰＥＧ間依存性の数を最小化する方法で、処理要素ＰＥをＰＥＧにグループ化しようと試みる。この種のグループ化は、典型的に、より少ない連鎖間ＳＹＮＣを有するＳＩＤをもたらす。統合工程の例は前掲の特許文献３のセクション５．５．１に記載されている。
【０１６８】
ある実施形態では、コンパイラは、処理要素ＰＥの実行時間に沿って進みながら、ＳＩＤを繰り返し構築するように試みる。この工程では、コンパイラは、長い前方位相（ＦＰ）を有する処理要素ＰＥを最初に配置し、そしてそれらを混雑していない実行連鎖内に配置する。さらにコンパイラは、ＳＹＮＣの追加を必要としない連鎖の中に処理要素ＰＥを配置することを高い優先順位に置く。ＳＩＤ生成工程の事例は前掲の特許文献３のセクション６．３．６に記載されている。コンパイラは、一般的に、処理要素ＰＥのＦＰ長さ、実行連鎖の占有レベル及び／又はＳＹＮＣの可能性のある追加を考慮する、他の基準又は経験に基づいて、処理要素ＰＥを実行連鎖内に配置してもよい。
【０１６９】
ある実施形態では、ＣＰＵとＧＰＵは共同して、依存問題をシミュレートするイベント駆動（ＥＤＥ）シミュレータを走らせる。イベント駆動工程は、前掲の特許文献１のセクション６．８に記載されている。詳しくは、コンパイラは、ＣＰＵ上で走るシミュレーションの即時更新が必要な中で、あるＳＩＤの実行が他の１つのＳＩＤの実行の引き金となるケースを識別してもよい。この仕組みはＧＰＵとＣＰＵの相互作用のレイテンシを節約する。この技術は前掲の特許文献２のセクション５．２．１に記載されている。    
【０１７０】
上記の実施形態は、例として示され、本発明は上記で詳細に示され記述されたものに限定されない。むしろ本発明の範囲はここに記載された種々の特徴の組合せやサブ組合せを含み、この記述を読んだ当業者が想起する、従来技術で開示されていない、変化形や変更を含む。
【符号の説明】
【０１７１】
２０：システム          ２４：サーバ            ２６：インタフェース
２８：ＣＰＵ            ３２：画像処理ユニット（ＧＰＵ）
３６：ユーザ基地        ４０：マルチプロセッサ装置  ４４：プロセッサ
４８：ローカルレジスタ  ５２：共有メモリ        ５６：デバイスメモリ
６０：命令ユニット      ６４：ブロックマネージャ
１６０：グリッド        １６８：ワープスロット  
１７２：ＳＹＮＣワープ  ３１０：ＳＩＤ        
３１４：ＳＩＤ間キャッシュライン
３１８：実行連鎖        ３２２：ＰＥＧ        ３２６：ＳＹＮＣ
【図１】
0005733860.tif 000010
【図２】
0005733860.tif 000011
【図３】
0005733860.tif 000012
【図４】
0005733860.tif 000013
【図５】
0005733860.tif 000014
【図６】
0005733860.tif 000015
【図７】
0005733860.tif 000016
【図８】
0005733860.tif 000017
【図９】
0005733860.tif 000018
【図１０Ａ】
0005733860.tif 000019
【図１０Ｂ】
0005733860.tif 000020
【図１１】
0005733860.tif 000021
【図１２】
0005733860.tif 000022
【図１３】
0005733860.tif 000023
【図１４Ａ】
0005733860.tif 000024
【図１４Ｂ】
0005733860.tif 000025
【図１５】
0005733860.tif 000026
【図１６】
0005733860.tif 000027
【図１７】
0005733860.tif 000028
【図１８】
0005733860.tif 000029
【図１９】
0005733860.tif 000030