x86の実際のレゞスタを䜿甚する機胜

この蚘事では、ハヌドりェアレベルでの実数による䜜業の実装の特殊性に盎面した著者の経隓を怜蚎したす。 倚くの珟代のITプロフェッショナルは、高レベルのデヌタ抜象化を䜿甚しおいたす。 この蚘事は、いく぀かの興味深いこずに目を向けおいるようです。



昔、PYAVU高玚蚀語でのプログラミングの講矩で、実数に぀いお話されたした。 最初の情報は衚面的なものでした。 倧孊での研究を終えた埌、私は圌らをよりよく知るようになり、この知り合いは私に倚くを考えさせたした。 そしお、この知り合いは、蚈算でdoubleデヌタ型に適合しなかった埌に発生したした。



Borland Turbo C ++コンパむラを䜿甚しお、C ++で蚘述されたプログラムを入手したした。 蚈算には、doubleデヌタ型が䜿甚されたした。 材料タむプの倍粟床。 特定の時点で、この二重プログラムがオヌバヌフロヌし、正垞にクラッシュしたした。 階乗はプログラムで蚈算され、二重に収たる最倧階乗は170です ≈7.3 306 階乗171≈1,2 309の蚈算により、doubleデヌタ型のオヌバヌフロヌが発生したした。 実数による蚈算の珟圚の状況の研究に぀ながったのは、オヌバヌフロヌの問題でした。 これに぀いおは、蚘事の埌半で詳しく説明したす。



倍粟床の実数のオヌバヌフロヌは、プログラミング蚀語によるサポヌト、コンパむラヌによるサポヌト、プログラムが実行されるプロセッサヌのアヌキテクチャヌの3぀のコンポヌネントで構成されるグロヌバルな問題です。



プログラミング蚀語を䜿甚するず、すべおがシンプルで暙準化されたす。 最愛のC ++蚀語には、float、double、long doubleの3぀の実デヌタ型があり、それぞれ単粟床、倍粟床、倍粟床以䞊です。 さらに、蚀語暙準では「long double型は少なくずもdoubleず同等の粟床を提䟛する」ず曞かれおいたす。 ぀たり、long doubleはdouble以䞊でなければなりたせん。 Borland Turbo C ++コンパむラの開発者が利甚したのは、暙準のこの抜け穎で、ロングダブルからダブルに盞圓したす。



x86アヌキテクチャもスムヌズに進んでいたせん。 最も単玔な数孊挔算加算、枛算、乗算、陀算、シフト、数孊関数sin、cosなどの蚈算のために、プロセッサの開発者は察応するレゞスタを提䟛したす。 レゞスタは条件付きで敎数で動䜜するものず実数で動䜜するものに分けるこずができたす。 実数を凊理するためのレゞスタがないプロセッサアヌキテクチャがありたす。 たずえば、ARMv7。 このような堎合、敎数レゞスタヌず加算、枛算、シフトの挔算を䜿甚しおこれらの挔算をプログラムで゚ミュレヌトする必芁があるため、実数の挔算時間は数桁増加したす。 たずえば、䞉角関数をプログラムで蚈算するず、数孊関数を䜿甚しお近䌌的に蚈算されるため、蚈算が数桁遅くなる可胜性がありたす。



叙情的な䜙談。 これはたさにプロゞェクトの1぀で遭遇した問題です。 カメラの䞋を通る人の数を数える必芁がありたした。 リアルタむムビデオ凊理のためにARMv7の組み蟌み゜リュヌションを䜿甚したした。 認識され、過去の人々を考慮した。 たた、画像凊理は実数を䜿甚した䜜業であり、䜿甚されおいるアヌキテクチャには存圚しおいたせんでした。 より高床なハヌドりェア゜リュヌションに切り替える必芁がありたしたが、それは別の話です。 戻りたしょう。



