(57)【要約】第１処理要素は第１スレッドを実行するように構成されており、１つ以上の第２処理要素は、第１スレッドに対して冗長な１つ以上の第２スレッドを実行するように構成されている。第１スレッド及び１つ以上の第２スレッドは、比較用のイベントトリガが、以前の結果の符号化値の以前の比較以降に設定可能な回数だけ発生したか否かに応じて、第１スレッド及び１つ以上の第２スレッドによって実行された演算の結果の１回以上の比較を選択的にバイパスする。比較は、例えば、現在の演算及び１回以上の以前の延在の結果のハッシュ（又は、符号化）値に基づいて行われる。【選択図】図１
2019526102.tif 000002
【特許請求の範囲】
【請求項１】
比較用のイベントトリガが、冗長スレッドによって以前に実行された少なくとも１つの演算の結果の以前の比較以降に設定可能な回数だけ発生したか否かに応じて、冗長スレッドによって実行された演算の結果の少なくとも１回の比較を選択的にバイパスすることを含む、
方法。
【請求項２】
前記設定可能な回数は１よりも大きい、
請求項１の方法。
【請求項３】
前記イベントトリガは、前記結果をメモリに記憶するために前記冗長スレッドによって実行されるストア命令である、
請求項１又は２の方法。
【請求項４】
前記結果を、以前の符号化値及び初期値のうち少なくとも１つと共にハッシュすることによって、前記結果の符号化値を生成することをさらに含む、
請求項１〜３の何れかの方法。
【請求項５】
前記結果をハッシュするのに使用されるコード値のルックアップテーブルを生成するためにコンパイル中にコードを挿入することによって、前記冗長スレッドによって実行されるプログラムコードを修正することをさらに含む、
請求項１〜４の何れかの方法。
【請求項６】
前記コンパイル中にプログラムコードを修正することは、前記冗長スレッド毎にカウンタを初期化することをさらに含み、前記冗長スレッドが前記イベントトリガを実行したことに応じて各カウンタがインクリメントされ、前記カウンタの値は、前記少なくとも１回の比較を選択的にバイパスするか否かを判別するために、前記設定可能な回数と比較される、
請求項５の方法。
【請求項７】
前記コンパイル中にプログラムコードを修正することは、前記結果をハッシュして符号化値を生成し、前記カウンタの値を前記設定可能な回数と比較して前記少なくとも１回の比較を選択的にバイパスするか否かを判別し、前記比較用のイベントトリガが前記設定可能な回数だけ発生したと判別したことに応じて、前記冗長スレッド間で前記符号化値を共有及び比較するためのコードを挿入することをさらに含む、
請求項６の方法。
【請求項８】
前記コンパイル中にプログラムコードを修正することは、前記冗長スレッドが前記プログラムコードを終了する前に、未処理の共有及び比較演算を実行するか否かを判別するためのコードを挿入することをさらに含む、
請求項７の方法。
【請求項９】
第１スレッドを実行するための第１処理要素と、
前記第１スレッドに対して冗長な少なくとも１つの第２スレッドを実行するための少なくとも１つの第２処理要素と、を備え、
前記第１スレッド及び前記少なくとも１つの第２スレッドは、比較用のイベントトリガが、冗長スレッドによって以前に実行された少なくとも１回の演算の結果の以前の比較以降に設定可能な回数だけ発生したか否かに応じて、前記第１スレッド及び前記少なくとも１つの第２スレッドによって実行された演算の結果の少なくとも１回の比較を選択的に迂回する、
装置。
【請求項１０】
前記イベントトリガは、前記結果を記憶するために前記冗長スレッドによって実行されるストア命令である、
請求項９の装置。
【請求項１１】
前記第１スレッド及び前記少なくとも１つの第２スレッドは、前記結果を、以前の符号化値及び初期値のうち少なくとも１つと共にハッシュすることによって、符号化値を生成する、
請求項９又は１０の装置。
【請求項１２】
前記第１処理要素と、前記少なくとも１つの第２処理要素と、を含む複数の処理要素をさらに備え、
前記複数の処理要素は、前記結果をハッシュして符号化値を生成するのに使用されるコード値のルックアップテーブルを生成するためにコンパイル中にコードを挿入することによって、前記第１スレッド及び前記少なくとも１つの第２スレッドによって実行されるプログラムコードを修正するように構成されたコンパイラを実装する、
請求項９〜１１の何れかの装置。
【請求項１３】
前記第１スレッド及び前記少なくとも１つの第２スレッドのためのカウンタを実装するように構成されたメモリをさらに備え、
前記コンパイラは、前記カウンタを初期化するように構成されており、前記第１スレッド又は前記少なくとも１つの第２スレッドは、前記イベントトリガを実行したことに応じて対応するカウンタをインクリメントし、前記カウンタの値は、前記少なくとも１回の比較を選択的にバイパスするか否かを判別するために、前記設定可能な回数と比較される、
請求項１２の装置。
【請求項１４】
前記コンパイラは、前記結果をハッシュし、前記カウンタの値を前記設定可能な回数と比較して前記少なくとも１回の比較を選択的にバイパスするか否かを判別し、前記比較用のイベントトリガが前記設定可能な回数だけ発生したと判別したことに応じて、前記第１スレッド及び前記少なくとも１つの第２スレッドの間で前記符号化値を共有及び比較するためのコードを挿入するように構成されている、
請求項１３の装置。
【請求項１５】
前記コンパイラは、前記第１スレッド及び前記少なくとも１つの第２スレッドが前記プログラムコードを終了する前に、未処理の共有及び比較演算を実行するか否かを判別するためのコードを挿入するように構成されている、
請求項１４の装置。
【発明の詳細な説明】
【背景技術】
【０００１】
中央処理装置（ＣＰＵ）、グラフィックス処理装置（ＧＰＵ）及び加速処理装置（ＡＰＵ：accelerated processing unit）等の処理ユニットには、複数の命令を同時に又は並行して処理するために複数の計算装置（例えば、プロセッサコア）が実装されている。例えば、ＧＰＵは、命令ストリーム（従来、「ワークアイテム」又は「スレッド」と呼ばれる）を同時に又は並行して実行するための複数の処理要素をそれぞれ含む複数の計算装置を用いて実装され得る。単一命令複数データ（ＳＩＭＤ）アーキテクチャに従って動作する計算装置は、異なるデータセットを用いて同じ命令を実行する。ＧＰＵ等の処理装置上で同時に又は並行して実行可能なスレッドの数は、数十スレッドから数千スレッドに及ぶ場合があり、エンジニアは、ＧＰＵに通常実装されている２次元（２Ｄ）又は３次元（３Ｄ）のグラフィックスアプリケーション以外のアプリケーションにもこの機能を利用したいと考えている。しかしながら、汎用アプリケーションは、アプリケーションエラーやシステムクラッシュを回避するために、従来のグラフィックスアプリケーションよりも高いレベルの耐障害性（fault tolerance）を必要とする。
【０００２】
添付の図面を参照することによって、本開示をより良く理解することができ、その多くの特徴及び利点が当業者に明らかとなるであろう。異なる図面において同一の参照符号が使用されている場合、類似又は同一のアイテムが示されている。
【図面の簡単な説明】
【０００３】
【図１】いくつかの実施形態による、加速処理装置のブロック図である。
【図２】いくつかの実施形態による、図１に示す加速処理装置上で実行可能なスレッドのグループの階層構造を示すブロック図である。
【図３】いくつかの実施形態による、フィンガープリントの以前の比較以降に生じたイベントトリガの数に基づいて、冗長スレッドのフィンガープリントの比較を選択的にバイパスする加速処理装置のブロック図である。
【図４】いくつかの実施形態による、プログラムコードのコンパイル中にコンパイラによって挿入される変換コードによるプログラムコードの修正を示す図である。
【図５】いくつかの実施形態による、エラーを検出するために冗長スレッド間で共有及び比較演算を選択的にバイパス又は実行する方法のフロー図である。
【図６】いくつかの実施形態による、プログラムコードを終了する前に冗長スレッド間で共有及び比較演算を実行するか否かを判別するために終了チェックを実行する方法のフロー図である。
【発明を実施するための形態】
【０００４】
冗長マルチスレッド（ＲＭＴ：Redundant multithreading）を使用して、２つ以上の冗長スレッドを異なる処理要素で実行し、次に冗長スレッドの結果を比較してエラーを検出することによって、処理装置の信頼性を向上させることができる。同じデータに対して同じ命令を実行する２つの冗長スレッドによって生成された結果間の相違を検出することによって、少なくとも１つの冗長スレッドにエラーがあることが示される。同じデータに対して同じ命令を実行する３つ以上の冗長スレッドによって生成された結果間の類似点及び相違点を用いて、例えば３つ以上の結果に適用される投票方式を使用することによって、エラーを検出し、場合によってはエラーを訂正することができる。ＲＭＴエラー検出又は訂正をサポートするために冗長スレッド間でデータを受け渡すメカニズムは、かなりのオーバーヘッドを招く。例えば、スピンロックメカニズムを使用して、冗長スレッド間のデータ及びメッセージの受け渡しを同期させてもよい。ＲＭＴシステムの性能は、少なくとも部分的には、従来のＲＭＴシステムが、エラーを含む可能性があるデータを記憶するのを避けるために、各ストア命令（又は他のイベントトリガ）の前に、冗長スレッドによって生成された結果を比較するため、オーバーヘッドによって著しく低下する可能性がある。
【０００５】
比較用のイベントトリガ（例えば、冗長スレッドによるストア命令の実行等）が以前の結果の比較から設定可能な回数（例えば２回以上）だけ発生したか否かに応じて、冗長スレッドによって実行された演算結果の比較を選択的にバイパスすることによって、ソフトウェア実装されたＲＭＴエラー検出又は訂正メカニズムのオーバーヘッドを、エラー検出精度を低下させることなく減らすことができる。スレッドによって生成された結果を、以前に符号化された値又はスレッドに関連する初期値と共にハッシュして、符号化値を冗長スレッド毎に生成することによって、エラーを検出する確率を大幅に低下させることなく、以前の演算の結果を後続の比較のために記憶するのに伴うオーバーヘッドを減らすことができる。符号化値は、複数のイベントトリガに関連する複数の結果を表す各スレッドのフィンガープリントを形成する。冗長スレッドのフィンガープリントの値は、冗長スレッドでいくつかのイベントトリガが発生した後に共有及び比較される。冗長スレッドのフィンガープリントの値が異なる場合にはエラーが検出され、これにより、バリエーションによってはエラー回復処理がトリガされる。冗長スレッドは、３つ以上の冗長スレッドを含むことができ、その場合、投票方式を使用して、フィンガープリントの最頻値を正しい値として選択することによって、エラー訂正を実行する。フィンガープリントのいくつかの実施形態では、記憶される結果及び記憶される値のアドレスを以前のフィンガープリントの値と共にハッシュすることによって、計算される。
【０００６】
いくつかのバリエーションでは、コンパイラを使用して、冗長スレッドによって実行されるプログラムコードをフィンガープリント方式に変換する。変換コードによって、冗長スレッドは、共有及び比較演算を選択的にバイパスし、バイパスされた共有及び比較演算に対する符号化値を、単一の符号化されたフィンガープリントにひとまとめにする。例えば、共有及び比較演算のイベントトリガがストア命令である場合、コンパイラは、コードを挿入して、冗長スレッドによって記憶される結果と、対応する以前のフィンガープリントの値と、をハッシュするのに使用されるコードのルックアップテーブルを生成する。また、コンパイラは、冗長スレッド毎のカウンタを初期化する。カウンタは、冗長スレッドがイベントトリガを実行したことに応じてインクリメントされ、共有及び比較演算がバイパスされた回数を判別するために使用される。また、コンパイラは、ハッシュを実行し、冗長スレッドのフィンガープリント変数の値の比較をバイパス又は実行するかをチェックし、冗長スレッドのフィンガープリント変数の値を共有及び比較し、プログラムコードを終了する前に未処理の共有及び比較演算を実行するか否かを判別するために、変換コードを挿入する。
【０００７】
図１は、いくつかの実施形態による、加速処理装置１００のブロック図である。加速処理装置（ＡＰＤ：accelerated processing device）１００を用いて、様々なタイプの処理装置（例えば、中央処理装置（ＣＰＵ）、グラフィックス処理装置（ＧＰＵ）、汎用ＧＰＵ（ＧＰＧＰＵ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、デジタル信号プロセッサ（ＤＳＰ）等）を実装することができる。ＡＰＤ１００は、１つ以上の仮装マシン（例えば、コンピュータシステムの動作をエミュレートし、アプリケーションを実行するためのプラットフォームを提供する低レベル仮想マシン（ＬＬＶＭ）等）を実装するように構成され得る。また、ＡＰＤ１００は、オペレーティングシステムを実装するように構成されており、いくつかの実施形態では、各仮装マシンは、オペレーティングシステムの個別のインスタンスを実行する。さらに、ＡＰＤ１００は、例えば、ピクセル演算、幾何学的計算、例えば画像レンダリング等を含むグラフィックスパイプライン演算等の演算を行うカーネルを実行するように構成されている。また、ＡＰＤ１００は、映像操作（video operations）、物理シミュレーション、計算流体力学等の非グラフィックス処理演算を実行することができる。
【０００８】
ＡＰＤ１００は、複数の計算ユニット１０１，１０２，１０３を含み、これらは本明細書においてまとめて「計算ユニット１０１〜１０３」と呼ばれる。計算ユニット１０１〜１０３は、同じカーネルの異なるインスタンスを同時に実行するパイプラインとして動作するように構成することができる。例えば、計算ユニット１０１〜１０３のいくつかの変形例では、異なるデータを使用して同じ命令を並行して実行する単一命令複数データ（ＳＩＭＤ）プロセッサコアであってもよい。ＡＰＤ１００のいくつかの実施形態は、より多くの又はより少ない計算ユニット１０１〜１０３を実装してもよい。
【０００９】
計算ユニット１０１は、処理要素１０５，１０６，１０７（本明細書においてまとめて「処理要素１０５〜１０７」と呼ばれる）を含む。処理要素１０５〜１０７のいくつかの実施形態は、計算ユニット１０１内の処理要素１０５〜１０７による実行のためにスケジューリングされた命令によって示される算術演算及び論理演算を実行するように構成されている。また、計算ユニット１０１は、例えばローカルデータ記憶部（ＬＤＳ：local data store）１１０等のメモリを含む。ＬＤＳ１１０に記憶された命令又はデータは、処理要素１０５〜１０７からは見えるが、計算ユニット１０２，１０３上のエンティティからは見えない。したがって、ＬＤＳ１１０は、計算ユニット１０１の処理要素１０５〜１０７間での共有を可能にする。ＬＤＳ１１０は、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）、組み込みＤＲＡＭ（ｅＤＲＡＭ）、相変化メモリ（ＰＣＭ）等を使用して実装することができる。明瞭にするために、図１には、計算ユニット１０１に実装された処理要素１０５〜１０７及びＬＤＳ１１０のみが示されている。しかしながら、計算ユニット１０２，１０３も対応する処理要素及び対応するＬＤＳを含む。
【００１０】
各処理要素１０５〜１０７は、カーネルの個別のインスタンスを実行する。処理要素１０５〜１０７によって実行されるカーネルのインスタンスは、ワークアイテム、タスク又はスレッドと呼ばれ得る。いくつかの変形例では、スレッドによって実行される命令、及び、命令によって操作されるデータは、ＬＤＳ１１０からアクセスされる。そして、スレッドによって実行された演算の結果は、ＬＤＳ１１０に記憶される。また、処理要素１０５〜１０７は、プライベートメモリ１１５，１１６，１１７を含み、これらは本明細書においてまとめて「メモリ１１５〜１１７」と呼ばれる。各処理要素１０５〜１０７のメモリ１１５〜１１７は、対応する処理要素１０５〜１０７からしか見えない。例えば、メモリ１１５は、処理要素１０５からしか見えず、処理要素１０６，１０７からは見えない。メモリ１１５〜１１７は、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）、組み込みＤＲＡＭ（ｅＤＲＡＭ）、相変化メモリ（ＰＣＭ）等を使用して実装することができる。
【００１１】
また、ＡＰＤ１００は、ＡＰＤ１００に実装される全ての計算ユニット１０１〜１０３から見えるメモリであるグローバルデータ記憶部（ＧＤＳ：global data store）１２０を含む。本明細書で使用される場合、「見える」という用語は、計算ユニット１０１〜１０３が、例えば、メモリに情報を書き込むためにストアを実行する、又は、メモリから情報を読み出すためにロードを実行することによって、ＧＤＳ１２０内の情報にアクセスできることを示している。したがって、ＧＤＳ１２０を使用することによって、計算ユニット１０１〜１０３の処理要素によって実行されているスレッド間の共有を容易にすることが可能になる。ＧＤＳ１２０のいくつかの実施形態は、ＡＰＤ１００に相互接続され得る他の処理装置からも見える。例えば、ＧＤＳ１２０は、ＡＰＤ１００に接続されているＣＰＵ（図１には示されていない）から見えてもよい。ＧＤＳ１２０は、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）、組み込みＤＲＡＭ（ｅＤＲＡＭ）、相変化メモリ（ＰＣＭ）等を使用して実装することができる。
【００１２】
冗長スレッドは、ＡＰＤ１００内の処理要素１０５〜１０７によって実行される。冗長スレッドによって実行された演算の結果を符号化することによって、冗長スレッド毎にフィンガープリントを生成することができる。そして、冗長スレッドによって実行された演算の結果又は冗長スレッドのフィンガープリントを比較して、冗長スレッドの実行中に発生したエラーを検出（又は、場合によっては訂正）することができる。結果又は関連するフィンガープリントの比較は、通常、ストア命令等のトリガイベントに応じて実行され、これにより、結果をメモリに収容する前にエラーが検出又は訂正される。ＡＰＤ１００のいくつかの実施形態は、比較用のイベントトリガが、結果の符号化値の以前の比較から設定可能な回数だけ発生したか否かに応じて、冗長スレッドのフィンガーの比較を選択的にバイパスするように構成されている。設定可能な回数は、２以上の値に設定することができる。
【００１３】
図２は、いくつかの実施形態による、スレッドのグループの階層構造２００を示すブロック図である。階層構造２００のいくつかの変形例は、図１に示すＡＰＤ１００によって同時に又は並行して実行されるスレッドを表す。階層構造２００は、図１に示す処理要素１０５〜１０７等の処理要素によって実行可能なプログラムコードを表すカーネル２０５を含む。カーネル２０５のインスタンスは、ワークグループ２１０，２１１，２１２にグループ分けされ、これらは本明細書においてまとめて「ワークグループ２１０〜２１２」と呼ばれる。各ワークグループ２１０〜２１２は、ワークグループ内のスレッド数を定義するローカルサイズと、ワークグループ２１０〜２１２の各々を一意に識別するグループ識別子と、を有する。いくつかの実施形態では、ワークグループ２１０〜２１２は、同時に又は並行して実行される関連スレッドの集合である。例えば、ワークグループ２１０はスレッド２１５，２１６，２１７を含み、これらは本明細書においてまとめて「スレッド２１５〜２１７」と呼ばれる。スレッド２１５〜２１７には、ワークグループ２１０内のスレッド２１５〜２１７を識別する異なるローカル識別子が割り当てられている。また、スレッド２１５〜２１７には、全てのワークグループ２１０〜２１２に割り当てられたスレッドに亘ってスレッド２１５〜２１７をグローバルに識別するグローバル識別子も割り当てられている。各ワークグループ２１０〜２１２内のスレッドは、対応するワークグループ２１０〜２１２内の他のスレッドと同期することができる。
【００１４】
ワークグループ２１０〜２１２は、対応する計算ユニットで実行されるように割り当てられている。例えば、ワークグループ２１０は、図１に示す計算ユニット１０１で実行され、ワークグループ２１１は、図１に示す計算ユニット１０２で実行され、ワークグループ２１２は、図１に示す計算ユニット１０３で実行され得る。ワークグループ２１０〜２１２内のスレッドは、割り当てられた計算ユニット内の対応する処理要素で実行されるようにスケジューリングされる。例えば、スレッド２１５は、図１に示す処理要素１０５で実行されるようにスケジューリングすることができ、スレッド２１６は、図１に示す処理要素１０６で実行されるようにスケジューリングすることができ、スレッド２１７は、図１に示す処理要素１０７で実行されるようにスケジューリングすることができる。
【００１５】
冗長マルチスレッド（ＲＭＴ）は、スレッド２１５〜２１７等のスレッドの処理中に発生するエラーを検出し、場合によっては訂正するために、ＡＰＤ１００によって実行される。冗長スレッドは、同じデータを使用して同じ命令を実行するために、複数のスレッドをインスタンス化することによって生成される。冗長スレッドは、異なる処理要素で実行される。グローバル識別子、又は、グループ識別子及びローカル識別子の組み合わせは、対応するスレッドによって処理されるデータを示している。例えば、スレッドのグローバル識別子を使用して、メモリアドレスを計算し、スレッドの制御を決定することができる。したがって、２つのスレッドが同じデータに対して同じカーネルコードを実行するように、複数のスレッドのグローバル識別子（又は、グループ識別子及びローカル識別子の組み合わせ）を単一のグローバル識別子にマッピングすることによって、冗長スレッドを生成することができる。ソフトウェア実装ＲＭＴ技術は、米国特許第９，２７４，９０４号に開示されており、その全体は、引用することによって本明細書に組み込まれる。比較用のイベントトリガが、結果の符号化値の以前の比較から設定可能な回数だけ発生したか否かに応じて、冗長スレッドによって実行された演算の結果の符号化値（フィンガープリントとも呼ばれ得る）の比較を選択的にバイパスすることによって、ソフトウェア実装ＲＭＴ技術によって生じるオーバーヘッドを低減することができる。
【００１６】
図３は、いくつかの実施形態による、フィンガープリントの以前の比較以降に生じたイベントトリガの数に基づいて、フィンガープリントの比較を選択的にバイパスするＡＰＤ３００のブロック図である。ＡＰＤ３００は、図１に示すＡＰＤ１００のいくつかの実施形態を実装するために使用される。ＡＰＤ３００はカーネル３０５を実行するように構成されている。スレッド３１０，３１５は、同じデータに対して同じ命令を実行するカーネル３０５の冗長インスタンスを表している。いくつかの実施形態では、スレッド３１０，３１５は、同じ識別子（例えば、同じグローバル識別子、グループ識別子又はローカル識別子）によって識別される。図３には、２つのスレッド３１０，３１５が示されているが、他の実施形態では、より多くの冗長スレッドを含んでもよい。
【００１７】
ＡＰＤ３００は、冗長スレッドを実行するための処理要素３２０，３２５を含む。各処理要素３２０，３２５は、対応するプライベートメモリ３３０，３３５を含む。図３には、２つの処理要素３２０，３２５が示されているが、ＡＰＤ３００のいくつかの実施形態では、より多くの処理要素を含んでもよい。また、ＡＰＤ３００は、処理要素３２０，３２５の両方から見えるメモリ３４０を含む。例えば、処理要素３２０，３２５が同じ計算ユニットに実装される場合、メモリ３４０は、図１に示すＬＤＳ１１０等のローカルデータ記憶部とすることができる。他の例では、処理要素３２０，３２５が異なる計算ユニットに実装される場合、メモリ３４０は、図１に示すＧＤＳ１２０等のグローバルデータ記憶部とすることができる。
【００１８】
ＡＰＤ３００によって実装されるコンパイラは、コンパイル中に、変換コードを、カーネル３０５によって定義されたプログラムコードに挿入する。変換コードは、スレッド３１０，３１５によって実行されると、スレッド３１０，３１５に、プログラムコードの一部又はブロックの実行結果に基づいてスレッド３１０，３１５によって生成されたフィンガープリントの比較を選択的にバイパスさせる。スレッド３１０，３１５は、比較用のイベントトリガが、以前のフィンガープリントの比較以降に設定可能な回数だけ発生したか否かに応じて、フィンガープリントの比較を選択的にバイパスする。いくつかの実施形態では、コンパイラは、フィンガープリントを生成するために結果をハッシュするのに用いられるコード値を含むルックアップテーブル３４５を、スレッド３１０，３１５の１つ以上に割り当てさせる変換コードを挿入する。例えば、２５６要素の８ビット配列をスレッドグループのローカル共有メモリ空間に割り当てて、ルックアップテーブル３４５を形成することができる。また、変換コードは、スレッド３１０，３１５の１つ以上に、ルックアップテーブル３４５内のコード値を初期化させることができる。例えば、スレッド３１０，３１５の１つ以上は、２５６個の８ビットの一意のキャッシュ要素（unique cache elements）を、ルックアップテーブル３４５を形成する配列に挿入することができる。或いは、いくつかの実施形態は、ルックアップテーブル３４５の使用を必要としない他のアルゴリズム（例えば、排他的論理和演算等に基づくハッシュアルゴリズム）を使用してハッシュを行う。
【００１９】
プログラムコードに挿入された変換コードは、フィンガープリントの値を記憶するために、対応するレジスタ３５０，３５５をスレッド３１０，３１５に初期化させるレジスタ初期化コードを含む。例えば、スレッド３１０，３１５は、対応するプライベートメモリ３３０，３３５内のレジスタ３５０，３５５を割り当てることができる。また、スレッド３１０，３１５は、ルックアップテーブル３４５に記憶されたコード値を使用して、レジスタ３５０，３５５に記憶されたフィンガープリントの値を初期化することができる。また、変換コードは、スレッド３１０，３１５が例えばストア命令等のイベントトリガに応じたフィンガープリント値の比較をバイパスした回数をカウントするのに使用される対応するカウンタ３６０，３６５を、スレッド３１０，３１５に初期化させるカウンタ初期化コードを含む。スレッド３１０，３１５は、カウンタ３６０，３６５を例えばゼロ等のデフォルト値に初期化することができる。
【００２０】
変換コードは、スレッド３１０、３１５に、現在の結果の値（及び、場合によっては、結果を記憶する場所のアドレス）を、対応するレジスタ３５０，３５５に記憶された現在のフィンガープリントの値とハッシュさせるハッシュコードを含む。例えば、スレッド３１０，３１５が以前のフィンガープリント値の比較をバイパスしていない場合、現在の結果の値（例えば、メモリに記憶される値等）及び記憶場所のアドレスは、対応するレジスタ３５０，３５５に記憶されたフィンガープリントの初期値とハッシュされる。他の例では、スレッド３１０，３１５が以前のフィンガープリント値の比較を既に１回以上バイパスしている場合、現在の結果の値及びアドレスは、現在のフィンガープリント値とハッシュされる。現在のフィンガープリント値は、以前の比較をバイパスしたことに応じてフィンガープリントとハッシュされた以前の結果の値及びアドレスに基づいて以前に生成されたものである。スキップチェックは、変換コードに含まれており、カウンタ３６０，３６５の値と、比較をバイパスするか比較を実行するかを示す設定可能な値と、を比較するために使用される。設定可能な値は、１より大きい値に設定される。設定可能な値が大きいほど、ＡＰＤ３００によるエラー検出を行うのに使用される共有及び比較アルゴリズムによって生じるオーバーヘッドを低減させることができる。
【００２１】
また、変換コードは、エラー検出又は訂正のために値を比較できるように、対応するレジスタ３５０，３５５内の値をスレッド３１０，３１５に共有させる共有及び比較コードを含む。例えば、スレッド３１０によって実行されたスキップチェックが、カウンタ３６０の値が設定可能な値以上であることを示す場合、スレッド３１０は、フィンガープリントの値を、レジスタ３５０から、メモリ３４０内に実装された共有バッファ３７０にコピーすることによって、レジスタ３５０に記憶されたフィンガープリントを共有することができる。同期、スピンロック又は他の技術を使用して、共有バッファ３７０の使用を調整してもよい。また、スレッド３１５によって実行されるスキップチェックは、カウンタ３６５の値が設定可能な値以上であることを示す。そして、スレッド３１５は、スレッド３１０に関連する共有されたフィンガープリントの値にアクセスし、共有されたフィンガープリントを、レジスタ３５５に記憶されたフィンガープリントの値と比較することができる。２つの値が等しい場合、ＡＰＤ３００は、エラーが発生していないと判別する。２つの値が異なる場合、ＡＰＤ３００は、エラーが発生したと判別し、エラー訂正を含むエラー手順を開始することができる。
【００２２】
図４は、いくつかの実施形態による、プログラムコード４００のコンパイル中にコンパイラによって挿入される変換コードによるプログラムコード４００の修正を示す図である。プログラムコード４００は、図２に示すカーネル２０５又は図３に示すカーネル３０５等のカーネルに含まれるコードの一部とすることができる。プログラムコード４００は、コードブロック４０１と、イベントトリガ４０２と、コードブロック４０３と、イベントトリガ４０４と、コードブロック４０５と、終了コード４０６と、を含む。イベントトリガ４０２，４０４は、エラーを検出又は訂正するために冗長スレッドのフィンガープリントを比較するのに使用される共有及び比較演算をトリガする命令である。例えば、イベントトリガ４０２，４０４は、値をある場所及びメモリに記憶するのに使用されるストア命令とすることができる。したがって、記憶される値は、イベントトリガの結果であり、この値を用いて、例えば、記憶された値及び記憶場所のアドレスを、以前のフィンガープリントの値又は初期値と共にハッシュすることによって、対応するスレッドのフィンガープリントを決定する。プログラムコード４００を実行するスレッドが遭遇するイベントトリガ４０２，４０４の数は、確定的であってもよいし非確定的であってもよい。例えば、コードブロック４０１，４０３，４０５は、プログラムコード４００の実行中に異なる数のイベントトリガ４０２，４０４に遭遇するカーネルの異なるインスタンスをもたらす可能性があるループ、条件付き命令、分岐命令等を含むことができる。
【００２３】
プログラムコード４００は、コンパイル中にコンパイラによって変換される。例えば、コンパイラのいくつかの変形例は、プログラムコード４００内の最初のコードブロック４０１の前にテーブル生成コード４１０を挿入し、その結果、修正されたプログラムコード４１５を実行するスレッドは、図３に示すルックアップテーブル３４５等のテーブルを割り当てて初期化する。テーブル生成コード４１０のいくつかの実施形態は、３２ビット巡回冗長検査（ＣＲＣ）ハッシュルーチンを実装し、ＣＲＣハッシュルーチンに使用される符号化値を記憶するために２５６要素の８ビット配列を割り当てる。例えば、テーブルを割り当ててデータを入力するためのテーブル生成コード４１０は、以下の擬似コードで記述することができる。
【表１】
2019526102.tif 000003
【００２４】
さらに、コンパイラは、図３に示すカウンタ３６０，３６５等のカウンタを初期化するのに使用されるカウンタ初期化コード４２５を挿入することによって、プログラムコード４００を、修正されたプログラムコード４２０に変換する。また、修正されたプログラムコード４２０は、イベントトリガ４０２，４０４の各々の後に挿入されるハッシュコード４３０，４３１を含む。ハッシュコード４３０，４３１は、イベントトリガ４０２，４０４に関連する結果をハッシュして、対応するスレッドのフィンガープリントを表す符号化値をイベントトリガ４０２，４０４の後に形成するのに使用される。ハッシュコード４３０，４３１の例は、以下の擬似コードで記述することができる。
【表２】
2019526102.tif 000004
【００２５】
スキップチェックコード４３５，４３６を挿入して、プログラムコード４００を実行するスレッドが、１つ以上の対応する冗長スレッドと最後に共有及び比較してから設定可能な回数だけイベントトリガ４０２，４０４に遭遇したか否かを判別する。共有及び比較コード４４０，４４１は、プログラムコード４００を実行するスレッドに、そのフィンガープリント値を、１つ以上の冗長スレッドによって計算されたフィンガープリント値と共有及び比較させるために挿入される。共有及び比較コード４４０，４４１は、対応するスキップチェックコード４３５，４３６が、最後にスレッドを共有及び比較してからスレッドが設定可能な数のイベントトリガ４０２，４０４に遭遇したことを示す場合にのみ実行される。
【００２６】
最後に変換されたコード４４５は、スレッドが終了ブロック４０６においてプログラムコード４００を終了する前に、実行する必要がある未処理の共有及び比較演算が存在するか否かを判別するのに使用される終了チェック４５０を挿入することによって、生成される。
【００２７】
図５は、いくつかの実施形態による、エラーを検出するために冗長スレッド間で共有及び比較演算を選択的にバイパス又は実行する方法５００のフロー図である。方法５００は、図１に示すＡＰＤ１００又は図３に示すＡＰＤ３００のいくつかの実施形態において実施される。ＡＰＤは、ＡＰＤに実装された対応する処理要素に割り当てられた複数のスレッドを使用して、カーネルの複数のインスタンスを実行するように構成されている。ＡＰＤ内のコンパイラは、カーネル内のプログラムコードを変換して、カーネルのインスタンスを実行するスレッドに共有及び比較演算を選択的にバイパス又は実行させる変換コードを生成する。例えば、コンパイラは、図４に示すように、プログラムコードを変換することができる。
【００２８】
ブロック５０５において、ＡＰＤは、実行されるスレッドを識別し、識別されたスレッドに対して冗長な１つ以上のスレッドを生成する。本明細書で説明したように、冗長スレッドは、同じ識別子（例えば、グローバル識別子、グループ識別子又はローカル識別子等）を使用して識別することができる。ＡＰＤは、冗長スレッドを異なる処理要素に割り当てる。ブロック５１０において、冗長スレッドが異なる処理要素で実行される。冗長スレッドは、同時に又は並行して実行することができ、冗長スレッドのいくつかの実施形態では同期している。
【００２９】
ブロック５１５において、スレッドは、エラーを検出又は訂正するために共有及び比較演算を潜在的にトリガするイベントトリガ（例えば、ストア命令等）を検出する。ブロック５２０において、スレッドは、イベントトリガを検出したことに応じて、対応するカウンタをインクリメントする。ブロック５２５において、スレッドは、イベントトリガに関連する結果（例えば、ストア命令に応じて記憶されたデータ等）のハッシュ値を、対応するフィンガープリントにひとまとめにする。例えば、いくつかの変形例では、スレッドは、結果の値を、以前のイベントトリガの結果に基づいて生成された以前のフィンガープリントとハッシュする。また、スレッドは、他の情報（例えば、ストア命令によって示されたデータを記憶する場所のアドレス等）を、フィンガープリントとハッシュすることができる。
【００３０】
判別ブロック５３０において、スレッドは、冗長スレッド間で共有及び比較演算を行う前に、カウンタの値を、共有及び比較演算がバイパスされる設定可能な数を示す閾値と比較する。カウンタが閾値以下の場合、方法５００は、ブロック５１０に移行して、スレッドの実行を継続する。カウンタが閾値より大きい場合、ブロック５３５において、スレッドが共有及び比較演算を実行して、冗長スレッドのフィンガープリントが一致するか否かを判別する。ＡＰＤは、フィンガープリントが一致しない場合、エラーが発生したと判別することができる。ＡＰＤは、ブロック５３５において実行される共有及び比較演算中にエラーが検出された場合、エラー報告又は回復を実行することができる。ブロック５４０において、スレッドは、対応するカウンタの値をリセットする。そして、方法５００は、ブロック５１０に移行して、スレッドの実行を継続する。
【００３１】
図６は、いくつかの実施形態による、プログラムコードを終了する前に冗長スレッド間の共有及び比較演算を実行すべきか否かを判別するために終了チェックを実行する方法６００のフロー図である。方法６００は、図１に示すＡＰＤ１００又は図３に示すＡＰＤ３００のいくつかの実施形態において実施される。ＡＰＤは、ＡＰＤに実装された対応する処理要素に割り当てられた複数のスレッドを使用して、カーネルの複数のインスタンスを実行するように構成されている。ＡＰＤのコンパイラは、カーネル内のプログラムコードを変換して、終了チェックを挿入する。例えば、コンパイラは、図４に示すように、終了チェック４５０を挿入するようにプログラムコード４００を変換することができる。
【００３２】
ブロック６０５において、冗長スレッドが異なる処理要素で実行される。冗長スレッドは、同時に又は並行して実行することができ、冗長スレッドのいくつかの実施形態では同期している。ブロック６１０において、スレッドは終了条件を検出する。判別ブロック６１５において、スレッドは、終了条件を検出したことに応じて、対応するカウンタの値をチェックする。カウンタの値がゼロ（又は、他のデフォルト値）より大きい場合、すなわち、冗長スレッド間で最後に共有及び比較演算が行われてから共有及び比較演算が少なくとも１回バイパスされた場合、方法は、ブロック６２０に移行する。ブロック６２０において、スレッドは、フィンガープリントの現在の値に基づいて共有及び比較を行う。そして、方法６００はブロック６２５に移行して、スレッドが終了コードを実行する。カウンタの値がゼロ（又は、他のデフォルト値）に等しい場合、すなわち、未処理の共有及び比較演算が存在しない場合、方法６００はブロック６２５に直接移行して、スレッドが終了コードを実行する。
【００３３】
いくつかの実施形態では、上述した技術の特定の態様は、ソフトウェアを実行する処理システムの１つ以上のプロセッサによって実装され得る。ソフトウェアは、非一時的なコンピュータ可読記憶媒体に記憶され又は有形に具現化された実行可能命令の１つ以上のセットを含む。ソフトウェアは、１つ以上のプロセッサによって実行されると、上述した技術の１つ以上の態様を実施するように１つ以上のプロセッサを操作する命令及び特定のデータを含むことができる。非一時的なコンピュータ可読記憶媒体は、例えば、磁気若しくは光ディスク記憶装置、フラッシュメモリ等の固体記憶装置、キャッシュ、ランダムアクセスメモリ（ＲＡＭ）、又は、他の不揮発性メモリ装置等を含むことができる。非一時的なコンピュータ可読記憶媒体に記憶される実行可能命令は、ソースコード、アセンブリ言語コード、オブジェクトコード、又は、１つ以上のプロセッサによって解釈され若しくは実行可能な他の命令フォーマットであってもよい。
【００３４】
概要的な説明において上述した全てのアクティビティ又は要素が必要とされているわけではなく、特定のアクティビティ又はデバイスの一部が必要とされない場合があること、１つ以上のさらなるアクティビティが実行され、１つ以上のさらなる要素が含まれ得ることに留意されたい。さらに、アクティビティを列挙する順序は、必ずしもそれらが実行される順序ではない。また、概念は、特定の実施形態を参照して説明された。しかしながら、当業者であれば、以下の特許請求の範囲に記載されるように本発明の範囲から逸脱することなく、様々な変更及び変形を行うことが可能であることを理解するであろう。したがって、本明細書及び図面は、限定的な意味ではなく例示的な意味で考慮されるべきであり、かかる変更の全てが本発明の範囲内に含まれることを意図している。
【００３５】
利益、他の利点及び問題に対する解決手段を、特定の実施形態に関して上記のように説明した。しかしながら、利益、利点、問題に対する解決手段、及び、何等かの利益、利点、解決手段を生じさせ又は顕著にし得る機能は、何れか又は全ての請求項の重要な、必須の、不可欠な特徴として解釈されるべきではない。さらに、本明細書の教示の恩恵を受ける当業者は、開示された発明を、異なるが当業者に明らかな同等の方式で変更及び実施することができるので、上述した特定の実施形態は例示に過ぎない。以下の特許請求の範囲に記述されているもの以外に、本明細書に示される構成又は設計の詳細に対する限定を意図していない。したがって、上記に開示された特定の実施形態は変更されてもよいし、修正されてもよく、このような変形形態の全ては、開示された発明の範囲内にあるとみなされることが明らかである。よって、本明細書で求められる保護は、以下の特許請求の範囲に記載のとおりである。
【図１】
2019526102.tif 000005
【図２】
2019526102.tif 000006
【図３】
2019526102.tif 000007
【図４】
2019526102.tif 000008
【図５】
2019526102.tif 000009
【図６】
2019526102.tif 000010
【国際調査報告】
2019526102.tif 000011
2019526102.tif 000012