(58)【調査した分野】(Int.Cl.,DB名)
前記少なくとも1つのプロセッサにより、前記上位中間値または前記下位中間値の1つに第3オペランドを加算することに少なくとも部分的に基づいて上位値および下位値を決定することは、
前記中間値の符号が前記第3オペランドの符号と同じであることに応答して、および前記中間値の指数が前記第3オペランドの指数よりも、指定されたしきい値を上回るだけ大きいことに応答して、
前記少なくとも1つのプロセッサにより、前記上位値を前記上位中間値に設定することと、
前記少なくとも1つのプロセッサにより、前記下位中間値と前記第3オペランドの合計を最も近い奇数に丸め込むことにより前記下位値を決定することと
を備える、請求項1の方法。
前記少なくとも1つのプロセッサにより、前記上位中間値または前記下位中間値の1つに第3オペランドを加算することに少なくとも部分的に基づいて上位値および下位値を決定することは、
前記中間値の符号が前記第3オペランドの符号と同じであることに応答して、および前記中間値の指数が前記第3オペランドの指数よりも、指定されたしきい値未満だけ大きいかあるいは前記中間値の前記指数が前記第3オペランドの前記指数以下であることに応答して、
前記少なくとも1つのプロセッサにより、前記上位中間値と前記第3オペランドの合計を最も近い偶数に丸め込むことにより前記上位値を決定することと、
前記少なくとも1つのプロセッサにより、前記下位値を0.0に設定することと
を備える、請求項1の方法。
前記少なくとも1つのプロセッサにより、前記上位中間値または前記下位中間値の1つに第3オペランドを加算することに少なくとも部分的に基づいて上位値および下位値を決定する前記手段は、
前記中間値の符号が前記第3オペランドの符号と同じであることに応答して、および前記中間値の指数が前記第3オペランドの指数よりも、指定されたしきい値を上回るだけ大きいことに応答して、
前記上位値を前記上位中間値に設定することと、
前記下位中間値と前記第3オペランドの合計を最も近い奇数に丸め込むことにより前記下位値を決定することと
を行う手段を備える、請求項21の装置。
前記少なくとも1つのプロセッサにより、前記上位中間値または前記下位中間値の1つに前記第3オペランドを加算することに少なくとも部分的に基づいて上位値および下位値を決定する前記手段は、
前記中間値の符号が前記第3オペランドの符号と同じであることに応答して、および前記中間値の指数が前記第3オペランドの指数よりも、指定されたしきい値未満だけ大きいかあるいは前記中間値の前記指数が前記第3オペランドの前記指数以下であることに応答して、
前記上位中間値と前記第3オペランドの合計を最も近い偶数に丸め込むことにより前記上位値を決定することと、
前記下位値を0.0に設定することと
を行う手段を備える、請求項21の装置。
【発明を実施するための形態】
【0011】
[0016]一般に、この開示は、第1および第2のオペランドの中間積を第3のオペランドと加算するための特化された加算器の必要性なく、既存の乗算および加算ハードウエアを用いてFMA演算が実行されることができるように支援命令を介して融合された乗算−加算(FMA)演算をエミュレートするための技法を記載する。第1および第2のオペランドの中間積は第1オペランドまたは第2オペランド単独のいずれかよりもより多くのビットを含むことができるので、中間積と第3オペランドを加算するために特化された加算器ハードウエアを用いる代わりに、通常の加算器ハードウエアを介して第3オペランドが上位部分または下位部分に加算されることができるように、プロセッサは中間積を上位部分および下位部分に分割することができ、上位部分と下位部分は、エミュレートされた融合された乗算−加算結果を提供するために結合されることができる。
【0012】
[0017]中央処理装置(CPU)、グラフィック処理装置(GPU)等のようなプロセッサは浮動小数点値を演算するFMA演算を実行することができる。
図1は例示浮動小数点フォーマットを図示する概念図である。
図1に示されるように、値-82.3125を有する浮動小数点数50は32ビットのIEEE754−2008浮動小数点フォーマットで表されることができる。そのような32ビット浮動小数点フォーマットは単精度フォーマットと考えることができ、一方64ビット浮動小数点フォーマットは倍精度フォーマットと考えることができ、16ビット浮動小数点フォーマットは半精度フォーマットと考えることができる。浮動小数点数50のような単精度IEEE754−2008浮動小数点フォーマット(すなわち、32−ビット浮動小数点数)はサインビット52、指数54および仮数56を含むことができる。サインビット52は32ビット数のサインビット52であり得、指数54は32ビット数の8ビット数を含むことができ、および仮数56は、32ビット数の23ビットを含むことができる。
【0013】
[0018]一例として、浮動小数点数50の符号が負である場合符号ビット52は1であり得、浮動小数点数50の符号が正である場合0であり得、他の例として逆も同様である。バイアスされていない指数は指数54の値から127を減算することにより指数54の値から計算されることができるように指数54は127のバイアスを有することができる。仮数56はその整数ビットを隠れさせることができる。例えば、浮動小数点値-82.3125は-1.0100100101
2*2
6と等しくなるなり得る。この例において、サインビット52は1に設定されることができる。指数54は10000101
2であり得、それは指数54において127のバイアスにより133であり(すなわち6+127)、1.0100100101
2の整数ビット1は隠されることが出来るので、仮数56は01001001010000000000000
2であり得る。このようにして、仮数56は、仮数56が浮動小数点数50の23ビットを取ることができるとしても24ビット値を表すことができる。
【0014】
[0019]プロセッサはまた浮動小数点計算の間にガードビット(guard bit)57、ラウンドビット(round bit)58、およびスティッキービット(sticky bit)59を追跡することができる。ガードビット57、ラウンドビット58およびスティッキービット59は、仮数56の正規化および丸め込みの期間に仮数56をシフトしながらポピュレート(populate)されることができる。たとえば、仮数56の値が110011なら、110011の右方向のシフトは011001の値を生じることができ、ガードビット57はシフトされた最も右側のビットを記憶するために1に設定されることができる。011001の次の右方向のシフトは001100の値を生じることができ、ガードビット57の1は今度はラウンドビット58に記憶されることができ、ガードビット57は、シフトされた最も右側のビットを記憶するために1に設定されることができる。001100の次の右方向のシフトは000110の値を生じることができ、ラウンドビット58に記憶された1はスティッキービット59に記憶されるようにシフトされることができ、ガードビット57に記憶された1はラウンドビット58に記憶されるようにシフトされることができ、ガードビット57はシフトされた最右ビットを記憶するように0に設定されることができる。000110の次の右方向のシフトは000011の値を生じることができる。この場合一度スティッキービットが1にセットされると、それはラウンドビット58の値に関係なく1のままであり得る。それゆえ、スティッキービット59に記憶された1はスティッキービット59に留め置かれ、ラウンドビット58に記憶された1はドロップされることができ、ガードビット57に記憶された0はラウンドビット58に記憶されるようにシフトされることができ、ガードビット57はシフトされた最右ビットを記憶するために0に設定されることができる。以上のように、1は最初にガードビット57に、次にラウンドビット58に、そして次にスティッキービット59にシフトされることができる。一度1がスティッキービット59にシフトされると1はさらなるシフトに無関係にスティッキービット59に留まることができ、一方ラウンドビット58に記憶されたビットは他の右方向のシフトで単にドロップオフ(drop off)することができる。代替的に、スティッキービット59はラウンドビット58の右にシフトされたビットのすべてにOR演算を実行した結果であり得る。
【0015】
[0020]浮動小数点数50は例えば、IEEE754−2008で規定された丸め込みモードの1つを用いて、多数の方法で丸め込みされることができる。浮動小数点数50を丸め込むことは仮数56を指定されたビット数に丸め込むことを含むことができる。プロセッサは仮数56を右方向へシフトすることができ、そのシフトを補償するために指数54の値を調整することができる。最も近い偶数へ丸め込む丸め込みモード(round-to-nearest-even rounding mode)において、ある数は最も近い値に丸め込まれる。その数が、2つの等価な最も近い値の間の中ほどに収まる場合、最も近い偶数へ丸め込む丸め込みモードにおいて偶数の最下位ビットを有する最も近い値に丸め込まれる。
【0016】
[0021]指定されたビット数だけゼロ方向へ浮動小数点数50を丸め込むことは、ガードビット57、ラウンドビット58およびスティッキービット59をドロップすることにより浮動小数点数50を切り捨てることができる。さらに、浮動小数点数50が加算の中間結果である場合、2つのオペランドの24ビット仮数の加算は、ガードビット57、ラウンドビット58、およびスティッキービット59に加えて25ビットの仮数を生じることができる。この場合、中間結果は正規化されなければならないであろう。これを遂行するために、プロセッサは、1ビットだけ右方向に浮動小数点数50の仮数56をシフトすることができ、また、1だけ浮動小数点数50の指数54をインクリメントすることができる。同様に、浮動小数点数50が減算の中間結果である場合、2つのオペランドの仮数の24ビットの減算は、オペランドの最上位ビットの1つまたは複数がゼロである、仮数の24ビットを生じることができる。この場合、中間結果は仮数の最上位ビットが1になるまで左にシフトされることにより正規化されることができ、指数は対応的にシフトの大きさだけデクリメントされることができる。
【0017】
[0022]浮動小数点数50のような浮動小数点数を最も近い偶数へ丸め込む結果は、それぞれガードビット、ラウンドビット、およびスティッキービット57−59の値に少なくとも部分的に基づくことができる。丸め込みは正規化の後に行われることに留意する必要がある。最も近い偶数への丸め込み(round-to-nearest-even)(RTE)の場合、ガードビットが1であり、ラウンドビットおよび/またはスティッキービットが1の場合、1が24ビット仮数に加算される。さらに、24ビット仮数の最下位ビットが1の場合、ガードビットがセットされラウンドビットおよびスティッキービットがゼロなら1が仮数のLSBに加算される。奇数への丸め込み(round-to-odd)(RTO)の場合、ガードビット、ラウンドビット、スティッキービットのいずれか1つまたは複数が1の場合、1が、24ビット仮数の最下位ビットへ「OR」される(ORed)。
【0018】
[0023]上述したように、FMA演算は3つの浮動小数点オペランドのセットに演算することができる。表1は、例示FMA演算のステップを示す。オペランドop0=0x76744000
16, op1=0x2721A200
16、およびop2=0x2088E3EF
16, プロセッサはFMA(op1, op2, op3)=RTE((op1*op2)+op3)を決定することができる。
[0024]
【0020】
[0025]上記表1に示されるように、プロセッサはop0をop1と乗算することができる。値pを生じるためにop0とop1を乗算することに応答して、プロセッサは、1だけ指数をインクリメントすることにより値nを生じるために、結果として生じる値pを正規化することができる。次に、プロセッサはop2をnに加算することができる。2つの浮動小数点値を加算するために、プロセッサは、それらの指数が同じになるように2つの浮動小数点値の小さい方を右シフトすることができる。値nは61のバイアスされていない指数を有するので、プロセッサは、値nのバイアスされていない指数と一致する61のバイアスされていない指数を有する値tを生じるために−62のバイアスされていない指数を有するop2を123だけ右方向にシフトすることができる。op2をシフトすることに応答して、プロセッサは値nとtを加算し、加算値を正規化し、nとtの加算値を最も近い偶数に丸め込み24ビット仮数からなる32ビット結果に丸め込み、0x5E1A36D1
16のFMA結果を生じる。
【0021】
[0026]
図1に示されるように、浮動小数点数50のような単精度IEEE754−2008浮動小数点値は23ビット仮数56を含むことができる。上述したように、仮数56はその整数ビットを隠すことができるので、23ビット仮数56は実際には、24ビット仮数値を表すことができる。ガードビット、ラウンドビットおよびスティッキービットに対処するために、ガードビット、ラウンドビットおよびスティッキービットの2つのセットおよび2つの24ビット仮数値を加算することを含む、2つの単精度(すなわち、32ビット)浮動小数点値を加算するために27ビット加算器が利用されることができる。
【0022】
[0027]プロセッサは、FMA演算を行うために第3のオペランドに加算される中間値を生成するために第1のオペランドと第2のオペランドを一緒に乗算するので、2つの24ビット仮数値を乗算することを含む、第1のオペランドと第2のオペランドを乗算することは、48ビット仮数値を備えた中間値を生成することができる。48ビット仮数値に対処するために、プロセッサは、48ビット中間値と第3オペランドの24ビット仮数とを加算するために51ビット加算器を含むことを必要とされるかもしれない。
【0023】
[0028]27ビット加算器の代わりにプロセッサに51ビット加算器を組み込むことの潜在的な不利益は、プロセッサに関するより多くのスペースおよび電力要件を含むことができる。さらに、そのような大きなビット数を介して合計値を桁上げ(carrying)することによりクリティカルパスの問題が起こる可能性がある。51ビット加算を行うために、余分な加算器を必要とすることなくFMA演算の結果を近似するための1つのアプローチは、融合されない乗算−加算演算であり得る。上述したように、融合されない乗算−加算演算は、op0とop1の24ビット仮数の積である48ビット中間値を24ビットに丸め込んでバックダウン(back down)し、24ビット中間値をop2と加算し、その後にその合計値の結果を丸め込むことができる。
【0024】
[0029]いくつかの例において、プロセッサは、FMA演算の代わりに融合されていない乗算−加算演算を実行することが可能であるハードウエアを含むことができる。そのようなハードウエアは融合されていない乗算−加算演算を実行するためにデジタル回路、ハードウエア乗算器、加算器、ハードウエアロジック、等を含むことができる。いくつかの例において、ハードウエアはハードウエアパイプラインを備えることができる。融合されていない乗算−加算演算において、第1および第2のオペランドの中間積は、中間積が第3のオペランドと加算される前に丸め込まれるので、融合されていない乗算−加算演算を実行するためのハードウエアは、大きな浮動小数点値を加算するための特殊な加算器を含まなくてもよい。たとえば、表1に示される例において、プロセッサはop0およびop1を乗算することから得られる48ビット仮数を、op3がその積に加算される前に24ビットに丸め込まれることができる。
【0025】
[0030]しかしながら、融合されない乗算−加算演算は、FMA演算の結果と異なる不正確な結果をときどき提供する可能性がある。表1に示される例において、代わりに、プロセッサがop1、op2、およびop3の融合されない乗算−加算結果を計算する場合、その結果は、代わりに0x5E1A36D0
16になることができ、それは、0x5E1A36D1
16のFMA演算の結果と異なる。たとえば、融合されない乗算−加算において、正規化された値pの結果である値nの仮数は24ビット仮数値0x9A36D0hに丸め込むこまれることができるので、合計値n+tの仮数は0x9A36D0800000
hの代わりに0x9A36D0
hであることができる。したがって、仮数0x9A36D0800000
hを正規化した結果としてガードビット、ラウンドビットおよびスティッキービットは1、0、0になり得るけれども、この値は、融合されない乗算−加算における乗算の直後に0x9A36D0に丸め込まれ、ガードビットは失われる。ガードビット、ラウンドビット、およびスティッキービットは融合されない乗算−加算の加算ステージの期間に001になり得る。従って、001のガードビット、ラウンドビット、およびスティッキービット値を有する仮数0x9A36D0
hを最も近い偶数に丸め込んだ結果は、0x9A36D0hであり得、それは0x5E1A36D0
16の融合されない乗算−加算結果を生じる。
【0026】
[0031]本開示の態様に従って、プロセッサは、融合されない乗算−加算演算よりも精度の良いFMA演算をエミュレートするために融合されない乗算−加算演算を計算するために使用されるのと同じ既存のハードウエアを使用することができる。FMA演算をエミュレートするために既存の加算器ハードウエアを利用することにより、プロセッサは、単一精度浮動小数点数に関するFMA演算を行うためにさらなる51ビット加算器を提供する必要はないかもしれない。少なくとも1つのプロセッサは、第1のオペランドと第2のオペランドの乗算に少なくとも部分的に基づいて中間値を決定し、上位中間値または下位中間値の少なくとも1つを決定し、ここにおいて上位中間値を決定することは指定されたビット数だけ中間値をゼロ方向へ丸め込むことを備え、下位中間値を決定することは上位中間値
だけ下位中間値を減算することを備え、上位中間値または下位中間値の1つに第3オペランドの適切なビットを加算/減算することに少なくとも部分的に基づいて上位値および下位値を決定し、および上位値および下位値を加算することにより第1オペランド、第2オペランドおよび第3オペランドに関するエミュレートされた融合された乗算−加算結果を決定するように構成されることができる。プロセッサが第3オペランドを加算するか減算するかは、中間積および第3オペランドの符号が同じか異なるかに少なくとも部分的に依存することができる。
【0027】
[0032]上述したように、単精度浮動小数点値の場合、第1のオペランドと第2のオペランドの2つの24ビット仮数の積は48ビットの中間値を生成することができ、中間値の48ビット仮数と第3オペランドの24ビット仮数を加算することによりFMA演算を行うために51ビット加算器が必要となるかもしれない。代わりに、さらなる51ビット加算器なしにFMA演算をエミュレートするために、プロセッサは中間値の仮数をビットの上位部分およびビットの下位部分に分割することができる。例えば、中間値の48ビット仮数の場合、プロセッサは中間値の48ビット仮数を、48ビット仮数の上位24ビット[47−24]を含むビットの上位部分と、48ビット仮数の下位24ビット[23−0]を含むビットの下位部分に均等に分割することができる。
【0028】
[0033]プロセッサは、上位中間値と下位中間値の少なくとも1つを決定するように構成されることができ、上位中間値の仮数は48ビット仮数の上位24ビットを備え、下位中間値は48ビット仮数の下位24ビットを備える。プロセッサは、第3オペランドを上位中間値と下位中間値の1つに加算することに少なくとも部分的に基づいて上位中間値と下位中間値を決定することができ、さらに、上位値を下位値を加算することにより第1オペランド、第2オペランドおよび第3オペランドに関するエミュレートされた融合された乗算−加算結果を決定することができる。
【0029】
[0034]
図2はFMA演算をエミュレートするための例示プロセスを図示するブロック図である。具体的には、プロセッサは、オペランド60、62、および64に関するFMA演算をエミュレートすることができ、ここでは、演算RTE((オペランド60*オペランド62)+オペランド64)がエミュレートされる。
図2に示されるように、オペランド60、62および64は、各々が
図1に示される浮動小数点数50に類似する32ビット単精度浮動小数点値であり得、オペランド60、62、および64はそれぞれ仮数66、68、および70を含むことができる。
【0030】
[0035]プロセッサは、中間値72を生成するためにオペランド60および62を乗算することができ、それもまた浮動小数点値であり得る。上述したように、オペランド60と62は単精度浮動小数点値であり得、仮数66および68は各々24ビット(23ビット仮数プラス隠れ整数ビット)であり得、オペランド60および62を乗算することは、仮数66および68を乗算することを含み、中間値72に48ビット仮数を結果として生じる。プロセッサは中間値72の仮数を正規化することができ、中間値72の正規化された仮数を上位部分74と下位部分76に概念的に分割することができる。中間値72の正規化された仮数を分割することは、上位部分74が仮数の上位24ビットを含み、下位部分76が仮数の下位24ビットを含むように、2つの同じ大きさの半分に、正規化された仮数を分割することを含む。
【0031】
[0036]プロセッサは、中間値72の仮数のビットの半分となるように中間値72をゼロに丸め込む(すなわち、24ビットになるように48ビット仮数をゼロに丸め込む)ことにより上位中間値78を決定することができる。プロセッサはまた、上位中間値78により中間値72を減算することにより下位中間値80を決定することができる。したがって、上位中間値78は上位部分74をその仮数として含むことができ、下位中間値80は下位部分76をその仮数として含むことができる。中間値72は上位中間値78と下位中間値80に分割されたので、下位中間値80の指数値は、上位中間値78の指数値に比べて24だけ小さくなることができる。さらに、いくつかの例において、下位中間値の指数値は単精度浮動小数点フォーマットに関する指数値の有効レンジを超えてもよい。
【0032】
[0037]プロセッサは、下位値88を生成するためにまたは結果として生じる上位値86を生成するために、オペランド64と中間値72の指数間の差異に少なくとも部分的に基づいて、プロセッサがオペランド64を上位中間値78または下位中間値に加算するか否かを決定することができる。浮動小数点演算において、2つの浮動小数点値が同じ指数を有する場合には、2つの浮動小数点値のどちらか一方をシフトせずに2つの浮動小数点値が一緒に加算されることができる。したがって、異なる指数を有する2つの浮動小数点値を加算することは、2つの浮動小数点値が同じ指数を有するように浮動小数点値の一方の仮数をシフトし、その結果生じる仮数を加算することを含むことができる。このため、プロセッサは、オペランド64の仮数が上位中間値78または下位中間値80の指数と一致するようにオペランド64の仮数および/または中間値72の仮数の必要とされるシフト量に少なくとも部分的に基づいて上位中間値78または下位中間値80にオペランド64を加算するかどうかを決定することができる。
【0033】
[0038]いくつかの例において、プロセッサが上位値86を生じるために上位中間値78にオペランド64を加算する場合、プロセッサは下位値88を0.0に設定することができる。いくつかの他の例において、下位値88を生じるためにプロセッサが下位中間値80にオペランド64を加算する場合、プロセッサは上位中間値78の値に上位値86を設定することができる。
【0034】
[0039]上位値86と下位値88を生成することに応答して、プロセッサは、上位値86を下位値88に加算することができる。プロセッサは、オペランド62、64、および66に対するエミュレートされたFMA演算の結果として生じる値90を生成するために上位値86と下位値88の合計を正規化し、下位値88と上位値86の正規化された合計を最も近い偶数方向へ丸め込むことができる。
【0035】
[0040]上述したように、プロセッサは、結果として生じる上位値86または下位値88を生成するために上位中間値78または下位中間値80にオペランド64を加算するかどうかを、オペランド64と中間値72の指数間の差異に少なくとも部分的に基づいて決定することができる。
図3は、中間値72の指数とオペランド64の指数間の差分が2より大きい場合で、かつ中間値72とオペランド64の符号が同じである場合の状況を例示するブロック図である。言い換えれば、オペランド64の指数が中間値72の指数に等しくなるように、オペランド64の仮数70は3ビット以上右シフトし、それに応じてオペランド64の指数が3以上インクリメントされることができるようにオペランド64の指数は、3以上中間値72の指数よりも小さい。代替的に、
図3に示される状況は、オペランド64の符号なしの値が4で除算された中間値72未満である場合として表されることができる。
【0036】
[0041]
図3に示されるように、中間値72の指数とオペランド64の指数との間の差分が2より大きいオペランド64の例は、シナリオ92、94、96、98および100を含むことができる。シナリオ92において、中間値72の指数とオペランド64の指数は48より大きいので、プロセッサは、49ビット以上仮数70を右方向にシフトしてオペランド64の指数を49以上インクリメントすることができ、それによりオペランド64の指数は中間値72の指数と同じ値になる。
【0037】
[0042]シナリオ94において、中間値72の指数とオペランド64の指数は正確に48であり、それによりプロセッサは、仮数70を正確に48ビット右方向にシフトしてオペランド64の指数を正確に48だけインクリメントすることができ、それによりオペランド64の指数は中間値72の指数と同じ値になる。シナリオ96において、中間値72の指数とオペランド64の指数は24より大きく48より小さいので、プロセッサは仮数70を25ビット以上48ビット未満だけ右方向にシフトしてオペランド64の指数を25ビット以上48ビット未満だけインクリメントすることができ、それによりオペランド64の指数は中間値72の指数と同じ値になる。
【0038】
[0043]シナリオ98において、中間値72の指数とオペランド64の指数は正確に24であるので、プロセッサは、仮数70を正確に24ビットだけ右方向にシフトしてオペランド64の指数を正確に24ビットだけインクリメントすることができるので、オペランド64の指数は中間値72の指数と同じ値である。シナリオ100において、中間値の72の指数とオペランド64の指数は2より大きく24未満であるので、プロセッサは、仮数70を3ビット以上右方向にシフトし、オペランド64の指数を3以上で24未満だけインクリメントすることができ、それによりオペランド64の指数は中間値72の指数と同じ値である。
【0039】
[0044]
図3に示されるシナリオ92、94、96、98および100の各々において、融合された乗算−加算演算をエミュレートするために、プロセッサは、中間値72とオペランド64の符号が同じであるかどうかを決定することができる。代替的に、プロセッサは、中間値72とオペランド64の符号が同じであるかどうかを決定することができる。中間値72とオペランド64の符号が同じであると決定することに応答して、かつ中間値72の指数とオペランド64の指数の間の差分が2より大きいかまたはオペランド64の値が4で除算した中間値72未満であると決定したことに応答して、プロセッサは上位値86を上位中間値78に設定することができる。プロセッサはまた、オペランド64を下位中間値80に加算し、オペランド64と中間値80の合計を正規化し、オペランド64と下位中間値80の正規化された合計を最も近い奇数に丸め込み下位値88を生成することができる。プロセッサは上位値86と下位値88を加算し、上位値と下位値88の合計を正規化し、上位値86と下位値88の正規化された合計を最も近い偶数に丸め込みエミュレートされた融合された乗算−加算結果90を生成することができる。
【0040】
[0045]同様に、プロセッサは、融合された乗算−減算演算をエミュレートすることができる。融合された乗算―減算演算は中間値72とオペランド64の符号が異なる融合された乗算−加算であり得る。シナリオ92、94、96、98および100において、プロセッサは、中間値72とオペランド64の符号が異なるかどうかを決定することができる。中間値72とオペランド64の符号が異なると決定したことに応答して、プロセッサは上位値86を上位中間値78に設定することができる。プロセッサはまた下位中間値80からオペランド64を減算し、下位中間値80とオペランド64の差分を正規化し、下位中間値80とオペランド64の正規化された差分を奇数に丸め込み下位値88を生成することができる。プロセッサは上位値86から下位値88を減算し、上位値86と下位値88の差分を正規化し、上位値86と下位値88の正規化された合計を最も近い偶数に丸め込みエミュレートされた融合された乗算−減算結果90を生成することができる。
【0041】
[0046]
図4は、中間値72の指数とオペランド64の指数との差分が2以下であるか、あるいはオペランド64の指数が中間値72の指数以上である場合に、中間値72とオペランド64の符号が同じである状況を例示するブロック図である。言い換えれば、オペランド64の指数が2以下だけ中間値72の指数よりも小さく、あるいはオペランド64の指数が中間値72の指数よりも大きい。オペランド64の指数が中間値72の指数に等しくなるように、オペランド64の仮数70は2回以下右にシフトされることができ、それに応じてオペランド64の指数は、2を超えない値だけインクリメントされることができる。代替的に、
図4に示される状況はオペランド64の符号なしの値が4で除算された中間値72以上である場合として表されることができる。
【0042】
[0047]
図4に示されるように、中間値72の指数とオペランド64の指数との差分が2以下である場合のオペランド64の例はシナリオ102、104、106、108、110、112、114、および116を含むことができる。シナリオ102において、中間値72の指数とオペランド64の指数は正確に2であるので、プロセッサは、オペランド64の指数は中間値72の指数と同じ値になるようにオペランド64の指数を正確に2だけインクリメントするために仮数70を2ビットだけ右方向にシフトすることができる。
【0043】
[0048]シナリオ104において、オペランド64の指数は中間値72の指数と同じ値であるように、オペランド64の指数を正確に1だけインクリメントするためにプロセッサが仮数70を1ビットだけ右方向にシフトすることができるように中間値72の指数とオペランド64の指数は正確に1である。
【0044】
[0049]シナリオ106において、プロセッサが仮数70をシフトする必要がないように中間値72の指数はオペランド64の指数と同じである。シナリオ108において、オペランド64の指数が中間値72の指数と同じ値であるように中間値72の指数を正確に1だけインクリメントするためにプロセッサが中間値72の仮数を正確に1ビットだけ右方向にシフトすることができるように、オペランド64の指数は中間値72の指数よりも正確に1だけ大きい。シナリオ110において、オペランド64の指数が中間値72の指数と同じ値であるように、中間値72の指数を正確に2だけインクリメントするために中間値72の仮数を正確に2ビットだけ右方向にシフトすることができるようにオペランド64の指数は中間値72の指数よりも正確に2だけ大きい。
【0045】
[0050]シナリオ112において、オペランド64の指数が中間値72の指数と同じ値であるように中間値72の指数を3以上24未満だけインクリメントするためにプロセッサが中間値72の仮数を3ビット以上24ビット未満だけ右方向にシフトすることができるようにオペランド64の指数は中間値72の指数よりも大きい。シナリオ114において、オペランド64の指数が中間値72の指数と同じ値であるように中間値72の指数を正確に24だけインクリメントするためにプロセッサが中間値72の仮数を正確に24ビットだけ右方向にシフトすることができるように、オペランド64の指数は中間値72の指数よりも正確に24だけ大きい。
【0046】
[0051]シナリオ116において、オペランド64の指数が中間値72の指数と同じ値であるように中間値72の指数を25以上インクリメントするために中間値72の仮数を25ビット以上右方向にシフトすることができるようにオペランド64の指数は中間値72の指数よりも25以上大きい。
【0047】
[0052]
図4に示されるシナリオ102、104、106、108、110、112、114および116の各々において、融合された乗算−加算演算をエミュレートするために、プロセッサは、中間値72の符号とオペランド64の符号が同じであるかどうかを決定することができる。プロセッサはまた、オペランド64の指数が、中間値72の指数よりも2を超えないだけ小さいか、等しいか、または大きいかを決定することができる。中間値72の符号とオペランド64の符号が同じであることに応答してさらにオペランド64の指数が中間値72の指数よりも2未満だけ小さいか、等しいか、または大きいかに応答してプロセッサは下位値88を0.0に設定することができる。
図4に示されるシナリオ102、104、106、108、110、112、114、および116に関してオペランド64と中間値72が同じ符号を有する場合、プロセッサは、オペランド64と中間値72の指数に関わらず下位値88を0.0に設定することができる。プロセッサはまた上位値86を生成するためにオペランド64を上位中間値78に加算し、オペランド64と上位中間値78の合計を正規化し、オペランド64と上位中間値78の正規化された合計を最も近い偶数に丸め込むことができる。この例において、プロセッサの乗算ステージは、それぞれガードビット73、ラウンドビット75およびスティッキービット77を形成するために、上位部74および下位部76のMSB、第2MSB、並びに残りのビットのORを送信する。プロセッサは、上位値86および下位値88を加算し、上位値86および下位値88の合計を正規化し、および上位値86と下位値88の正規化された合計を最も近い偶数に丸め込み、エミュレートされた融合された乗算−加算結果90を生成することができる。
【0048】
[0053]同様に、
図4に示されるシナリオ102、104、106、108、110、112、114および116において、プロセッサは、融合された乗算−減算演算をエミュレートすることができる。上述したように、融合された乗算-減算演算は、中間値72の符号とオペランド64の符号が異なる融合された乗算−加算であり得る。シナリオ102、110、112、114、および116において、プロセッサは下位値88を0.0に設定することができる。シナリオ104、106、および108において、GPUは下位値88を下位部76の下位22ビット(すなわち、[21:0])に設定することができる。
【0049】
[0054]シナリオ102、104、106に関して、プロセッサは上位値86を生成するためにオペランド64と上位中間値78を加算し、上位中間値78とオペランド64の合計を正規化し、上位中間値78とオペランド64の正規化された合計を最も近い偶数に丸め込むことができる。上述したように、上位値86を生成するために丸め込むことは、乗算ステージから生じるガードビット、ラウンドビットおよびスティッキービットに少なくとも部分的に基づくことができる。プロセッサはエミュレートされた融合された乗算−換算結果90を生成するために上位値86および下位値88を加算し、上位値86と下位値88の合計を正規化し、上位値86と下位値88の正規化された合計を最も近い偶数に丸め込むことができる。
【0050】
[0055]シナリオ108、110、112、114および116に関してオペランド64の符号と中間値72の符号が異なるとき、上位値86を生成するためにプロセッサは下位中間値80からのガードビット、ラウンドビットおよびスティッキービットを有する−上位中間値78をオペランド64と合計し、オペランド64と上位中間値78の合計を正規化し、オペランド64と上位中間78の正規化された合計を最も近い偶数に丸め込むことができる。プロセッサはエミュレートされた融合された乗算−加算結果90を生成するために上位値86と下位値88を加算し、上位値86と下位値88の合計を正規化し、上位値86と下位値88の正規化された合計を最も近い偶数に丸め込むことができる。
【0051】
[0056]
図4に示されるシナリオ102、104、106、108、110、112、114および116の各々において、上位値86を生成するためにオペランド64と上位中間値78の正規化された合計または差分を最も近い偶数に丸め込むことの結果が、オペランド60および62の積の正規化からの1つまたは複数のガードビット73、ラウンドビット75およびスティッキービット77の値の1つまたは複数に少なくとも部分的に基づくことができるように、プロセッサは、中間値72を生成するためにオペランド60および62の積を正規化することからガードビット73、ラウンドビット75およびスティッキービット77を保存することができる。たとえば、シナリオ102、104、106において、上位値86を生成するためにオペランド64と上位中間値78の正規化された合計または差分を最も近い偶数に丸め込むことは、上位中間値78に関してそれぞれガードビット、ラウンドビットおよびスティッキービットとして動作するオペランド60および62の積の正規化からのガードビット73、ラウンドビット75およびスティッキービット77に基づくことができる。
【0052】
[0057]シナリオ108において、オペランド60および62の積の正規化からのガードビット73の値はラウンドビットであり得、およびオペランド60および62の積を正規化することからのスティッキービット77とオペランド60および62の積を正規化することからのラウンドビット75のOR演算からの結果は、スティッキービットとして動作することができる。73のLSBがガードビットになる。プロセッサは、これらのガードビット、ラウンドビットおよびスティッキービットに基づいて上位値86を生成するためにオペランド64と上位中間値78の正規化された合計または差分を最も近い偶数に丸め込むことができる。
【0053】
[0058]シナリオ110、112、114、および116において、オペランド60および62の積を正規化することからのスティッキービット77とオペランド60および62の積を正規化することからのラウンドビット75と、オペランド60および62の積を正規化することからのガードビット73とのOR演算の結果はスティッキービットとして作用する。プロセッサは、ガードビット、ラウンドビットおよびスティッキービットに基づいて上位値86を生成するためにオペランド64と上位中間値78の正規化された合計を最も近い偶数に丸め込むことができる。
【0054】
[0059]表2はエミュレートされた融合された乗算−加算およびエミュレートされた融合された乗算―減算の両方に関するシナリオ92−116を要約する。
【0056】
[0061]表2に示されるように、リストされたシナリオは、
図3および
図4に示されるシナリオ92−116に対応する。上位値は、上位値86を表すことができ下位値は下位値88を表すことができる。”uh”は上位中間値78を表し、”ul”は下位中間値80を表し、”c”はオペランド64を表すことができる。ADD列は融合された乗算−加算に関する上位値86および/または下位値88の値を表すことができ、SUB列は融合された乗算-減算に関する上位値86および/または下位値88の値を表すことができる。”{“シンボルは1または複数ビットの連結(concatenation)を表すことができ”|”シンボルは1または複数ビットの論理ORを表すことができる。”g”, “r”、および”s”は、下位部76の最上位ビットから来る中間値72を正規化することから結果として生じる、それぞれガードビット73、ラウンドビット75およびスティッキービット77を表すことができる。
【0057】
[0062]シナリオ96の場合、ul-cが負の値を生じる場合、プロセッサの乗算器は結果として生じた負の値を正規化することができないので、プロセッサは、2の補数の形態で結果として生じた負の値を表すことができる。シナリオ104および106の場合、(uh{ul(grs)}-cは非常に小さいので結果として生じる値は非正規数として表すことができる。例えば、結果として生じる値は丸め込みのステップの後で−126になる−127の指数値を有することができる。
【0058】
[0063]シナリオ110、112、114、および116の場合、uhは2以上のビット数右にシフトされることができる。シフトされた値のビット1はラウンドビット75として作用する。シフトされた値のビット0は(g|r|s)の結果とORされスティッキービット77を形成することができる。従って、シナリオ110、112、114および116において、uh(g|r|s)は、スティッキービット77を形成するためにガードビット73、ラウンドビット75およびスティッキービット77を、uhのLSBとORした結果をORすることを表すことができる。
【0059】
[0064]
図5はこの開示の1つまたは複数の態様をインプリメントするように構成されることができる例示コンピューティングデバイスを図示するブロック図である。
図5に示されるように、コンピューティングデバイス202は、これに限定されないがビデオデバイス、メディアプレイヤ、セットトップボックス、モバイル電話のようなワイヤレスハンドセットおよびいわゆるスマートフォン、パーソナルデジタルアシスタンツ(PDAs)、デスクトップコンピュータ、ラップトップコンピュータ、ゲームコンソール、ビデオカンファレンスユニット、タブレットコンピューティングデバイス、等を含むコンピューティングデイバスであり得る。
図5の例において、コンピューティングデバイス202は、中央処理装置(CPU)206、システムメモリ210、およびGPU212を含むことができる。コンピューティングデバイス202はまた、ディスプレイプロセッサ214、トランシーバモジュール203、ユーザインタフェース204およびディスプレイ208を含むことができる。トランシーバモジュール203およびディスプレイプロセッサ214は両方ともCPU206および/またはGPU212と同じ集積回路(IC)の一部であり得、CPU206および/またはGPU212を含むICまたは複数のIC群の外部にあってもよいし、あるいはCPU206および/またはGPU212を含むICの外部にあるIC内に形成されることができる。
【0060】
[0065]コンピューティングデバイス202は明瞭さのために
図5に示されないさらなるモジュールまたはユニットを含んでいてもよい。例えば、コンピューティングデバイス202は、コンピューティングデバイス202がモバイルワイヤレス電話である例において電話通信を行うために、
図5にはいずれも示されていないスピーカおよびマイクロフォンを含むことができ、あるいは、コンピューティングデバイス202がメディアプレイヤであるスピーカを含むことができる。コンピューティングデバイス202はまたビデオカメラを含むことができる。さらに、コンピューティングデバイス内に示される種々のモジュールおよびユニットはコンピューティングデバイス202のすべての例において必要ではないかもしれない。例えば、ユーザインタフェース204およびディスプレイ208は、コンピューティングデバイス202が、外部ユーザインタフェースまたはディスプレイとインタフェースするために備えられた他のデバイスまたはデスクトップコンピュータである例においてはコンピューティングデバイス202の外部にあってよい。
【0061】
[0066]ユーザインタフェース204の例は、これらに限定されないが、トラックボール、マウス、キーボード、および他のタイプの入力デバイスを含む。ユーザインタフェース204はまたタッチスクリーンであり得、ディスプレイ208の一部として組み込まれてもよい。トランシーバモジュール203は、コンピューティングデバイス202と他のデバイスまたはネットワークとの間の無線または有線通信を可能にするための回路網を含むことができる。
【0062】
[0067]プロセッサ206は、実行のためのコンピュータプログラムの命令群を処理するように構成された中央処理装置(CPU)のようなマイクロプロセッサであることができる。プロセッサ206はコンピューティングデバイス202の動作を制御する汎用または特殊用途のプロセッサを含むことができる。ユーザはプロセッサ206に1つまたは複数のソフトウエアアプリケーションを実行させるためにコンピューティングデバイス202に入力を提供することができる。プロセッサ206上で実行するソフトウエアプリケーションは、例えば、オペレーティングシステム、ワードプロセッサアプリケーション、eメールアプリケーション、スプレッドシートアプリケーション、メディアプレイヤアプリケーション、ビデオゲームアプリケーション、グラフィカルユーザインタフェースアプリケーションまたは他のプログラムを含むことができる。さらに、プロセッサ206はGPU212の動作を制御するためのGPUドライバ222を実行することができる。ユーザは、ユーザ入力インタフェース204を介してコンピューティングデバイス202に結合されたキーボード、マウス、マイクロフォン、タッチパッドまたは他の入力デバイスのような1つまたは複数の入力デバイス(図示せず)を介してコンピューティングデバイス202に入力を提供することができる。プロセッサ206はFMA演算をエミュレートするためにここに開示された技術のいずれかを実行するように構成されることができる。
【0063】
[0068]プロセッサ206上で実行するソフトウエアアプリケーションはプロセッサ206に、ディスプレイ208にグラフィックデータのレンダリングをさせるように命令する1つまたは複数のグラフィックレンダリング命令を含むことができる。いくつかの例において、ソフトウエア命令は、例えば、Open Graphics Library (OpenGL(登録商標))API、Open Graphics Library Embedded Systems (OpenGL ES) API、Direct3D API、X3D API、RenderMan API、WebGL API、またはその他の公のまたは独占所有権のある標準グラフィックAPIのようなグラフィックアプリケーションプログラミングインタフェース(API)に準拠することができる。他の例において、ソフトウエア命令は、Open Computing Language(Open CL) APIのような他のAPIsに準拠することができる。グラフィックレンダリング命令を処理するために、プロセッサ206は、GPU212にグラフィックデータのレンダリングの一部またはすべてを実行させるためにGPU212(例えばGPUドライバ222を介して)1つまたは複数のグラフィックレンダリングコマンドを発行することができる。いくつかの例において、レンダリングされるグラフィックデータは、たとえば、点、線、三角形、四角形、三角形片(triangle strips)等のグラフィックプリミティブ(graphic primitives)のリストを含むことができる。典型的に、arcsin、arctan、power等のような関数に関するコンパイラにより数学関数ライブラリが提供されることができる。これらの関数は有理多項式を用いてインプリメントされることができる。そのようなライブラリ関数に関するFMA命令を用いることは潜在的により高次の精度および実行スピードを提供することができる。
【0064】
[0069]GPU212はディスプレイ208に1つまたは複数のグラフィックプリミティブをレンダリングするためのグラフィック演算を実行するように構成されることができる。したがって、プロセッサ206上で実行中のソフトウエアアプリケーションの1つがグラフィック処理を必要とするとき、プロセッサ206はディスプレイ208にレンダリングするためのグラフィックコマンドとデータをGPU212に提供することができる。グラフィックデータは、例えば、描画コマンド、状態情報、プリミティブ情報、テクスチャ情報等を含むことができる。いくつかの例において、GPU212は、プロセッサ206よりも複雑なグラフィック関連の演算のより効率的な処理を提供する高度並列構造で構築されることができる。例えば、GPU212は、複数の頂点(vertices)またはピクセル上で並列に演算するように構成されたシェーダーユニット(shader units)のような複数の処理エレメントを含むことができる。GPU212の高度に並列化した性質は、いくつかのインスタンスにおいて、GPU212が、プロセッサ206を用いてディスプレイ208に直接シーンを描画するよりもより速くディスプレイ208上にグラフィック画像(例えば、GUIsおよび2次元(2D)および/または3次元(3D)グラフィックシーン)を描画することを可能にする。
【0065】
[0070]GPU212は、いくつかのインスタンスにおいて、コンピューティングデバイス202のマザーボードに集積されることができる。他のインスタンスにおいて、GPU212はコンピューティングデバイス202のマザーボード内の1つのポートにインストールされるグラフィックカード上に存在されてもよいし、あるいはさもなければコンピューティングデバイス202と同時に使用される(interoperate with)ように構成された周辺装置内に内蔵されてもよい。GPU212は1つまたは複数のマイクロプロセッサ、特定用途集積回路(ASICs)、フィールドプログラマブルゲートアレイ(FPGAs)、デジタルシグナルプロセッサ(DSPs)、または他の等価な集積またはディスクリートロジック回路のような1つまたは複数のプロセッサを含むことができる。GPU212はまた、1つまたは複数のプロセッサコアを含むことができるので、GPU212はマルチコアプロセッサと呼ばれることができる。GPU212はFMA演算をエミュレートするためにここに開示された技術のいずれかを実行するように構成されることができる。
【0066】
[0071]GPU212は、グラフィックメモリ240に直接結合されることができる。したがって、GPU212はバスを用いずにグラフィックメモリ240に対してデータをリードおよびライトすることができる。言い換えれば、GPU212はオフチップメモリ(off-chip memory)の代わりにローカルストレージを用いてローカルにデータを処理することができる。そのようなグラフィックメモリ240はオンチップメモリ(on-chip memory)と呼ばれることができる。これは、GPU212が、重度のバストラフィックを経験する可能性がある、バスを介したデータをGPU212がリードおよびライトする必要性を無くすことにより、より効率的な方法で動作することを可能にする。しかしながら、いくつかのインスタンスにおいて、GPU212は別個のメモリを含むことはできないが、その代わりに、バスを介してシステムメモリ210を利用することができる。グラフィックメモリ240は、たとえば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、消去可能プログラマブルROM(EPROM)、電気的に消去可能なプログラマブルROM(EEPROM(登録商標))、フラッシュメモリ、磁気データ媒体または光学ストレージ媒体のような1つまたは複数の揮発性または不揮発性メモリまたはストレージデバイスを含むことができる。
【0067】
[0072]いくつかの例において、GPU212はシステムメモリ210に完全に形成された画像を記憶することができる。ディスプレイプロセッサ214はシステムメモリ210から画像を検索してディスプレイ208のピクセルに画像を表示するために発光させる値を出力する。ディスプレイ208はGPU212により発生された画像コンテンツを表示するコンピューティングデバイス202のディスプレイ。ディスプレイ208は液晶ディスプレイ(LCD)、有機発行ダイオードディスプレイ(OLED)、陰極線管(CRT)ディスプレイ、プラズマディスプレイ、または他のタイプのディスプレイデバイスであり得る。
【0068】
[0073]GPU212は乗算−加算ユニット224を含むことができ、それは非融合乗算−加算演算を行うように構成されたデジタル回路であり得る。乗算−加算ユニット224は、非融合乗算−加算演算を行うのに必要な浮動小数点算術論理演算を行うためのデジタル回路、ハードウエア乗算器、加算器、ハードウエアロジック、およびその他の類似物を含むことができる。GPU212はFMA演算をエミュレートするために乗算−加算ユニット224を利用することができる。GPU212はまたFMA演算をエミュレートするために乗算−加算ユニット224を支援するために浮動小数点数の丸め込み、シフト、および正規化を行うためのハードウエアのようなさらなるハードウエアを含むことができる。いくつかの例において、プロセッサ206はまた、ここに開示された技術に従ってFMA演算をエミュレートするように構成されることができるさらなるハードウエアおよび乗算−加算ユニット224を含むことができる。
【0069】
[0074]いくつかの例において、少なくとも乗算−加算ユニット224を使用するプロセッサ204またはGPU212は、第1オペランド、第2オペランドおよび第3オペランドに関するFMA演算をエミュレートするように構成されることができる。FMA演算をエミュレートするために、プロセッサ206またはGPU212は、第1オペランドを第2オペランドと乗算することに少なくとも部分的に基づいて中間値を決定し、上位中間値または下位中間値の少なくとも1つを決定し、ここにおいて、上位中間値を決定することは特定のビット数だけ中間値をゼロ方向へ丸め込むことを備え、下位中間値を決定することは上位中間値
だけ中間値を減算することを備え、上位中間値により中間値を減算することを備え、上位中間値または下位中間値の1つに第3オペランドを加算することに少なくとも部分的に基づいて上位中間値と下位中間値を決定し、および上位値および下位値を加算することにより第1オペランド、第2オペランドおよび第3オペランドに関するエミュレートされた融合された乗算−加算結果を決定することができる。
【0070】
[0075]
図6はFMA演算をエミュレートするための例示処理を示すフローチャートである。
図6に示されるように、プロセスは、第1オペランドを第2オペランドと乗算することに少なくとも部分的に基づいて中間値を、プロセッサ206またはGPU212により決定することを含むことができる(602)。
【0071】
[0076]いくつかの例において、第1オペランド、第2オペランドおよび第3オペランドは、32ビット浮動小数点数、中間値の仮数は48ビットを備え、指定ビット数は24ビットを備える。
【0072】
[0077]プロセスはさらに、上位中間値または下位中間値の少なくとも1つをプロセッサ206またはGPU212により決定することを含むことができ、ここにおいて、上位中間値を決定することは指定ビット数だけ中間値をゼロ方向へ丸め込むことを備え、下位中間値を決定することは上位中間値
だけ中間値を減算することを備える(604)。いくつかの例において、上位中間値または下位中間値の少なくとも1つを決定することはさらに上位中間値を決定することを含み、中間値の指数が指定されたしきい値を超える値だけ第3オペランドの指数よりも大きいことに応答して下位中間値を決定することを備える。
【0073】
[0078]プロセスはさらに第3オペランドを上位中間値または下位中間値の1つに加算することに少なくとも部分的に基づいて上位中間値と下位中間値をプロセッサ206またはGPU212により決定することを含むことができる(606)。
【0074】
[0079]いくつかの例において、上位中間値または下位中間値の1つに第3オペランドを加算することに少なくとも部分的に基づいて上位中間値および下位中間値をプロセッサ206またはGPU212により決定することは、中間値の符号が第3オペランドの符号と同じであることに応答して、および中間値の指数が第3オペランドの指数よりも指定ビット数を超えて大きいことに応答して:プロセッサ206またはGPU212により、上位値を上位中間値に設定し、プロセッサ206またはGPU212により下位中間値と第3オペランドの合計を最も近い奇数に丸め込むことにより下位値を決定することを含むことができる。いつかの例において、指定されたしきい値は、指数差が1または0の時キャンセル(cancellation)が起こり得るので、2であることができる。
【0075】
[0080]いくつかの例において、第3オペランドを上位中間値または下位中間値に加算することに少なくとも部分的に基づいて上位中間値と下位中間値をプロセッサ206またはGPU212により決定することは、中間値の符号が第3オペランドの符号と同じであることに応答して、および中間値の指数が第3オペランドの指数よりも指定されたしきい値未満だけ大きいかあるいは、第3オペランドの指数以下であることに応答して、プロセッサ206またはGPU212により、上位中間値と第3オペランドの合計を最も近い偶数に丸め込むことにより上位値を決定し、およびプロセッサ206およびGPU212により下位値を0.0に設定することを含むことができる。いくつかの例において、指定されたしきい値は2であり得る。いくつかの例において、中間値を決定することはプロセッサ206またはGPU212により第1オペランドと第3オペランドの積を正規化することを含み、上位中間値と第3オペランドの合計を最も近い偶数に丸め込むことはプロセッサ206またはGPU212により、中間値を正規することから生じるガードビット、ラウンドビットおよびスティッキービットの1つまたは複数に少なくとも部分的に基づいて上位中間値および第3オペランドの合計を最も近い偶数に丸め込むことを含むことができる。
【0076】
[0081]いくつかの例において、第3オペランドを上位中間値または下位中間値の1つに加算することに少なくとも部分的に基づいて上位中間値と下位中間値を決定することは、積の符号が第3オペランドの符号と異なることに応答して、および中間値の指数が第3オペランドの指数よりも指定されたしきい値だけ大きいことに応答して:プロセッサ206またはGPU212により上位値を上位中間値に設定し、プロセッサ206またはGPU212により下位中間値と第3オペランドの合計を最も近い奇数に丸め込むことにより下位値を決定することを含むことができる。
【0077】
[0082]プロセスはさらに、プロセッサ206またはGPU212により、上位値および下位値を加算することにより第1オペランド、第2オペランド、および第3オペランドに関するエミュレートされた融合された乗算−加算結果を決定することを含むことができる(608)。
【0078】
[0083]いくつかの例において、第1オペランド、第2オペランドおよび第3オペランドに関するエミュレートされた融合された乗算−加算結果を決定することは、さらにプロセッサ206またはGPU212により、上位値と下位値の合計を正規化すること、およびプロセッサ206またはGPU212により上位値と下位値の正規化された合計を偶数に丸め込むことを含むことができる。
【0079】
[0084]本開示は、単精度浮動所数点数に関するFMA演算をエミュレートする技術を説明するけれども、ここに説明される技術は、半精度浮動小数点数、倍精度浮動小数点数、任意の他のサイズの浮動小数点数、ならびに任意の他の適用可能な浮動所数点フォーマットで表された浮動小数点数にも等しく適用可能であることが理解されるべきである。
【0080】
[0085]1つまたは複数の例において、記載された機能はハードウエア、ソフトウエア、ファームウエアまたはそれらのいずれかの組み合わせでインプリメントされることができる。ソフトウエアでインプリメントされる場合、機能はコンピュータ可読媒体上の1つまたは複数の命令またはコードとして記憶されあるいは送信されることができる。コンピュータ可読媒体は、1つの場所から他の場所へコンピュータプログラムの転送を容易にする任意の媒体を含むコンピュータデータ記憶媒体または通信媒体を含むことができる。データ記憶媒体は、この開示に記載された技術のインプリメンテーションに関する命令、コードおよび/またはデータ構造を検索するために1つまたは複数のコンピュータまたは1つまたは複数のプロセッサによりアクセスされることができる任意の利用可能な媒体であり得る。例として、これに限定されないが、そのようなコンピュータ可読媒体は、RAM、ROM、EEPROM、CD−ROMまたは他の光ディスクストレージ、磁気ディスクストレージまたは他の磁気ストレージデバイス、あるいはコンピュータによりアクセスされることができ、命令またはデータ構造の形態で所望のプログラムコードを搬送または記憶するために使用されることができる任意の他の媒体を備えることができる。また、いかなる接続もコンピュータ可読媒体と適切に称することができる。例えば、ソフトウエアが、ウエブサイト、サーバ、または同軸ケーブル、ファイバ光ケーブル、ツイストペア、デジタル加入者線(DSL)、または赤外線、無線、およびマイクロ波のような無線技術から送信される場合、同軸ケーブル、光ファイバケーブル、ツイストペア、DSL、または赤外線、無線およびマイクロ波のような無線技術は媒体の定義に含まれる。ここで使用されるディスク(disk)およびディスク(disc)はコンパクトディスク(CD)、レーザディスク(登録商標)、光学ディスク、デジタルバーサタイルディスク(DVD)、フロッピ(登録商標)ディスクおよびブルーレイディスクを含む。この場合、ディスク(disks)は通常データを磁気的に再生し、一方、ディスク(discs)はデータをレーザを用いて光学的に再生する。上述の組み合わせもコンピュータ可読媒体の範囲内に含まれるべきである。
【0081】
[0086]コードは、1つまたは複数のデジタルシグナルプロセッサ(DSPs)、汎用マイクロプロセッサ、特定用途集積回路(ASICs)、フィールドプログラマブルロジックアレイ(FPGAs)、または他の等価な集積またはディスクリートロジック回路網のような1つまたは複数のプロセッサにより実行されることができる。したがって、ここで使用される「プロセッサ」および「処理ユニット」という用語は上述した構造のいずれかまたはここに記載された技術のインプリメンテーションに適した他のいずれかの構造に言及することができる。さらに、いくつかの態様において、ここに記載された機能性は、符号化および復号するために構成されるか、あるいは結合されたコーデックに内蔵された、専用ハードウエアおよび/またはソフトウエアモジュール内に備えられることができる。
【0082】
[0087]本開示の技術は、ワイヤレスハンドセット、集積回路(IC)またはICsのセット(すなわち、チップセット)を含む多種多様のデバイスまたは装置内にインプリメントされることができる。種々のコンポーネント、モジュール、またはユニットは、開示された技術を実行するように構成されたデバイスの機能的観点を強調するために本開示において記載されているが、異なるハードウエアユニットによる実現を必ずしも必要としない。むしろ、上述したように、種々のユニットは、適切なソフトウエアおよび/またはファームウエアと一緒に、上述した1つまたは複数のプロセッサを含む相互動作するハードウエアユニットの集合により提供されるかまたはコーデックハードウエアユニット内に結合されることができる。
【0083】
[0088]種々の例について記載した。これらの例および他の例は、以下のクレームの範囲内にある。
以下に本願の出願当初の特許請求の範囲に記載された発明を付記する。
[C1]
第1オペランド、第2オペランドおよび第3オペランドに関する融合乗算−加算演算をエミュレートする方法において、
少なくとも1つのプロセッサにより、第1のオペランドを第2のオペランドと乗算することに少なくとも部分的に基づいて中間値を決定することと、
前記少なくとも1つのプロセッサにより、上位中間値または下位中間値の少なくとも1つを決定することと、ここにおいて、前記上位中間値を決定することは、指定されたビット数だけ前記中間値をゼロ方向へ丸め込むことを備え、前記下位中間値を決定することは、前記中間値を前記上位中間値により減算することを備える、
前記少なくとも1つのプロセッサにより、前記上位中間値または前記下位中間値の1つに第3オペランドを加算することに少なくとも部分的に基づいて上位値および下位値を決定することと、および
前記少なくとも1つのプロセッサにより、前記上位値および前記下位値を加算することにより前記第1オペランド、前記第2オペランドおよび前記第3オペランドに関するエミュレートされ融合された乗算−加算結果を決定することと、を備える方法。
[C2]
前記少なくとも1つのプロセッサにより前記上位中間値または前記下位中間値の1つに第3オペランドを加算することに少なくとも部分的に基づいて上位値および下位値を決定することは、
前記中間値の符号が前記第3オペランドの符号と同じであることに応答して、および前記中間値の指数が、指定されたしきい値を上回る値だけ前記第3オペランドの指数より大きいことに応答して、
前記少なくとも1つのプロセッサにより前記上位値を前記上位中間値に設定することと、および
前記少なくとも1つのプロセッサにより、前記下位中間値と前記第3オペランドの合計を最も近い奇数に丸め込むことにより前記下位値を決定することを備える、C1の方法。
[C3]
前記指定されたしきい値は2であるC2の方法。
[C4]
前記少なくとも1つのプロセッサにより、前記上位中間値または前記下位中間値の1つに第3オペランドを加算することに少なくとも部分的に基づいて上位値および下位値を決定することは、
前記中間値の符号が前記第3オペランドの符号と同じであることに応答して、および前記中間値の指数が前記第3オペランドの指数よりも指定されたしきい値未満だけ大きいかあるいは前記中間値の前記指数が前記第3オペランドの前記指数以下であることに応答して、
前記少なくとも1つのプロセッサにより、前記上位中間値と前記第3オペランドの合計を最も近くの偶数値に丸め込むことにより前記上位値を決定することと、
前記少なくとも1つのプロセッサにより前記下位値を0.0に設定することと、を備える、C1の方法。
[C5]
前記指定されたしきい値は2である、C4の方法。
[C6]
前記中間値を決定することは、前記少なくとも1つのプロセッサにより、前記第1オペランドと前記第2オペランドの積を正規化することと、および
前記上位中間値と前記第3オペランドの合計を最も近い偶数に丸め込むことは、前記中間値を正規化することから得られるスティッキービット(sticky bit)、ラウンドビット(round bit)、およびガードビット(guard bit)の1つまたは複数に少なくとも部分的に基づいて前記上位中間値と前記第3オペランドの前記合計を最も近い偶数に丸め込むことを備える、C4の方法。
[C7]
前記上位中間値または前記下位中間値の1つに第3オペランドを加算することに少なくとも部分的に基づいて前記上位値および前記下位値を決定することは、
前記積の符号が前記第3オペランドの符号と異なることに応答して、および前記中間値の指数が前記第3オペランドの指数よりも指定されたしきい値だけ大きいことに応答して、前記少なくとも1つのプロセッサにより前記中間値を前記上位中間値に設定することと、および
前記少なくとも1つのプロセッサにより、前記下位中間値と前記第3オペランドの合計を最も近い奇数に丸め込むことにより前記下位値を決定することと、を備えた、C1の方法。
[C8]
前記第1オペランド、前記第2オペランドおよび前記第3オペランドに関するエミュレートされ融合された乗算−加算結果を決定することは、
前記少なくとも1つのプロセッサにより、前記上位値と前記下位値の合計を正規化することと、および
前記少なくとも1つのプロセッサにより、前記上位値および前記下位値の正規化された合計を偶数に丸め込むことと、を備えた、C1の方法。
[C9]
前記第1オペランド、前記第2オペランド、および前記第3オペランドは32ビット浮動小数点数を備え、
前記中間値の仮数は48ビットを備え、および
前記指定されたビット数は24ビットを備える、C1の方法。
[C10]
上位中間値または下位中間値の少なくとも1つを決定することは、さらに、前記上位中間値を決定することと、および
前記中間値の指数が前記第3オペランドの指数よりも指定されたしきい値を上回るだけ大きいことに応答して前記下位中間値を決定することを備える、C1の方法。
[C11]
第1オペランド、第2オペランド、および第3オペランドに関する融合された乗算−加算演算をエミュレートするための装置において、
前記第1オペランド、前記第2オペランド、および前記第3オペランドを記憶するように構成されたメモリと、および
前記第1オペランドを前記第2オペランドと乗算することに少なくとも部分的に基づいて中間値を決定し、
上位中間値または下位中間値の少なくとも1つを決定し、ここにおいて、前記上位中間値を決定することは、指定されたビット数だけ前記中間値をゼロ方向へ丸めこむことを備え、前記下位中間値を決定することは、前記上位中間値だけ前記中間値を減算することを備える、
前記上位中間値または前記下位中間値の1つに前記第3オペランドを加算することに少なくとも部分的に基づいて上位値および下位値を決定し、
前記上位値と前記下位値を加算することにより前記第1オペランド、前記第2オペランドおよび前記第3オペランドに関するエミュレートされた融合された乗算−加算結果を決定する、ように構成された少なくとも1つのプロセッサと、を備えた装置。
[C12]
前記少なくとも1つのプロセッサは、
前記中間値の符号が前記第3オペランドの符号と同じであることに応答して、および前記中間値の指数が前記第3オペランドの指数よりも、指定されたしきい値を上回るだけ大きいことに応答して、
前記上位値を前記上位中間値に設定し、および
前記下位中間値と前記第3オペランドの合計を最も近い奇数に丸め込むことにより前記下位値を決定する、ようにさらに構成される、C11の装置。
[C13]
前記指定されたしきい値は2である、C11の装置。
[C14]
前記少なくとも1つのプロセッサは、さらに、
前記中間値の符号が前記第3オペランドの符号と同じであることに応答して、および前記中間値の指数が前記第3オペランドの指数よりも、指定されたしきい値未満だけ大きいことに応答して、または前記中間値の前記指数が前記第3オペランドの前記指数以下であることに応答して、
前記上位中間値と前記第3オペランドの合計を最も近い偶数に丸め込むことにより前記上位値を決定し、および
前記下位値を0.0に設定する、ように構成される、C11の装置。
[C15]
前記指定されたしきい値は2である、C14の装置。
[C16]
前記少なくとも1つのプロセッサはさらに、
前記第1オペランドおよび前記第2オペランドの積を正規化し、
前記中間値を正規化することから生じるガードビット、ラウンドビットおよびスティッキービットの1つまたは複数に少なくとも部分的に基づいて前記上位中間値および前記第3オペランドの合計を最も近い偶数に丸め込む、ように構成される、C14の装置。
[C17]
前記少なくとも1つのプロセッサはさらに、
前記積の符号が前記第3オペランドの符号と異なることに応答して、および前記中間値の指数が前記第3オペランドの指数よりも指定されたしきい値だけ大きいことに応答して、
前記上位値を前記上位中間値に設定し、および
前記下位中間値と前記第3オペランドの合計を最も近い奇数に丸め込むことにより前記下位値を決定する、ようにさらに構成される、C11の装置。
[C18]
前記少なくとも1つのプロセッサはさらに、
前記上位値と前記下位値の合計を正規化し、および
前記上位値と前記下位値の前記正規化された合計を偶数に丸め込む、ように構成される、C11の装置。
[C19]
前記第1オペランド、前記第2オペランド、および前記第3オペランドは32ビット浮動小数点数を備え、
前記中間値の仮数は48ビットを備え、および
前記指定されたビット数は24ビットを備える、C11の装置。
[C20]
前記少なくとも1つのプロセッサはさらに、
前記上位中間値を決定し、および
前記中間値の指数が前記第3オペランドの指数よりも、指定されたしきい値を上回るだけ大きいことに応答して、前記下位中間値を決定する、ようにさらに構成される、C11の装置。
[C21]
第1オペランド、第2オペランド、および第3オペランドに関する融合された乗算−加算演算をエミュレートするための装置において、
少なくとも1つのプロセッサにより、第1オペランドを第2オペランドと乗算することに少なくとも部分的に基づいて中間値を決定する手段と、
前記少なくとも1つのプロセッサにより、上位中間値または下位中間値の少なくとも1つを決定する手段と、ここにおいて、前記上位中間値を決定する手段は、指定ビット数だけ前記中間値をゼロ方向へ丸め込む手段を備え、前記下位中間値を決定する手段は、前記中間値を前記上位中間値により減算する手段を備える、
前記少なくとも1つのプロセッサにより、前記上位中間値または前記下位中間値の1つに第3オペランドを加算することに少なくとも部分的に基づいて上位値と下位値を決定する手段と、および
前記少なくとも1つのプロセッサにより前記上位値と前記下位値を加算することにより前記第1オペランド、前記第2オペランドおよび前記第3オペランドに関するエミュレートされた融合された乗算−加算結果を決定する手段と、を備えた装置。
[C22]
前記少なくとも1つのプロセッサにより、前記上位中間値または前記下位中間値の1つに第3オペランドを加算することに少なくとも部分的に基づいて上位値および下位値を決定する手段は、前記中間値の符号が前記第3オペランドの符号と同じであることに応答して、および前記中間値の指数が前記第3オペランドの指数よりも指定されたしきい値を上まわるだけ大きいことに応答して、
前記上位値を前記上位中間値に設定し、および
前記下位中間値と前記第3オペランドの合計を最も近い奇数に丸め込むことにより前記下位値を決定する手段を備える、C21の装置。
[C23]
前記少なくとも1つのプロセッサにより、前記上位中間値または前記下位中間値の1つに前記第3オペランドを加算することに少なくとも部分的に基づいて上位値および下位値を決定する前記手段は、
前記中間値の符号が前記第3オペランドの符号と同じであることに応答して、および前記中間値の指数が前記第3オペランドの指数よりも指定されたしきい値未満だけ大きいかあるいは前記中間値の前記指数が前記第3オペランドの前記指数以下であることに応答して、
前記上位中間値および前記第3オペランドの合計を最も近い偶数に丸め込むことにより前記上位値を決定し、および
前記下位値を0.0に設定する手段を備えた、C21の装置。
[C24]
前記上位中間値または前記下位中間値の1つに前記第3オペランドを加算することに少なくとも部分的に基づいて前記上位値および前記下位値を決定する手段は、
前記積の符号が前記第3オペランドの符号と異なることに応答して、および前記中間値の指数が前記第3オペランドの指数よりも指定されたしきい値だけ大きいことに応答して、
前記上位値を前記上位中間値に設定し、および前記下位中間値と前記第3オペランドの合計を最も近い奇数に丸め込むことにより前記下位値を決定する手段を備えた、C21の装置。
[C25]
前記第1オペランド、前記第2オペランドおよび前記第3オペランドに関するエミュレートされた融合された乗算−加算結果を決定する前記手段は、さらに、
前記上位値と前記下位値の合計を正規化する手段と、および
前記上位値と前記下位値の正規化された合計を偶数に丸め込む手段とを備えた、C21の装置。
[C26]
実行されると、1つまたは複数のプログラマブルプロセッサに、
第1オペランドを第2オペランドと乗算することに少なくとも部分的に基づいて中間値を決定させ、
上位中間値または下位中間値の少なくとも1つを決定させ、ここにおいて、前記上位中間値を決定することは指定されたビット数だけ前記中間値をゼロ方向へ丸め込むことを備え、前記下位中間値を決定することは、前記上位中間値により前記中間値を減算することを備える、
前記上位中間値または前記下位中間値の1つに第3オペランドを加算することに少なくとも部分的に基づいて上位値および下位値を決定させ、
前記上位値と前記下位値を加算することにより前記第1オペランド、前記第2オペランドおよび前記第3オペランドに関するエミュレートされた融合された乗算−加算結果を決定させる、命令を記憶するコンピュータ読取可能記憶媒体。
[C27]
前記上位中間値または前記下位中間値の1つに第3オペランドを加算することに少なくとも部分的に基づいて上位値と下位値を決定することは、
前記中間値の符号が前記第3オペランドの符号と同じであることに応答して、および前記中間値の指数が前記第3オペランドの指数よりも指定されたしきい値を上回るだけ大きいことに応答して、
前記上位値を前記上位中間値に設定すること、および
前記下位中間値および前記第3オペランドの合計を最も近い奇数に丸め込むことにより前記下位値を決定することを備える、C26のコンピュータ読み取り可能記憶媒体。
[C28]
前記上位中間値または前記下位中間値の1つに前記第3オペランドを加算することに少なくとも部分的に基づいて上位値と下位値を決定することは、
前記中間値の符号が前記第3オペランドの符号と同じであることに応答して、および前記中間値の指数が前記第3オペランドの指数よりも、指定されたしきい値未満だけ大きいかあるいは前記中間値の前記指数が前記第3オペランドの前記指数以下であることに応答して、
前記上位中間値と前記第3オペランドの合計を最も近い偶数に丸め込むことにより前記上位値を決定すること、および
前記下位値を0.0に決定することを備える、C26のコンピュータ読取可能記憶媒体。
[C29]
前記上位中間値または前記下位中間値の1つに第3オペランドを加算することに少なくとも部分的に基づいて前記上位値および前記下位値を決定することは、
前記積の符号が前記第3オペランドの符号と異なることに応答して、および前記中間値の指数が前記第3オペランドの指数よりも指定されたしきい値だけ大きいことに応答して、
前記上位値を前記上位中間値に設定することと、および
前記下位中間値および前記第3オペランドの合計を最も近い奇数に丸め込むことにより前記下位値を決定することと、を備える、C26のコンピュータ読取可能記憶媒体。
[C30]
前記第1オペランド、前記第2オペランド及び前記第3オペランドに関するエミュレートされた融合された乗算−加算結果を決定することは、さらに、
前記上位値及び前記下位値の合計を決定することと、および
前記上位値および前記下位値の前記正規化された合計を偶数に決定することと、を備える、C26のコンピュータ読取可能記憶媒体。
少なくとも1つのプロセッサは、第1オペランド、第2オペランド、および第3オペランドに関する融合された乗算−加算演算をエミュレートすることができる。少なくとも1つのプロセッサは、第1のオペランドを第2のオペランドと乗算することに少なくとも部分的に基づいて中間値を決定し、上位中間値または下位中間値の少なくとも1つを決定し、ここにおいて、前記上位中間値を決定することは、指定されたビット数だけ、前記中間値をゼロ方向へ丸め込むことを備え、前記下位値を決定することは前記上位中間値により前記中間値を減算することと、前記上位中間値または前記下位中間値の1つに前記第3オペランドを加算又は減算することに少なくとも部分的に基づいて上位値および下位値を決定することと、および前記上位値と前記下位値を加算することによりエミュレートされた融合された乗算−加算結果を決定することとを備える。