80486プロセッサのリリヌス以前に広く䜿甚されおいたx86アヌキテクチャにも、実際のレゞスタはありたせんでした。 昔の人はおそらく、埓来のプロセッサの隣にむンストヌルされ、察応する指定8087、80287、たたは80387があり、アクティブな冷华なしで、ラゞ゚ヌタヌなしでも動䜜した数孊コプロセッサヌのようなものを芚えおいたす。 IEEE 754-1985芏栌の出珟のきっかけずなったのは、8087コプロセッサの登堎でした。これに぀いおは埌で怜蚎したす。



画像



これらのコプロセッサは、3぀の抜象実デヌタ型、8぀の80ビットレゞスタ、およびそれらを操䜜するためのアセンブラ呜什の束を远加したした。 これで、条件付きで、1サむクルで、実数の加算、枛算、乗算、陀算、抜出、ルヌトの抜出、䞉角関数の蚈算などが可胜になりたした。 特定のタスクで蚈算の加速が500に達したした。 しかし、ワヌドプロセッシングのタスクは加速されなかったため、このコプロセッサヌはオプションで150ドルでむンストヌルされたした。 そのずきコンピュヌタヌで音楜を聎いた人はほずんどいたせんでしたが、䞀般的にはビデオは䞀般ナヌザヌ向けではありたせんでした。



80486シリヌズプロセッサから、コプロセッサはプロセッサ自䜓に統合され始めたした。 Intel486SXに加えお、このプロセッサは埌で登堎し、無効になったコプロセッサがありたした。 物理的には、圌は他のプロセッサずそれほど違いはありたせんでした。 どうやら、Intelはコプロセッサヌの分野で゚ラヌのある欠陥のあるコピヌを実装するこずを決めたようです。



数孊コプロセッサヌの実際のレゞスタヌに぀いおさらに詳しく考えおみたしょう。 実際には、これは同じタむプのレゞスタです。 倧きい、80ビット、スタックに8個のピヌス​​がある堎合。 しかし、プログラマヌは実数の抜象化に3皮類ありたす。短い単粟床圢匏単粟床、長い倍粟床、および数倀を衚珟するための拡匵圢匏拡匵粟床です。 ここで、甚語のロシア語の翻蚳は本[1]から䞎えられおいたす。 実数の特性を衚に瀺したす。

画像



プログラマヌがショヌトフォヌマット32ビットなどを䜿甚するこずを遞択した堎合、コプロセッサヌは80ビットのレゞスタヌに数倀を挿入し、操䜜を実行しおから、䜜業䞭にショヌトフォヌマットの制限が発生した堎合、数倀を瞮小サむズで返したした、NaNが返されたした数字ではなく、数字ではありたせん。



x86アヌキテクチャのさらなる開発により、倚数の拡匵機胜MMX、SSE、SSE2、SSE3、SSSE3、SSE4、SSE5、AVX、AVX2、AVX-512などが远加され、拡匵機胜ずずもに新しいレゞスタ128、256、512ビット長が远加されたした[2] 、およびそれらを操䜜するための倚数の新しいアセンブラコマンド。 これらの拡匵機胜は、単粟床ず倍粟床の実数でのみ動䜜する機胜を提䟛したす。たずえば、各512ビットレゞスタは、8぀の64ビットの倍粟床数たたは16の32ビットの単粟床数のいずれかで動䜜できたす。



アヌキテクチャに぀いお考えるこずから、コンパむラに移りたしょう。 C ++プログラミング蚀語では、floatデヌタ型はx86アヌキテクチャの32ビット実数に察応し、2倍から64ビットになりたすが、long doubleではすべおがより興味深いものになりたす。 前述のように、倚くのコンパむラ開発者は暙準の仮定を䜿甚しお、long double型をdoubleに等しくしたす。 しかし、ハヌドりェアx86thでは、拡匵80ビット圢匏で動䜜できたす。 そしお、それらを䜿甚できるコンパむラがありたす。 コンパむラに぀いお詳しく芋おみたしょう。



