(57)【要約】方法は、スパース三角行列を圧縮スパース行（ＣＳＲ）データセットとして格納することを含む。第１のベクトル内の複数の要素毎に、要素の値は、要素について、第１のベクトル内の１つ以上の先行要素のセットを識別することによって計算される。要素の値は、１つ以上の先行要素の各々に依存する。１つ以上の先行要素の全ての値が解かれたことを完了アレイが示すことに応じて、行列の行内の１つ以上の要素、及び、行に対応する積値に基づいて、要素の値が計算される。完了アレイにおいて、要素が解かれたことを示す、要素の第１の完了フラグがアサートされる。【選択図】図８
2021513172.tif 000002
【特許請求の範囲】
【請求項１】
スパース三角行列を圧縮スパース行（ＣＳＲ）データセットとして格納することと、
第１のベクトル内の複数の要素毎に、
前記要素について、前記第１のベクトル内の１つ以上の先行要素のセットを識別することであって、前記要素の値は、前記１つ以上の先行要素の各々に依存する、ことと、
前記１つ以上の先行要素の全ての値が解かれたことを完了アレイが示すことに応じて、前記行列の行内の１つ以上の要素、及び、前記行に対応する積値に基づいて、前記要素の値を計算することと、
前記完了アレイにおいて、前記要素が解かれたことを示す、前記要素の第１の完了フラグをアサートすることと、
によって、前記要素の値を計算することと、を含む、
方法。
【請求項２】
前記行列の要素を前記ＣＳＲデータセットの値アレイに格納することと、
前記ＣＳＲデータセットの列アレイにおいて、前記値アレイに格納された前記要素毎に前記行列の列を識別することと、
前記ＣＳＲデータセットの行ポインタアレイにおいて、前記行列の各々の行内の前記要素を識別することと、をさらに含む、
請求項１の方法。
【請求項３】
前記複数の要素毎に、前記要素の値を計算するためのスレッドを開始することをさらに含み、
前記スレッドは、並列に実行される複数のスレッドのうち１つのスレッドである、
請求項１の方法。
【請求項４】
前記複数のスレッド毎に、
前記完了アレイ内の第２の完了フラグを監視するために前記スレッドにおいて実行されるスピンループの反復回数をカウントすることであって、前記第２の完了フラグは、１つの前記先行要素に関連付けられている、ことと、
前記反復回数が制限を超えたことに応じて、
前記スピンループを終了することと、
複数の並列処理スレッドの全てが完了した場合に、実行される子カーネルをエンキューすることと、
前記子カーネルにおいて新たなスレッド内の前記完了フラグを監視することと、をさらに含む、
請求項３の方法。
【請求項５】
子開始フラグをチェックすることであって、前記子カーネルをエンキューすることは、前記子開始フラグがデアサートされた場合に実行される、ことと、
前記子カーネルをエンキューすることに関連して、前記子開始フラグをアサートすることと、をさらに含む、
請求項４の方法。
【請求項６】
前記複数の要素毎に、
第１のスピンループを実行して、前記完了アレイ内の第１の完了フラグを監視することであって、前記第１の完了フラグは、前記ＣＳＲデータセットの列アレイ内の第１の位置において指定されており、前記列アレイ内の前記第１の位置は、前記要素に対応する行ポインタによって示されている、ことと、
前記第１の完了フラグがアサートされ、前記列アレイ内の第２の位置が前記スパース三角行列の非対角線要素に対応すると判別したことに応じて、第２のスピンループを実行して、前記完了アレイ内の第２の完了フラグを監視することであって、前記第２の完了フラグは、前記列アレイ内の前記第２の位置において指定されている、ことと、をさらに含む、
請求項１の方法。
【請求項７】
行ポインタアレイ内の前記行ポインタの位置は、前記ベクトル内の前記要素の位置に対応しており、
前記行ポインタは、前記列アレイ内の前記第１の位置のインデックスであり、
前記列アレイの前記第１の位置は、前記完了アレイの前記完了フラグのインデックスを格納する、
請求項６の方法。
【請求項８】
前記複数の要素毎に、
前記先行要素の各々の完了フラグを格納することと、
前記先行要素の前記完了フラグの中で最高値を有する完了フラグをインクリメントすることによって、前記要素の前記完了フラグの値を決定することと、
前記要素の前記完了フラグの決定された値を、前記要素に対応する位置の前記完了アレイに格納することによって、前記要素の前記完了フラグをアサートすることと、をさらに含む、
請求項１の方法。
【請求項９】
第２のベクトル内の複数の要素毎に、前記完了アレイ内の前記要素に対応する前記完了フラグの値に基づいて、前記要素の階層を決定することと、
決定された前記階層に応じた順序で前記第２のベクトル内の各要素の値を計算することであって、同一の階層内の前記複数の要素のうち少なくとも２つの要素の値は、並列に計算される、ことと、をさらに含む、
請求項８の方法。
【請求項１０】
前記ＣＳＲデータセットは、メモリシステムに格納され、
前記複数の要素毎に、前記要素の値は、前記メモリシステムに接続されたソルバー回路において計算される、
請求項１の方法。
【請求項１１】
スピンループ回路を使用して、前記完了アレイから前記第１の完了フラグを読み出すことをさらに含み、
前記完了アレイは、メモリシステムに格納されており、
前記完了アレイの前記第１の完了フラグをアサートすることは、前記スピンループ回路と前記メモリシステムとに接続されたソルバー回路によって実行される、
請求項１の方法。
【請求項１２】
スパース三角行列を圧縮スパース行（ＣＳＲ）データセットとして格納するように構成されたメモリと、
前記メモリに接続された処理ユニットと、を備え、
前記処理ユニットは、
第１のベクトル内の複数の要素毎に、
前記要素について、前記第１のベクトル内の１つ以上の先行要素のセットを識別することであって、前記要素の値は、前記１つ以上の先行要素の各々に依存する、ことと、
前記１つ以上の先行要素の全ての値が解かれたことを完了アレイが示すことに応じて、前記行列の行内の１つ以上の要素、及び、前記行に対応する積値に基づいて、前記要素の値を計算することと、
前記完了アレイにおいて、前記要素が解かれたことを示す、前記要素の完了フラグをアサートすることと、
によって、前記要素の値を計算する、ように構成されている、
コンピューティングデバイス。
【請求項１３】
前記ＣＳＲデータセットは、
前記行列の要素を格納するように構成された値アレイと、
前記値アレイに格納された前記要素の各々についての前記行列の列を識別するように構成された列アレイと、
前記行列の各々の行内の前記要素を識別するように構成された行ポインタアレイと、をさらに含む、
請求項１２のコンピューティングデバイス。
【請求項１４】
前記処理ユニットは、
前記ベクトル内の１つの前記要素の値を計算するために複数の並列スレッドのスレッドをそれぞれ実行するように構成された複数のプロセッシングコアを含む、
請求項１２のコンピューティングデバイス。
【請求項１５】
前記複数のプロセッシングコアの各々は、
前記スレッドにおいてスピンループを実行することによって、前記完了アレイ内の完了フラグを監視することと、
前記スピンループの反復回数が所定の制限を超えたことに応じて、
前記スピンループを終了することと、
複数の並列処理スレッドの全てが完了した場合に、前記完了フラグを監視するための新たなスレッドを実行することと、
を行うように構成されている、
請求項１４のコンピューティングデバイス。
【請求項１６】
前記処理ユニットは、
第１のスピンループを実行して前記完了アレイ内の第１の完了フラグを監視することであって、前記第１の完了フラグは、前記ＣＳＲデータセットの列アレイ内の第１の位置において指定されており、前記列アレイ内の前記第１の位置は、第１のベクトル内の前記複数の要素のうち１つに対応する行ポインタによって示されている、ことと、
前記第１の完了フラグがアサートされたと判別し、前記列アレイ内の第２の位置が前記スパース三角行列の非対角線要素に対応すると判別したことに応じて、第２のスピンループを実行して前記完了アレイ内の第２の完了フラグを監視することであって、前記第２の完了フラグは、前記列アレイ内の前記第２の位置において指定されている、ことと、
を行うように構成された複数のプロセッシングコアを含む、
請求項１２のコンピューティングデバイス。
【請求項１７】
前記メモリ内の完了アレイをさらに備え、前記完了アレイは、前記複数の要素毎に完了フラグを格納するように構成されており、
前記処理ユニットは、前記複数の要素毎に、
前記先行要素の前記完了フラグの中で最高値をインクリメントすることによって、前記要素の前記完了フラグの値を決定することと、
前記要素の前記完了フラグの決定された値を、前記要素に対応する位置の前記完了アレイに格納することによって、前記要素の前記完了フラグをアサートすることと、
を行うように構成されている、
請求項１２のコンピューティングデバイス。
【請求項１８】
前記処理ユニットは、
第２のベクトル内の複数の要素毎に、前記完了アレイ内の前記要素に対応する前記完了フラグの値に基づいて、前記要素の階層を決定することと、
決定された前記階層に応じた順序で前記第２のベクトル内の各要素の値を計算することであって、同一の階層内の前記複数の要素のうち少なくとも２つの要素の値は、並列に計算される、ことと、
を行うように構成されている、
請求項１７のコンピューティングデバイス。
【請求項１９】
スパース三角行列を圧縮スパース行（ＣＳＲ）データセットとして格納するように構成されたメモリシステムと、
前記メモリシステムに接続された１つ以上の処理ユニットのセットと、を備え、
前記処理ユニットのセット内の各処理ユニットは、
第１のベクトル内の複数の要素毎に、
前記要素について、前記第１のベクトル内の１つ以上の先行要素のセットを識別することであって、前記要素の値は、前記１つ以上の先行要素の各々に依存する、ことと、
前記１つ以上の先行要素の全ての値が解かれたことを完了アレイが示すことに応じて、前記行列の行内の１つ以上の要素、及び、前記行に対応する積値に基づいて、前記要素の値を計算することと、
前記完了アレイにおいて、前記要素が解かれたことを示す、前記要素の完了フラグをアサートすることと、
によって、前記要素の値を計算するように構成されている、
コンピューティングシステム。
【請求項２０】
前記処理ユニットのセット内の各処理ユニットは、
複数の並列スレッドのうち少なくとも１つを実行するように構成されており、前記複数の並列スレッドの各々は、前記複数の要素のうち１つの値を計算する、
請求項１９のコンピューティングシステム。
【請求項２１】
前記処理ユニットのセット内の各処理ユニットは、単一の集積回路ダイ上に複数のプロセッシングコアを含み、前記複数のプロセッシングコアの各々は、前記複数の並列スレッドのうち１つを実行するように構成されている、
請求項２０のコンピューティングシステム。
【請求項２２】
前記処理ユニットのセット内の各処理ユニットは、前記処理ユニットのセット内の他の処理ユニットとは別の集積回路ダイ上のグラフィックス処理ユニット（ＧＰＵ）である、
請求項１９のコンピューティングシステム。
【発明の詳細な説明】
【背景技術】
【０００１】
三角行列は、行列の主対角線の上又は下のゼロ要素のみを有するタイプの正方行列である。下三角行列は、主対角線の上にゼロ要素のみを有するため、行列内の非ゼロ要素は、下三角形内にあり、主対角線上又は主対角線の下にある。上三角行列は、主対角線の下にゼロ要素のみを有するため、行列内の非ゼロ要素は、上三角形内にあり、主対角線上又は主対角線の上にある。三角行列は、線型代数の分野において式の系を表すために使用することができる。
【０００２】
スパース三角行列は、埋められた三角形に相当な数のゼロ要素を有する三角行列であり、例えば、スパース下三角行列は、下三角形内に１つ以上のゼロ値を有する。スパース三角解（ＳｐＴＳ）は、式Ａｘ＝ｙにおけるベクトルｘを解くプロセスであり、Ａは、Ｎ行Ｎ列のスパース三角行列であり、ｘは、Ｎ個の未知の値を有するベクトルであり、ｙは、Ｎ個の既知の値を有するベクトルである。行列Ａ内の非ゼロ値のみが主対角線上にあり、その対角線の片側にある場合、代入を使用してベクトルｘを解くことが可能である。ベクトルエントリｘ［ｎ］について解くことは、下三角行列内の前進代入（forward substitution）のケースでは、全ての前のベクトルエントリ（例えば、ｘ［０］−ｘ［ｎ−１］）を解いたことに依存する。しかしながら、行列がスパースである場合、三角行列値のいくつかはゼロであり、並列プロセッサ上で複数の行を並列に解くことが可能である。
【０００３】
本開示は、限定ではなく例として、添付図面の図に示されている。
【図面の簡単な説明】
【０００４】
【図１】実施形態による、スパース三角解（ＳｐＴＳ）を実行する並列コンピューティングシステムの実施形態を示す図である。
【図２】実施形態による、コンピューティングデバイスを示す図である。
【図３】実施形態による、コンピューティングデバイス内の複数の処理ユニット及びメモリを示す図である。
【図４Ａ】実施形態による、スパース三角行列の行列乗算及びベクトルを示す図である。
【図４Ｂ】実施形態による、ＳｐＴＳについての依存性グラフを示す図である。
【図４Ｃ】実施形態による、圧縮スパース行（ＣＳＲ）データセット及び完了アレイ（completion array）を示す図である。
【図５】実施形態による、ベクトル内の要素（factor）毎の完了フラグを識別するためのＣＳＲデータセット内の要素を示す図である。
【図６】実施形態による、ＳｐＴＳにおけるイベントのタイムラインを示す図である。
【図７】実施形態による、ＳｐＴＳにおけるイベントのタイムラインを示す図である。
【図８】実施形態による、プロセッサコアにおいてＳｐＴＳを実行するモジュールを示すブロック図である。
【図９Ａ】実施形態による、ＳｐＴＳを実行する処理を示すフローチャートである。
【図９Ｂ】実施形態による、ＳｐＴＳを実行する処理を示すフローチャートである。
【発明を実施するための形態】
【０００５】
以下の説明は、実施形態を十分に理解するために、特定のシステム、構成要素、方法等の例等の多数の特定の詳細を示す。しかしながら、少なくともいくつかの実施形態がこれらの特定の詳細無しに実施され得ることは、当業者には明らかであろう。他の例では、実施形態を不必要に曖昧にすることを避けるために、周知の構成要素又は方法は、詳細に説明されず、又は、単純なブロック図のフォーマットで示されている。よって、記載された特定の詳細は、例示的なものに過ぎない。特定の実装態様は、これらの例示的な詳細から変化してもよく、依然として実施形態の範囲内にあると考えられる。
【０００６】
スパース三角解（ＳｐＴＳ）は、式Ａｘ＝ｙにおけるベクトルｘ内の未知の値について解くことを試み、Ａは、スパース三角行列であり、ｙは、既知の値のベクトルである。スパース三角行列内の行を並列に解くことは、一連のデータ依存性をもたらし、ベクトルｘ内の各要素ｘ［ｎ］の解は、前の要素ｘ［０］−ｘ［ｎ−１］に依存する。解は、一連の階層（level）に分けることが可能であり、同一の階層内の要素は、直接又は推移的に相互に依存しないため、相互に並列して解くことが可能である。並列ＳｐＴＳを即時に実行する際の主要な問題の１つは、特に、特定の入力行列が数千又は数百万の行及び列を含む場合に、特定の入力行列についてこのデータ依存性グラフを見つけることである。したがって、スパース三角解は、グラフィックス処理ユニット（ＧＰＵ）ベースの並列コンピューティングシステム等の高度な並列アーキテクチャでは依然として不十分なパフォーマンスを示す可能性がある。並列コンピューティングシステムは、計算を開始する前に決定された依存性グラフに基づいて、又は、以前に計算された結果が利用可能な場合に並列ワーカ間で通信することによって、特定の要素について解くことをいつ開始するかを決定することができる。
【０００７】
並列コンピューティングシステム上でＳｐＴＳを実行する１つのアプローチは、最初に入力行列を分析して、並列に解くことができる行及び要素を決定し、次に階層内の各行を並列に解くためのスレッドを含む、階層毎の新たなカーネルを起動することを含む。しかしながら、ＳｐＴＳを分析フェーズ及び解フェーズに分けることは、ユーザが、所望の解を得る前に、分析（実装レベルの詳細（implementation-level detail））を追加で呼び出す、より面倒なアプリケーションプログラミングインタフェース（ＡＰＩ）をもたらす。更に、分析の実行に要する時間は、解の計算に要する時間を超える場合がある。実行する分析によっては、分析は、解フェーズよりも最大で数千倍の時間がかかる場合がある。行列が繰り返して使用されない場合、分析の実行に費やされた時間は、償却されない場合がある。
【０００８】
いくつかのケースでは、所定の階層内の要素は、既に解かれた前の階層内の要素のサブセットに依存することがある。よって、要素を解くことを進めることができるはずである。しかしながら、前の階層内で解かれていないままになっている他の要素が前の階層の完了を妨げている間、要素を解くことは続行しない。よって、ＳｐＴＳ計算を階層に分けると、いくつかの並列性が失われることがある。
【０００９】
別々の分析ステージを必要としない１つのアプローチでは、圧縮スパース列（ＣＳＣ）フォーマットに従って格納されるスパース三角行列を演算することによって、解ステージの間に並列ワーカを動的に管理するＳｐＴＳが実行されてもよい。しかしながら、多くのアプリケーションは、スパース三角行列を圧縮スパース行（ＣＳＲ）フォーマットで格納し、ＣＳＲデータセットをＣＳＣフォーマットに転置すると、かなりの時間とメモリリソースを消費する可能性がある。
【００１０】
一実施形態では、並列コンピューティングシステムは、ベクトルｘの要素がいつ解かれ、後続の計算で使用できるかを示す完了アレイを更新することによって、ＣＳＲフォーマットで格納された行列に対してＳｐＴＳを実行することができる。コンピューティングシステムによって起動されたカーネルは、行列の対応する行ｎ内の要素を使用して、ベクトルｘ内の各要素ｘ［ｎ］を計算するためのスレッドを実行する。各スレッドでは、スピンループが実行され、完了アレイ内の完了フラグが繰り返し監視され、要素ｘ［ｎ］が依存する先行要素（行ｎについての入力変数を表す）が解かれたかどうかが判別される。先行要素が解かれた場合、要素ｘ［ｎ］の値の一部を計算するために使用される。
【００１１】
完了アレイ内の値に対してスピンループすることによって生じるメモリ競合を低減するために、スピンループの反復回数又はスピンループに費やされた時間が制限を超えた場合、スレッドは、現在のカーネルの完了後に開始するためにエンキューされた従属子カーネル（dependent child kernel）を起動する。残りのスレッドが完了した（すなわち、より多くの要素が解かれた）後、従属子カーネルは、新たなスレッドを開始して、完了アレイ内の同一の値に対してスピンループを再開する。
【００１２】
よって、この高性能ＳｐＴＳメカニズムは、並列コンピューティングシステムが、ＣＳＣ等の別のフォーマットに変換するための費用のかかる転置演算を実行することなく、並ＣＳＲフォーマットで格納されたスパース三角行列に対してＳｐＴＳを実行することを可能にする。行及びその対応する要素を階層にグループ化しないため、このメカニズムは、誤った依存性を生じさせず、ＳｐＴＳを実行する際に更に動的な並列性を見つけることが可能である。高性能ＳｐＴＳメカニズムは、個別の分析ステージを必要とせず、各並列ワーカは、先行要素が既知であるか、前の行を解くことで利用可能になると、対応する要素の値を計算するために、行を解くことを開始する。子カーネルを起動することによってスピンループをタイムアウトして後に再開することを可能にするメカニズムは、完了アレイ内の複数の完了フラグに対してスピンループすることに起因したメモリ競合を低減する。一実施形態では、この高性能ＳｐＴＳメカニズムは、いくつかのケースにおいて、個別のステージにおいて分析及び解を実行するＳｐＴＳメカニズムよりも数千倍速く実行する。
【００１３】
図１は、並列コンピューティングシステム１００の実施形態を示す図である。コンピューティングシステム１００は、通信ネットワーク１１０を介して相互に接続された複数のコンピューティングデバイス１０１〜１０３を含む。コンピューティングデバイス１０１〜１０３の各々は、処理機能及びメモリ記憶機能を有する。一実施形態では、コンピューティングシステム１００は、単一の物理筐体内に含まれ、通信ネットワーク１１０は、筐体内のコンピューティングデバイス１０１〜１０３を接続するバス又はシステム相互接続である。例えば、コンピューティングデバイス１０１〜１０３は、同一のボード上又はバックプレーンを介して相互に接続された個別のキャリアボード上に、ＧＰＵ、中央処理装置（ＣＰＵ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）等の処理ユニットを含むことができる。一実施形態では、コンピューティングシステム１００内の構成要素は、個別の物理筐体内に含まれ、地理的に分散されている。例えば、コンピューティングデバイス１０１〜１０３は、インターネット等のワイドエリアネットワーク（ＷＡＮ）、ローカルエリアネットワーク（ＬＡＮ）、無線ネットワーク、又は、他の通信ネットワーク１１０を介して相互に接続された個々のサーバ、パーソナルコンピュータ、モバイルデバイス等を表すことができる。一実施形態では、コンピューティングデバイス１０１〜１０３は、同一のタイプ又は類似のタイプのデバイスを表す。或いは、コンピューティングデバイス１０１〜１０３は、異なるタイプのデバイスである。
【００１４】
図２は、高性能並列ＳｐＴＳメカニズムが実装されたコンピューティングデバイス１０１の実施形態を示す図である。概して、コンピューティングデバイス１０１は、ラップトップ又はデスクトップコンピュータ、モバイルデバイス、サーバ等を含むがこれらに限定されない、いくつかの異なるタイプのデバイスとして具体化される。コンピューティングデバイス１０１は、バス２０１を介して相互に通信するいくつかの構成要素２０２〜２０８を含む。コンピューティングデバイス１０１では、構成要素２０２〜２０８の各々は、バス２０１を介して直接、又は、他の構成要素２０２〜２０８のうち１つ以上を介して、他の構成要素２０２〜２０８の何れかと通信することが可能である。コンピューティングデバイス１０１内の構成要素２０１〜２０８は、ラップトップ若しくはデスクトップのシャーシ、又は、携帯電話ケース等の単一の物理筐体内に含まれる。代替の実施形態では、コンピューティングデバイス１０１の構成要素のいくつかは、コンピューティングデバイス１０１全体が単一の物理筐体内に存在しないように、周辺デバイスとして具体化される。
【００１５】
また、コンピューティングデバイス１０１は、ユーザから情報を受信し、又は、ユーザに情報を提供するためのユーザインタフェースデバイスを含む。具体的には、コンピューティングデバイス１０１は、キーボード、マウス、タッチスクリーン、又は、ユーザから情報を受信するための他のデバイス等の入力デバイス２０２を含む。コンピューティングデバイス１０１は、モニタ、発光ダイオード（ＬＥＤ）ディスプレイ、液晶ディスプレイ、又は、他の出力デバイス等のディスプレイ２０５を介して、ユーザに情報を表示する。
【００１６】
コンピューティングデバイス１０１は、有線ネットワーク又は無線ネットワークを介してデータを送信及び受信するためのネットワークアダプタ２０７をさらに含む。また、コンピューティングデバイス１０１は、１つ以上の周辺デバイス２０８を含む。周辺デバイス２０８は、大容量記憶装置、位置検出デバイス、センサ、入力デバイス、又は、コンピューティングデバイス１０１によって使用される他のタイプのデバイスを含むことができる。
【００１７】
コンピューティングデバイス１０１は、１つ以上の処理ユニット２０４を含み、複数の処理ユニット２０４の場合には並列に動作することが可能である。処理ユニット（複数可）２０４は、メモリサブシステム２０６に記憶された命令２０９を受信して実行するように構成されている。一実施形態では、処理ユニット（複数可）２０４の各々は、共通の集積回路基板上に存在する複数のプロセッシングコアを含む。メモリサブシステム２０６は、ランダムアクセスメモリ（ＲＡＭ）モジュール、読み出し専用メモリ（ＲＯＭ）モジュール、ハードディスク、及び、他の非一時的なコンピュータ可読媒体等のように、コンピューティングデバイス１０１によって使用されるメモリデバイスを含む。
【００１８】
コンピューティングデバイス１０１のいくつかの実施形態は、図２に示す実施形態よりも少ない又は多い構成要素を含んでもよい。例えば、特定の実施形態は、ディスプレイ２０５又は入力デバイス２０２無しに実施される。他の実施形態は、複数の特定の構成要素を有し、例えば、コンピューティングデバイス１０１の実施形態は、複数のバス２０１、ネットワークアダプタ２０７、メモリデバイス２０６等を有してもよい。
【００１９】
図３は、実施形態による、コンピューティングデバイス１０１の選択された構成要素を含むブロック図である。図３は、バス２０１を介してメモリ２０６に接続された処理ユニット２０４を示している。図３は、１つのコンピューティングデバイス１０１を示しているが、コンピューティングシステム１００の他のコンピューティングデバイス（例えば、１０２〜１０３）は、同様の構成要素を含む。
【００２０】
一実施形態では、処理ユニット２０４の各々は、ＧＰＵ、ＣＰＵ、ＦＰＧＡ又は他の処理デバイスであり、処理ユニット２０４のセット内の他の処理ユニットとは別の集積回路ダイ上に配置されている。処理ユニット２０４の各々は、単一の集積回路ダイ上のプロセッシングコアのセットを含む。処理ユニット２０４（１）は、プロセッシングコア３０１〜３０３を含み、処理ユニット２０４（２）は、プロセッシングコア３０４〜３０６を含み、処理ユニット２０４（３）は、プロセッシングコア３０７〜３０９を含む。プロセッシングコアの各々は、命令２０９によって指示されるように、コンピュータプログラムにおいてスレッドを実行するように構成されている。プロセッシングコア３０１〜３０９は、互いに独立して命令を実行することが可能であり、よって、ＳｐＴＳ処理において並列スレッドを実行することが可能である。並列スレッドの各々は、プロセッシングコア３０１〜３０９のうち１つにおいて実行され、ベクトルｘ内の１つの要素の値を計算する。
【００２１】
また、メモリ２０６は、式Ａｘ＝ｙの高性能ＳｐＴＳを実行するための命令セット２０９に加えて、スパース三角行列ＡをＣＳＲデータセット３２１の形式で記憶し、入力データ３２２を記憶する。入力データ３２２は、解かれる未知の要素のベクトルｘと、既知の積値のベクトルｙと、を含む。また、メモリ２０６は、ベクトルｘ内の各要素の完了フラグを含む完了アレイ３２３を記憶し、各完了フラグは、対応する要素が解かれたかどうかを示す。一実施形態では、メモリ２０６内の情報は、コンピューティングデバイス１０１０内の単一のメモリデバイス又はサブシステムに記憶される。代替の実施形態では、情報は、同一のコンピューティングデバイス１０１又は複数のコンピューティングデバイス（例えば、１０１〜１０３）内の複数のメモリデバイスに分散される。したがって、より広範囲のコンピューティングシステム１００のメモリシステムは、複数のコンピューティングデバイス１０１〜１０３に分散されたメモリデバイスを含むことができる。
【００２２】
図４Ａは、実施形態による、積ベクトルｙ  ４３０をもたらす、ベクトルｘ  ４２０とスパース三角行列４１０との乗算（すなわち、Ａｘ＝ｙ）を示す図である。行列Ａ  ４１０は、ＳｐＴＳの入力として使用され、１０個の非ゼロ要素を含む下三角行列である。行列Ａ  ４１０の主対角線は、要素ａ，ｃ，ｅ，ｇ，ｊを含む。行列Ａ  ４１０が下三角行列であるため、前進代入で解くことができる。これは、以前の解かれた上位の行の結果を入力として使用していくつかの行が解かれることを意味する。したがって、矢印４１１〜４１５は、前進代入処理におけるこれらの依存性を表す。例えば、各行１、２、３に対応する要素ｘ［１］、ｘ［２］及びｘ［３］を解くことは、解かれる行０に関連付けられた要素ｘ［０］に依存する。これらの依存関係は、矢印４１１，４１２，４１３によって示されている。例えば、依存関係の矢印４１１は、行１から項ｂｘ［０］の値を計算することが、行０の項ａｘ［０］を使用してｘ［０］を解くことに依存することを示している。依存関係の矢印４１４，４１５は、行４を介して要素ｘ［４］を解くことが、非ゼロ要素ｃ，ｇにそれぞれ対応するｘ［１］及びｘ［３］要素を解くことに依存することを示している。解かれたｘ［１］及びｘ［３］要素は、要素ｘ［４］を解くときに、項ｈｘ［１］及びｉｘ［３］を計算するために使用される。高性能ＳｐＴＳメカニズムは、下三角行列を解くために実行されるものとして本明細書で説明されているが、メカニズムは、上三角行列を解くために後退代入（backwards-substitution）を実行するために同様に使用されてもよい。
【００２３】
図４Ｂは、行列Ａ  ４１０のＳｐＴＳを実行するための依存性グラフ４５０を示す図である。グラフ内の各ノードは、解かれるベクトルｘ内の１つの要素を表している。図４Ｂにおける依存関係４１１〜４１５は、図４Ａの同様の符号の依存関係４１１〜４１５に対応している。要素ｘ［０］〜ｘ［４］の各々の計算は、個別のスレッドによって実行され、個別のスレッドの各々は、個別のプロセッシングコア（例えば、プロセッシングコア３０１〜３０９の１つ）において実行される。
【００２４】
依存性グラフ４５０では、要素ｘ［０］の値の計算は、依存関係が無く、他の要素が解かれるのを待機することなく最初に計算される。要素ｘ［１］、ｘ［２］及びｘ［３］の各々を解くことは、依存関係４１１，４１２，４１３の各々を介してｘ［０］に依存している。したがって、これらの計算は、ｘ［０］が解かれ、利用可能になるときに開始される。ｘ［１］、ｘ［２］及びｘ［３］を解くために個別のスレッドにおいて実行される計算は、少なくとも部分的に並列に実行されるが、各々の要素の計算が完了するまでに異なる時間がかかる場合がある。ｘ［４］を解くことは、依存関係４１４，４１５の各々を介してｘ［１］及びｘ［３］に依存する。よって、ｘ［４］の全ての計算は、ｘ［１］及びｘ［３］の両方が利用可能である場合に実行される。一実施形態では、複数のスレッドの各々は、要素ｘ［０］〜ｘ［４］のうち１つを解く。代替の実施形態では、複数のスレッドを含む並列ワークグループは、１つの要素を解き、単一のスレッドは、複数の要素を解き、又は、複数のスレッドは、ベクトルｘ  ４２０内の複数の要素を解く。
【００２５】
図４Ｃは、実施形態による、スパース三角行列Ａ  ４１０を表す圧縮スパース行（ＣＳＲ）データセット３２１を示す図である。ＣＳＲデータセット３２１は、３つのアレイ（値アレイ（ｖａｌｕｅｓ［］）、列アレイ（ｃｏｌｕｍｎｓ［］）及び行ポインタアレイ（ｒｏｗ＿ｐｔｒｓ［］））を含む。値アレイは、行列Ａ  ４１０の非ゼロ要素を格納する。要素は、行列の左から右（各行内の列０から列４）、及び、上から下（行０から行４）に順に格納される。列アレイは、値アレイ内の要素毎に、要素が配置されている行列の列を識別する。列アレイは、値アレイと同じ数のエントリを有し、列アレイの各要素は、同じアレイインデックスを有する値アレイ内の対応する要素の列を識別する。行ポインタアレイは、行列の各行内に何れの要素があるかを識別する。具体的には、行ポインタアレイ内の各々の値は、各行の最初の値における値アレイ及び列アレイを指すインデックスである。行ポインタアレイ内の最終値は、値アレイ又は列アレイ内の最大インデックスよりも１つ大きい値である。
【００２６】
ＣＳＲフォーマットに格納された行列に対してＳｐＴＳを実行する１つのアプローチによれば、ｘ［０］を解くためのスレッド０は、ｘ［０］が解かれると、（ｘ［１］、ｘ［２］及びｘ［３］を解くための）従属スレッド１、２、３に通知する。しかしながら、ＣＳＲフォーマットが使用される場合、このような通知は、列アレイをウォークして、「０」を含む全てのエントリを検索する必要がある。これは、行が、列０内に非ゼロ値を有しているため、ｘ［０］に対するデータ依存関係を有することを示している。列アレイ内で「０」エントリを見つけた後、スレッド０は、行ポインタアレイの検索を実行して、行ポインタアレイの何れの２つのインデックスの間に列アレイからの「０」エントリが存在するかを判別することによって、何れの従属スレッドを起動するかを判別する。列アレイをウォークし、行ポインタアレイを検索することは、計算負荷が高く、高性能ＳｐＴＳの実行不可能なスローダウンをもたらす。
【００２７】
また、図４Ｃは、実施形態による、列アレイの計算負荷の高いウォークすること及び行ポインタアレイの検索を回避するために使用される完了アレイ３２３を示す図である。完了した各スレッドが従属スレッドを起動する代わりに、待機している従属スレッドの各々は、完了アレイ３２３をチェックして、その先行要素が解かれたかどうかを判別する。完了アレイ３２３は、ベクトルｘ  ４２０内の要素毎に（よって、行列Ａ  ４１０内の行毎に）完了フラグを格納する。ベクトルｘ  ４２０内の各要素は、同一のインデックスを有する完了アレイ内のフラグに対応する（すなわち、ｘ［ｎ］は、ｃｏｍｐｌｅｔｉｏｎ［ｎ］に対応する）。ＳｐＴＳを開始する前に、完了アレイ内の全てのフラグは、何れの要素も未だ解かれていないことを示す「０」に初期化される。スレッドがベクトルｘ  ４２０内の１つの要素について解かれた値を書き込むことを終了する毎に、スレッドは、解かれた値が後続の計算における使用に対して利用可能であることを示すように、完了アレイ３２３内の対応する完了フラグをアサートする。一実施形態では、完了フラグは、その値が０である場合にデアサートされ、その値が非ゼロ値である場合にアサートされる。
【００２８】
図５は、実施形態による、完了アレイ３２３内の何れの完了フラグが、解かれるベクトルｘ  ４２０の各要素を監視するかを決定するための、ＣＳＲデータセットアレイ内の要素の使用を示す図である。ベクトルｘ  ４２０では、要素ｘ［０］〜ｘ［４］の各々は、行列Ａ  ４１０の１つの行に対応し、よって、行ポインタアレイ内の１つの行ポインタ要素に対応する。したがって、１つの要素を解くために実行されるスレッドは、解かれる要素と行ポインタアレイ内で同一のインデックスを有する行ポインタ要素を識別する。行ポインタ要素は、行列Ａ  ４１０の対応する行の最初の非ゼロ値を識別する、列アレイ内の列要素を見つけるためのインデックスとして使用される。スレッドは、完了アレイ３２３内の完了フラグを見つけるためのインデックスとして列要素を使用する。
【００２９】
スレッドは、完了フラグを識別した後、完了フラグがアサートされるまで完了フラグを繰り返しチェックするスピンループを実行する。完了フラグがアサートされると、スレッドは、列アレイ内の次の列要素を見つけることによって（例えば、インデックスを１つインクリメントすることによって）、監視する次の完了フラグを識別する。スレッドは、スピンループを実行して、次の完了フラグを監視する。この処理は、次の列要素が要素のインデックスに等しくなり、これにより、行列Ａ  ４１０の主対角線上の要素に対応するまで繰り返される。監視された完了フラグの各々は、先行要素の１つ（要素の解が依存する）が解かれたかどうかを示す。よって、主対角線に到達すると、行の全ての先行要素が解かれ、スレッドは、自身の要素を解くことが可能である。
【００３０】
要素ｘ［０］についてのこの処理を実行する場合、「０」の値を有する対応する列要素は、既に主対角線上の要素を表す。したがって、スレッドは、既に、何れの完了フラグをチェックする必要なく、ｘ［０］を解くことが可能である。
【００３１】
図６は、実施形態による、ＳｐＴＳ内のイベントのタイムラインを示す図である。図６に示すように、ベクトルｘ内の各要素は、並列スレッド０〜４の１つによって解かれる。一実施形態では、スレッド０〜４は、１つ以上の処理ユニット（例えば、処理ユニット（複数可）２０４）において実行され、各スレッドは、１つのプロセッシングコア（例えば、コア３０１〜３０９のうち１つ）において実行される。代替の実施形態では、各要素は、ワークグループの複数のスレッドによって解かれてもよいし、ワークグループは、複数の要素を解いてもよい。図６のタイムラインでは、時間が上から下に進む。図の右側は、ＳｐＴＳ処理中の異なる時点における完了アレイ３２３内の完了フラグの値を示す。
【００３２】
時間６０１において、完了アレイ３２３は、全ての完了フラグが、要素が未だ解かれていないことを示す「０」に設定されることで初期化される。スレッド０、１、２、３、４は、ベクトルｙ４３０から積値ｙ［０］、ｙ［１］、ｙ［２］、ｙ［３］、ｙ［４］を読み出し、行列の主対角線から要素ａ、ｃ、ｅ、ｇ、ｊを読み出す。ベクトルｙ  ４３０からの積値及び主対角線要素は、ベクトルｘ  ４２０からの要素を解くために各スレッドによって使用される既知の値である。
【００３３】
時間６０２において、スレッド１〜３の各々（要素ｘ［１］〜ｘ［３］にそれぞれ対応する）は、図５に示す判定に基づいて、完了アレイ（すなわち、ｃｏｍｐｌｅｔｉｏｎ［０］）のインデックス０における完了フラグの状態を監視するためにスピンループを実行する。要素ｘ［４］に対応するスレッド４は、図５に示す判定に従って、ｃｏｍｐｌｅｔｉｏｎ［１］の状態を監視するためにスピンループを実行する。この時間６０２の間、スレッド０は、依存関係を持たず（図５を参照して前述したように）、ｘ［０］を解くことを続行する。スレッド０は、ｙ［０］をａで除算し、結果をｘ［０］としてベクトルｘ  ４２０に格納する。結果を格納した後、スレッド０は、非ゼロ値をｃｏｍｐｌｅｔｉｏｎ［０］に書き込むことによって、ｃｏｍｐｌｅｔｉｏｎ［０］をアサートする。
【００３４】
時間６０３において、ｃｏｍｐｌｅｔｉｏｎ［０］における完了フラグは、アサート状態にある。スレッド１〜３の各々について、列アレイ内の次の列要素は、主対角線上にあり（図５を参照）、したがって、スレッド１〜３についての先行要素の全ての値が解かれている。スレッド１〜３は、各々のスピンループを終了し、各々の要素を解くことを続行する。各スレッド１〜３は、ｘ［０］の新たに計算された値を、式Ａｘ＝ｙでｘ［０］を乗算する行列要素（例えば、ｂ、ｄ、ｆ）とともに読み出す。時間６０４において、スレッド１〜３は、ｘ［０］、行列要素（ｂ、ｄ、ｆ）、及び、行の積値（ｙ［１］〜ｙ［３］）に基づいて、要素ｘ［１］〜ｘ［３］を解く。スレッド１〜３は、ｘ［１］〜ｘ［３］の結果の計算値をベクトルｘ  ４２０に格納する。
【００３５】
計算値を格納した後、各スレッド１〜３は、これらの要素が解かれたことを示すために、要素ｘ［１］〜ｘ［３］に対応する完了フラグをアサートする。よって、スレッド１、２、３は、これらの位置に非ゼロ値を格納することによって、ｃｏｍｐｌｅｔｉｏｎ［１］、ｃｏｍｐｌｅｔｉｏｎ［２］、ｃｏｍｐｌｅｔｉｏｎ［３］をアサートする。
【００３６】
時間６０５において、ｃｏｍｐｌｅｔｉｏｎ［１］は、アサート状態にあり、したがって、スレッド４は、ｃｏｍｐｌｅｔｉｏｎ［１］に対するスピンループを停止し、ｘ［１］の新たに計算された値を、式Ａｘ＝ｙでｘ［１］を乗算する行列要素ｈとともに読み出す。時間６０６において、スレッド４は、非ゼロ要素を含む行列の行内の次の列を識別する。列アレイでは、ｃｏｌｕｍｎｓ［８］の位置（行４についてのｃｏｌｕｍｎｓ［７］の初期位置に隣接する）は、行４内の次の非ゼロ要素が列３内の非対角線要素であることを示す。したがって、スレッド４は、列３に対応するｃｏｍｐｌｅｔｉｏｎ［３］の完了フラグの状態を監視するためにスピンループを開始する。
【００３７】
時間６０７において、ｘ［３］は、以前に解かれており、その完了フラグは、時間６０３においてスレッド３によってアサートされている。また、非ゼロ値を有する行４内の次の列（ｃｏｌｕｍｎｓ［９］によって指定される）は、行列Ａ  ４１０の主対角線上にある。したがって、完了アレイ３２３は、全ての先行要素が解かれていることを示す。それに応じて、スレッド４は、スピンループを終了し、要素ｘ［４］の値を計算するために使用する値ｘ［３］及びｉを読み出すことを開始する。時間６０８において、スレッド４は、先行要素ｘ［１］、ｘ［２］、行列要素ｈ、ｉ、ｊ、及び、積値ｙ［４］に基づいて、要素ｘ［４］の値を計算する。ｘ［４］が解かれると、スレッド４は、ｃｏｍｐｌｅｔｉｏｎ［４］に非ゼロ値を格納することによって、ｃｏｍｐｌｅｔｉｏｎ［４］で完了フラグをアサートする。
【００３８】
一実施形態では、スレッド０〜４は、非ゼロ値として「１」又は他の固定数を書き込むことによって、完了アレイ３２３内の各完了フラグをアサートする。或いは、図６に示すように、完了アレイ３２３の更新は、階層セット情報を生成するために使用される。単純に値「１」で完了フラグをアサートする代わりに、スレッドをアサートすることは、先行要素の完了フラグの中で最高値をインクリメントすることによって、解かれた要素についての完了フラグの値を決定する。次に、スレッドは、完了アレイ３２３内の完了フラグの決定された値を要素に対応する位置に格納することによって、要素についての完了フラグをアサートする。
【００３９】
例として、これらのスレッド１〜３の各々について、先行要素（すなわち、ｘ［０］）の最高完了フラグ値は１である。これをインクリメントすることによって、新たな完了フラグ値「２」がもたらされる。よって、時間６０４においてスレッド１、２、３は、各々の要素ｘ［１］、ｘ［２］、ｘ［３］の値「２」を使用して完了フラグをアサートする。スレッド４が、時間６０８において解かれた要素ｘ［４］の完了フラグをアサートする場合、先行要素ｘ［１］及びｘ［２］に対応する完了フラグのうち最高完了フラグは、「２」の値を有する。したがって、スレッド４は、「３」のインクリメントされた値を使用して、ｘ［４］の完了フラグをアサートする。
【００４０】
ＳｐＴＳの終了時（時間６０９）、全ての完了フラグ要素がアサートされた完了アレイ３２３は、新たなベクトルｘの要素を後に解くための順序を決定するためにオプションで使用することができる階層セットを示す。前述した例を続けると、要素［１，２，２，２，３］を含む完了アレイは、ｘ［０］が階層１内で最初に解かれ、次に、ｘ［１］、ｘ［２］、ｘ［３］が階層２内で並列に解かれ、最後に、ｘ［４］が階層３内で解かれる、ことを示す。よって、完了アレイ３２３は、同一の行列Ａ  ４１０の後の計算において使用することができる階層セット情報を効率的に生成するために使用される。
【００４１】
図７は、スピンループによって生じるメモリ競合を低減するために、スピンループを実行するスレッドがタイムアウトして子カーネルを起動することができる、ＳｐＴＳの実施形態を実行するイベントのタイムラインを示す図である。特に、行列Ａが多数の行及び／又は依存性の長い連鎖を有するケースでは、多数の対応する要素の完了状態を繰り返しチェックするスピンループは、完了アレイ３２３を読み出すために繰り返されるメモリアクセスに起因して、かなりの量のメモリ競合を生じさせることがある。メモリ競合は、これらの要素を解き、ＳｐＴＳにおいて進捗を進めようとするスレッドをスローダウンさせ、スピンループに費やされる時間を長引かせる。スピンループを実行する各スレッドは、スピンループサイクルの全体的な回数を低減するために、反復回数又はスピンループに費やされた時間が所定の閾値を超えた場合に、スピンループを終了する。スピンループは、ＳｐＴＳにおける更なる進捗が行われた（すなわち、更なる要素が解かれる）後に、子カーネルの対応するスレッドにおいて再開される。
【００４２】
図７に示すように、スレッド０〜４の各々は、ベクトルｘ  ４２０内の要素ｘ［０］〜ｘ［４］のうち１つを解くために、第１のカーネル７１１において実行される。各スレッド０〜４は、各々の要素ｘ［０］〜ｘ［４］が前のスレッドによって既に解かれているかどうかを判別するために、完了アレイをチェックすることによって開始する。要素が既に解かれている場合、スレッドは直ちに終了する。時間７０２において、完了アレイ３２３は、「０」要素のみを含み、よって、ベクトルｘ  ４２０内の何れの要素も解かれていないことを示す。したがって、スレッド１〜３は、ｘ［０］を解くためにｃｏｍｐｌｅｔｅ［０］を監視するようにスピンループを実行し、スレッド４は、ｘ［１］を解くためにｃｏｍｐｌｅｔｅ［１］を監視するようにスピンループを実行する。スレッド０は、ｘ［０］を解き、ｃｏｍｐｌｅｔｉｏｎ［０］で関連する完了フラグをアサートする。
【００４３】
スレッド１〜３の各々は、スピンループによって監視される完了フラグがアサートされるまで、又は、スピンループの反復回数が所定の制限を超えるまで、そのスピンループを実行し続ける。時間７０３において、ｃｏｍｐｌｅｔｉｏｎ［０］におけるｘ［０］についての完了フラグは、アサート状態にある。よって、スレッド１〜３は、スピンループの反復が所定の制限を超える前に、各々の要素ｘ［１］〜ｘ［３］を解くことを開始する。しかしながら、スレッド４は、ｘ［１］が解かれる前に、ｘ［１］についての完了フラグにおいて、所定の反復制限を超えるスピンループを実行する。スレッド４は、スピンループを終了することによって止まり、子カーネルが他のスレッドによって既に起動されているかどうかを示すグローバル「ｃｈｉｌｄ＿ｌａｕｎｃｈｅｄ」変数をチェックする。「ｃｈｉｌｄ＿ｌａｕｎｃｈｅｄ」変数がアサートされた場合、子カーネルは、別のスレッドによって既に起動されており、スレッド４は、子カーネルを起動せずに終了する。「ｃｈｉｌｄ＿ｌａｕｎｃｈｅｄ」変数がアサートされていない場合、子カーネルは、それまで起動されておらず、スレッド４は、第１のカーネル７１１が完了した後（すなわち、カーネル７１１内の全ての他のスレッドが完了したとき）に開始するようにエンキューされる第２のカーネル７１２を起動する。カーネル７１２の起動に関連して、スレッド４は、第１のカーネル７１１内の他のスレッドがこのような方法で子カーネルを起動しようとすることを防止するために、「ｃｈｉｌｄ＿ｌａｕｎｃｈｅｄ」変数をアサートする。その後、スレッド４は終了する。このメカニズムによって、非常に多くの反復を実行し又はスピンループに非常に多くの時間を費やすスレッドは、更なる進捗が行われるまで、メモリシステムにアクセスすることを一時的に停止する。
【００４４】
時間７０３の終了時、並列スレッド０〜４の全てが完了すると、第１のカーネル７１１は終了する。時間７０４において、第２のカーネル７１２が起動され、同じ要素ｘ［０］〜ｘ［４］に対して並列スレッド０〜４が再度呼び出される。グローバル「ｃｈｉｌｄ＿ｌａｕｎｃｈｅｄ」変数は、子カーネル７１２の起動に関連してデアサート状態に初期化される。スレッド０〜４は、各々の要素ｘ［０］〜ｘ［４］の完了フラグをチェックする。要素ｘ［０］〜ｘ［３］が既に解かれていることを完了アレイ３２３が示すので、スレッド０〜３は終了する。
【００４５】
しかしながら、ｃｏｍｐｌｅｔｅ［４］における完了フラグは、デアサートされ、要素ｘ［４］が解かれていないことを示す。スレッド４は、（ｃｏｍｐｌｅｔｉｏｎ［１］における）ｘ［１］、及び、（ｃｏｍｐｌｅｔｉｏｎ［３］における）ｘ［３］についての完了フラグをチェックするようスピンループを実行することによって、先行要素ｘ［１］及びｘ［３］が解かれているかどうかを判別する。時間７０５において、スレッド４は、ｃｏｍｐｌｅｔｉｏｎ［１］における完了フラグに基づいて、ｘ［１］が既に解かれていると判別する。時間７０６において、スレッド４は、ｃｏｍｐｌｅｔｉｏｎ［３］における完了フラグに基づいて、ｘ［３］が既に解かれていると判別する。要素ｘ［４］の解が依存する先行要素の全てが解かれているので、スレッド４は、時間７０７においてｘ［４］を解くことを続行する。要素ｘ［０］〜ｘ［４］の全てが解かれると、子カーネルが起動されず、ＳｐＴＳが完了する。
【００４６】
図８は、実施形態による、ＣＳＲデータセット３２１に対して高性能ＳｐＴＳを実行するプロセッシングコア３０１内のモジュールのブロック図である。一実施形態では、プロセッシングコア３０１内のモジュール８０１〜８０５は、硬化回路モジュール（hardened circuit module）を使用して実装されている。代替の実施形態では、モジュール８０１〜８０５は、プログラム可能論理回路（例えば、プロセッシングコア３０１がＦＰＧＡ若しくは他のプログラム可能デバイスを使用して実装される場合）、ソフトウェアモジュール、又は、ハードウェア、ソフトウェア、プログラム可能ロジックの組み合わせ等を使用して実装される。一実施形態では、モジュール８０１〜８０５は、ベクトルｘのｎ番目の要素を表す要素ｘ［ｎ］を解くためにスレッド８００において実行される演算を実行する。一実施形態では、スレッド８００は、図６又は図７を参照して説明したように、スレッド０〜４と同様に機能する。
【００４７】
スピンループモジュール８０１は、図５を参照して前述したように、（行ポインタアレイ及び列アレイから）ポインタ８１１を読み出して、適切な完了フラグを決定して完了アレイ３２３を監視し、スピンループを実行して、完了アレイ３２３からの完了フラグ８１０を繰り返しチェックする。よって、スピンループモジュール８０１は、解かれる要素ｘ［ｎ］が依存する先行要素の可用性を判別する。
【００４８】
一実施形態では、スレッド８００は、スピンループに時間がかかり過ぎた場合又は反復回数が多過ぎた場合に、子カーネルを終了して起動することによって、メモリ競合を低減する。モジュール８０１によって実行されるスピンループの各反復は、カウンタ８０２によってカウントされる。反復回数（又は、スピンループに費やされた時間）は、所定の制限８０３と比較され、スピンループの反復回数（又は、スピンループに費やされた時間）が制限８０３を超えた場合、子ランチャ８０４は、「ｃｈｉｌｄ＿ｌａｕｎｃｈｅｄ」変数８１７をチェックする。子カーネルが別のスレッドによって起動されていないことを「ｃｈｉｌｄ＿ｌａｕｎｃｈｅｄ」変数８１７が示す場合、子ランチャ８０４は、現在のカーネル７１１内の全てのスレッドが完了した後に開始するようにエンキューされた子カーネル７１２を起動する。よって、スレッド８００は、制限８０３を超えたことに応じて、スピンループを停止し、次に、ＳｐＴＳにおいて更なる進捗が行われた（すなわち、更なる要素が解かれた）後に、子カーネル７１２においてスピンループを再開する。
【００４９】
ソルバー（solver）モジュール８０５は、完了アレイ３２３内の関連する完了フラグによって示されるように、ｘ［ｎ］の先行要素の全てが解かれたとスピンループモジュール８０１が判別したことに応じて、要素ｘ［ｎ］の値を計算する。ソルバー８０５は、ｘ［ｎ］に対応する行内の行列要素８１２を、ＣＳＲデータセット３２１から読み出し、積値ｙ［ｎ］を、ｘ［ｎ］に対応する積ベクトルｙ  ４３０から読み出し、解かれた先行要素８１４を、ベクトルｘ  ４２０から読み出す。ソルバー８０５は、先行要素８１４、積ｙ［ｎ］８１３、行列要素８１２をＡｘ＝ｙによって定義される行の式に代入することによって要素ｘ［ｎ］の値を計算し、要素ｘ［ｎ］を代数的に解く。
【００５０】
ソルバー８０５は、ｘ［ｎ］の解かれた値８１５を要素ベクトルｘ  ４２０に格納し、他のスレッドにおいて要素を解くために使用可能にする。また、ソルバー８０５は、ｘ［ｎ］の完了フラグ８１６について非ゼロ値を決定し、値を完了アレイ３２３に格納することによって、完了アレイ３２３の完了フラグをアサートする。一実施形態では、ソルバー８０５は、要素ｘ［ｎ］の階層を計算するために、先行要素の完了フラグのうち最高値をインクリメントすることによって、完了フラグの値を決定する。或いは、ソルバー８０５は、「１」又は別の固定値を完了フラグに使用する。
【００５１】
図９Ａ及び図９Ｂは、ＣＳＲフォーマットで格納されたスパース三角行列に対して高性能ＳｐＴＳを実行する処理９００を示す図である。処理９００の動作は、コンピューティングシステム１００の構成要素（例えば、メモリシステム２０６、プロセッシングコア３０１内のモジュール８０１〜８０５等）によって実行される。
【００５２】
ブロック９０１において、メモリシステム２０６は、スパース三角行列Ａ４１０をＣＳＲデータセット３２１として格納する。ＣＳＲデータセット３２１内では、値アレイは、行列Ａ  ４１０の要素を格納し、列アレイは、値アレイに格納された要素毎に行列Ａ  ４１０の列を識別し、行ポインタアレイは、行列Ａ  ４１０の各行の要素を識別する。ＣＳＲデータセット３２１内のこれらのアレイは、図４Ｃに示されている。
【００５３】
また、メモリシステム２０６は、要素ｘ［０］〜ｘ［４］の各々についての完了フラグを含む完了アレイ３２３（ｃｏｍｐｌｅｔｉｏｎ［］）をベクトルｘ  ４２０に格納する。ブロック９０３において、完了アレイ３２３内の完了フラグの各々は、何れの要素も解かれていないことを示す「０」に初期化される。ブロック９０５において、複数の並列スレッドが開始され、各スレッドは、ベクトルｘ  ４２０内の１つの要素を計算する。１つの並列スレッド８００は、要素ｘ［ｎ］の値を計算するために開始され、ｎは、概して、ベクトルｘ  ４２０内の要素ｘ［ｎ］のインデックスを表す。
【００５４】
ブロック９０７において、スレッド８００は、ｃｏｍｐｌｅｔｉｏｎ［ｎ］における完了フラグを読み出すことによって、要素ｘ［ｎ］が前の処理によって既に解かれているかどうかを判別する。ｃｏｍｐｌｅｔｉｏｎ［ｎ］が非ゼロ値である場合（すなわち、アサートされた場合）、スレッド８００は、ｘ［ｎ］が既に解かれているのでブロック９３３において終了する。ｃｏｍｐｌｅｔｉｏｎ［ｎ］がゼロである場合（すなわち、デアサートされた場合）、処理９００は、ブロック９０９に進む。
【００５５】
ｘ［ｎ］の値は、ベクトルｘ  ４２０内の１つ以上の先行要素のセットの各々に依存するデータである。すなわち、先行要素の値は、ｘ［ｎ］の値を計算するために使用される。よって、ブロック９０９において、スピンループモジュール８０１は、ＣＳＲデータセット３２１内の行ポインタアレイ及び列アレイに基づいて、監視するための次の先行要素を識別する。要素ｘ［ｎ］と同じインデックスｎを有する行ポインタは、列アレイ内の位置を識別するインデックスとして使用される。列アレイ内の識別された位置は、要素ｘ［ｎ］に対応する行列Ａ  ４１０の行ｎ内の非ゼロ要素の列を識別する。図５を参照した例として、要素ｘ［４］について、ｒｏｗ＿ｐｔｒｓ［４］は、「７」の値を有し、ｃｏｌｕｍｎｓ［７］は、「１」の値を有する。これは、行列Ａ  ４１０の行４では、非ゼロ要素が列１にあることを示す。図４Ａに示すように、この非ゼロ要素は「ｈ」である。
【００５６】
ブロック９１０において、列アレイ内の識別された位置のインデックスがｒｏｗ＿ｐｔｒｓ［ｎ＋１］に等しくない場合、行ｎ内の非ゼロ要素を含む全ての列がトラバースされているわけではなく、全ての先行要素についてスピンループが実行されてるわけではない。行４について前の例を続けると、ｒｏｗ＿ｐｔｒｓ［４＋１］は、「１０」である。先行要素ｘ［１］に対応する識別された非ゼロ要素「ｈ」についての列アレイ内の現在のインデックスは、「７」である。これらの値は等しくないので、行４についての全ての列がトラバースされているわけではなく、処理９００は、ブロック９１１に進む。
【００５７】
ブロック９１１において、スピンループモジュール８０１は、識別された非ゼロ要素が行列Ａ  ４１０の主対角線上に位置するかどうかを判別する。一実施形態では、非ゼロ要素は、その列番号が要素のインデックス（すなわち、「ｎ」）に等しい場合、主対角線上にある。要素が主対角線上に位置する場合、処理９００は、スピンループを実行せずに、ブロック９０９に戻る。主対角線上の要素に対応する要素は、スレッド８００によって解かれる要素ｘ［ｎ］である。したがって、その完了フラグを監視するためのスピンループは実行されない。処理９００は、代わりに、ブロック９１０において次の先行要素に進む。ブロック９１１において、要素が非対角線に位置する場合（主対角線上にない場合）、要素は先行要素に対応し、処理９００は、ブロック９１３に進む。
【００５８】
ブロック９１３において、スピンループモジュール８０１は、メモリ２０６内の完了アレイ３２３から完了フラグ８１０を読み出すことによって、第１の先行要素についての完了フラグをチェックする。図５を参照して前述の例を続けると、列アレイ内の識別された要素は、先行要素についての完了フラグのインデックスを完了アレイ３２３に格納する。よって、スピンループモジュール８０１は、ｃｏｍｐｌｅｔｉｏｎ［１］において、先行要素ｘ［１］が解かれているかどうかを示す完了フラグを読み出す。ブロック９１５において、完了フラグがアサートされない場合、先行要素は解かれておらず、処理９００は、ブロック９１７に進む。
【００５９】
ブロック９１７において、スピンループモジュール８０１は、実行されたスピンループの反復回数をカウントするスピンループカウンタ８０２をインクリメントする。カウントされた反復回数は、制限８０３と比較され、ブロック９１９において、カウントされた反復回数が制限８０３を超えていない場合、処理９００は、ブロック９１３に戻る。よって、処理９００は、ブロック９１３〜９１９をループして、完了フラグがアサートされるまで又は制限８０３を超えるまで、第１の先行要素の完了フラグを監視するためのスピンループを実行する。
【００６０】
スピンループの間、完了フラグがアサートされると、処理は、ブロック９１５からブロック９０９に進む。ブロック９０９において、スピンループモジュール８０１は、要素ｘ［ｎ］に対する解が依存する次の先行要素を識別する。列アレイは、行ｎ内の非ゼロ要素を識別する。したがって、行内の次の非ゼロ要素は、直近に識別された非ゼロ列に隣接する列アレイに示される。よって、直近に識別された列のインデックスは、１だけインクリメントされる。図５を参照して前の例を続けると、非ゼロ値を格納した行４内の直近に識別された列は、ｃｏｌｕｍｎｓ［７］において示される。よって、行４内の次の非ゼロ要素は、ｃｏｌｕｍｎｓ［７＋１］又はｃｏｌｕｍｎｓ［８］において示される。列アレイ内のこの位置は、行４が列３において非ゼロ値を有することを示す。図４Ａに示すように、この値は「ｉ」である。
【００６１】
行４の列３は、列アレイ内でｒｏｗ＿ｐｔｒｓ［４＋１］に等しくない「８」のインデックスを有する。したがって、処理９００は、ブロック９１０から９１１に進む。行４の列３は、行列Ａ  ４１０内の非対角線要素である。したがって、処理９００は、ブロック９１１からブロック９１３に進む。ブロック９１３において、スピンループモジュール８０１は、列アレイ内の現在の位置において指定された完了フラグを読み出す。前の例を続けると、ｃｏｌｕｍｎｓ［８］は、列３を指定する。したがって、ｘ［３］が解かれるかどうかを示すｃｏｍｐｌｅｔｉｏｎ［３］の完了フラグを監視するために、スピンループが実行される。よって、ブロック９０９〜９１９を繰り返して、要素ｘ［ｎ］についての複数の先行要素（例えば、ｘ［１］及びｘ［３］）の完了フラグを順に監視するためのスピンループを実行する。
【００６２】
ブロック９１０において、列アレイ内の非ゼロ要素のインデックスがｒｏｗ＿ｐｔｒｓ［ｎ＋１］に等しい場合、行ｎ内の非ゼロ要素を含む全ての列がトラバースされる。これは、スピンループ処理が、全ての先行要素についてアサートされた完了フラグを検出したことを意味する。前の例を続けると、行４の列１、３、４には、非ゼロ要素が含まれている。最後の列「４」は、列アレイ内の「９」のインデックスを有する。行４について、ｒｏｗ＿ｐｔｒｓ［ｎ＋１］は、「１０」に等しい。よって、列アレイについてのインデックスが「１０」にインクリメントされるまで、非ゼロ要素を有する（「７」〜「９」のインデックスを有する）全ての列が、スピンループモジュール８０１によってトラバースされている。すなわち、スピンループ処理は、全ての先行要素ｘ［１］及びｘ［３］についての完了フラグがアサートされていると判別している。この時点で、全ての先行要素が解かれている。よって、ブロック９２１において、ソルバー８０５は、解かれた先行要素８１４、ｘ［ｎ］に対応する行列Ａ  ４１０の行ｎ内の要素８１２、及び、ｘ［ｎ］に対応する積値ｙ［ｎ］８１３に基づいて、要素ｘ［ｎ］の値を計算する。ｘ［ｎ］８１５について計算された値は、メモリシステム２０６内のベクトルｘ  ４２０に書き込まれる。前の例においてｎが「４」に等しい場合、ソルバー８０５は、（ｙ［４］−ｈｘ［１］−ｉｘ［３］）／ｊからｘ［４］を計算し、結果をベクトルｘ  ４２０に書き込む。
【００６３】
ブロック９２３において、ソルバー８０５は、ｘ［ｎ］の完了フラグをアサートするための非ゼロ値を計算する。ソルバー８０５は、ｘ［ｎ］の解が依存する先行要素の完了フラグの中で最高値を有する完了フラグをインクリメントする。ｘ［４］の場合、先行要素ｘ［１］及びｘ［３］についての完了フラグは、図６の時間６０５に示すように、「２」及び「２」である。最高値を有する完了フラグが「２」であるため、ｘ［４］についての完了フラグは３である。ブロック９２５において、ソルバー８０５は、完了フラグ８１６を、完了アレイ３２３内の要素に対応する位置に書き込む。一実施形態では、完了フラグは、完了アレイ内で、ベクトルｘ  ４２０内の要素ｘ［ｎ］と同一のインデックスｎを有する（例えば、ｃｏｍｐｌｅｔｉｏｎ［ｎ］は、要素ｘ［ｎ］に対応する）。完了フラグは、ｘ［ｎ］が解かれたことを示す。よって、スレッドは、ブロック９３３において終了する。
【００６４】
ブロック９１９において、カウンタ８０２によってカウントされたスピンループの反復回数が制限８０３を超えた場合、処理９００は、ブロック９２７に進む。ブロック９２７において、子ランチャ８０４は、現在のカーネルの子カーネルが以前に起動されたかどうかを示すｃｈｉｌｄ＿ｓｔａｒｔｅｄグローバル変数８１７をチェックする。ｃｈｉｌｄ＿ｓｔａｒｔｅｄ変数８１７がアサートされている場合、スレッドは、子カーネルを起動することなくブロック９３３において終了し、よって、スピンループが終了する。ブロック９２７において、ｃｈｉｌｄ＿ｓｔａｒｔｅｄ変数８１７がデアサートされている場合、子カーネルは、以前に起動されておらず、処理９００は、ブロック９２９に進む。ブロック９２９において、子ランチャ８０４は、子カーネルを起動し、現在のカーネルの完了後に開始するように子カーネルをエンキューする。よって、子カーネルは、現在実行中のカーネルの全ての並列スレッドが終了した後に、新たな並列スレッドのセットを開始するようにエンキューされる。
【００６５】
ブロック９３１において、子ランチャ８０４は、子カーネル及びその並列スレッドの起動及びエンキューに関連して、子開始フラグ（child started flag）をアサートする。これにより、現在実行中の他のスレッドがスピンループの制限８０３を超えて別の子カーネルを起動及びエンキューするのを防止する。子カーネルが既にエンキューされている場合、スピンループ制限８０３に起因して終了した現在のカーネル内のスレッドは、同一の子カーネル内の対応するスレッドにおいて継続される。ブロック９３３において、スレッドは終了する。
【００６６】
ブロック９３５において、プロセッシングコア３０１は、現在のカーネル内の残りの並列スレッドが終了するのを待機する。並列スレッドの各々は、その要素を解くことを終了するか、スピンループ制限８０３を超えたことに起因して終了するかの何れかである。全てのスレッドが終了すると、カーネルが完了し、処理９００は、ブロック９３７に進む。
【００６７】
ブロック９３７において、子カーネルがエンキューされている場合（すなわち、ブロック９２９において）、処理は、ブロック９３９に進む。ブロック９３９において、エンキューされた子カーネルが開始する。子カーネルは、ベクトルｘ  ４２０内の要素ｘ［ｎ］の各々についてスレッドを開始する。前のスレッドにおいて既に解かれた（完了アレイによって示される）要素を解くためのスレッドは、ブロック９０７及び９３３を介して終了する。残りの解かれていない要素は、前述したように解かれる。新たなスレッドは、スピンループ（すなわち、ブロック９０９〜９１９）を実行して、各々の要素についての全ての先行要素が利用可能になるタイミングを判別し、先行要素が解かれた後にこれらの要素を解く。各子カーネルは、スピンループ制限８０３を超える１つのスレッドの１つを介して、ベクトルｘ  ４２０内の全ての要素が解かれ、ＳｐＴＳ全体が完了するまで、ブロック９１９及び９２７〜９３３を介して自身の子カーネルを起動及びエンキューすることもできる。
【００６８】
ベクトルｘ  ４２０内の全ての要素が解かれると、ブロック９０７又はブロック９２５からブロック９３３において全てのスレッドが終了し、子カーネルはエンキューされない。よって、処理９００は、ブロック９３７からブロック９４１に進み、ＳｐＴＳが完了する。
【００６９】
一実施形態では、図９Ｂに示すように、ブロック９０１〜９４１は、行列Ａ  ４１０の第１のＳｐＴＳを実行する動作を表し、ブロック９４３〜９４７は、行列Ａ  ４１０の第２のＳｐＴＳを実行する動作を表す。第２のＳｐＴＳについて、第１のＳｐＴＳを実行することによって生成された完了アレイは、式Ａｘ’＝ｙ’内の第２のベクトルｘ’を解くときに使用される。ここで、Ａは、第１のＳｐＴＳからの同一の行列Ａ  ４１０であり、ｘ’は、ベクトルｘ  ４２０とは異なる未知の要素の第２のベクトルであり、ｙ’は、ベクトルｙ４３０とは異なる既知の積値の第２のベクトルである。
【００７０】
ブロック９４３において、処理ユニット（例えば、処理ユニット２０４のうち１つ）は、ベクトルｘ’内の解かれる要素の階層を決定する。ベクトルｘ’内の各要素の階層は、以前に生成された完了アレイ内の要素と同一のインデックスを有する対応する完了フラグによって示される。例えば、以前に生成された完了アレイは、完了フラグ［１，２，２，２，３］を含み、階層１は、ｘ’［０］を含み、階層２は、ｘ’［１］、ｘ’［２］、ｘ’［３］を含み、階層３は、ｘ’［４］を含む。同一の階層内の要素は、並列に解くことが可能である。
【００７１】
ブロック９４５において、処理ユニットは、決定された階層に対応する順序でベクトルｘ’内の要素ｘ’［ｎ］の各々についての値を計算し、低い番号の階層内の要素は、高い番号の階層内の要素よりも前に解かれ、同一の階層内の要素は、並列に解かれる。各要素ｘ’［ｎ］は、その先行要素、行列Ａ  ４１０の対応する行内の要素、及び、対応する積値ｙ’［ｎ］に基づいて解かれる。要素ｘ’［ｎ］が階層に従った順序で解かれる場合、各要素は、その先行要素が既に解かれた後に解かれる。全ての要素が解かれた後に、第２のＳｐＴＳは、ブロック９４７において完了する。
【００７２】
よって、処理９００は、並列コンピューティングシステム（例えば、コンピューティングシステム１００）が、ＣＳＲデータセットの異なるフォーマット（ＣＳＣ等）へのコストのかかる変換を行うことなく、及び、コストのかかる依存性分析を行うことなく、ＣＳＲフォーマットに格納された行列に対してＳｐＴＳを実行することを可能にする。したがって、このアプローチを採用する並列コンピューティングシステムは、同じ結果を達成するための他のアプローチと比較して、電力を消費せず、少ないコンピューティングリソースを利用し、少ない時間で解を計算する。
【００７３】
方法は、スパース三角行列を圧縮スパース行（ＣＳＲ）データセットとして格納することと、第１のベクトル内の複数の要素毎に、要素の値を計算することと、を含む。要素の値を計算することは、要素について、第１のベクトル内の１つ以上の先行要素のセットを識別することであって、要素の値は、１つ以上の先行要素の各々に依存する、ことと、１つ以上の先行要素の全ての値が解かれたことを完了アレイが示すことに応じて、行列の行内の１つ以上の要素、及び、行に対応する積値に基づいて、要素の値を計算することと、完了アレイにおいて、要素が解かれたことを示す、要素の第１の完了フラグをアサートすることと、を含む。
【００７４】
方法は更に、行列の要素をＣＳＲデータセットの列アレイに格納することと、ＣＳＲデータセットの列アレイにおいて、値アレイに格納された要素毎に行列の列を識別することと、ＣＳＲデータセットの行ポインタアレイにおいて、行列の各々の行内の要素を識別することと、を含む。
【００７５】
方法は更に、複数の要素毎に、要素の値を計算するためのスレッドを開始することを含み、スレッドは、並列に実行される複数のスレッドのうち１つのスレッドである。
【００７６】
方法は更に、複数のスレッド毎に、完了アレイ内の第２の完了フラグを監視するためにスレッドにおいて実行されるスピンループの反復回数をカウントすることであって、第２の完了フラグは、１つの先行要素に関連付けられている、ことと、反復回数が制限を超えたことに応じて、スピンループを終了することと、複数の並列処理スレッドの全てが完了した場合に、実行される新たなスレッドをエンキューすることと、新たなスレッド内の完了フラグを監視することと、を含む。
【００７７】
方法は更に、子開始フラグをチェックすることであって、新たなスレッドをエンキューすることは、子開始フラグがデアサートされた場合に実行される、ことと、新たなスレッドをエンキューすることに関連して、子開始フラグをアサートすることと、を含む。
【００７８】
方法は更に、複数の要素毎に、第１のスピンループを実行して、完了アレイ内の第１の完了フラグを監視することであって、第１の完了フラグは、ＣＳＲデータセットの列アレイ内の第１の位置において指定されており、列アレイ内の第１の位置は、要素に対応する行ポインタによって示されている、ことと、第１の完了フラグがアサートされ、列アレイ内の第２の位置がスパース三角行列の非対角線要素に対応すると判別したことに応じて、第２のスピンループを実行して、完了アレイ内の第２の完了フラグを監視することであって、第２の完了フラグは、列アレイ内の第２の位置において指定されている、ことと、を含む。
【００７９】
方法では、行ポインタアレイ内の行ポインタの位置は、ベクトル内の要素の位置に対応しており、行ポインタは、列アレイ内の第１の位置のインデックスであり、列アレイの第１の位置は、完了アレイの完了フラグのインデックスを格納する。
【００８０】
方法は更に、複数の要素毎に、先行要素の各々の完了フラグを格納することと、先行要素の完了フラグの中で最高値の完了フラグをインクリメントすることによって、要素の完了フラグの値を決定することと、要素の完了フラグの決定された値を、要素に対応する位置の完了アレイに格納することによって、要素の完了フラグをアサートすることと、を含む。
【００８１】
方法は更に、第２のベクトル内の複数の要素毎に、完了アレイ内の要素に対応する完了フラグの値に基づいて、要素の階層を決定することと、決定された階層に応じた順序で第２のベクトル内の各要素の値を計算することと、を含み、同一の階層内の複数の要素のうち少なくとも２つの要素の値は、並列に計算される。
【００８２】
方法では、ＣＳＲデータセットは、メモリシステムに格納され、複数の要素毎に、要素の値は、メモリシステムに接続されたソルバー回路において計算される。
【００８３】
方法は更に、スピンループ回路を使用して、完了アレイから第１の完了フラグを読み出すことを含み、完了アレイは、メモリシステムに格納されており、完了アレイの第１の完了フラグをアサートすることは、スピンループ回路とメモリシステムとに接続されたソルバー回路によって実行される。
【００８４】
コンピューティングデバイスは、スパース三角行列を圧縮スパース行（ＣＳＲ）データセットとして格納するメモリと、メモリに接続された処理ユニットと、を含む。処理ユニットは、第１のベクトル内の複数の要素毎に、要素について第１のベクトル内の１つ以上の先行要素のセットを識別することによって要素の値を計算し、要素の値は、１つ以上の先行要素の各々に依存しており、１つ以上の先行要素の全ての値が解かれたことを完了アレイが示すことに応じて、行列の行内の１つ以上の要素及び行に対応する積値に基づいて要素の値を計算し、完了アレイにおいて、要素が解かれたことを示す要素の完了フラグをアサートする。
【００８５】
コンピューティングデバイスでは、ＣＳＲデータセットは更に、行列の要素を格納するための値アレイと、値アレイに格納された要素の各々についての行列の列を識別するための列アレイと、行列の各々の行内の要素を識別するための行ポインタアレイと、を含む。
【００８６】
コンピューティングデバイスでは、処理ユニットは、ベクトル内の１つの要素の値を計算するために複数の並列スレッドのスレッドをそれぞれ実行する複数のプロセッシングコアを含む。
【００８７】
コンピューティングデバイスでは、複数のプロセッシングコアの各々は更に、スレッドにおいてスピンループを実行することによって、完了アレイ内の完了フラグを監視し、スピンループの反復回数が所定の制限を超えたことに応じて、スピンループを終了し、複数の並列処理スレッドの全てが完了した場合に、完了フラグを監視するための新たなスレッドを実行する。
【００８８】
コンピューティングデバイスでは、処理ユニットは、第１のスピンループを実行して完了アレイ内の第１の完了フラグを監視することであって、第１の完了フラグは、ＣＳＲデータセットの列アレイ内の第１の位置において指定されており、列アレイ内の第１の位置は、第１のベクトル内の複数の要素のうち１つに対応する行ポインタによって示されている、ことと、第１の完了フラグがアサートされたと判別し、列アレイ内の第２の位置がスパース三角行列の非対角線要素に対応すると判別したことに応じて、第２のスピンループを実行して完了アレイ内の第２の完了フラグを監視することであって、第２の完了フラグは、列アレイ内の第２の位置において指定されている、ことと、を行うように構成された複数のプロセッシングコアを含む。
【００８９】
コンピューティングデバイスは更に、メモリ内の完了アレイを含み、完了アレイは、複数の要素毎に完了フラグを格納するためのものであり、処理ユニットは更に、複数の要素毎に、先行要素の完了フラグの中で最高値をインクリメントすることによって、要素の完了フラグの値を決定し、要素の完了フラグの決定された値を、要素に対応する位置の完了アレイに格納することによって、要素の完了フラグをアサートする。
【００９０】
コンピューティングデバイスでは、処理ユニットは更に、第２のベクトル内の複数の要素毎に、完了アレイ内の要素に対応する完了フラグの値に基づいて、要素の階層を決定し、決定された階層に応じた順序で第２のベクトル内の各要素の値を計算し、同一の階層内の複数の要素のうち少なくとも２つの要素の値は、並列に計算される。
【００９１】
コンピューティングシステムは、スパース三角行列を圧縮スパース行（ＣＳＲ）データセットとして格納するメモリシステムと、メモリシステムに接続された１つ以上の処理ユニットのセットと、を含む。処理ユニットのセット内の各処理ユニットは、第１のベクトル内の複数の要素毎に、要素について第１のベクトル内の１つ以上の先行要素のセットを識別することによって要素の値を計算し、要素の値は、１つ以上の先行要素の各々に依存しており、１つ以上の先行要素の全ての値が解かれたことを完了アレイが示すことに応じて、行列の行内の１つ以上の要素及び行に対応する積値に基づいて要素の値を計算し、完了アレイにおいて、要素が解かれたことを示す要素の完了フラグをアサートする。
【００９２】
コンピューティングシステムでは、処理ユニットのセット内の各処理ユニットは更に、複数の並列スレッドのうち少なくとも１つを実行し、複数の並列スレッドの各々は、複数の要素のうち１つの値を計算する。
【００９３】
コンピューティングシステムでは、処理ユニットのセット内の各処理ユニットは更に、単一の集積回路ダイ上に複数のプロセッシングコアを含み、複数のプロセッシングコアの各々は、複数の並列スレッドのうち１つを実行する。
【００９４】
コンピューティングシステムでは、処理ユニットのセット内の各処理ユニットは、処理ユニットのセット内の他の処理ユニットとは別の集積回路ダイ上のグラフィックス処理ユニット（ＧＰＵ）である。
【００９５】
本明細書で使用するように、「に接続される」という用語は、直接的に、又は、１つ以上の介在する構成要素を介して間接的に接続されることを意味することができる。本明細書に記載された様々なバスを介して提供される何れの信号も、他の信号と時分割多重化されてもよく、１つ以上の共通バスを介して提供されてもよい。さらに、回路構成要素又はブロック間の相互接続は、バス又は単一の信号線として示されてもよい。また、各バスは、１つ以上の単一の信号線であってもよいし、単一の信号線の各々は、バスであってもよい。
【００９６】
特定の実施形態は、非一時的なコンピュータ可読媒体に記憶された命令を含むことができるコンピュータプログラム製品として実施されてもよい。これらの命令は、説明した動作を実行するように汎用プロセッサ又は特殊目的プロセッサをプログラムするために使用されてもよい。コンピュータ可読媒体は、機械（例えば、コンピュータ）によって読み出し可能な形式（例えば、ソフトウェア、処理アプリケーション）で情報を記憶又は送信するための任意のメカニズムを含む。非一時的なコンピュータ可読記憶媒体は、磁気記憶媒体（例えば、フロッピー（登録商標）ディスク）、光学記憶媒体（例えば、ＣＤ−ＲＯＭ）、光磁気記憶媒体、読み出し専用メモリ（ＲＯＭ）、ランダムアクセスメモリ（ＲＡＭ）、消去可能プログラム可能メモリ（例えば、ＥＰＲＯＭ及びＥＥＰＲＯＭ）、フラッシュメモリ、又は、電子命令を記憶するのに適した別のタイプの媒体を含むことができるが、これらに限定されない。
【００９７】
さらに、いくつかの実施形態は、コンピュータ可読媒体が複数のコンピュータシステムに記憶され、及び／又は、複数のコンピュータシステムによって実行される分散コンピューティング環境において実施されてもよい。さらに、コンピュータシステム間で転送される情報は、コンピュータシステムを接続する伝送媒体を介してプルされてもよいし、プッシュされてもよい。
【００９８】
概して、コンピューティングシステム１０１を表すデータ構造及び／又はコンピュータ可読記憶媒体上で搬送されるこれらの一部は、プログラムによって読み出され、コンピューティングデバイス１０１を含むハードウェアを製造するために直接的又は間接的に使用され得るデータベース又は他のデータ構造であってもよい。例えば、データ構造は、Ｖｅｒｉｌｏｇ又はＶＨＤＬ等の高水準設計言語（ＨＤＬ）におけるハードウェア機能の動作レベルの記述又はレジスタ転送レベル（ＲＴＬ）記述であってもよい。記述は、合成ライブラリからゲートのリストを含むネットリストを生成するために記述を合成する合成ツールによって読み出されてもよい。ネットリストは、コンピューティングデバイス１０１を含むハードウェアの機能を表すゲートのセットを含む。次に、ネットリストは、マスクに適用される幾何学的形状を記述するデータセットを生成するように配置及びルーティングされてもよい。次いで、マスクは、コンピューティングデバイス１０１に対応する半導体回路を製造するために、様々な半導体製造工程で使用されてもよい。或いは、コンピュータ可読記憶媒体上のデータベースは、ネットリスト（合成ライブラリの有無に関わらない）若しくは必要に応じてデータセット、又は、グラフィックデータシステム（ＧＤＳ）ＩＩデータであってもよい。
【００９９】
本明細書における方法（複数可）の動作は、特定の順序で示され、説明されているが、各方法の動作の順序は、逆の順序で特定の動作を実行することができるように、又は、他の動作と少なくとも部分的に同時に特定の動作を実行することができるように変更されてもよい。別の実施形態では、個別の動作の命令又はサブ動作は、断続的及び／又は交互の方法であってもよい。
【０１００】
以上の明細書では、実施形態を、その特定の例示的な実施形態を参照して説明した。しかしながら、添付の特許請求の範囲に記載された実施形態のより広い範囲から逸脱することなく、様々な修正及び変更を行うことができることは明らかである。したがって、明細書及び図面は、限定的な意味ではなく、例示的な意味としてみなされる。
【図１】
2021513172.tif 000003
【図２】
2021513172.tif 000004
【図３】
2021513172.tif 000005
【図４Ａ】
2021513172.tif 000006
【図４Ｂ】
2021513172.tif 000007
【図４Ｃ】
2021513172.tif 000008
【図５】
2021513172.tif 000009
【図６】
2021513172.tif 000010
【図７】
2021513172.tif 000011
【図８】
2021513172.tif 000012
【図９Ａ】
2021513172.tif 000013
【図９Ｂ】
2021513172.tif 000014
【手続補正書】
【提出日】令和2年12月14日(2020.12.14)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
メモリデバイスにおいて、スパース三角行列を圧縮スパース行（ＣＳＲ）データセットとして格納することと、
複数のプロセッシングコアを備える処理ユニットにおいて、
第１のベクトル内の要素について、前記第１のベクトル内の１つ以上の先行要素のセットを識別することであって、前記要素の値は、前記１つ以上の先行要素の各々に依存する、ことと、
前記１つ以上の先行要素の全ての値が解かれたことを完了アレイが示すことに応じて、前記要素の値を計算するために前記複数のプロセッシングコアのうち何れかにおけるスレッドを開始することであって、前記スレッドは、前記行列の行内の１つ以上の要素と、前記１つ以上の先行要素の値、前記要素の値及び前記行内の１つ以上の要素に対応する積値と、に基づいて、前記複数のプロセッシングコアのうち何れかにおいて実行される、ことと、
前記完了アレイにおいて、前記要素が解かれたことを示す、前記要素の完了フラグをアサートすることと、
によって、前記第１のベクトル内の要素のサブセット内の要素毎に要素の値を計算することによって、前記第１のベクトル内の要素のサブセット毎の値を計算することと、を含む、
方法。
【請求項２】
前記スパース三角行列をＣＳＲデータセットとして格納することは、
前記行列の要素を前記ＣＳＲデータセットの値アレイに格納することと、
前記ＣＳＲデータセットの列アレイにおいて、前記値アレイに格納された前記要素毎に前記行列の列を識別することと、
前記ＣＳＲデータセットの行ポインタアレイにおいて、前記行列の各々の行内の前記要素を識別することと、を含む、
請求項１の方法。
【請求項３】
前記要素のサブセットの要素毎に、
前記スレッドは、互いに並列に実行される複数の並列スレッドのうち１つの並列スレッドであり、前記複数の並列スレッドの各々は、複数の要素のうち何れかを計算するためのものである、
請求項１の方法。
【請求項４】
前記複数のスレッド毎に、
前記完了アレイ内の第２の完了フラグを監視するために前記スレッドにおいて実行されるスピンループの反復回数をカウントすることであって、前記第２の完了フラグは、１つの前記先行要素に関連付けられている、ことと、
前記反復回数が制限を超えたことに応じて、
前記スピンループを終了することと、
複数の並列処理スレッドの全てが完了した場合に、実行される子カーネルをエンキューすることと、
前記子カーネルにおいて新たなスレッド内の前記第２の完了フラグを監視することと、をさらに含む、
請求項３の方法。
【請求項５】
子開始フラグをチェックすることであって、前記子カーネルをエンキューすることは、前記子開始フラグがデアサートされた場合に実行される、ことと、
前記子カーネルをエンキューすることに関連して、前記子開始フラグをアサートすることと、をさらに含む、
請求項４の方法。
【請求項６】
前記要素のサブセットの要素毎に、
第１のスピンループを実行して、前記完了アレイ内の第１の完了フラグを監視することであって、前記第１の完了フラグは、前記ＣＳＲデータセットの列アレイ内の第１の位置において指定されており、前記列アレイ内の前記第１の位置は、前記要素に対応する行ポインタによって示されている、ことと、
前記第１の完了フラグがアサートされ、前記列アレイ内の第２の位置が前記スパース三角行列の非対角線要素に対応すると判別したことに応じて、第２のスピンループを実行して、前記完了アレイ内の第２の完了フラグを監視することであって、前記第２の完了フラグは、前記列アレイ内の前記第２の位置において指定されている、ことと、をさらに含む、
請求項１の方法。
【請求項７】
前記要素のサブセットの要素毎に、
行ポインタアレイ内の前記行ポインタの位置は、前記ベクトル内の前記要素の位置に対応しており、
前記行ポインタは、前記列アレイ内の前記第１の位置のインデックスであり、
前記列アレイの前記第１の位置は、前記完了アレイ内の前記要素の前記完了フラグのインデックスを格納する、
請求項６の方法。
【請求項８】
前記要素のサブセットの要素毎に、
前記先行要素の各々の完了フラグを格納することと、
前記先行要素の前記完了フラグの中で最高値を有する完了フラグをインクリメントすることによって、前記要素の前記完了フラグの値を決定することと、
前記要素の前記完了フラグの決定された値を、前記要素に対応する位置の前記完了アレイに格納することによって、前記要素の前記完了フラグをアサートすることと、をさらに含む、
請求項１の方法。
【請求項９】
第２のベクトル内の複数の要素毎に、前記完了アレイ内の前記要素に対応する前記完了フラグの値に基づいて、前記要素の階層を決定することと、
決定された前記階層に応じた順序で前記第２のベクトル内の各要素の値を計算することであって、同一の階層内の前記複数の要素のうち少なくとも２つの要素の値は、並列に計算される、ことと、をさらに含む、
請求項８の方法。
【請求項１０】
前記ＣＳＲデータセットは、メモリシステムに格納され、
前記要素のサブセットの要素毎に、前記要素の値は、前記メモリシステムに接続されたソルバー回路において計算される、
請求項１の方法。
【請求項１１】
前記完了アレイを生成することと、
スピンループ回路を使用して、前記完了アレイから前記完了フラグを読み出すことと、をさらに含み、
前記完了アレイは、メモリシステムに格納されており、
前記完了アレイの前記完了フラグをアサートすることは、前記スピンループ回路と前記メモリシステムとに接続されたソルバー回路によって実行される、
請求項１の方法。
【請求項１２】
スパース三角行列を圧縮スパース行（ＣＳＲ）データセットとして格納するように構成されたメモリと、
複数のプロセッシングコアを備える処理ユニットであって、前記メモリに接続された処理ユニットと、を備え、
前記処理ユニットは、
第１のベクトル内の要素について、前記第１のベクトル内の１つ以上の先行要素のセットを識別することであって、前記要素の値は、前記１つ以上の先行要素の各々に依存する、ことと、
前記１つ以上の先行要素の全ての値が解かれたことを完了アレイが示すことに応じて、前記要素の値を計算するために前記複数のプロセッシングコアのうち何れかにおけるスレッドを開始することであって、前記スレッドは、前記行列の行内の１つ以上の要素と、前記１つ以上の先行要素の値、前記要素の値及び前記行内の１つ以上の要素に対応する積値と、に基づいて、前記複数のプロセッシングコアのうち何れかにおいて実行される、ことと、
前記完了アレイにおいて、前記要素が解かれたことを示す、前記要素の完了フラグをアサートすることと、
によって、前記第１のベクトル内の要素のサブセットの要素毎に要素の値を計算する、ように構成されている、
コンピューティングデバイス。
【請求項１３】
前記ＣＳＲデータセットは、
前記行列の要素を格納するように構成された値アレイと、
前記値アレイに格納された前記要素の各々についての前記行列の列を識別するように構成された列アレイと、
前記行列の各々の行内の前記要素を識別するように構成された行ポインタアレイと、をさらに含む、
請求項１２のコンピューティングデバイス。
【請求項１４】
前記処理ユニットは、
前記ベクトル内の１つの前記要素の値を計算するために複数の並列スレッドのスレッドをそれぞれ実行するように構成された複数のプロセッシングコアを含む、
請求項１２のコンピューティングデバイス。
【請求項１５】
前記複数のプロセッシングコアの各々は、
前記スレッドにおいてスピンループを実行することによって、前記完了アレイ内の前記完了フラグを監視することと、
前記スピンループの反復回数が所定の制限を超えたことに応じて、
前記スピンループを終了することと、
複数の並列処理スレッドの全てが完了した場合に、前記完了フラグを監視するための新たなスレッドを実行することと、
を行うように構成されている、
請求項１４のコンピューティングデバイス。
【請求項１６】
前記処理ユニットは、
第１のスピンループを実行して前記完了アレイ内の第１の完了フラグを監視することであって、前記第１の完了フラグは、前記ＣＳＲデータセットの列アレイ内の第１の位置において指定されており、前記列アレイ内の前記第１の位置は、前記第１のベクトルの要素のサブセットのうち何れかに対応する行ポインタによって示されている、ことと、
前記第１の完了フラグがアサートされたと判別し、前記列アレイ内の第２の位置が前記スパース三角行列の非対角線要素に対応すると判別したことに応じて、第２のスピンループを実行して前記完了アレイ内の第２の完了フラグを監視することであって、前記第２の完了フラグは、前記列アレイ内の前記第２の位置において指定されている、ことと、
を行うように構成された複数のプロセッシングコアを含む、
請求項１２のコンピューティングデバイス。
【請求項１７】
前記メモリ内の完了アレイをさらに備え、前記完了アレイは、前記要素のサブセットの要素毎に完了フラグを格納するように構成されており、
前記処理ユニットは、前記要素のサブセットの要素毎に、
前記先行要素の前記完了フラグの中で最高値をインクリメントすることによって、前記要素の前記完了フラグの値を決定することと、
前記要素の前記完了フラグの決定された値を、前記要素に対応する位置の前記完了アレイに格納することによって、前記要素の前記完了フラグをアサートすることと、
を行うように構成されている、
請求項１２のコンピューティングデバイス。
【請求項１８】
前記処理ユニットは、
第２のベクトル内の複数の要素毎に、前記完了アレイ内の前記要素に対応する前記完了フラグの値に基づいて、前記要素の階層を決定することと、
決定された前記階層に応じた順序で前記第２のベクトル内の各要素の値を計算することであって、同一の階層内の前記複数の要素のうち少なくとも２つの要素の値は、並列に計算される、ことと、
を行うように構成されている、
請求項１７のコンピューティングデバイス。
【請求項１９】
スパース三角行列を圧縮スパース行（ＣＳＲ）データセットとして格納するように構成されたメモリシステムと、
前記メモリシステムに接続された１つ以上の処理ユニットのセットと、を備え、
前記処理ユニットのセット内の各処理ユニットは、複数のプロセッシングコアを備えており、
第１のベクトル内の要素のサブセットの要素毎に、
前記要素について、前記第１のベクトル内の１つ以上の先行要素のセットを識別することであって、前記要素の値は、前記１つ以上の先行要素の各々に依存する、ことと、
前記１つ以上の先行要素の全ての値が解かれたことを完了アレイが示すことに応じて、前記要素の値を計算するために前記複数のプロセッシングコアのうち何れかにおけるスレッドを開始することであって、前記スレッドは、前記行列の行内の１つ以上の要素と、前記１つ以上の先行要素の値、前記要素の値及び前記行内の１つ以上の要素に対応する積値と、に基づいて、前記複数のプロセッシングコアのうち何れかにおいて実行される、ことと、
前記完了アレイにおいて、前記要素が解かれたことを示す、前記要素の完了フラグをアサートすることと、
によって、前記要素の値を計算するように構成されている、
コンピューティングシステム。
【請求項２０】
前記処理ユニットのセット内の各処理ユニットは、
複数の並列スレッドのうち少なくとも１つを実行するように構成されており、前記複数の並列スレッドの各々は、前記要素のサブセットのうち何れかの要素の値を計算する、
請求項１９のコンピューティングシステム。
【請求項２１】
前記処理ユニットのセット内の各処理ユニットは、単一の集積回路ダイ上に複数のプロセッシングコアを含み、前記複数のプロセッシングコアの各々は、前記複数の並列スレッドのうち１つを実行するように構成されている、
請求項２０のコンピューティングシステム。
【請求項２２】
前記処理ユニットのセット内の各処理ユニットは、前記処理ユニットのセット内の他の処理ユニットとは別の集積回路ダイ上のグラフィックス処理ユニット（ＧＰＵ）である、
請求項１９のコンピューティングシステム。
【国際調査報告】
2021513172.tif 000015
2021513172.tif 000016