(57)【特許請求の範囲】
【請求項１】
数学的関数を計算する装置であって、
オペコード及び一つ以上の入力引数を入力として取り、前記一つ以上の入力引数と前記オペコードに従って、一つ以上の出力引数を生成するように構成された、前処理ハードウェアステージと、
値G(Z)を計算し一つまたは二つの出力を求めて出力するように構成された逆関数ハードウェアステージであって、Zは、前記オペコードがAsin、AtanまたはAtan2に対応する場合は前記出力引数のうちの一つに基づくものであり、前記オペコードがAcosに対応する場合は前記一つ以上の入力引数のうちの一つに基づくものであり、かつ、G(Z)=Acos(Z)/Sqrt(1-Z*Z)である、逆関数ハードウェアステージと、
前記逆関数ハードウェアステージからの一つまたは二つの出力と、前記一つ以上の入力引数と前記一つ以上の出力引数のうちの一つを、前記オペコードに従って処理し、最終結果を得るように構成された、後処理ハードウェアステージと、
を備える装置。
【請求項２】
前記逆関数ハードウェアステージは、一つ以上のルックアップテーブルから、G(Z)を計算するように構成されている、請求項１に記載の装置。
【請求項３】
前記逆関数ハードウェアステージは、前記一つ以上のルックアップテーブルからの値を用いて、多項式近似を行うことによって、前記一つ以上のルックアップテーブルからG(Z)を計算するように構成されている、請求項２に記載の装置。
【請求項４】
前記逆関数ハードウェアステージは、(Z-Z0)と(Z-Z1)の値を用いて多項式を計算することによって、前記多項式近似を実行するように構成されており、前記一つ以上のルックアップテーブルは、Zより小さいZ0に対応する値、及び、Zより大きいZ1に対応する値を含む、請求項３に記載の装置。
【請求項５】
逆関数ハードウェアステージは、(Z-Z1)をNOT(Z-Z0)と計算するように構成されている、請求項４に記載の装置。
【請求項６】
前記逆関数ハードウェアステージは、(Z-Z0)*(Z-Z1)の値を用いて多項式を更に計算することによって、前記多項式近似を実行するように構成されている、請求項４に記載の装置。
【請求項７】
前記逆関数ハードウェアステージは、G(Z)=a+b*(Z-Z0)+c*(Z-Z0)*(Z-Z1)を計算することによって前記多項式近似を実行するように構成されており、値ａ、ｂ、及びｃは、値Z0とZ1に対応し、前記一つ以上のルックアップテーブルから取得される、請求項６に記載の装置。
【請求項８】
表１を
【表１】
0006770777.tif 000006
表４を
【表２】
0006770777.tif 000007
とするとき、
前記前処理ハードウェアステージは、表１と表４に従って、前記入力引数に応じて前記出力引数を計算するように構成されている、請求項１に記載の装置。
【請求項９】
表２を
【表３】
0006770777.tif 000008
とするとき、
前記逆関数ハードウェアステージは、表２に従って、前記一つまたは二つの出力を求めて出力するように構成されている、請求項１に記載の装置。
【請求項１０】
表３を
【表４】
0006770777.tif 000009
とするとき、
前記後処理ハードウェアステージは、表３に従って、前記オペコード、前記逆関数ハードウェアステージからの一つまたは二つの出力、及び、前記一つ以上の入力引数と前記一つ以上の出力引数のうちの一つに応じて前記最終結果を計算するように構成されている、請求項１に記載の装置。
【請求項１１】
数学的関数を計算する方法であって、
前処理ハードウェアステージによって、オペコード、及び一つ以上の入力引数を受け取ることと、
前記前処理ハードウェアステージによって、前記一つ以上の入力引数と前記オペコードに従って、一つ以上の出力引数を生成することと、
逆関数ハードウェアステージによって、値G(Z)を計算し一つまたは二つの出力を求めて出力することであって、Zは、前記オペコードがAsin、AtanまたはAtan2に対応する場合は前記出力引数のうちの一つに基づくものであり、前記オペコードがAcosに対応する場合は前記一つ以上の入力引数のうちの一つに基づくものであり、かつ、G(Z)=Acos(Z)/Sqrt(1-Z*Z)である、値G(Z)を計算し一つまたは二つの出力を求めて出力することと、
後処理ハードウェアステージによって、前記オペコードに従って、前記逆関数ハードウェアステージからの一つまたは二つの出力と、前記一つ以上の入力引数と前記一つ以上の出力引数のうちの一つとを処理し、最終結果を得ることと、
を含む、方法。
【請求項１２】
前記逆関数ハードウェアステージによって、一つ以上のルックアップテーブルからG(Z)を計算することを、更に含む、請求項１１に記載の方法。
【請求項１３】
前記逆関数ハードウェアステージによって、前記一つ以上のルックアップテーブルからの値を用いて、多項式近似を実行することによって、前記一つ以上のルックアップテーブルからG(Z)を計算することを更に含む、請求項１２に記載の方法。
【請求項１４】
前記逆関数ハードウェアステージによって、(Z-Z0)と(Z-Z1)の値を用いて多項式を計算することによって、前記多項式近似を求めることを更に含み、前記一つ以上のルックアップテーブルは、Zより小さいZ0に対応する値、及び、Zより大きいZ1に対応する値を含む、請求項１３に記載の方法。
【請求項１５】
前記逆関数ハードウェアステージによって、(Z-Z1)をNOT(Z-Z0)と計算することを更に含む、請求項１４に記載の方法。
【請求項１６】
前記逆関数ハードウェアステージによって、(Z-Z0)*(Z-Z1)の値を用いて、前記多項式近似を求めることを更に含む、請求項１４に記載の方法。
【請求項１７】
前記逆関数ハードウェアステージによって、G(Z)=a+b*(Z-Z0)+c*(Z-Z0)*(Z-Z1)を計算することによって、前記多項式近似を求めることを更に含み、値ａ、ｂ、及びｃは、値Z0とZ1に対応し、前記一つ以上のルックアップテーブルから取得される、請求項１６に記載の方法。
【請求項１８】
表１を
【表５】
0006770777.tif 000010
とし、
表４を
【表６】
0006770777.tif 000011
とするとき、
前記前処理ハードウェアステージによって、表１と表４に従って、前記入力引数に応じて前記出力引数を計算することを更に含む、請求項１１に記載の方法。
【請求項１９】
表２を
【表７】
0006770777.tif 000012
とするとき、
前記逆関数ハードウェアステージによって、表２に従って、一つまたは二つの出力を求めて出力することを更に含む、請求項１１に記載の方法。
【請求項２０】
表３を
【表８】
0006770777.tif 000013
とするとき、
前記後処理ハードウェアステージによって、表３に従って、前記オペコード、前記逆関数ハードウェアステージからの一つまたは二つの出力、及び、前記一つ以上の入力引数と前記一つ以上の出力引数のうちの一つに応じて前記最終結果を計算することを更に含む、請求項１１に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
＜関連出願＞
この出願は、２０１４年９月１５日出願の、数学的関数の計算をするためのシステム及び方法という名称の米国特許出願第１４／４８６，８９１号の一部継続出願である。
【０００２】
＜技術分野＞
本発明は、一般に、コンピュータシステムの分野に関し、より詳細には、グラフィックスプロセッサチップ用の計算機能に関する。
【背景技術】
【０００３】
グラフィックスプロセッサチップは、伝統的に、高速な描画とレンダリング速度のために、ハードウェアで実装された様々な数学的関数を用いる。これらの数学的関数の幾つかの例は、逆数関数（「ＲＣＰ」、reciprocal function）、逆平方根関数（「ＳＱＲＴ」、reciprocal square root function）、指数関数（「ＥＸＰ」）、及び、対数関数（「ＬＯＧ」）を含む。これらの数学的関数は、従来技術において、異なるアルゴリズムの個別の回路ブロックとして実装される。
【０００４】
例えば、従来技術における３サイクルのＲＣＰの実装においては、浮動小数点数ｘを、上位ビット（「ＭＳＢ」、most significant bits）部分ｘ０と下位ビット（「ＬＳＢ」、least significant bits）部分ｘ１の連結として表すことができ、ここで、ｘ１＝ｘ−ｘ０である。ｘの逆数の主な計算は、仮数の計算におけるものである。仮数は、典型的には、ａとｂをデータルックアップテーブルとして、従来技術において、２つの項を持つ関数：ｆ（ｘ）＝ａ＋ｂ（ｘ−ｘ０）で計算される。典型的な例だと、グラフィックスプロセッサのために２１ビットよりも上の精度が要求されるわけだが、要求される精度を達成するために、データルックアップテーブルａ及びｂのそれぞれにおいて、１６，０００個を超えるエントリが必要とされる。これは、１４ビットのｘ０と、それぞれが２．ｓｕｐ．１４個のエントリを持つデータルックアップテーブルに基づく。そのような大きなデータルックアップテーブルのハードウェア実装は、データルックアップテーブルのサイズに比例した大きなゲート数、という結果となる。グラフィックプロセッサチップは、幾つかの数学的関数のハードウェア実装を含むことがある。従来技術の例においては、これらの数学的関数のそれぞれは、大きなゲート数を必要とし、典型的には他の方法と組み合わされる。これらの数学的関数のそれぞれを個別の論理回路と個別の大きなデータルックアップテーブルを使って実装することは、従来技術において、一般的な技法である。高速さとモバイルアプリケーションには、より高い集積度とより低い電力消費を要するので、これらの様々な数学的関数を実装する効率的なアルゴリズムへのニーズがある。
【図面の簡単な説明】
【０００５】
本発明の利点が容易に理解されるように、簡単に上に記した本発明のより詳細な記述が、添付の図面に図示される特定の実施形態を参照して、与えられるだろう。これらの図面が単に本発明の典型的な実施形態を図示するだけであることと、従って、これらの図面は本発明の範囲を限定するものと考えられるべきではないこととの理解の下に、本発明は、添付の図面を用いて、追加的な特殊性及び詳細とともに、記述され、説明されるだろう。
【０００６】
【図１】コンピュータシステムの模式的ブロック図である。
【図２】本発明の実施形態による、６ステージ統合型ハードウェアパイプラインを図示するブロック図である。
【図３】本発明の実施形態による、３ステージのＲＣＰハードウェアパイプラインを図示するブロック図である。
【図４】本発明の実施形態による、様々な例示的データルックアップテーブルを計算するアルゴリズムを図示するフローチャート図である。
【図５】本発明の実施形態による、別の統合型ハードウェアパイプラインを図示するフローチャート図である。
【図６】本発明の実施形態による、逆三角関数を計算する別のパイプラインを図示するフローチャート図である。
【発明を実施するための形態】
【０００７】
本願の図に一般的に記述され図示されるような、本発明のコンポーネントを、多種多様な異なる構成で配置したり、設計したりすることが可能である、ということは、容易に理解されるだろう。従って、図に表されているような本発明の実施形態についてのより詳細な以下の記述は、請求項に記載されたような本発明の範囲を限定することを意図したものではなく、本発明による、現在考えられる実施形態の、ある幾つかの例を単に代表しているだけである。ここに記述される実施形態は、図面を参照することにより最も良く理解されるだろうし、図面においては、同様な部分は、全体に渡って、同様な参照符号によって示される。
【０００８】
本発明は、現在の最先端の技術に応じて、特に、現在利用可能な装置及び方法によってはまだ完全には解決されていない当分野の問題とニーズに応じて、開発された。
【０００９】
本発明による実施形態は、装置、方法、あるいはコンピュータプログラム製品として実施することが出来る。従って、本発明は、完全にハードウェアの実施形態、完全にソフトウェアの実施形態（ファームウェア、常駐ソフトウェア、マイクロコードなどを含む）、あるいは、ソフトウェアとハードウェアの側面を組み合わせる実施形態の形を取ることが出来、これらはすべて、本明細書において一般的に、「モジュール」あるいは「システム」と呼ばれることがある。更に、本発明は、媒体内に具現化されたコンピュータ利用可能なプログラムコードを有する任意の有形の表現媒体において具現化されたコンピュータプログラム製品、という形を取ることが出来る。
【００１０】
一つ以上の、コンピュータ利用可能あるいはコンピュータ読み取り可能な媒体の、任意の組み合わせが利用され得る。例えば、コンピュータ読み取り可能な媒体は、携帯型コンピュータ・ディスケット、ハードディスク、ランダムアクセスメモリ（ＲＡＭ）装置、リードオンリメモリ（ＲＯＭ）装置、イレーサブル・プログラマブル・リードオンリメモリ（ＥＰＲＯＭあるいはフラッシュメモリ）装置、携帯型コンパクトディスク・リードオンリメモリ（ＣＤＲＯＭ）、光ストレージ装置、及び磁気ストレージ装置のうちの、一つ以上を含んでいてもよい。選択された実施形態においては、コンピュータ読み取り可能な媒体は、命令実行システム、命令実行装置、もしくは命令実行デバイスによって使用されるためのプログラム、もしくは、こうしたものとつながるプログラムを、含み、格納し、通信し、伝播し、又は伝送することが出来るような、任意の非一時的媒体を含んでいてもよい。
【００１１】
本発明の動作を実行するためのコンピュータプログラムコードは、Java、Smalltalk、C++などのオブジェクト指向プログラミング言語や、「Ｃ」プログラミング言語あるいは同様なプログラミング言語などの従来の手続き的なプログラミング言語などを含む、一つ以上のプログラミング言語の任意の組み合わせによって、書かれてもよい。プログラムコードは、スタンドアロンのソフトウェアパッケージとして全体がコンピュータシステム上で実行されてもよく、スタンドアロンのハードウェアユニット上で実行されてもよく、当該コンピュータからある程度離れたリモートコンピュータ上で一部が実行されてもよく、あるいは、全体がリモートコンピュータ上あるいはリモートサーバ上で実行されてもよい。後者のシナリオにおいては、リモートコンピュータは、ローカルエリアネットワーク（ＬＡＮ）あるいはワイドエリアネットワーク（ＷＡＮ）を含む、任意のタイプのネットワークを介して、コンピュータに接続されてもよく、あるいは、その接続は、外部コンピュータに対して（例えば、インターネットサービスプロバイダを利用して、インターネットを介して）なされてもよい。
【００１２】
本発明の実施形態による方法、装置（システム）及びコンピュータプログラム製品の、フローチャート図及び／又はブロック図を参照して、本発明が以下に記述される。フローチャート図及び／又はブロック図のそれぞれのブロックと、フローチャート図及び／又はブロック図におけるブロックの組み合わせは、コンピュータプログラム命令あるいはコードによって実装され得ることが理解されるだろう。これらのコンピュータプログラム命令は、汎用コンピュータのプロセッサか、専用コンピュータのプロセッサか、あるいは、マシンを作り出す他のプログラマブルなデータ処理装置のプロセッサに、以下のように与えられてもよい。すなわち、それらの命令、つまりコンピュータあるいは他のプログラマブルなデータ処理装置のプロセッサを介して実行される命令が、フローチャート及び／又はブロック図の一つ又は複数のブロックに規定された機能／動作を実現する手段を作成するように、与えられてもよい。
【００１３】
これらのコンピュータプログラム命令は、また、コンピュータ又は他のプログラマブルなデータ処理装置を特定の方法で機能させることが出来る非一時的なコンピュータ読み取り可能な媒体に、以下のように格納されてもよい。すなわち、コンピュータ読み取り可能な媒体に格納された命令が、フローチャート及び／又はブロック図の一つ又は複数のブロックに規定された機能／動作を実現する命令手段を含む製品を作り出すように、格納されてもよい。
【００１４】
また、コンピュータあるいは他のプログラマブルな装置上で実行される命令が、フローチャート及び／又はブロック図の一つ又は複数のブロックに規定された機能／動作を実現するプロセスを生み出すように、コンピュータプログラム命令が、コンピュータあるいは他のプログラマブルなデータ処理装置にロードされて、コンピュータあるいは他のプログラマブルな装置上で一連の動作ステップが実行されるようにして、コンピュータで実装されたプロセスを作り出す、ということも可能である。
【００１５】
図１は、例示的コンピューティング装置１００を図示するブロック図である。コンピューティング装置１００は、本明細書で議論される手続きなどの、様々な手続きを実行するために用いられてもよい。コンピューティング装置１００は、サーバ、クライアント、あるいは、任意の他のコンピューティング・エンティティとして機能することが出来る。コンピューティング装置は、本明細書で議論するような様々な監視機能を実行することが出来、本明細書で説明されるアプリケーションプログラムなどの、一つ以上のアプリケーションプログラムを実行することが出来る。コンピューティング装置１００は、デスクトップ・コンピュータ、ノートブック・コンピュータ、サーバ・コンピュータ、ハンドヘルド・コンピュータ、タブレット・コンピュータなどの、広範囲の様々なコンピューティング装置のうちの任意のものとすることが出来る。
【００１６】
コンピューティング装置１００は、一つ以上のプロセッサ１０２、一つ以上のメモリ装置１０４、一つ以上のインタフェース１０６、一つ以上の大容量記憶装置１０８、一つ以上の入出力（Ｉ／Ｏ）装置１１０、及びディスプレイ装置１３０を含み、これらは全てバス１１２に接続される。プロセッサ１０２は、メモリ装置１０４及び／又は大容量記憶装置１０８に格納された命令を実行する、一つ以上のプロセッサあるいはコントローラを含む。プロセッサ１０２は、また、キャッシュメモリなどの、様々なタイプのコンピュータ読み取り可能な媒体を含むことが出来る。
【００１７】
メモリ装置１０４は、揮発性メモリ（例えば、ランダムアクセスメモリ（ＲＡＭ）１１４）及び／又は不揮発性メモリ（例えば、リードオンリメモリ（ＲＯＭ）１１６）などの、様々なコンピュータ読み取り可能な媒体を含む。メモリ装置１０４は、また、フラッシュメモリなどの書き換え可能なＲＯＭを含むことが出来る。
【００１８】
大容量記憶装置１０８は、磁気テープ、磁気ディスク、光ディスク、固体メモリ（例えば、フラッシュメモリ）などの、様々なコンピュータ読み取り可能な媒体を含む。図１に示されるように、ある特定の大容量記憶装置は、ハードディスクドライブ１２４である。様々なコンピュータ読み取り可能な媒体に対して読み書きを可能とするために、様々なドライブも大容量記憶装置１０８に含まれていてよい。大容量記憶装置１０８は、リムーバブルな媒体１２６及び／又は、リムーバブルでない媒体を含む。
【００１９】
Ｉ／Ｏ装置１１０は、データ及び／又は他の情報がコンピューティング装置１００に入力されたりコンピューティング装置１００から取り出されたりすることを可能とする、さまざまな装置を含む。例示的なＩ／Ｏ装置１１０は、カーソル制御装置、キーボード、キーパッド、マイク、モニタあるいは他のディスプレイ装置、スピーカ、プリンタ、ネットワークインタフェースカード、モデム、レンズ、ＣＣＤあるいは他の撮像装置、などを含む。
【００２０】
ディスプレイ装置１３０は、コンピューティング装置１００の一人以上のユーザに対して情報を表示することが出来る任意のタイプの装置を含む。ディスプレイ装置１３０の例は、モニタ、ディスプレイ端末、ビデオ投影装置などを含む。
【００２１】
インタフェース１０６は、コンピューティング装置１００が他のシステム、装置、又はコンピューティング環境と相互作用することを可能とする、様々なインタフェースを含む。例示的なインタフェース１０６は、例えばローカルエリアネットワーク（ＬＡＮ）、ワイドエリアネットワーク（ＷＡＮ）、無線ネットワーク、及びインターネットへのインタフェースのような、任意の個数の異なるネットワークインタフェース１２０を含む。他のインタフェースは、ユーザインタフェース１１８と周辺装置インタフェース１２２を含む。インタフェース１０６は、また、一つ以上のユーザインタフェース要素１１８を含むことも出来る。インタフェース１０６は、また、例えばプリンタ、ポインティングデバイス（マウス、トラックパッドなど）、キーボードなどへのインタフェースといった、一つ以上の周辺装置インタフェースを含むことも出来る。
【００２２】
バス１１２は、プロセッサ１０２、メモリ装置１０４、インタフェース１０６、大容量記憶装置１０８、及びＩ／Ｏ装置１１０が相互に通信することを可能とし、バス１１２に接続された他の装置あるいはコンポーネントについても同様である。バス１１２は、システムバス、ＰＣＩバス、ＩＥＥＥ１３９４バス、ＵＳＢバスなどの何種類かのバス構造のうちの、一つ以上を代表している。
【００２３】
説明のために、プログラム及び他の実行可能なプログラムコンポーネントは、本図面には個別のブロックとして示されているが、とはいえ、そのようなプログラムとコンポーネントは、様々な時点においてコンピューティング装置１００の異なる記憶コンポーネントに存在し得るもので、かつ、プロセッサ１０２によって実行されるものだ、と理解される。あるいは、本明細書に記述されるシステム及び手続きを、ハードウェアによって、あるいは、ハードウェア、ソフトウェア、及び／又はファームウェアの組み合わせによって、実装することが出来る。例えば、一つ以上の特定用途向け集積回路（ＡＳＩＣ）を、本明細書に記述されるシステムと手続きのうちの一つ以上を実行するように、プログラムすることが出来る。
【００２４】
図２は、本発明の実施形態による、６ステージ統合型ハードウェアパイプラインを図示するブロック図である。ここで、ブロック１０１、ブロック１０３、ブロック１０５、ブロック１０７、ブロック１０９、ブロック１１１、及びブロック１１３は、パイプラインのレジスタステージである。ブロック１０２は、浮動小数点から固定小数点への変換器である。ブロック１１２は、固定小数点から浮動小数点への変換器である。一例においては、ブロック１１２は、ＥＸＰ関数を実装するためのオペコード（つまり、構成（configuration）命令、マイクロコードなど）に応じてバイパス回路となるように構成されてもよい。他の例においては、ブロック１０２は、ＬＯＧ関数を実装するための他のオペコード（つまり、構成命令、マイクロコードなど）に応じてバイパス回路となるように構成されてもよい。更に他の例においては、ブロック１０２とブロック１１２の両方は、ＲＣＰあるいはＳＱＲＴ関数を実装するに際し、更に他のオペコード（つまり、構成命令、マイクロコードなど）に応じてバイパス回路となるように構成されてもよい。幾つかの例においては、ブロック１０４、１０６、１０８、及び１１０は、個別のデータルックアップテーブルに基づいて、ＲＣＰ、ＳＱＲＴ、ＥＸＰ、ＬＯＧなどの数学的関数を計算するための二次近似の様々な部分を実装することが出来る。例えば、ブロック１０４は、浮動小数点数ｘの仮数に対応する整数ｉに基づいて、ｃについてのデータテーブルのルックアップを実装する。同様に、ブロック１０６は、ｂについてのデータテーブルのルックアップを実装する。同一のパイプラインステージの間に、ブロック１０６は、また、ｃ（ｘ−ｘ０）を計算する。同様に、ブロック１０８は、ａについてのデータテーブルのルックアップを実装し、ｂ（ｘ−ｘ０）とｃ（ｘ−ｘ０）（ｘ−ｘ１）の計算も実装する。ブロック１１０は、二次近似を計算するために、３個の項の合算を実装する。上記記述は、上記詳細には限定されず、上記記述により自明となったような様々な改変あるいは交替がなされてもよい。
【００２５】
図３は、本発明の実施形態による、３ステージのＲＣＰハードウェアパイプラインを図示するブロック図である。ここで、ブロック２０１、ブロック２０３、ブロック２０５、及びブロック２０７は、パイプラインのレジスタステージである。幾つかの例においては、ブロック２０２、２０４、及び２０６は、二次近似の様々な部分を実装することが出来る。例えば、ブロック２０２は、浮動小数点数の仮数のＭＳＢに対応する整数ｉに基づいて、ｂとｃについてのデータテーブルのルックアップを実装する。同一のパイプラインステージの間に、ブロック２０２は、また、（ｘ−ｘ０）（ｘ−ｘ１）を計算する。同様に、ブロック２０４は、ａについてのデータテーブルのルックアップを実装し、ｂ（ｘ−ｘ０）とｃ（ｘ−ｘ０）（ｘ−ｘ１）の計算も実装する。幾つかの実装においては、（ｘ１−ｘ）は、ＮＯＴ（ｘ−ｘ０）として計算されてもよく、ここで、ＮＯＴは、１を０に、０を１に変更する、ビットごとの演算である。ブロック２０６は、二次近似を計算するために、３個の項の合算を実装する。上記記述は、上記詳細には限定されず、上記記述によって自明となったような様々な改変あるいは交替がなされてもよい。
【００２６】
図４は、本発明の実施形態による、様々なデータルックアップテーブルを計算する例示的アルゴリズムを図示するフローチャート図である。ここで、例示的アルゴリズムは、ＳＱＲＴ用のデータテーブルａ、ｂ及びｃを計算するために図示されている。この例においては、table[0][i]=a, table[1][i]=b 及び table[2][i]=c である。三つの一次方程式が、三つの値ａ、ｂ及びｃを計算するために用いられる。これらの三つの方程式は、まずセグメントの開始点（つまり、ｘ）、中間点（つまり、ｘ．ｓｕｂ．――５）及び終点（つまり、ｘ１）を計算することにより（３０１）、解かれる。ブロック３０２及び３０３は、浮動小数点形式でａ、ｂ及びｃを計算する。ブロック３０４は、ａ、ｂ及びｃを整数形式に変換する。ブロック３０５は、丸めを行い、最終的な値を生成する。他の例として、ブロック３０２における「ｓｑｒｔ」関数は、本アルゴリズムをＲＣＰ用のデータテーブルａ、ｂ及びｃを計算することに転用するために、逆数関数によって置換されてもよい。他の例においては、ブロック３０２における「ｓｑｒｔ」関数は、本アルゴリズムを他の関数（例えば、ＥＸＰ、ＬＯＧなど）用のデータテーブルａ、ｂ及びｃを計算することに転用するために、これらの他の関数によって置換されてもよい。上記記述は、上記詳細には限定されず、上記記述によって自明となったような様々な改変あるいは変更がなされてもよい。図４のフローチャートは、６４個のエントリのテーブルを実装するのに適しているだろう。１２８個のエントリなどの他の個数のエントリも用いることができる。
【００２７】
上記方法は、例えばモバイル・グラフィックス・チップにおけるバーテックスシェーダやピクセルシェーダなどに対して、一つの統合型ハードウェアパイプラインを用いて浮動小数点値で上記の超越関数のリストを計算するための統一的方法を、提供する。この技法は、F(x) = 1/x; F(x) = 1/x^(1/2); F(x) = 2 ^x 及び F(x) = LOG2(x) の計算に基づいていてもよい。
【００２８】
これらの関数は、以下の関数、すなわち、F(x) = a + b(x-x0) + c(x-x0)(x-x1)（以下、「補間関数」）を実行する、統合型ハードウェアパイプによって、実装される。近似は、６４個、１２８個あるいは、ある他の個数のセグメントで行うことができ、ここで、ｘ０はセグメントの開始値であり、ｘ１はセグメントの終了値である。ｘ０は、ｘのＭＳＢ(most significant bits)部分であり、（ｘ−ｘ０）は、ｘのＬＳＢ(least significant bits)部分である。ｘの値は、ｘ０とｘ１の間である(x0 <=  x < x1)。値ａ、ｂ及びｃは、例えばハードウェアに埋め込まれたテーブルなどの、三つの個別のテーブルからのものである。
【００２９】
ＥＸＰに対しては、浮動小数点から固定小数点への数の変換ステージが、統合型ハードウェアパイプの前段に配置される。ＬＯＧに対しては、統合型ハードウェアパイプの後段に、固定小数点から浮動小数点への数の変換がある。ハードウェアの流れと機能は、各関数について選択されるテーブルが異なるほかは、四つの関数のそれぞれについて同一である。入力オペコードが関数を選択する。このアプローチに基づいた、低レイテンシの効率的ＲＣＰ（逆数）の実装は、３サイクルにまで減少され得る。
【００３０】
図５を参照すると、Sin(πx), Cos(πx), LOG2(x) 及び DIV （つまり、ｙ／ｘ）の計算を高速化するために、ロジックデバイスが図１と図２のパイプラインに追加されてもよい。例えば、追加のロジックは、Sin(πx) = Sin(π*(IntX+ FracX)) = (-1)^IntX*Sin(π*FracX) という公式に基づいて実装されてもよく、ここで、IntXは入力浮動小数点引数ｘの整数部分であり、FracXは入力ｘの小数部分である。よって、直接Sin(πx)を近似するのではなくて、F(x) = Sin(π*FracX)/FracXに従って近似されてもよい。従って、図５の改変されたパイプラインは、例えば浮動小数点から固定小数点への変換ロジック２０２などから、追加のパイプライン５００を用いて、追加の出力(output2)を生成してもよく、ここでoutput2はFracXに等しい。パイプラインは、Sin(πx) = F(x)*output2を計算するように更に改変されてもよく、ここでF(x)は、例えばパイプラインステージ２０３-２１４による、関数Sin(π*FracX)/FracXの近似である。具体的には、F(x)は、例えば上記したパイプラインと方法による、入力引数としてのFracXの値に従って選択されたテーブルのエントリ間での、補間の結果である。図示された実施形態では、F(x)とoutput2の乗算は、パイプラインのステージ２１６において実行されてもよい。Cos(πx)については、Cos(πx) = Sin(π(x+0.5))である。従って、Sin(πx)の同じロジックが、結果を得るために用いられてもよい。ある実施形態においては、Sin(πx)は、FracX <= 0.5fならば、F(x) = Sin(π*FracX)/FracX とoutput2 = FracX とを用いて計算され、ここで0.5f は、１／２に等しい浮動小数点値である。Sin(πx)用の幾つかの実施形態においては、FracX > 0.5f ならば、F(x) = Sin(π*(1.0 - FracX) )/(1.0 - FracX)であり、output2は1.0-FracX である。例えば、より一般的には、Sin(πx)に対し、F(x) = ((-1)^IntX)*Sin(π*Min(FracX, 1.0 - FracX) )/Min(FracX, 1.0 - FracX) であり、output2 はMin(FracX, 1.0 - FracX)であり、ここでIntXはｘの整数部分である。
【００３１】
入力引数ｘが１．０に近いとき、Ｌｏｇ２（ｘ）は非常に小さい。直接ＬＯＧ２（ｘ）を近似するのではなく、F(x) = Log2(x - 1)/(x - 1)として近似されてもよい。従って、ＬＯＧ２について、output2は、x - 1に等しく設定されてもよい。従って、LOG2(x) = F(x)*output2であり、ここでoutput2は(x - 1)に等しく、F(x)は、本明細書に記載したようにハードウェアパイプライン内でテーブルと補間を用いて計算される、LOG2(x-1)/(x-1)の近似である。この改変が実行される対象のｘの値は、用いられる浮動小数点表現に基づいて選択されるべきである。例えば、幾つかの実施形態においては、ｘが[0.75,1.5)の範囲内にあるとき、F(x) = LOG2(x-1)/(x-1) かつ output2 = (x-1)である。そうでない場合は、ＬＯＧ２（ｘ）に対しては、F(x) = LOG2(x) かつ output2 = 1.0fである。
【００３２】
ＤＩＶ（例えば、ｙ／ｘ）については、y/x = y*(1/x) = y*Rcp(x)という関係を用いると、１／ｘのアンダーフローの問題があるかもしれず、つまり、|x| > 2^126のとき、３２ビットの浮動小数点表現では 1/x = 0 であるかもしれない。|x| > 2^126におけるアンダーフローは、最大の浮動小数点値が、2^127*1.11111111であり、かつ、「浮動小数点正規化数表現」において、最小値が、2^(-126)であるので、発生する。非正規化数を用いる場合、最小値は、2^(-149)となり得る。この場合、入力引数ｘ及びｙの双方は、2^32によってスケーリングされてもよく、つまり、y/x = (y/2^32)/(x/2^32)である。従って、ハードウェアパイプラインにおいては、ｘがある範囲を超えている（例えば、2^64より大きい）場合にｙ／ｘの双方をスケールダウンするために、追加のパイプラインステージが用いられてもよい。この追加のステージは、本明細書に記述したようにテーブル値を選択して補間ステップを実行するためのパイプラインステップの前に、実行されてもよい。
【００３３】
G(x) = Acos(x)/Sqrt(1-x*x)は、[0, 1.0]において非常に滑らかであり、すなわち、その導関数が、有限で、多項式を用いて容易に近似出来る。G(x)は、SinPi(x)/x について上記したのと同様の方法で近似されてもよい。特に、引数が浮動小数点から２４ビット固定小数点値に変換されてもよく、それから、G(x)が、上記したようにルックアップテーブルと多項式近似を用いて、固定小数点バージョンで実行されてもよく、その後、多項式近似の出力が浮動小数点値に変換されてもよい。特に、多項式近似は、上記したように、区分的な二次近似を用いて、実行されてもよい。更に、aTan2(x,y)についての前処理関数が、正負の無限大の（ｘ，ｙ）成分を調整するために用いられてもよい。
【００３４】
Acos(x)は、以下のようにして、G(x)から得ることが出来る。すなわち、ｘ≧０に対して、Acos(x) = G(x) * Sqrt(1-x*x) 及び Acos(-x) = π  - G(-x)*Sqrt(1-x*x) である。
【００３５】
上記の二つの式を統合するために（さもなければ、「ｉｆ  ｅｌｓｅ」命令が必要になるだろう）、幾つかの実施形態では、 (out1, out2) = InvTrig(x, y, opcode) という関数を用いるのだが、これは、二つの入力（ｘ，ｙ）をとり、関数G(Z)に基づいてOut1 及び Out2を出力するもので、ここで、Zはオペコードに基づいて決定される入力である。
【００３６】
図６を参照すると、逆三角関数を計算する装置は、図示されるようなものであってもよい。前処理ステージ６００は、入力引数ｘ、あるいは、入力引数ｘとｙを処理し、一つ以上の出力を生成する。特に、前処理ステージ６００は、表１に概要が示されているように入力引数に応答して、出力引数を提供するのに効果的な回路を含んでもよい。
【表１】
0006770777.tif 000002
【００３７】
前処理ステージ６００からの出力引数は、関数「InvTrig()」を実行するステージ６０２に入力されてもよく、関数「InvTrig()」は、入力引数と共に受け取ったオペコードにより、表２に概要が示されているように、前処理ステージの出力引数及び／又は元の入力引数を処理する。InvTrigステージ６０２は、二つの出力Out1及びOut2を生成することが出来、その一方が使用されてもよく、あるいは、両方が使用されてもよい。表１において、「Ｆｍａ」は、オーバーフローを避けるためにａとｂの精度を落とすのとは反対に、ｃを加算する前の高精度のａとｂを用いて関数a*b+cを実行する演算を指す。表１において、「Ｄｐ２」は、関数a*b+kc*dが二通りの精度で実行される、つまり、乗算(a*b)及び(c*d)が、オーバーフローを避けるために半精度の引数ａ、ｂ、ｃ、及びｄを用いて実行され、加算が全精度で実行される、関数を指す。
【表２】
0006770777.tif 000003
【００３８】
表２において明らかなように、各オペコードについて、入力引数のうち少なくとも幾つかの値は、関数G(Z)を計算するという結果をもたらすだろう（Ｚは、表２に概要が示されるように、ｘ、ｓなどである）。図示された実施形態においては、G(Z)は、値G(Z) = Acos(Z)/Sqrt(1 - x*x)を出力する。G(Z)を計算することは、図５のパイプラインを用いて実行されてもよい。同様に、Ｓｑｒｔ（二乗根）及びＲｓｑｒｔ（二乗根の逆数）もまた、図２-５のパイプラインの属性のうちの幾つかあるいは全部を有することが出来るパイプライン６０４を用いて、計算されてもよい。具体的には、これらの関数の値は、係数ａ、ｂ、ｃ用のルックアップテーブルを用いて計算されてもよく、上記のように補間されてもよい。
【００３９】
InvTrig ステージ６０２の出力の一方あるいは両方は、オペコードに対応する逆三角関数を近似する出力６０８を得るために、前処理ステージ６００の出力と元の入力引数のうちの一つ以上と共に、後処理ステージ６０６によって処理されてもよい。特に、後処理ステージ６０６によって実行される計算と、各オペコードについて後処理ステージ６０６が演算を行う対象の値が、表３に記述されている。１／Ｐｉの値は、必要なときに毎回計算しなくてよいように、予め計算されていてもよい(0.31830988618379067153776752674503f)。
【表３】
0006770777.tif 000004
【００４０】
さてこれからnew(x,y)の動作を記述しよう。特に、new(x,y)は、オーバーフロー、アンダーフロー、０による割り算、及び、幾つかの入力引数について起こりうる他のエラーを避けるために用いられてもよい。例えば、new(x,y)は、Atan2piの出力が、Atan2piに対するOpenCL標準の要件に合致するように、出力ｘ’とｙ’を生成してもよい：
atan2pi ( ±0, -0 ) = ±1.
atan2pi ( ±0, +0 ) = ± 0.
atan2pi ( ±0, x )   x < 0に対し、± 1を返す。
atan2pi ( ±0, x )   x > 0に対し、± 0を返す。
atan2pi ( y, ±0 )   y < 0に対し、-0.5を返す。
atan2pi ( y, ±0 )   y > 0に対し、0.5を返す。
atan2pi ( ±y, -∞ )  有限な y > 0に対し、± 1を返す。
atan2pi ( ±y, +∞ )  有限な y > 0に対し、± 0を返す。
atan2pi ( ±∞, x )  有限な x に対し、± 0.5を返す。
atan2pi (±∞, -∞ )   ± 0.75を返す。
atan2pi (±∞, +∞ )   ± 0.25を返す。
【００４１】
図示された実施形態において、上記結果は、表４において以下に示されるようにnew(x,y)を実装することによって、達成される。例えば、x=y=2^68で、new(x,y)が用いられなかった場合、u=(x*x+y*y)=2^137となり、オーバーフローを起こすだろう(max=2^127*1.11111…)。u= +infのときは、v=0,(s,t)=(0,0)である。最終結果は、従って、w=0である。正しい結果は、0.25である。x=y=2^(-68)ならば、アンダーフロー、u=0,v=Inf,(s, t)=Infにより、間違った結果が、また得られるだろう。最終結果は、w=Nanである。G(s)の計算において、|s|>1.0である場合、InvTrigの出力は、out1=out2= Nanであってもよい。
【表４】
0006770777.tif 000005
【００４２】
上記装置及び方法は、少しの命令で、Asin, Acos, Atan, Atan及び Atan2のうちの複数あるいは全てを実行することが出来る、2入力・2出力関数（前処理ステージ６００と、InvTrigステージ６０２）を提供する。
【００４３】
本発明の上記実施形態は、例示と説明として提供されている。これらは、本発明を、記述されたとおりのまさにその形態に限定することを意図したものではない。特に、本明細書に記述された発明の機能的実装は、ハードウェア、ソフトウェア、ファームウェア、及び／又は、他の利用可能な機能的なコンポーネント若しくは基本構成要素で、等価に実装され得るということ、そして、ネットワークは、有線、無線、あるいは、有線と無線の組み合わせであってよいこと、が考えられる。他の変形、及び、実施形態が、上記教示の下に可能であり、従って、発明の範囲は、この詳細な説明によって限定されず、むしろ、以下の請求項によって限定されることを意図している。
【００４４】
本発明は、その精神あるいは本質的特性から外れることなく、他の特定の形態で実施され得る。記述された実施形態は、全ての点で、例示的であるのみであり、限定的ではない、と考えられるべきである。従って、本発明の範囲は、上記記述によってではなく、添付の請求項によって示される。請求項の均等物の意味と範囲の内にある全ての変更は、請求項の範囲内に含まれるべきである。
【図１】
0006770777.tif 000014
【図２】
0006770777.tif 000015
【図３】
0006770777.tif 000016
【図４】
0006770777.tif 000017
【図５】
0006770777.tif 000018
【図６】
0006770777.tif 000019