(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-02-16
(45)【発行日】2023-02-27
(54)【発明の名称】数学的関数を計算するためのシステムおよび方法
(51)【国際特許分類】
G06F 7/552 20060101AFI20230217BHJP
G06F 7/556 20060101ALI20230217BHJP
G06F 7/548 20060101ALI20230217BHJP
G06F 17/10 20060101ALI20230217BHJP
【FI】
G06F7/552 A
G06F7/552 B
G06F7/556 A
G06F7/556 B
G06F7/548 A
G06F17/10 Z
【外国語出願】
(21)【出願番号】P 2018014217
(22)【出願日】2018-01-31
【審査請求日】2021-01-15
(32)【優先日】2017-02-02
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】507186492
【氏名又は名称】ビバンテ コーポレーション
(74)【代理人】
【識別番号】100121083
【氏名又は名称】青木 宏義
(74)【代理人】
【識別番号】100138391
【氏名又は名称】天田 昌行
(74)【代理人】
【識別番号】100074099
【氏名又は名称】大菅 義之
(74)【代理人】
【識別番号】100106851
【氏名又は名称】野村 泰久
(72)【発明者】
【氏名】レファン ゾン
(72)【発明者】
【氏名】ズィーウェイ カオ
【審査官】白石 圭吾
(56)【参考文献】
【文献】特開2010-033318(JP,A)
【文献】特開平04-092921(JP,A)
【文献】特開2016-201108(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 1/02-1/035;7/544-7/556
G06F 17/00-17/18
(57)【特許請求の範囲】
【請求項1】
XのY乗(X^Y)を計算する方法であって、
(i)電子デバイスによって、Xの関数を入力として受け付ける第1の超越関数を計算することであって、前記第1の超越関数は、M1H、M1L、および、M2を出力し、M2は第1の精度を有し、M1HとM1Lの組合せは前記第1の精度よりも大きい第2の精度を有する、ことと、
(ii)前記電子デバイスの2エレメントドット積(Dp2)回路によって、M1HとM2の積、および、M1LとM2の積に従って、KHとKLを計算することと、
(iii)前記電子デバイスによって、(a)Yの関数と、(b)KHおよびKLの両方との積を計算して、有意性の高い出力THと有意性の低い出力TLを得ることと、
(iv)前記電子デバイスによって、THおよびTLの関数に従って第2の超越関数を計算して、XのY乗(X^Y)の見積もり値である出力を得ることと、
を含む方法。
【請求項2】
前記Dp2回路が、KHとKLの各々がM2と同じ精度を有するように、KHとKLを生成する、請求項1に記載の方法。
【請求項3】
Xが指数kおよび仮数sを有する浮動小数点値であり、
前記方法は、
前記電子デバイスによって、p=s≧0.5 ? (1+s)/2 : (1+s)を計算することと、
前記電子デバイスによって、M2を1-pとして計算することと、
前記電子デバイスによって、M1Hが(Log2(1-p))/(1-p)の計算結果の有意性の高い部分であり、且つ、M1Lが(Log2(1-p))/(1-p)の計算結果の有意性の低い部分であるように、{M1H,M1L}を(Log2(1-p))/(1-p)として計算することと、
前記電子デバイスによって、n=s≧0.5 ? k+1 : kを計算することと、
前記電子デバイスによって、KHが n*1.0+M1H*M2+M1L*M2 の計算結果の有意性の高い部分であり、且つ、KLが n*1.0+M1H*M2+M1L*M2 の計算結果の有意性の低い部分であるように、{KH,KL}=n*1.0+M1H*M2+M1L*M2 を計算することと、
をさらに含む、請求項1に記載の方法。
【請求項4】
(Log2(1-p))/(1-p)を計算することは、前記電子デバイスによって、テーブルを用いて行われる、請求項3に記載の方法。
【請求項5】
n*1.0+M1H*M2+M1L*M2を計算することは、3エレメントドット積(Dp3)回路を用いて行われる、請求項4に記載の方法。
【請求項6】
KHおよびKLがM2と同じ精度を有する、請求項5に記載の方法。
【請求項7】
M1LがM1Hよりも小さいビット数の精度を有する、請求項1に記載の方法。
【請求項8】
前記電子デバイスによって、X及びYを前処理関数(関数Preprocess(X,Y) = (X', Y', Sign))に従って前処理して、X’、Y’、Signを生成すること、をさらに含み、X’はXの前記関数であり、Y’はYの前記関数であり、Signは、XのY乗(X^Y)の見積もり値が正か負のどちらであるかを表す符号であり、前記前処理関数は、X及びYをそのまま使用してXのY乗(X^Y)の値を計算しようとするとエラーが生じるケースに対処し得るように、X及びYを前処理する関数である、請求項1に記載の方法。
【請求項9】
前記電子デバイスによって、前記Signに従って、前記第2の超越関数からの前記出力の符号を設定すること、をさらに含む、請求項8に記載の方法。
【請求項10】
前記第2の超越関数をTHおよびTLの前記関数に従って計算することが、
前記電子デバイスによって、THの整数部分としてTH_Intを取得することと、
前記電子デバイスによって、THの小数部分としてTH_Fracを取得することと、
前記電子デバイスによって、T_All_Fracを取得するために、TH_FracとTLを組合せることと、
前記電子デバイスによって、XのY乗の前記見積もり値を取得するために、TH_IntおよびT_All_Fracを前記第2の超越関数に入力することと、
を含む、請求項1に記載の方法。
【請求項11】
XのY乗(X^Y)を計算する電子デバイスであって、
(i)Xの関数を入力として受け付け、且つ、M1H、M1L、および、M2を出力するようにプログラムされた第1の超越関数ステージであって、M2は第1の精度を有し、M1HとM1Lの組合せは前記第1の精度よりも大きい第2の精度を有する、第1の超越関数ステージと、
(ii)M1HとM2の積、および、M1LとM2の積に従って、KHとKLを出力するようにプログラムされた第1のドット積ステージと、
(iii)(a)Yの関数と、(b)KHおよびKLの両方との積を計算して、有意性の高い出力THと有意性の低い出力TLを得るようにプログラムされた第2のドット積ステージと、
(iv)THおよびTLの関数を入力として受け付けて、XのY乗(X^Y)の見積もり値を出力するようにプログラムされた第2の超越関数ステージと、
を含み、
M1LはM1Hよりも低いビット数の精度を有し、
前記第1のドット積ステージ、および、前記第2のドット積ステージは、1つ以上の4エレメントドット積(Dp4)回路を用いて実行される、電子デバイス。
【請求項12】
前記第1のドット積ステージの前記Dp4回路は、KHとKLの各々がM2と同じ精度を有するように、KHとKLを出力するようにプログラムされている、請求項11に記載の電子デバイス。
【請求項13】
Xが指数kおよび仮数sを有する浮動小数点値であり、
前記電子デバイスは、
p=s≧0.5 ? (1+s)/2 : (1+s)を計算することと、
M2を1-pとして計算することと、
M1Hが(Log2(1-p))/(1-p)の計算結果の有意性の高い部分であり、且つ、M1Lが(Log2(1-p))/(1-p)の計算結果の有意性の低い部分であるように、{M1H,M1L}を(Log2(1-p))/(1-p)として計算することであって、Log2(1-p)は前記第1の超越関数ステージを用いて実行される、ことと、
n=s≧0.5 ? k+1 : kを計算することと、
KHが n*1.0+M1H*M2+M1L*M2 の計算結果の有意性の高い部分であり、且つ、KLが n*1.0+M1H*M2+M1L*M2 の計算結果の有意性の低い部分であるように、{KH,KL}=n*1.0+M1H*M2+M1L*M2 を計算することと、
を行うようにさらにプログラムされる、請求項11に記載の電子デバイス。
【請求項14】
前記電子デバイスは、
X及びYを前処理関数(関数Preprocess(X,Y) = (X', Y', Sign))に従って前処理して、X’、Y’、Signを生成するように、さらにプログラムされ、
X’はXの前記関数であり、Y’はYの前記関数であり、Signは、XのY乗(X^Y)の見積もり値が正か負のどちらであるかを表す符号であり、前記前処理関数は、X及びYをそのまま使用してXのY乗(X^Y)の値を計算しようとするとエラーが生じるケースに対処し得るように、X及びYを前処理する関数である、請求項11に記載の電子デバイス。
【請求項15】
前記電子デバイスは、
TH_IntをTHの整数部分として取得することと、
TH_FracをTHの小数部分として取得することと、
TH_FracとTLとを組み合わせてT_All_Fracを取得することと、
TH_IntおよびT_All_Fracを前記第2の超越関数ステージに入力することと、
を行うことによって、THおよびTLの前記関数を計算するようにさらにプログラムされている、請求項11に記載の電子デバイス。
【発明の詳細な説明】
【技術分野】
【0001】
<関連出願>
本出願は、2014年9月15日出願の「数学的関数を計算するためのシステムおよび方法」という名称の米国特許出願第14/486891号に関連しており、この出願は参照することによって本明細書に含まれる。
【0002】
<技術分野>
本発明は、一般にコンピュータシステムの分野に関連し、より詳細には、グラフィックプロセッサチップの計算機能に関する。
【背景技術】
【0003】
グラフィックプロセッサチップは、従来から、高速な描画とレンダリング速度のためにハードウェアで実装された様々な数学的関数を用いる。これらの数学的関数のいくつかの例は、逆関数(「RCP」、reciprocal function)、逆平方根関数(「SQRT」、reciprocal square root function)、指数関数(「EXP」)、対数関数(「LOG」)を含む。これらの数学的関数は、従来技術において、異なるアルゴリズムの個別の回路ブロックとして実装される。
【0004】
例えば、従来技術における3サイクルのRCPの実装においては、浮動小数点数xを、上位ビット(「MSB」、most significant bits)部分x0と下位ビット(「LSB」、least significant bits)部分x1の連結として表すことができ、ここで、x1=x-x0である。xの逆数の主な計算は、仮数の計算におけるものである。仮数は、従来技術において、典型的には2つの項を持つ関数:f(x)=a+b(x-x0)で計算される。ここで、aとbはデータルックアップテーブルである。典型的な例だと、グラフィックプロセッサのために21ビット以上の精度が要求されるが、要求される精度を達成するために、データルックアップテーブルa及びbのそれぞれにおいて、16,000個を超えるエントリが必要とされる。これは、14ビットのx0と、それぞれが2の14乗(2.sup.14)個のエントリを持つデータルックアップテーブルに基づく。このような大きなデータルックアップテーブルのハードウェア実装は、データルックアップテーブルのサイズに比例した大きなゲート数をもたらす。グラフィックプロセッサチップは、幾つかの数学的関数のハードウェア実装を含むことがある。従来技術の例においては、これらの数学的関数の各々は、大きなゲート数を必要とし、典型的には他の方法と組み合わされる。これらの数学的関数の各々を個別の論理回路と個別の大きなデータルックアップテーブルを使って実装することは、従来技術において、一般的な技術である。高速さとモバイルアプリケーションがより高い集積度とより低い電力消費を要することから、これらの様々な数学的関数を実装する効率的なアルゴリズムへのニーズがある。
【図面の簡単な説明】
【0005】
本発明の利点が容易に理解されるように、簡単に上述した本発明のより詳細な記述が、添付の図面に図示される特定の実施形態を参照して提供される。これらの図面が単に本発明の典型的な実施形態を図示するだけであり、従って、これらの図面は本発明の範囲を限定するものと考えられるべきではないという理解の下で、本発明は、添付の図面を用いて、追加的な特異性及び詳細とともに、記述され、説明される。
【0006】
【
図1】コンピュータシステムの概略ブロック図である。
【
図2】本発明の実施形態による、6ステージ統合型ハードウェアパイプラインを説明するブロック図である。
【
図3】本発明の実施形態による、3ステージのRCPハードウェアパイプラインを説明するブロック図である。
【
図4】本発明の実施形態による、様々な例示的データルックアップテーブルを計算するアルゴリズムを説明するフローチャート図である。
【
図5】本発明の実施形態による、別の統合型ハードウェアパイプラインを説明するフローチャート図である。
【
図6】本発明の実施形態による、X
Yを計算する装置と方法を説明するブロック図である。
【
図7】本発明の実施形態による、Log2(x)を計算する代替の装置と方法を説明するブロック図である。
【発明を実施するための形態】
【0007】
本出願の図に一般的に記述され図示されるような、本発明のコンポーネントを、多種多様な異なる構成で配置したり、設計したりすることが可能である、ということは、容易に理解されるだろう。従って、図に表されているような本発明の実施形態についてのより詳細な以下の記述は、請求項に記載されている本発明の範囲を限定することを意図したものではなく、本発明による、現在考えられる実施形態の、ある幾つかの例を単に代表しているにすぎない。ここに記述される実施形態は、図面を参照することにより最も良く理解されるだろう。図面においては、同様な部分は、全体に渡って、同様な参照符号によって指定される。
【0008】
本発明は、現在の最先端の技術に応じて、特に、現在利用可能な装置及び方法によってはまだ完全には解決されていない当分野の問題とニーズに応じて、開発された。
【0009】
本発明の実施形態は、装置、方法、あるいはコンピュータプログラム製品であり得る。従って、本発明は、完全にハードウェアの実施形態、完全にソフトウェアの実施形態(ファームウェア、常駐ソフトウェア、マイクロコードなどを含む)、あるいは、ソフトウェアの態様とハードウェアの態様を組み合わせた実施形態の形を取りうる。これらは全て、本明細書において一般的に、「モジュール」あるいは「システム」と呼ばれることがある。更に、本発明は、媒体内に具現化されたコンピュータ利用可能なプログラムコードを有する任意の有形の表現媒体において具現化されたコンピュータプログラム製品、という形を取っても良い。
【0010】
1つ以上の、コンピュータ利用可能あるいはコンピュータ読み取り可能な媒体の、任意の組み合わせが利用され得る。例えば、コンピュータ読み取り可能な媒体は、携帯型コンピュータ・ディスケット、ハードディスク、ランダムアクセスメモリ(RAM)装置、リードオンリメモリ(ROM)装置、イレーサブル・プログラマブル・リードオンリメモリ(EPROMあるいはフラッシュメモリ)装置、携帯型コンパクトディスク・リードオンリメモリ(CDROM)、光ストレージ装置、及び磁気ストレージ装置のうちの、1つ以上を含んでいてもよい。選択された実施形態においては、コンピュータ読み取り可能な媒体は、命令実行システム、命令実行装置、もしくは命令実行デバイスによって使用されるためのプログラム、あるいは、命令実行システム、命令実行装置、もしくは命令実行デバイスに接続して使用されるプログラムを、含み、格納し、通信し、伝播し、又は伝送することができるような、任意の非一時的媒体を含んでいてもよい。
【0011】
本発明の動作を実行するためのコンピュータプログラムコードは、Java、Smalltalk、C++などのオブジェクト指向プログラミング言語や、「C」プログラミング言語あるいは同様なプログラミング言語などの従来の手続き型のプログラミング言語などを含む、一つ以上のプログラミング言語の任意の組み合わせによって、書かれてもよい。プログラムコードは、スタンドアロンのソフトウェアパッケージとして全体がコンピュータシステム上で実行されてもよく、スタンドアロンのハードウェアユニット上で実行されてもよく、当該コンピュータからある程度離れたリモートコンピュータ上で一部が実行されてもよく、あるいは、全体がリモートコンピュータ上あるいはリモートサーバ上で実行されてもよい。後者の状況では、リモートコンピュータは、ローカルエリアネットワーク(LAN)もしくはワイドエリアネットワーク(WAN)を含む、任意のタイプのネットワークを介して、コンピュータに接続されてもよく、また、その接続は、外部コンピュータに対して(例えば、インターネットサービスプロバイダを利用して、インターネットを介して)なされてもよい。
【0012】
本発明の実施形態による方法、装置(システム)及びコンピュータプログラム製品の、フローチャート図、および/または、ブロック図を参照しながら、本発明が以下に記述される。フローチャート図、および/または、ブロック図の各々のブロックと、フローチャート図、および/または、ブロック図におけるブロックの組み合わせは、コンピュータプログラム命令あるいはコードによって実装され得ることが理解されるだろう。これらのコンピュータプログラム命令は、汎用コンピュータのプロセッサか、専用コンピュータのプロセッサか、あるいは、マシンを作り出す他のプログラマブルなデータ処理装置のプロセッサに、それらの命令(すなわちコンピュータあるいは他のプログラマブルなデータ処理装置のプロセッサを介して実行される命令)が、フローチャートおよび/またはブロック図の1つ以上のブロックに規定された機能/動作を実現する手段を作成するように、与えられてもよい。
【0013】
これらのコンピュータプログラム命令は、また、コンピュータ又は他のプログラマブルなデータ処理装置を特定の方法で機能させることができる非一時的なコンピュータ読み取り可能な媒体に、コンピュータ読み取り可能な媒体に格納された命令が、フローチャートおよび/またはブロック図の1つ以上のブロックに規定された機能/動作を実現する命令手段を含む製品を作り出すように、格納されてもよい。
【0014】
また、コンピュータあるいは他のプログラマブルな装置上で実行される命令が、フローチャートおよび/またはブロック図の1つ以上のブロックに規定された機能/動作を実現するプロセスを提供するように、コンピュータプログラム命令が、コンピュータあるいは他のプログラマブルなデータ処理装置にロードされて、コンピュータあるいは他のプログラマブルな装置上で一連の動作ステップが実行されるようにして、コンピュータで実装されたプロセスを作り出す、ということも可能である。
【0015】
図1は、例示的コンピューティング装置100を図示するブロック図である。コンピューティング装置100は、本明細書で議論される手続きなどの、様々な手続きを実行するために用いられてもよい。コンピューティング装置100は、サーバ、クライアント、あるいは、任意の他のコンピューティング・エンティティとして機能することができる。コンピューティング装置は、本明細書で議論するような様々な監視機能を実行することができ、本明細書で説明されるアプリケーションプログラムなどの、一つ以上のアプリケーションプログラムを実行することができる。コンピューティング装置100は、デスクトップ・コンピュータ、ノートブック・コンピュータ、サーバ・コンピュータ、ハンドヘルド・コンピュータ、タブレット・コンピュータなどの、広範囲の様々なコンピューティング装置のうちの任意のものであって良い。
【0016】
コンピューティング装置100は、1つ以上のプロセッサ102、1つ以上のメモリ装置104、1つ以上のインタフェース106、1つ以上の大容量記憶装置108、1つ以上の入出力(I/O)装置110、および、ディスプレイ装置130を含み、これらは全てバス112に接続される。プロセッサ102は、メモリ装置104および/または大容量記憶装置108に格納された命令を実行する、1つ以上のプロセッサあるいはコントローラを含む。プロセッサ102は、また、キャッシュメモリなどの、様々なタイプのコンピュータ読み取り可能な媒体を含んでも良い。
【0017】
メモリ装置104は、揮発性メモリ(例えば、ランダムアクセスメモリ(RAM)114)、および/または、不揮発性メモリ(例えば、リードオンリメモリ(ROM)116)などの、様々なコンピュータ読み取り可能な媒体を含む。メモリ装置104は、また、フラッシュメモリなどの書き換え可能なROMを含んでも良い。
【0018】
大容量記憶装置108は、磁気テープ、磁気ディスク、光ディスク、固体メモリ(例えば、フラッシュメモリ)などの、様々なコンピュータ読み取り可能な媒体を含む。
図1に示されるように、ある特定の大容量記憶装置は、ハードディスクドライブ124である。様々なコンピュータ読み取り可能な媒体に対して読み書きを可能とするために、様々なドライブも大容量記憶装置108に含まれていてよい。大容量記憶装置108は、可搬型の媒体126および/または、可搬型ではない媒体を含む。
【0019】
I/O装置110は、データおよび/または他の情報がコンピューティング装置100に入力されたりコンピューティング装置100から取り出されたりすることを可能とする、さまざまな装置を含む。例示的なI/O装置110は、カーソル制御装置、キーボード、キーパッド、マイク、モニタあるいは他のディスプレイ装置、スピーカ、プリンタ、ネットワークインタフェースカード、モデム、レンズ、CCDあるいは他の撮像装置、などを含む。
【0020】
ディスプレイ装置130は、コンピューティング装置100の1人以上のユーザに対して情報を表示することができる任意のタイプの装置を含む。ディスプレイ装置130の例は、モニタ、ディスプレイ端末、ビデオ投影装置などを含む。
【0021】
インタフェース106は、コンピューティング装置100が他のシステム、装置、もしくは、コンピューティング環境と相互作用することを可能とする、様々なインタフェースを含む。例示的なインタフェース106は、例えばローカルエリアネットワーク(LAN)へのインタフェース、ワイドエリアネットワーク(WAN)へのインタフェース、無線ネットワークへのインタフェース、および、インターネットへのインタフェースのような、任意の個数の異なるネットワークインタフェース120を含む。他のインタフェースは、ユーザインタフェース118と周辺装置インタフェース122を含む。インタフェース106は、また、1つ以上のユーザインタフェース要素118を含んでも良い。インタフェース106は、また、例えばプリンタ用のインタフェース、ポインティングデバイス(マウス、トラックパッドなど)用のインタフェース、キーボード用のインタフェースなどの、1つ以上の周辺装置インタフェースを含んでも良い。
【0022】
バス112は、プロセッサ102、メモリ装置104、インタフェース106、大容量記憶装置108、および、I/O装置110が相互に通信することを可能とし、バス112に接続された他の装置あるいはコンポーネントについても同様である。バス112は、システムバス、PCIバス、IEEE1394バス、USBバスなどの何種類かのバス構造のうちの、1つ以上を代表している。
【0023】
説明のために、プログラム及び他の実行可能なプログラムコンポーネントは、本図面には個別のブロックとして示されているが、そのようなプログラムとコンポーネントは、様々な時点においてコンピューティング装置100の異なる記憶コンポーネントに存在し得るもので、かつ、プロセッサ102によって実行されるものだ、と理解される。あるいは、本明細書に記述されるシステム及び手続きを、ハードウェアによって、あるいは、ハードウェア、ソフトウェア、および/または、ファームウェアの組み合わせによって、実装することができる。例えば、1つ以上の特定用途向け集積回路(ASIC)を、本明細書に記述されるシステムと手続きのうちの1つ以上を実行するように、プログラムすることができる。
【0024】
図2は、本発明の実施形態による、6ステージ統合型ハードウェアパイプラインを説明するブロック図である。ここで、ブロック101、ブロック103、ブロック105、ブロック107、ブロック109、ブロック111、及びブロック113は、パイプラインのレジスタステージである。ブロック102は、浮動小数点から固定小数点への変換器である。ブロック112は、固定小数点から浮動小数点への変換器である。一例においては、ブロック112は、EXP関数を実装するためのオペコード(つまり、構成(configuration)命令、マイクロコードなど)に応じてバイパス回路となるように構成されてもよい。他の例においては、ブロック102は、LOG関数を実装するための他のオペコード(つまり、構成命令、マイクロコードなど)に応じてバイパス回路となるように構成されてもよい。更に他の例においては、ブロック102とブロック112の両方は、RCPあるいはSQRT関数を実装するに際し、更に他のオペコード(つまり、構成命令、マイクロコードなど)に応じてバイパス回路となるように構成されてもよい。幾つかの例においては、ブロック104、106、108、及び110は、個別のデータルックアップテーブルに基づいて、RCP、SQRT、EXP、LOGなどの数学的関数を計算するための二次近似の様々な部分を実装しても良い。例えば、ブロック104は、浮動小数点数xの仮数に対応する整数iに基づいて、cについてのデータテーブルのルックアップを実装する。同様に、ブロック106は、bについてのデータテーブルのルックアップを実装する。同一のパイプラインステージの間に、ブロック106は、また、c(x-x0)を計算する。同様に、ブロック108は、aについてのデータテーブルのルックアップを実装し、b(x-x0)とc(x-x0)(x-x1)の計算も実装する。ブロック110は、二次近似を計算するために、3個の項の合算を実装する。上記記述は、上記詳細には限定されず、上記記述により自明となったような様々な改変あるいは変更がなされてもよい。
【0025】
図3は、本発明の実施形態による、3ステージのRCPハードウェアパイプラインを説明するブロック図である。ここで、ブロック201、ブロック203、ブロック205、および、ブロック207は、パイプラインのレジスタステージである。いくつかの例においては、ブロック202、204、および、206は、二次近似の様々な部分を実装しても良い。例えば、ブロック202は、浮動小数点数の仮数のMSBに対応する整数iに基づいて、bとcについてのデータテーブルのルックアップを実装する。同一のパイプラインステージの間に、ブロック202は、また、(x-x0)(x-x1)を計算する。同様に、ブロック204は、aについてのデータテーブルのルックアップを実装し、b(x-x0)とc(x-x0)(x-x1)の計算も実装する。いくつかの実装においては、(x1-x)は、NOT(x-x0)として計算されてもよく、ここで、NOTは、1を0に、0を1に変更する、ビットごとの演算である。ブロック206は、二次近似を計算するために、3個の項の合算を実装する。上記記述は、上記詳細には限定されず、上記記述によって自明となったような様々な改変あるいは変更がなされてもよい。
【0026】
図4は、本発明の実施形態による、様々なデータルックアップテーブルを計算する例示的アルゴリズムを説明するフローチャート図である。ここで、例示的アルゴリズムは、SQRT用のデータテーブルa、b及びcを計算するために説明されている。この例においては、table[0][i]=a、table[1][i]=b、および、table[2][i]=c である。3つの一次方程式が、3つの値a、b、および、cを計算するために用いられる。これらの3つの方程式は、まずセグメント(301)の開始点(つまり、x)、中間点(つまり、x.sub.――5)及び終点(つまり、x1)を計算することにより、解かれる。ブロック302及び303は、浮動小数点形式でa、b、および、cを計算する。ブロック304は、a、b、および、cを整数形式に変換する。ブロック305は、丸めを行い、最終的な値を生成する。他の例として、ブロック302における「sqrt」関数は、本アルゴリズムをRCP用のデータテーブルa、b、および、cを計算することに転用するために、逆関数によって置換されてもよい。他の例においては、ブロック302における「sqrt」関数は、本アルゴリズムを他の関数(例えば、EXP、LOGなど)用のデータテーブルa、b、および、cを計算することに転用するために、これらの他の関数(EXP、LOGなど)によって置換されてもよい。上記記述は、上記詳細には限定されず、上記記述によって自明となったような様々な改変あるいは変更がなされてもよい。
図4のフローチャートは、64個のエントリのテーブルを実装するのに適しているだろう。128個のエントリなどの他の個数のエントリも用いることができる。
【0027】
上記方法は、例えばモバイル・グラフィックチップにおけるバーテックスシェーダやピクセルシェーダに対して、一つの統合型ハードウェアパイプラインを用いて浮動小数点値で上記の超越関数のリストを計算するための統一的方法を、提供する。この技法は、F(x)=1/x、F(x)=1/x^(1/2)、F(x)=2^x、および、F(x)=LOG2(x) の計算に基づいていてもよい。
【0028】
これらの関数は、以下の関数、すなわち、F(x) = a + b(x-x0) + c(x-x0)(x-x1)(以下、「補間関数」)を実行する、統合型ハードウェアパイプによって、実装される。近似は、64個、128個あるいは、ある他の個数のセグメントで行うことができ、ここで、x0はセグメントの開始値であり、x1はセグメントの終了値である。x0は、xの上位ビット(MSB、most significant bits)部分であり、(x-x0)は、xの下位ビット(LSB、least significant bits)部分である。xの値は、x0とx1の間である(x0 <= x < x1)。値a、b及びcは、例えばハードウェアに埋め込まれたテーブルなどの、3つの個別のテーブルからのものである。
【0029】
EXPに対しては、浮動小数点から固定小数点への数の変換ステージが、統合型ハードウェアパイプの前段に配置される。LOGに対しては、統合型ハードウェアパイプの後段に、固定小数点から浮動小数点への数の変換がある。ハードウェアの流れと機能は、各関数について選択されるテーブルが異なるほかは、4つの関数のそれぞれについて同一である。入力オペコードが関数を選択する。このアプローチに基づいた、低レイテンシの効率的RCP(逆数)の実装は、3サイクルにまで減少され得る。
【0030】
図5を参照すると、Sin(πx)、Cos(πx)、LOG2(x)、および、DIV(つまり、y/x)の計算を高速化するために、ロジックデバイスが
図1と
図2のパイプラインに追加されてもよい。例えば、追加のロジックは、Sin(πx) = Sin(π*(IntX+ FracX)) = (-1)^IntX*Sin(π*FracX) という公式に基づいて実装されてもよい。ここで、IntXは入力浮動小数点引数xの整数部分であり、FracXは入力xの小数部分である。よって、直接Sin(πx)を近似するのではなくて、F(x) = Sin(π*FracX)/FracXに従って近似されてもよい。従って、
図5の改変されたパイプラインは、例えば浮動小数点から固定小数点への変換ロジック202から、FracXに等しい追加の出力(output2)を生成してもよい。パイプラインは、Sin(πx) = F(x)*output2を計算するように更に改変されてもよい。ここでF(x)は、例えばパイプラインステージ203-214による、関数Sin(π*FracX)/FracXの近似である。具体的には、F(x)は、例えば上記したパイプラインと方法による、入力引数としてのFracXの値に従って選択されたテーブルのエントリ間での補間の結果である。図示された実施形態では、F(x)とoutput2の乗算は、パイプラインのステージ216において実行されてもよい。Cos(πx)については、Cos(πx) = Sin(π(x+0.5))である。従って、Sin(πx)と同じロジックが、結果を得るために用いられてもよい。ある実施形態においては、Sin(πx)は、FracX <= 0.5fならば、F(x) = Sin(π*FracX)/FracX とoutput2 = FracX とを用いて計算される。ここで0.5f は、1/2に等しい浮動小数点値である。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はxの整数部分である。
【0031】
入力引数xが1.0に近いとき、Log2(x)は非常に小さい。直接LOG2(x)を近似するのではなく、F(x) = Log2(x - 1)/(x - 1)として近似してもよい。従って、LOG2について、output2は、x - 1に等しく設定されてもよい。従って、LOG2(x) = F(x)*output2であり、ここでoutput2は(x - 1)に等しく、F(x)は、本明細書に記載したようにハードウェアパイプライン内でテーブルと補間を用いて計算される、LOG2(x-1)/(x-1)の近似である。この改変が実行される対象のxの値は、用いられる浮動小数点表現に基づいて選択されるべきである。例えば、いくつかの実施形態においては、xが[0.75,1.5)の範囲内にあるとき、F(x) = LOG2(x-1)/(x-1) かつ output2 = (x-1)である。そうでない場合は、LOG2(x)に対しては、F(x) = LOG2(x) かつ output2 = 1.0fである。
【0032】
DIV(例えば、y/x)については、y/x = y*(1/x) = y*Rcp(x)という関係を用いると、1/xのアンダーフローの問題があるかもしれない。つまり、|x| > 2^126のとき、32ビットの浮動小数点表現では 1/x = 0 であるかもしれない。|x| > 2^126におけるアンダーフローは、最大の浮動小数点値が、2^127*1.11111111であり、かつ、「浮動小数点正規化数表現」において、最小値が、2^(-126)であるので、発生する。非正規化数を用いる場合、最小値は、2^(-149)となり得る。この場合、入力引数xおよびyの両方は、2^32によってスケーリングされてもよく、つまり、y/x = (y/2^32)/(x/2^32)である。従って、ハードウェアパイプラインにおいては、xがある範囲を超えている(例えば、2^64より大きい)場合にy/xの両方をスケールダウンするために、追加のパイプラインステージが用いられてもよい。この追加のステージは、本明細書に記述したようにテーブル値を選択して補間ステップを実行するためのパイプラインステップの前に、実行されてもよい。
【0033】
図6は、X
Y(本明細書中では、X^Yとも記載される)を計算する方法を説明する。X
Yを計算する際に、(1.1)が使用されうる。
【0034】
【0035】
2Tとy*Log2(x)の実装がより簡単であるため、この数式は特に有用である。しかし、高い精度が要求される場合(例えば、OpenCLで相対誤差が16-ULP(最後の桁の単位)の場合など)には、このアプローチには問題がある。
【0036】
Log2(x)が相対誤差ε(典型的には±2-24の範囲である)を有している場合、t = y * Log2(x) を計算すると、t’ = y *( Log2(x) (1+ε) = t + t*εが得られる。最終的な計算結果は、以下の値となる。
【0037】
【0038】
このため、相対誤差は、0.69314*t*εとなる。単精度計算では、2tを単精度範囲(single precision range)に保つために、tは(-126,127)の範囲でありうる。従って、0.69314*t*εは、88.029*εの範囲に入りうる。これは、相対誤差がεの88倍まで増大しうることを意味する。
【0039】
Log2()を実装するための従来のアプローチでは、ロジックは{M1,M2}の値を出力する。ここで、M1とM2は単精度を有する。その後、Log2(x)の最終値は、M1*M2の単精度でのコンピューティングにより計算され、その結果、相対誤差は±2-24となる。その後の計算で更なる誤差が出なかったとしても、最終的な相対誤差は、まだ88*2-24のオーダーとなるだろう。この誤差の値は、16.0ULPでの必要条件よりずいぶん大きい。
【0040】
従って、
図6に示すように、Log2(x)ステージ600は、M2値と共に、M1をM1HとM1Lの2つの浮動小数点値(flowing point value)として出力するようにプログラムされ得る。M1HとM1Lの値は、M1H+M1LがM1と少なくとも30ビットの精度で等しくなるような値である。例えば、M1Hは、M1の上位24ビットに相当する24ビットの精度の浮動小数点値であり得る。M1Lは、M1の下位6ビットに相当する6ビットの精度の浮動小数点値であり得る。M2は単精度値(すなわち、24ビット)のままであって良い。
【0041】
図6に示すように、M1H、M1L、およびM2の値は、2入力ドット積ステージ(two input dot product (Dp2))602に入力されうる。特に、Dp2関数はM2*M1H + M2*M1L = {KH, KL} を計算する。ここで、KHとKLの各々は浮動小数点値であり、KHはDp2ステージ602の24ビット精度での計算結果の上位値であり、KLはDp2ステージ602の24ビット精度での計算結果の下位値である。
【0042】
KHおよびKLの値は、Y’とともに、Dp2ステージ604に入力されうる。以下で概略を説明するように、Y’は入力引数Yについて、めったに発生しない問題となるケース(problematic corner cases)に対処するために修正されたバージョンである。他の実施形態では、Y’は単に入力引数Yと同じである。Dp2関数は、Y’*KH + Y’*KL = {TH, TL} を計算する。ここで、THおよびTLは2つの浮動小数点値(24ビット精度での上位値+24ビット精度での下位値)である。
【0043】
Dp2ステージ602と604は、図示された処理の両方のステージで使用されている同じハードウェアコンポーネントであっても良いことに注意されたい。いくつかの実施形態では、Dp2関数は4入力ドット積ロジック(Dp4)の一部として実装される。
【0044】
従来の Dp2 (x1*y1 + x2*y2) のハードウェア実装では、Fma(fused multiply add、すなわち a*b+c)とほぼ同じロジックが使用されている。Fmaでは、いくつかのビット相殺ケース(bit cancellation cases)を処理するために、増大するビットの全てを保持する必要があるので、中間結果は少なくとも48ビットの精度を有する。しかし、従来のDp2は24ビットの仮数(単精度浮動小数点)に丸めて、1つの浮動小数点値を出力する。このため、Dp2ステージ602、604は、これらのステージが2つの浮動小数点値を出力する(すなわち、Dp2内部での丸め処理前は全体で48ビットの精度となる)ように追加のロジックを含んでも良い。
【0045】
TH値およびTL値は、入力引数Tとして、改良された精度の入力(すなわち、48ビットの精度:TH、TL)を受け付ける2Tを実装しているトランセンデンタルステージ(transcendental stage)606に入力されても良い。
【0046】
図示されている引数では、THとTLは、トランセンデンタルステージ606に入力される前に修正されている。例えば、浮動小数点から固定小数点への変換ロジック(float-to-Fix logic)608は、THを整数部分(TH_Int)と小数部分(TH_Frac)に分離するようにプログラムされる。TLは小数部分のみを有しているだろう。その結果、プロセスは、T_ALL_Fracを得るためにTH_FracとTLを合計する処理を含んでも良い。その後、TH_IntとT_ALL_Fracが、2^(TH_Int + T_All_Frac) を計算するトランセンデンタルステージ606に入力される。トランセンデンタルステージ606は2^Tを計算するための既知の任意のアプローチを用いて、この値を計算しうる。
【0047】
図7を参照すると、いくつかの実施形態では、テーブルを使用してLog2()ステージ600が実装される。例えば、
図2~
図5について説明した上記のアプローチが用いられる。いくつかの実装では、Log2(x)の計算のための2つのテーブルがあり、1つのテーブルは0.75≦x<1.5のときに使用され、他方はxが前述の範囲にない場合に使用される。高度な精度が要求されるため、0.75≦x<1.5のときに使用されるテーブルを含むいくつかの実施形態では、使用されるテーブルが大きくなる。このような実施形態では、Log2()関数は、(1.2)を実装する超越関数700に置き換えられても良い。
TranscedentalForLog(X) = {n, M1H, M1L, M2} (1.2)
【0048】
n、M1H、M1L、および、M2の値は以下に記載するように超越関数700によって計算されても良い。
【0049】
正のXは、(1.3)の浮動小数点形式で記述できる。
x = 2k*(1+ s) (1.3)
ここで、kは整数であり、0≦s<1.0である。
【0050】
(1.4)の場合、(1.5)と書き表せる。
p = s ≧ 0.5 ? (1 + s)/2 : (1+s) (1.4)
x = 2n * p(ここで 0.75≦p<1.5) (1.5)
すると、nは(1.6)に従って決定される。
n = s ≧ 0.5 ? k + 1: k (1.6)
【0051】
ここでは、M2 = 1 - p、かつ、 {M1H, M1L} = (Log2(1-p))/(1-p) と計算されても良い。本実施形態では、Log2()は、0.75≦x<1.5用のテーブルを用いて実装されうる。
【0052】
Log2(x)の値は(1.7)に従って計算される。
【0053】
Log2(x) = n*1.0 + M1H*M2 + M1L*M2 (1.7)
(1.7)は3入力ドット積関数702(Dp3、x1*y1 + x2*y2 + x3*y3)で処理されうる。いくつかの実施例では、同じ論理回路構造を用いてDp2とDp3の両方が実装され、場合によってはDp4と同じ物理回路を用いて実装される。
【0054】
上記のアプローチを用いると、(1.2)が1つの対数テーブルのみを使用するので、チップ上の領域を節約できる。(1.3)から(1.5)で通常の浮動小数点表記を用いることで、このような利点が得られた。しかしながら、(1.4)から(1.6)は非常に簡単に計算できる。(1.2)が4つの浮動小数点値を出力することに注意されたい。このため、ベクタ4GPUを用いて簡単に実装できる。
【0055】
OpenCL(open computing language standard)では、(1.8)のような、いくつかの問題となるケースがある。
(-3)3 = -27、(-3)2 = 9、(-3)0.33333333 = Nan (1.8)
【0056】
正確に(1.1)に従った場合、Log2(-3)=Nanであるので、エラーが発生する。従って、このような問題となるケースに対処するために、入力引数XおよびYの前処理が必要となり得る。特に、
図6に示したように、前処理ステージ610が、対応した値X’、Y’、および、Signを得るために関数Preprocess(X, Y) = {X’, Y’, Sign}に従って、入力引数XおよびYを処理しうる。
【0057】
上述したように、XとYの値は600~608のステージに従って処理されても良い。
図6に示すように、ステージ606の出力は、X
Yの最終の見積もり値を得るためにSignと掛け算されても良い。関数Preprocess(X, Y)は以下の表1に従って動作しうる。
【0058】
【0059】
OpenCLでのpow(x,y)=x
yの計算のために、最初から最後までに以下のプロセスが含まれ得る。
(1)X’、Y’、Signを得るためにXおよびYを前処理ステージ610に従って処理すること。
(2)その後、X’がLog2()ステージ600に従って処理される。前述のように、Log2()関数は、テーブルを用いて実装され得るし、M1H、M1L、および、M2を出力しうる。これらの値は、
図6に示すように、KHとKLを得るために、Dp2ステージ602を用いて掛け算される。または、KHとKLはX’から
図7に示すアプローチを用いて前述のように求められても良い。
(3)Dp2ステージ604は、Y’*KH + Y’*KL = {TH, TL} を計算するために使用される。ここで、THは演算の上位24ビットであり、TLは演算の下位24ビットである。
(4)THとTLは、改良された精度の入力{T_H,T_L}を受け付けるトランセンデンタルステージ606に従って処理される。上述のように、浮動小数点から固定小数点への変換ステージ608は、THを整数部分(TH_Int)と小数部分(TH_Frac)に分ける。その後、TH_Fracは、T_All_Fracを得るために、TLに加算される。その後、TH_IntとTH_Fracは、トランセンデンタルステージ606に入力される。トランセンデンタルステージ606は、2^(TH_Int + TH_Frac)の見積もり値を出力する。
(5)トランセンデンタルステージ606の出力は、Sign値と掛け算されて、X^Yの見積もり値である最終結果が得られる。
【0060】
本発明の上記実施形態は、例示と説明として提供されている。これらは、本発明を、記述されたとおりの形態に限定することを意図したものではない。特に、本明細書に記述された発明の機能的実装は、ハードウェア、ソフトウェア、ファームウェア、および/または、他の利用可能な機能的なコンポーネントもしくは基本構成要素で、等価に実装され得るということ、そして、ネットワークは、有線、無線、あるいは、有線と無線の組み合わせであってよいこと、が考えられる。他の変形、および、実施形態が、上記教示の下に可能であり、従って、発明の範囲は、この詳細な説明によって限定されず、むしろ、以下の請求項によって限定されることを意図している。
【0061】
本発明は、その精神あるいは本質的特性から外れることなく、他の特定の形態で実施され得る。記述された実施形態は、全ての点で、例示的であるのみであり、限定的ではない、と考えられるべきである。従って、本発明の範囲は、上記記述によってではなく、添付の請求項によって示される。請求項の均等物の意味と範囲の内にある全ての変更は、請求項の範囲内に含まれるべきである。