奇劙なこずに、80ビット拡匵デヌタプレれンテヌション圢匏を無芖しおいるものの䞭には、よく知られ広く䜿甚されおいるコンパむラが倚数ありたす。ここに、Microsoft Visual C ++、C ++ Builder、Watcom C ++、Comeau C / C ++の郚分的なリストを瀺したす。 しかし、拡匵圢匏をサポヌトするコンパむラのリストは非垞に興味深いものですIntel C ++、GCC、Clang、Oracle Solaris Studio。 コンパむラに぀いお詳しく芋おみたしょう。



Intelのコンパむラは、拡匵フォヌマットを持぀こずに倱敗するこずはありたせんでした-メヌカヌはどのようにしお適切なツヌルなしでハヌドりェアを残すのですか コンパむラの䜿甚は無料ではありたせん。 コンパむラは、科孊蚈算や高性胜マルチプロセッサシステムで広く䜿甚されおいたす。



無料のGCCコンパむラは、Linuxオペレヌティングシステムで拡匵フォヌマットを簡単にサポヌトしたす。 Windowsでは、すべおがより興味深いものになりたす。 Windows甚のコンパむラには、MinGWずCygwinの2぀の適応がありたす。 どちらも拡匵圢匏を操䜜できたすが、MinGWはMicrosoftのランタむムを䜿甚したす。぀たり、64ビットの倍粟床を超える実数はどこでも衚瀺/衚瀺できたせん。 Cygwinを䜿甚するず、移怍がより耇雑になるため、すべおが少し改善されたす。



GCCず同様に、Clangは拡匵圢匏をサポヌトしおいたす。



たあ、以前はSun StudioだったOracle Solaris Studioに぀いお少し。 その存圚の終わりに向かっお、サンは倚くの技術を利甚可胜にしたした。 コンパむラを含めたす。 もずもずは、SPARCアヌキテクチャプロセッサを搭茉したSolaris OS甚に開発されたした。 埌に、オペレヌティングシステムはコンパむラずずもにx86番目のアヌキテクチャに移怍されたした。 IDEずコンパむラは、Linuxオペレヌティングシステムで䜿甚できたす。 残念ながら、このコンパむラは「スロヌアップ」されおおり、最新のC ++トレンドをサポヌトしおいたせん。



蚘事の冒頭で述べたダブルオヌバヌフロヌの問題を解決するために、考え、苊しみ、探した埌、コヌドを完党に曞き盎し、GCC Cygwinコンパむラの機胜を䜿甚するこずにしたした。 デヌタを栌玍するためにlong doubleデヌタ型が䜿甚されたした。 64ビットず80ビットの実数を䜿甚する同様のシステムのパフォヌマンスは異なりたす。 64ビット実数を䜿甚する堎合、コンパむラはすべおを最適化し、x86アヌキテクチャの最速の「最新の」拡匵機胜を䜿甚しようずしたす。 80ビットの数倀に切り替える堎合、アヌキテクチャの「叀代の」「コプロセッサ」の郚分が関係したす。



もちろん、倧きな実数を凊理するための゜フトりェア手法を䜿甚しおオヌバヌフロヌ問題を解決するこずは可胜でしたが、プログラムは䞉角関数を含む数孊的モデルを蚈算し、根を抜出し、階乗を蚈算するため、パフォヌマンスの䜎䞋は著しくなりたす。 拡匵フォヌマットを䜿甚しおモデルを蚈算する䜜業は、入力パラメヌタヌに応じお、玄8〜12時間のプロセッサヌ時間を芁したした。



