(57)【特許請求の範囲】
【請求項１】
少なくとも１つのハードウェア・アクセラレータに動作可能なように結合された１つまたは複数のコンピュータ・プロセッサを含むコンピュータのハードウェア・アクセラレータの性能測定の方法であって、
前記１つまたは複数のコンピュータ・プロセッサが、
前記アクセラレータのデータ処理リソースを飽和させるレートで前記アクセラレータにデータ処理タスクを送り、前記送られたタスクの少なくとも一部を前記アクセラレータに拒否させて、前記アクセラレータを飽和状態で動作させるステップと、
前記アクセラレータが飽和状態で動作している間に、前記アクセラレータが複数の送られたタスクを受け入れるのに要する期間に従ってアクセラレータの性能を測定するステップと、を実行する、方法。
【請求項２】
アクセラレータの性能を測定するステップが、前記アクセラレータが複数の送られたタスクを受け入れるのに要する期間を、前記受け入れられた前記複数の送られたタスクを完了するために前記アクセラレータによって必要とされる期間であると解釈するステップをさらに含む、請求項１に記載の方法。
【請求項３】
データ処理タスクを送るステップが、前記プロセッサのうちの１つまたは複数で実行されるアプリケーション・プログラムの１つまたは複数のインスタンスによって、前記アクセラレータにデータ処理タスクを送るステップをさらに含み、
アクセラレータの性能を測定するステップが、前記プロセッサのうちの少なくとも１つで実行される性能測定プログラムによってアクセラレータの性能を測定するステップをさらに含む、請求項１に記載の方法。
【請求項４】
前記アクセラレータによって、前記アクセラレータが送られたタスクを拒否することを示すためにプロセッサ・ステータス・レジスタのビットを設定するステップをさらに含む、請求項１に記載の方法。
【請求項５】
アクセラレータの性能を測定するステップが、
Ｔ＝Ｎ／（ｔ１−ｔ０）に従ってアクセラレータの性能を測定するステップをさらに含み、式中、
Ｔは、毎秒受け入れられるタスクの数として表されたスループットを表し、
Ｎは、時刻ｔ０とｔ１との間に前記アクセラレータによって受け入れられた、送られたタスクの数であり、
ｔ０は、前記アクセラレータの飽和した動作が始まった後に受け入れられた、最初の送られたタスクの受け入れの時刻であり、
ｔ１は、Ｎ番目に送られたタスクの受け入れの時刻である、請求項１に記載の方法。
【請求項６】
アクセラレータの性能を測定するステップが、
ＢＩ＝Ｔ＊Ｉに従ってアクセラレータの性能を測定するステップをさらに含み、式中、
ＢＩは、バイト毎秒で表された入力帯域幅を表し、
Ｔは、毎秒受け入れられるタスクの数として表されたスループットを表し、
Ｉは、受け入れられたタスクごとに処理された入力データの平均バイト数を表す、請求項１に記載の方法。
【請求項７】
アクセラレータの性能を測定するステップが、
ＢＯ＝Ｔ＊Ｏに従ってアクセラレータの性能を測定するステップをさらに含み、式中、
ＢＯは、バイト毎秒で表された出力帯域幅を表し、
Ｔは、毎秒受け入れられるタスクの数として表されたスループットを表し、
Ｏは、受け入れられたタスクごとに処理された出力データの平均バイト数を表す、請求項１に記載の方法。
【請求項８】
ハードウェア・アクセラレータの性能測定のための装置であって、
少なくとも１つのハードウェア・アクセラレータに動作可能なように結合された１つまたは複数のコンピュータ・プロセッサと、前記１つまたは複数のコンピュータ・プロセッサに動作可能なように結合されたコンピュータ・メモリと、
前記アクセラレータのデータ処理リソースを飽和させるレートで前記アクセラレータにデータ処理タスクを送り、前記送られたタスクの少なくとも一部を前記アクセラレータに拒否させて、前記アクセラレータを飽和状態で動作させる第１のプログラム命令と、
前記アクセラレータが飽和状態で動作している間に、前記アクセラレータが複数の送られたタスクを受け入れるのに要する期間に従ってアクセラレータの性能を測定する第２のプログラム命令と、を含み、
前記第１及び第２のプログラム命令が、前記１つまたは複数のコンピュータ・プロセッサによる実行のために前記コンピュータ・メモリに格納される、装置。
【請求項９】
前記第２のプログラム命令においてアクセラレータの性能を測定することが、前記アクセラレータが複数の送られたタスクを受け入れるのに要する期間を、受け入れられた前記複数の送られたタスクを完了するために前記アクセラレータによって必要とされる期間であると解釈することをさらに含む、請求項８に記載の装置。
【請求項１０】
前記第１のプログラム命令においてデータ処理タスクを送ることが、前記プロセッサのうちの１つまたは複数で実行されるアプリケーション・プログラムの１つまたは複数のインスタンスによって、前記アクセラレータにデータ処理タスクを送ることをさらに含み、
前記第２のプログラム命令においてアクセラレータの性能を測定することが、前記プロセッサのうちの少なくとも１つで実行される性能測定プログラムによってアクセラレータの性能を測定することをさらに含む、請求項８に記載の装置。
【請求項１１】
前記アクセラレータが送られたタスクを拒否することを示すために前記アクセラレータがプロセッサ・ステータス・レジスタのビットを設定するように構成された前記アクセラレータをさらに含む、請求項８に記載の装置。
【請求項１２】
前記第２のプログラム命令においてアクセラレータの性能を測定することが、
Ｔ＝Ｎ／（ｔ１−ｔ０）に従ってアクセラレータの性能を測定することをさらに含み、式中、
Ｔは、毎秒受け入れられるタスクの数として表されたスループットを表し、
Ｎは、時刻ｔ０とｔ１との間に前記アクセラレータによって受け入れられた、送られたタスクの数であり、
ｔ０は、前記アクセラレータの飽和した動作が始まった後に受け入れられた、最初の送られたタスクの受け入れの時刻であり、
ｔ１は、Ｎ番目に送られたタスクの受け入れの時刻である、請求項８に記載の装置。
【請求項１３】
前記第２のプログラム命令においてアクセラレータの性能を測定することが、
ＢＩ＝Ｔ＊Ｉに従ってアクセラレータの性能を測定することをさらに含み、式中、
ＢＩは、バイト毎秒で表された入力帯域幅を表し、
Ｔは、毎秒受け入れられるタスクの数として表されたスループットを表し、
Ｉは、受け入れられたタスクごとに処理された入力データの平均バイト数を表す、請求項８に記載の装置。
【請求項１４】
前記第２のプログラム命令においてアクセラレータの性能を測定することが、
ＢＯ＝Ｔ＊Ｏに従ってアクセラレータの性能を測定することをさらに含み、式中、
ＢＯは、バイト毎秒で表された出力帯域幅を表し、
Ｔは、毎秒受け入れられるタスクの数として表されたスループットを表し、
Ｏは、受け入れられたタスクごとに処理された出力データの平均バイト数を表す、請求項８に記載の装置。
【請求項１５】
１つまたは複数のコンピュータ・プロセッサに動作可能なように結合されたハードウェア・アクセラレータの性能測定のためのコンピュータ・プログラムであって、
前記１つまたは複数のコンピュータ・プロセッサに、
前記アクセラレータのデータ処理リソースを飽和させるレートで前記アクセラレータにデータ処理タスクを送り、前記送られたタスクの少なくとも一部を前記アクセラレータに拒否させて、前記アクセラレータを飽和状態で動作させるステップと、
前記アクセラレータが飽和状態で動作している間に、前記アクセラレータが複数の送られたタスクを受け入れるのに要する期間に従ってアクセラレータの性能を測定するステップと、
を実行させるためのコンピュータ・プログラム。
【請求項１６】
アクセラレータの性能を測定するステップが、前記アクセラレータが複数の送られたタスクを受け入れるのに要する期間を、受け入れられた前記複数の送られたタスクを完了するために前記アクセラレータによって必要とされる期間であると解釈するステップをさらに含む、請求項１５に記載のコンピュータ・プログラム。
【請求項１７】
データ処理タスクを送るステップが、前記プロセッサのうちの１つまたは複数で実行されるアプリケーション・プログラムの１つまたは複数のインスタンスによって、前記アクセラレータにデータ処理タスクを送るステップをさらに含み、
アクセラレータの性能を測定するステップが、前記プロセッサのうちの少なくとも１つで実行される性能測定プログラムによってアクセラレータの性能を測定するステップをさらに含む、請求項１５に記載のコンピュータ・プログラム。
【請求項１８】
アクセラレータの性能を測定するステップが、
Ｔ＝Ｎ／（ｔ１−ｔ０）に従ってアクセラレータの性能を測定するステップをさらに含み、式中、
Ｔは、毎秒受け入れられるタスクの数として表されたスループットを表し、
Ｎは、時刻ｔ０とｔ１との間に前記アクセラレータによって受け入れられた、送られたタスクの数であり、
ｔ０は、前記アクセラレータの飽和した動作が始まった後に受け入れられた、最初の送られたタスクの受け入れの時刻であり、
ｔ１は、Ｎ番目に送られたタスクの受け入れの時刻である、請求項１５に記載のコンピュータ・プログラム。
【請求項１９】
アクセラレータの性能を測定するステップが、
ＢＩ＝Ｔ＊Ｉに従ってアクセラレータの性能を測定するステップをさらに含み、式中、
ＢＩは、バイト毎秒で表された入力帯域幅を表し、
Ｔは、毎秒受け入れられるタスクの数として表されたスループットを表し、
Ｉは、受け入れられたタスクごとに処理された入力データの平均バイト数を表す、請求項１５に記載のコンピュータ・プログラム。
【請求項２０】
アクセラレータの性能を測定するステップが、
ＢＯ＝Ｔ＊Ｏに従ってアクセラレータの性能を測定するステップをさらに含み、式中、
ＢＯは、バイト毎秒で表された出力帯域幅を表し、
Ｔは、毎秒受け入れられるタスクの数として表されたスループットを表し、
Ｏは、受け入れられたタスクごとに処理された出力データの平均バイト数を表す、請求項１５に記載のコンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の分野は、データ処理であり、またはより詳細にはハードウェア・アクセラレータの性能測定のための方法、装置、およびコンピュータ・プログラムである。
【背景技術】
【０００２】
汎用プロセッサは、過去数十年にわたって、ユニプロセッサ・システム、対称型マルチプロセッサ・システム、およびチップ・マルチプロセッサ・システムを構築するために使用される主力製品であった。汎用のコアは、作業負荷の集合に対して最も優れた「平均的な」挙動を実現するために設計されるが、それぞれの個々の作業負荷に関しては概して準最適である。（業界標準の制約および作業負荷の幅広い組に対する平均して良好な性能という設計目的が原因でもたらされる）汎用処理コアの固有の非効率性は、概して、単位面積当たりの指数関数的なトランジスタ密度の増加（ムーアの法則）および単位面積当たりの一定の電力密度（デナード・スケーリング（Dennard Scaling））のおかげで過去数十年にわたって隠されてきた。新しい現実は、ムーアの法則により、単位面積当たりのトランジスタの数がますます増え続ける一方で、デナード・スケーリングが著しく鈍化したことである。これは、汎用コアを用いる性能の向上がチップおよびシステムの電力バジェット（power budget）の超線形の（super linear）増加によってのみ可能であることを意味する。したがって、将来の計算機械は、汎用コンピュータのエネルギー非効率性から離れて特化されたタスクに固有のプロセッサまたはアクセラレータに向かうように強いられる。特定の作業負荷のためにハードウェア・コアを特化させることは、大きな性能の利点と１ワット当たりの性能の利点とをもたらす。特定のタスクを汎用プロセッサからタスクに固有のアクセラレータにオフロードすることは、汎用プロセッサで同じタスクを行うのに比べて消費電力を削減しながら（場合によってはタスクに関して数桁の）実行速度の向上をもたらし得る。
【０００３】
アクセラレータの性能を測定することは、アクセラレータの設計を実証するために使用される。アクセラレータの性能を測定することは、設計のボトルネックを理解し、チップの設計、システムの設計、およびソフトウェアの設計を手引きする際の価値ある手段である。しかし、この測定を正確に行うことには大きな課題がある。概して、アクセラレータの性能が測定される２つの方法がある。第１の方法は、アクセラレータのパフォーマンス・カウンタを（利用可能である場合）プログラミングすることをともなう。第２の方法は、ソフトウェア測定ツールを用いてアクセラレータによる作業の完了を特定し、その後、タイマ・レジスタを読む。第２の手法は、好ましい手法である。第２の手法はより広く（特定のパフォーマンス・カウンタが利用不可能であるときでさえも機能する）、より信頼性があり（パフォーマンス・カウンタを効率的にプログラミングすることができるライブラリに頼る必要がない）、より単純である（利用可能なパフォーマンス・カウンタの複雑さ、それらのパフォーマンス・カウンタが何を意味するかなどを知る必要がない）。たとえば、ラボ・システム（lab system）の呼出（bringup）中は、パフォーマンス・カウンタが容易に利用可能でないことが多く、少なくとも、測定ツールがそれらを利用することができない。利用可能になった後でさえも、解決されるべきバグが存在する。その一方、第２の手法は機能し続ける。そうは言っても、第２の手法は、汎用コアで実行され、アクセラレータと通信する測定ソフトウェアを使用することに依拠する。
【０００４】
これらの従来技術の手法は、問題を有する。ソフトウェア測定ツールは、比較的遠く離れているオンチップまたはオフチップ相互接続によって取り付けられたアクセラレータと（直接かまたはメモリを介するかのどちらかで）通信しなければならない。加えて、ソフトウェアは、アクセラレータによる作業の完了をテストするための少なくとも少数の命令を実行しなければならず、それらの命令は、実行に時間がかかる。さらに、すべての完了後の測定ステップは時間を要し、最善の場合の測定の粒度（measurement granularity）につながる。すなわち、ソフトウェアがタスクの完了をテストするために必要とする最短の時間につながる。これらの従来技術の技術はアクセラレータにおけるタスクの完了レートがこの測定の粒度に比べて遅いときに機能するが、多くの場合、アクセラレータにおける完了レートは、汎用コア上で実行されるソフトウェア測定ツールまたはアプリケーションが利用可能な粒度よりもずっと高い。結局、それが、アクセラレーションの本質、いかなる汎用コアまたはプロセッサよりも速いということである。これは、特に、たとえば、小さなイーサネット（Ｒ）・パケットの暗号化など、少量のデータに対して働くアクセラレータに当てはまる。そのような場合、対象のタスクは、性能測定ツールが検知してタスクが完了していることを認識する前に、統計的に相当な時間アクセラレータで完了した可能性がある。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ハードウェア・アクセラレータの性能測定のための方法、装置、およびコンピュータ・プログラムを提供する。
【課題を解決するための手段】
【０００６】
１つまたは複数のコンピュータ・プロセッサが少なくとも１つのハードウェア・アクセラレータに動作可能なように結合され、コンピュータ・メモリが１つまたは複数のコンピュータ・プロセッサに動作可能なように結合される、ハードウェア・アクセラレータの性能測定であって、１つまたは複数のプロセッサによって、アクセラレータのデータ処理リソースを飽和させるレートでアクセラレータにプロセッサによってデータ処理タスクを送り、送られたタスクの少なくとも一部をアクセラレータに拒否させて、アクセラレータを飽和状態で動作させることと、アクセラレータが飽和状態で動作している間に、プロセッサによって、アクセラレータが複数の送られたタスクを受け入れる期間に従ってアクセラレータの性能を測定することとを含む、ハードウェア・アクセラレータの性能測定のための方法、装置、およびコンピュータ・プログラムが、説明される。
【０００７】
本発明の上述した目的およびその他の目的、特徴、および利点が、添付図面に示される本発明の例示的な実施形態による以下の詳細な説明から明らかになるであろう。ここで、添付図面における同符号は、本発明の例示的な実施形態の同部分を示す。
【図面の簡単な説明】
【０００８】
【図１】ハードウェア・アクセラレータの性能測定で有用な例示的なコンピュータを含む自動化された計算機のブロック図である。
【図２】ハードウェア・アクセラレータの性能測定の例示的な方法を示すフローチャートである。
【図３】ハードウェア・アクセラレータの性能測定のさらなる例示的な方法に関するタイミング図である。
【図４】ハードウェア・アクセラレータの性能測定のためのさらなる例示的な方法を示すフローチャートである。
【発明を実施するための形態】
【０００９】
本発明によるハードウェア・アクセラレータの性能測定のための例示的な方法、装置、およびコンピュータ・プログラムが、図１で始まる添付の図面を参照して説明される。本発明によるハードウェア・アクセラレータの性能測定は、一般的に、コンピュータによって、すなわち自動化された計算機によって実装される。したがって、図１は、本発明の実施形態によるハードウェア・アクセラレータの性能測定で有用な例示的なコンピュータ（１５２）を含む自動化された計算機のブロック図を示す。図１のコンピュータ（１５２）は、１つまたは複数のコンピュータ・プロセッサ（１５６）と、高速メモリ・バス（１６６）およびバス・アダプタ（１５８）を通じてコンピュータ（１５２）のプロセッサ（１５６）およびその他の構成要素に接続されるランダム・アクセス・メモリ（１６８）（「ＲＡＭ」）とを含む。プロセッサ（１５６）は、本明細書においては「１つまたは複数のコンピュータ・プロセッサ」と呼ばれるが、本明細書の読み手であれば、あるコンピュータが単一のプロセッサのみでアクセラレータの性能を測定する可能性がある一方、本発明の実施形態によるアクセラレータの性能を測定するその他のコンピュータが多くのプロセッサ、プロセッサの中のマルチコア、マルチプロセッサ内のマルチ・ハードウェア・スレッドなどを含むことを理解するであろう。
【００１０】
図１の例示的なコンピュータは、ハードウェア・アクセラレータ（１５７）も含む。アクセラレータまたは補助プロセッサ（coprocessor）が、汎用プロセッサと類似の能力を有する可能性がある。アクセラレータは、メモリから命令をフェッチすること、プログラム・フロー制御命令を実行すること、入力／出力操作を行うこと、メモリを管理することなどができる。しかし、典型的に、アクセラレータは、ホストまたは主プロセッサ、汎用プロセッサにアクセラレータの命令をフェッチするように要求し、アクセラレーション機能自体に加えてその他の動作をハンドルする。明確にするために、本明細書においては、汎用プロセッサは、「プロセッサ」と呼ばれ、特化された補助プロセッサは、「アクセラレータ」と呼ばれる。本発明の実施形態による性能測定のために適合されたアクセラレータは、浮動小数点演算補助プロセッサ、グラフィックス・エンジン、ビデオ・アダプタ、デジタル信号プロセッサ、高速Ｉ／Ｏインターフェース、暗号化アクセラレータなどを含む。図１の例において、アクセラレータ（１５７）は、拡張バス（１６０）、バス・アダプタ（１５８）、およびフロント・サイド・バス（１６２）を通じてプロセッサ（１５６）に結合されるが、そのすべては、限定のためではなく説明のみのための例示的なアーキテクチャである。当業者は、一部のアクセラレータ、たとえば、数値演算補助プロセッサが汎用プロセッサと一緒に同じ集積回路基板上に直接実装され、オンチップ相互接続を通じてプロセッサに結合されることを理解するであろう。ビデオ・アダプタ（２０９）は、拡張バス（１６０）ではなく専用の高速ビデオ・バス（１６４）を通じてプロセッサ（１５７）に接続されるビデオ・アクセラレータの例である。アクセラレータおよびプロセッサを相互に接続するその他の方法が、当業者の頭に浮かび、すべてのそのような方法は、当然に本発明の範囲内にある。
【００１１】
ＲＡＭ（１６８）に記憶されるのは、プロセッサがデータ処理タスク（２０８）をアクセラレータ（１５７）に送るようにプロセッサ（１５６）を動作させるアプリケーション（１８２）である。アプリケーションの制御の下で、プロセッサは、初めに、アクセラレータを飽和状態で動作させることによって、つまり、アクセラレータのデータ処理リソースを飽和させるレートでアクセラレータにデータ処理タスクを送り、送られたタスクの少なくとも一部をアクセラレータに拒否させることによって、アクセラレータの性能を測定する。ＲＡＭは、アクセラレータ制御ブロック（２１０）も含み、各制御ブロックは、アクセラレータに送られたタスクを表現し、記述する構造である。各制御ブロックは、たとえば、入力バッファ・アドレス、入力バッファ・サイズ、出力バッファ・アドレス、出力バッファ・サイズ、およびステータス（リトライフラグがＴＲＵＥに設定される制御ブロックが示すアクセラレータが拒否したタスクを、セット時に示すフラグまたはメモリのビットなどのリトライインジケータ（２１１）を含む）を含む。リトライインジケータ（２１１）の代替として、一部の実施形態においては、少なくとも、アクセラレータは、プロセッサ自体のうちの１つまたは複数に搭載されたステータス・レジスタ（２１４）にＢＵＳＹビット（２１２）を設定することによって、アクセラレータが送られたタスクを拒否したことをシグナリングすることができる。送られたタスクを拒否したことのアクセラレータの指示を実装するその他の方法が、当業者の頭に浮かぶ可能性があり、すべてのそのような方法は、当然に本発明の範囲内に入る。
【００１２】
さらに、図１の例のＲＡＭ（１６８）内には、アクセラレータが飽和状態で動作している間に、アクセラレータ（１５７）が複数の送られたタスク（２０８）を受け入れる期間に従ってアクセラレータの性能を測定するようにプロセッサ（１５６）のうちの少なくとも１つを動作させる性能測定プログラム（１８４）がある。本明細書の読み手であれば、なぜ性能測定プログラム（１８４）がデータ処理タスクのアクセラレータに関してアクセラレータを用いるアプリケーション（１８２）の構成要素ではなく別個のプログラムとして実装されるのか不思議に思うであろう。答えは、それはそうされ得るということであり、性能測定プログラムは、多くの実施形態においてここに示されるように別に実装されるが、アプリケーション（１８２）内のスレッドまたはサブルーチンとして実装され得る。アプリケーション（１８２）は、アクセラレータの性能を測定するのに有用である標準的なアプリケーション・プログラム、財務会計プログラム（accounting program）、またはコンピュータ・ゲームである可能性があり、その理由は、そのプログラムがそうするように既に設定されているからである。したがって、アプリケーション（１８２）内に性能測定機能をインストールすることは、既存のプログラムのコードを変更することを必要とする。コンピュータにアクセラレータが存在することの本質は、そのアクセラレータがプロセッサよりもずっと高速であり、したがって、特に比較的小さなタスクで飽和した性能を実現することが、プロセッサがアクセラレータを飽和させるレートでタスクを送ることができるようになる前に、アプリケーションの複数のインスタンスが複数のプロセッサで実行されることを必要とする可能性があることも思い出されたい。同時に、アクセラレータの性能のそのような性能測定は、やはり性能測定プログラムの１つのインスタンスのみを必要とし、したがって、アプリケーションの各インスタンス内に別々の性能測定機能を有することは、おそらくリソースの最良の使用方法ではない。
【００１３】
さらにＲＡＭ（１６８）に記憶されるのは、オペレーティング・システム（１５４）である。オペレーティング・システムは、アプリケーション・プログラムの実行を担い、アプリケーション・プログラムに代わってコンピュータ・リソースへのアクセス、メモリ、プロセッサ時間、およびＩ／Ｏ機能の管理を担うコンピュータ・ソフトウェア・コンポーネントである。本発明の実施形態によるハードウェア・アクセラレータの性能測定に有用なオペレーティング・システムは、ＵＮＩＸ（商標）、Ｌｉｎｕｘ（商標）、Ｍｉｃｒｏｓｏｆｔ  ＸＰ（商標）、ＡＩＸ（商標）、ＩＢＭのｉ５／ＯＳ（商標）、および当業者の頭に浮かぶその他のオペレーティング・システムを含む。図１の例のオペレーティング・システム（１５４）、アプリケーション（１８２）、性能測定プログラム（１８４）、および制御ブロック（２１０）は、ＲＡＭ（１６８）内に示されるが、概して、多くのそのような構成要素は、たとえば、ディスク・ドライブ（１７０）上またはフラッシュ・メモリ（１８８）内など、不揮発性メモリにも記憶される。
【００１４】
図１のコンピュータ（１５２）は、拡張バス（１６０）およびバス・アダプタ（１５８）を通じてコンピュータ（１５２）のプロセッサ（１５６）およびその他の構成要素に結合されたディスク・ドライブ・アダプタ（１７２）を含む。ディスク・ドライブ・アダプタ（１７２）は、不揮発性データ・ストレージをディスク・ドライブ（１７０）の形態でコンピュータ（１５２）に接続する。本発明の実施形態によるハードウェア・アクセラレータの性能測定のためのコンピュータにおいて有用なディスク・ドライブ・アダプタは、インテグレーテッド・デバイス・エレクトロニクス（「ＩＤＥ：Integrated Drive Electronics」）アダプタ、小型コンピュータ・システム・インターフェース（「ＳＣＳＩ：Small Computer System Interface」）アダプタ、および当業者の頭に浮かぶその他のディスク・ドライブ・アダプタを含む。不揮発性コンピュータ・メモリは、当業者の頭に浮かぶ光ディスク・ドライブ、電気的消去可能プログラマブル読み出し専用メモリ（いわゆる「ＥＥＰＲＯＭ」または「フラッシュ」メモリ）、ＲＡＭドライブなどとして実装される可能性もある。
【００１５】
図１の例示的なコンピュータ（１５２）は、１つまたは複数の入力／出力（「Ｉ／Ｏ」）アダプタ（１７８）を含む。Ｉ／Ｏアダプタは、たとえば、コンピュータ・ディスプレイ・スクリーンなどのディスプレイ・デバイスへの出力ならびにキーボードおよびマウスなどのユーザ入力デバイス（１８１）からのユーザ入力を制御するためのソフトウェア・ドライバおよびコンピュータ・ハードウェアを通じてユーザ指向の入力／出力を実装する。図１の例示的なコンピュータ（１５２）は、ディスプレイ・スクリーンまたはコンピュータ・モニタなどのディスプレイ・デバイス（１８０）へのグラフィック出力のために特別に設計されたＩ／Ｏアダプタの例であるビデオ・アダプタ（２０９）を含む。ビデオ・アダプタ（２０９）は、高速ビデオ・バス（１６４）、バス・アダプタ（１５８）、およびやはり高速バスであるフロント・サイド・バス（１６２）を通じてプロセッサ（１５６）に接続される。
【００１６】
図１の例示的なコンピュータ（１５２）は、その他のコンピュータ（１１８）とのデータ通信およびデータ通信ネットワーク（１００）とのデータ通信のための通信アダプタ（１６７）を含む。そのようなデータ通信は、ＲＳ−２３２接続を通じて、ユニバーサル・シリアル・バス（「ＵＳＢ」）などの外部バスを通じて、ＩＰデータ通信ネットワークなどのデータ通信ネットワークを通じて、および当業者の頭に浮かぶその他の方法でシリアルに実行される可能性がある。通信アダプタは、１つのコンピュータが直接またはデータ通信ネットワークを通じて別のコンピュータにデータ通信を送るデータ通信のハードウェアのレベルを実装する。本発明の実施形態によるハードウェア・アクセラレータの性能測定のために有用な通信アダプタの例は、有線ダイアルアップ通信のためのモデム、有線データ通信ネットワーク通信のためのイーサネット（Ｒ）（ＩＥＥＥ８０２．３）アダプタ、およびワイヤレス・データ通信ネットワーク通信のための８０２．１１アダプタを含む。
【００１７】
さらなる説明のために、図２は、本発明の実施形態によるハードウェア・アクセラレータの性能測定の例示的な方法を示すフローチャートを示す。図２の方法は、図１を参照して上で説明されたコンピュータ、少なくとも１つのハードウェア・アクセラレータ（１５７）に動作可能なように結合された１つまたは複数のコンピュータ・プロセッサ（１５６）を含むコンピュータと同様のコンピュータで実施される。図２の方法において、プロセッサは、アクセラレータを飽和状態で動作させる、つまり、アクセラレータのデータ処理リソースを飽和させるレートでアクセラレータにデータ処理タスク（２０８）を送り、送られたタスクの少なくとも一部をアクセラレータに拒否させること（２１６）によってアクセラレータを動作させる。上述のように、データ処理タスク（２０８）を送ることは、アプリケーション（１８２）の１つまたは複数のインスタンスがプロセッサ（１５６）のうちの１つまたは複数で実行されることによって実行される可能性があり、実際の測定を行うプロセス（２０６）は、別の性能測定プログラム（１８４）によって実行される可能性がある。
【００１８】
図２の例において、アクセラレータを飽和状態で動作させること（２０２）は、アクセラレータに送られたそれぞれのタスクに関する制御ブロック（２１０）を開始すること（２０４）を含む。上述のように、各制御ブロックは、アクセラレータに送られるタスクを記述する構造である。各制御ブロックは、たとえば、入力バッファ・アドレス、入力バッファ・サイズ、出力バッファ・アドレス、出力バッファ・サイズ、およびステータス・インジケータを含む（ステータス表示は、リトライフラグがＴＲＵＥに設定される制御ブロックによって示されるアクセラレータが拒否したことを示すタスクを、セット時に示すフラグまたはメモリのビットなどのリトライインジケータ（２１１）を含む）。つまり、図２の例示的な方法において、飽和状態で実行されるアクセラレータ（１５７）は、送られたタスク（２０８）の少なくとも一部を拒否し（２１６）、それぞれの拒否されたタスクに関して対応する制御ブロック（２１０）においてリトライインジケータ（２１１）を設定することによってどのタスクが拒否されるかを示すことができる（２２０）。図２の例のリトライインジケータ（２１１）の使用（２２０）の代替として、アクセラレータ（１５７）は、プロセッサ・ステータス・レジスタ（２１４）のＢＵＳＹビット（２１２）を設定することによって、そのアクセラレータ（１５７）が送られたタスクを拒否したことを示すことができる（２１８）。
【００１９】
図２の方法は、アクセラレータが飽和状態で動作している間に、プロセッサによって、アクセラレータが複数の送られたタスクを受け入れる期間に従ってアクセラレータの性能を測定すること（２０６）も含む。アクセラレータを飽和状態で動作させること（２０２）、タスクを送ること（２０８）などの一部として、プロセッサは、システム・クロック（２１５）を読み、制御ブロックの一部またはすべてにおいて、それらの制御ブロックの対応するタスクが送られる時間（２１７）を記録する。Ｎ個のタスク（２０８）が送られることになることを知って、プロセッサは、（各タスクに関する送信時間をＮ個の制御ブロックのそれぞれに書き込むのではなく）アクセラレータが複数の送られたタスクを受け入れる期間を定めるために最初のタスクおよび最後のタスクに関する送信時間を記録することのみを必要とする。
【００２０】
さらに、図２の方法において、アクセラレータの性能を測定すること（２０６）は、任意で、アクセラレータが複数の送られたタスクを受け入れる期間を、受け入れられたタスクを完了するためにアクセラレータによって必要とされる期間であると解釈すること（２２２）を含む。飽和状態で実行されるとき、アクセラレータは次のタスクを受け入れることができるようにするためにタスクを完了しなければならないので、これは実現可能であり、受け入れ時間を完了時間であると解釈する。このようにして、受け入れ時間が、完了時間をたどる。
【００２１】
また、図２の方法において、アクセラレータの性能を測定すること（２０６）は、任意で、Ｔ＝Ｎ／（ｔ１−ｔ０）に従ってアクセラレータの性能を測定すること（２２４）を含み、ここで、Ｔは、毎秒受け入れられるタスクとして表されたスループットを表し、Ｎは、時間ｔ０とｔ１との間にアクセラレータによって受け入れられた、送られたタスクの数であり、ｔ０は、アクセラレータの飽和した動作が始まった後に受け入れられた、最初の送られたタスクの受け入れの時間であり、ｔ１は、Ｎ番目の送られたタスクの受け入れの時間である。
【００２２】
また、図２の方法において、アクセラレータの性能を測定すること（２０６）は、任意で、ＢＩ＝Ｔ＊Ｉに従ってアクセラレータの性能を測定することを含み、ここで、ＢＩは、バイト毎秒で表された入力帯域幅を表し、Ｔは、毎秒受け入れられるタスクとして表現されたスループットを表し、Ｉは、受け入れられたタスクごとに処理された入力データの平均バイト数を表す。
【００２３】
また、図２の方法において、アクセラレータの性能を測定すること（２０６）は、任意で、ＢＯ＝Ｔ＊Ｏに従ってアクセラレータの性能を測定することを含み、ここで、ＢＯは、バイト毎秒で表された出力帯域幅を表し、Ｔは、毎秒受け入れられるタスクとして表されたスループットを表し、Ｏは、受け入れられたタスクごとに処理された出力データの平均バイト数を表す。
【００２４】
さらなる説明のために、図３は、本発明の実施形態によるハードウェア・アクセラレータの性能測定のさらなる例示的な方法に関するタイミング図を示す。図３の例においては、１つまたは複数のコンピュータ・プロセッサ（１５６）が、アクセラレータを飽和させるのに十分なだけ速い多くのデータ処理タスクをアクセラレータ（１５７）に送る（３０２）。図３において、送られたタスクは、黒い点によって示され、拒否されたタスクは、斜交平行線のひかれた灰色の点によって示され、完了されたタスクは、斜交平行線のひかれた白い点によって示される。送信を速く行うことができるようにするために、アプリケーションは、多くのタスクに関するすべての必要な制御ブロックを前もって準備し、そして、アクセラレータへの送信をタイトなループで行わなければならい可能性がある。アクセラレータを飽和させるのに十分なだけ速く送信を行うことができるようにするためには、アプリケーションの複数のインスタンスが、２つ以上のプロセッサで実行される必要がある可能性がある。
【００２５】
いくつかのタスクが受け入れられた後、アクセラレータは、（内部のタスクのキューまたは入力バッファなどの）そのアクセラレータのリソースが一杯であるので、さらなる作業を引き受けることができない。その時点で、アクセラレータは、たとえば、プロセッサのレジスタのＢＵＳＹビットを設定するか、または制御ブロックのリトライフラグを設定することによって、送られたタスクを拒否する（３０４）。このフィードバックは、送るアプリケーションがそのアプリケーションの送ったタスクが正しく受け入れられたかどうかを知るためにデフォルトで必要とされる。アプリケーションは、この応答を用いて、アクセラレータがそのアクセラレータの性能の限界に到達した可能性が高いことを認識する。つまり、この時点（３０４）のタイミングで、アクセラレータは、飽和した動作を開始する。この時点（３０４）の後、次のタスクが受け入れに成功するとき（３０６）、アプリケーション制御下のプロセッサは、タイマ・レジスタから、つまり、システム・クロックからの時間ｔ０を記録する。プロセッサは、いくつかのタスクＮを正常に送った後、時間ｔ１を記録する（３０８）。ｔ１とｔ０との間の差は、アクセラレータが飽和状態で動作しながら複数のＮ個の送られたタスクを受け入れた期間を表す（３１０）。
【００２６】
しかし、我々が発見したのは、ｔ１とｔ０との間のこの受け入れの時間がタスクの間の完了時間の実際の差（３１２）もたどることである。これが起こる理由は、時間ｔ０におけるタスクの受け入れが、アクセラレータからの前のタスクの実際の完了と一致しなければならないからである。これは、タスクが前の試みでアクセラレータによって直ちに受け入れられなかったからである。したがって、タスクが受け入れられる可能性があるのは、その他のタスクが完了した後である。したがって、飽和したアクセラレータに対する受け入れレートは、アクセラレータにおける完了レートを測定するために使用され得る。
【００２７】
さらなる説明のために、図４は、本発明の実施形態によるハードウェア・アクセラレータの性能測定のさらなる例示的な方法を示すフローチャートを示す。図４の方法の初めに、アクセラレーションのために送られることになるＮ個のタスクに対応する、補助プロセッサ要求ブロック（Coprocessor Request Block；ＣＲＢ）としても知られるＮ個のアクセラレータに固有の制御ブロックの構造（２１０）が、メモリ内で予め割り当てられ、初期化される（４０２）。Ｎは、ターゲットアクセラレータにより受け入れられるタスクキューをオーバーフローさせるのに十分なだけ大きいように選択されるべきである。この情報が利用可能でない場合、どのＮがアクセラレータを不足なく飽和させるかを特定するために、対数的に大きくなるＮを用いたいくつかの実験が必要とされる可能性がある。アクセラレータを飽和させることは、アクセラレータのキューが一杯になり、アクセラレータがＢＵＳＹまたはリトライ信号で応答し、送られたタスクを受け入れない状態を指す。
【００２８】
タスク（２０８）は、アクセラレータを飽和させるのに十分なだけ速く、密な間隔でアクセラレータに送られる（４１０）。このステップは、アクセラレータを飽和させることができる十分に高い送信レートにするために複数のスレッドが関与する可能性がある。各タスクが送られた後、タスクのステータスが、たとえば、ＩＢＭ  ＰｏｗｅｒＰＣ（商標）プロセッサのＣＲ０などのステータス・レジスタを読むことによって判定される（４１２）。ステータス・レジスタが、タスクが受け入れられたことを示す場合、方法は、正常に送られたタスクのカウントをインクリメントし（４１４）、次のタスクを用いて継続する。タスクが、アクセラレータが飽和状態に達した後に受け入れられることになる最初のタスクである場合、つまり、変数「ｓａｔｕｒａｔｅｄ」が真（ＴＲＵＥ）である場合、システム・クロックの時間ベース・レジスタの値を「ｔｉｍｅ＿ｂｕｓｙ」変数に読み込むことによって現在の時間が記録される（４０４、４０６）。また、状態レジスタのステータスは、アクセラレータがＢＵＳＹであったので、そのアクセラレータがタスクを受け入れることができなかったことを示す可能性がある。その場合、図４の方法は、拒否されたタスクを再び送ることを含む。
【００２９】
加えて、タスクがそのようなＢＵＳＹ応答を受け取る最初のタスクである場合、つまり、ＦＡＬＳＥに初期化された変数「ｓａｔｕｒａｔｅｄ」がまだＦＡＬＳＥである場合（４１６）、変数「ｓａｔｕｒａｔｅｄ」が真（ＴＲＵＥ）に設定される（４１８）。１回または複数回の再試行の後、タスクがアクセラレータによって受け入れられるとき、変数「ｔｉｍｅ＿ｂｕｓｙ」が、システム・クロックのタイムレジスタの値からの現在の時間を記録するために使用される（４０６）。これは、飽和状態に達した後のアクセラレータによるタスクの初めての受け入れである。加えて、変数「Ｎ＿ｂｕｓｙ」が、このときに「ｔａｓｋｓＳｕｂｍｉｔｔｅｄ」変数の値に設定される。この変数は、アクセラレータによって受け入れられる前にアクセラレータからのＢＵＳＹ信号に出合った最初のタスクを合計Ｎ個のタスクの中から特定する。タスクの送信は、Ｎ個のタスクがすべて受け入れられるまで継続する。送られ、受け入れられた最後のタスク（４０８）に関して、システム時間の値が、タイムレジスタを読むことによって変数「ｔｉｍｅ＿ｌａｓｔ」に記録される（４２０）。すべてのタスクが受け入れられた後、方法は、すべてのタスクが完了するのを待つ（４２２）。
【００３０】
結果が、エラーに関して調べられる（４２４）。エラーがある場合、エラーが報告され（４２６）、テスト・ケース、アプリケーション、またはハードウェアがデバッグされる。しかし、基礎を成すハードウェアおよびアプリケーションが正しく機能している場合の典型的なシナリオであるエラーがない場合、毎秒の動作のアクセラレータのスループットの性能が、この式によって計算される（４２８）。
毎秒のタスクのスループット＝（Ｎ−Ｎ＿ｂｕｓｙ）＊ｔｉｍｅ＿ｂａｓｅ＿ｆｒｅｑｕｅｎｃｙ／（ｔｉｍｅ＿ｌａｓｔ−ｔｉｍｅ＿ｂｕｓｙ）
ｔｉｍｅ＿ｂａｓｅ＿ｆｒｅｑｕｅｎｃｙは、毎秒のタイマのチック（tick）の数を指す。バイト秒毎で表される入力および出力帯域幅は、どの程度の入力および出力データの平均タスクが働くかの知識に基づいて計算され得る。式が、ここで示される。
バイト毎秒の入力帯域幅（Ｉｎｐｕｔ＿Ｂａｎｄｗｉｄｔｈ）＝スループット＊タスクごとに処理された平均の入力データのバイト
バイト毎秒の出力帯域幅（Ｏｕｔｐｕｔ＿Ｂａｎｄｗｉｄｔｈ）＝スループット＊タスクごとに生成された平均の出力データのバイト
【００３１】
本発明の例示的な実施形態は、主に、ハードウェア・アクセラレータの性能測定のために完全に機能するコンピュータ・システムの文脈で説明された。しかし、当技術分野の読者は、本発明が任意の好適なデータ処理システムで使用するためのコンピュータ可読ストレージ媒体に配備されたコンピュータ・プログラムで具現化される可能性もあることを認めるであろう。そのようなコンピュータ可読ストレージ媒体は、磁気式媒体、光学式媒体、またはその他の好適な媒体を含む、機械可読情報のための任意のストレージ媒体である可能性がある。そのような媒体の例は、ハード・ドライブまたはディスケットの磁気ディスク、光学式ドライブのためのコンパクト・ディスク、磁気テープ、および当業者の頭に浮かぶその他の媒体を含む。当業者は、好適なプログラミング手段を有する任意のコンピュータ・システムが、コンピュータ・プログラムで具現化される本発明の方法のステップを実行することができることを直ちに認識するであろう。本明細書において説明された例示的な実施形態の一部は、コンピュータ・ハードウェアにインストールされて実行されるソフトウェアに基づくものの、当業者であれば、ファームウェアとしてまたはハードウェアとして実装される代替的な実施形態が、当然に本発明の範囲内にあることを認識するであろう。
【００３２】
当業者に理解されるように、本発明の態様は、方法、装置もしくはシステム、またはコンピュータ・プログラムとして具現化され得る。したがって、本発明の態様は、すべてハードウェアの実施形態、またはすべてが本明細書において「回路」、「モジュール」、「システム」、もしくは「装置」と呼ばれることがあるソフトウェアの態様とハードウェアの態様とを組み合わせる実施形態（ファームウェア、常駐ソフトウェア、マイクロコード、マイクロコントローラ組み込みコードなど）の形態をとる可能性がある。さらに、本発明の態様は、コンピュータ可読プログラム・コードを具現化する１つまたは複数のコンピュータ可読媒体で具現化されたコンピュータ・プログラムの形態をとる可能性がある。
【００３３】
１つまたは複数のコンピュータ可読媒体の任意の組み合わせが、利用される可能性がある。そのようなコンピュータ可読媒体は、コンピュータ可読信号媒体またはコンピュータ可読ストレージ媒体である可能性がある。コンピュータ可読ストレージ媒体は、たとえば、電子、磁気、光、電磁、赤外線、または半導体システム、装置、もしくはデバイス、またはこれらの任意の好適な組み合わせである可能性があるがこれらに限定されない。コンピュータ可読ストレージ媒体のより詳細な例（非網羅的なリスト）は、以下、すなわち、１つもしくは複数の配線を有する電気的な接続、ポータブル・コンピュータ・ディスケット、ハード・ディスク、ランダム・アクセス・メモリ（ＲＡＭ）、読み出し専用メモリ（ＲＯＭ）、消去可能プログラマブル読み出し専用メモリ（ＥＰＲＯＭもしくはフラッシュ・メモリ）、光ファイバ、ポータブル・コンパクト・ディスク読み出し専用メモリ（ＣＤ−ＲＯＭ）、光ストレージ・デバイス、磁気ストレージ・デバイス、またはこれらの任意の好適な組み合わせを含む。本明細書の文脈において、コンピュータ可読ストレージ媒体は、命令実行システム、装置、もしくはデバイスによって、または命令実行システム、装置、もしくはデバイスに関連して使用するためのプログラムを含むまたは記憶することができる任意の有形の媒体である可能性がある。
【００３４】
コンピュータ可読信号媒体は、たとえば、ベースバンドで、または搬送波の一部としてコンピュータ可読プログラム・コードを具現化する伝播されるデータ信号を含み得る。そのような伝播される信号は、電磁的、光学的、またはこれらの任意の好適な組み合わせを含むがこれらに限定されないさまざまな形態のうちの任意の形態をとり得る。コンピュータ可読信号媒体は、コンピュータ可読ストレージ媒体ではなく、命令実行システム、装置、もしくはデバイスによって、または命令実行システム、装置、もしくはデバイスに関連して使用するためのプログラムを伝達、伝播、または搬送することができる任意のコンピュータ可読媒体である可能性がある。コンピュータ可読媒体上に具現化されるプログラム・コードは、無線、有線、光ファイバ・ケーブル、ＲＦなど、またはこれらの任意の好適な組み合わせを含むがこれらに限定されない任意の適切な媒体を用いて送信される可能性がある。
【００３５】
本発明の態様の動作を実行するためのコンピュータ・プログラム・コードは、Ｊａｖａ（Ｒ）、Ｓｍａｌｌｔａｌｋ（Ｒ）、Ｃ＋＋などのオブジェクト指向プログラミング言語と、「Ｃ」プログラミング言語または同様のプログラミング言語などの従来の手続き型プログラミング言語とを含む１つまたは複数のプログラミング言語の任意の組み合わせで記述され得る。プログラム・コードは、すべてユーザのコンピュータ上で、スタンドアロンのソフトウェア・パッケージとしてユーザのコンピュータ上で部分的に、ユーザのコンピュータ上で部分的にかつ遠隔のコンピュータ上で部分的に、またはすべて遠隔のコンピュータもしくはサーバ上で実行され得る。最後のシナリオでは、遠隔のコンピュータが、ローカル・エリア・ネットワーク（ＬＡＮ）もしくは広域ネットワーク（ＷＡＮ）を含む任意の種類のネットワークを介してユーザのコンピュータに接続され得るか、または外部コンピュータへの接続が（たとえば、インターネット・サービス・プロバイダを使用してインターネットを介して）行われ得る。
【００３６】
本発明の態様が、本発明の実施形態による方法、装置（システム）、およびコンピュータ・プログラムのフローチャートまたはブロック図あるいはその両方を参照して本明細書において説明される。フローチャートまたはブロック図あるいはその両方の各ブロック、およびフローチャートまたはブロック図あるいはその両方のブロックの組み合わせは、コンピュータ・プログラム命令によって実装され得ることが理解されるであろう。これらのコンピュータ・プログラム命令は、コンピュータまたはその他のプログラム可能なデータ処理装置のプロセッサによって実行される命令が、フローチャートまたはブロック図あるいはその両方の１つのブロックまたは複数のブロックで規定された機能／動作を実施するための手段をもたらすように、汎用コンピュータ、専用コンピュータ、またはその他のプログラム可能なデータ処理装置のプロセッサに与えられ、マシンを作り出すものであってよい。
【００３７】
これらのコンピュータ・プログラム命令は、コンピュータ可読媒体に記憶された命令が、フローチャートまたはブロック図あるいはその両方の１つのブロックまたは複数のブロックで規定された機能／動作を実施する命令を含む製品をもたらすように、コンピュータ可読媒体に記憶され、コンピュータ、その他のプログラム可能なデータ処理装置、またはその他のデバイスを特定の方法で機能させるものであってもよい。コンピュータ・プログラム命令は、コンピュータまたはその他のプログラム可能な装置で実行される命令が、フローチャートまたはブロック図あるいはその両方の１つのブロックまたは複数のブロックで規定された機能／動作を実施するためのプロセスを提供するように、コンピュータで実施されるプロセスを生成するべく、コンピュータ、その他のプログラム可能なデータ処理装置、またはその他のデバイスにロードされ、コンピュータ、その他のプログラム可能な装置、またはその他のデバイスで一連の動作のステップを実行させるものであってもよい。
【００３８】
図面のフローチャートおよびブロック図は、本発明のさまざまな実施形態によるコンピュータ、装置、方法、およびコンピュータ・プログラムのあり得る実装のアーキテクチャ、機能、および動作を示す。これに関連して、フローチャートまたはブロック図の各ブロックは、（１つまたは複数の）規定された論理的な機能を実装するための１つまたは複数の実行可能命令を含むモジュール、セグメント、またはコードの一部を表す可能性がある。一部の代替的な実装においては、ブロックで示された機能が、図面に示された順序とは異なる順序で行われる可能性があることにも留意されたい。たとえば、連続で示された２つのブロックが、実際には実質的に同時に実行される可能性があり、またはそれらのブロックが、関連する機能に応じて逆順に実行されることもあり得る。ブロック図またはフローチャートあるいはその両方の各ブロックと、ブロック図またはフローチャートあるいはその両方のブロックの組み合わせとは、規定された機能もしくは動作を実行する専用のハードウェアに基づくシステム、または専用のハードウェアとコンピュータ命令との組み合わせによって実装され得ることにも留意されたい。
【００３９】
変更および改変が本発明のさまざまな実施形態において本発明の真の思想を逸脱することなく行われ得ることは、上述の説明から理解されるであろう。本明細書の説明は、例示のみを目的としており、限定する意味で解釈されるべきでない。本発明の範囲は、以下の請求項の文言によってのみ限定される。
【図１】
0006444393.tif 000002
【図２】
0006444393.tif 000003
【図３】
0006444393.tif 000004
【図４】
0006444393.tif 000005