蚘事の終わりに、IEEE 754暙準[3,4,5]に぀いお少し考察したす。 前述のように、暙準の最初のバヌゞョンは8087数孊コプロセッサヌのおかげで登堎したしたが、この暙準の埌続バヌゞョンは1997幎ず2008幎にリリヌスされたした。 2008幎の暙準は最も興味深いものです。 実数の4倍粟床4極、4倍粟床浮動小数点圢匏[6]に぀いお説明したす。 䞊蚘のタスクに最適なのは、このデヌタストレヌゞ圢匏です。 しかし、䞀般的なコンピュヌタの手頃な䟡栌のプロセッサアヌキテクチャには実装されおいたせん。 䞀方、x86アヌキテクチャには長い間必芁なサむズのレゞスタ128、256、512ビットがありたしたが、いく぀かの単粟床および倍粟床の数倀をすばやく凊理するのに圹立ちたす。 むンテルが将来のプロセッサヌで4倍粟床のサポヌトを導入するずいうむンタヌネット情報で䌚いたしたが、どうやらこれは玙でしか残っおいなかったようです。



4倍の粟床をサポヌトする最新のアヌキテクチャのうち、SPARC V8ずV9のアヌキテクチャは区別できたす。 それぞれ1990幎ず1993幎に登堎したしたが、4倍粟床の物理的な実珟は2004幎にのみ登堎したした。 2015幎、IBMは4倍の実数をサポヌトするPOWER9 CPU仕様ISA 3.0をリリヌスしたした。



4倍の実数の粟床は、幅広いナヌザヌにずっお䞍芁です。 䞻に科孊蚈算で䜿甚されたす。 たずえば、倩䜓物理蚈算で。 これは、70-80幎代に補造されたIBM360コンピュヌタヌが128ビットの実数をサポヌトしおいた理由を説明できたすが、もちろん最新のIEEE 754に察応しおいたせんでした。



たた、MCSTプロセッサのロシアの開発者に぀いおも少し話しおみたしょう。 この䌚瀟は、SPARCアヌキテクチャプロセッサを蚭蚈および補造しおいたす。 しかし、興味深いこずに、最初は4぀の実数をサポヌトせずに「叀い」SPARC V8アヌキテクチャ2001幎のMTsST-R150および2004幎のMTsST R500のプロセッサを開発およびリリヌスしたした。 そしお2011幎になっお、圌らは4倍粟床の実数をサポヌトするSPARC V9アヌキテクチャを備えたMCST R1000プロセッサをリリヌスしたした。



IEEE 754暙準に関するもう少しの蚀葉むンタヌネットに関する興味深い蚘事[3]には、非垞に感情的に、既存の暙準の問題ず欠点が説明されおいたす。 蚘事[4]では、暙準ずその問題に぀いおも説明しおいたす。 さらに、実数を衚珟するための新しいアプロヌチの必芁性に぀いおも説明しおいたす。 䞊蚘の2぀の蚘事では、数字の衚珟の欠点の倚くに぀いお説明しおいたすが、私はこれを远加したす。 プログラミングでは、「束葉杖」が䜕か間違っおいるずいう甚語がありたすが、最適な方法ではなく、特定の時間に珟圚の問題を解決するのに圹立ちたす。 したがっお、IEEE754暙準に察応する実数は束葉杖です。



そしお、なぜこの結論がここに珟れたした。 負のれロがないため、10進圢匏ぞの倉換ずその逆はあいたいです。実数を扱う堎合、プログラマヌは、可胜な倀の範囲の蚱容限界に近づくずきの実数の危険な動䜜を垞に芚えおおく必芁があり、実数を比范するずきは、蚱容範囲の粟床で範囲を比范する必芁がありたす。



魅力的な玠材ず゜ヌス



  1. ナロフV.I. アセンブラヌ。 高校向けの教科曞。 第2版 -SPb。Peter 2005
  2. x86
  3. ナロビツキヌV.M. IEEE754-tikaは人類を脅かす
  4. Yashkardin V. IEEE 754- バむナリ浮動小数点挔算暙準
  5. IEEE 754りィキペディアの蚘事1、2、3
  6. 実数の4倍粟床に関するりィキペディアの蚘事



All Articles