Lapack: LAPACKのプロセッサヌ芁件

䜜成日 2021幎06月04日  Â·  16コメント  Â·  ゜ヌス: Reference-LAPACK/lapack

LAPACKから.NETぞの翻蚳に取り組んでいたす。 すべおのテストを含むすべおのLAPACKを正垞に倉換するFORTRANコンパむラヌを䜜成したした。 実際のデヌタ型ではほがすべおのテストに合栌したす。 耇雑なデヌタに぀いおは、ただいく぀かの粟床の問題がありたす。

䟋
XEIGTSTZ <zec.in-ZLAHQRのアンダヌフロヌが原因で倱敗したす。
再珟手順ZGET37-> knt == 31、ZHSEQR-> ZLAHQR-> 2番目のQRステップITS == 2の最埌に、次のコヌドがアンダヌフロヌを匕き起こしたす特定のレゞスタでは、以䞋を参照

TEMP = H( I, I-1 )
    IF( DIMAG( TEMP ).NE.RZERO ) THEN
        RTEMP = ABS( TEMP)    ! <-- underflow on TEMP = (~1e-0173, ~1e-0173)
        IF (RTEMP .EQ. RZERO) RTEMP = CABS1(TEMP)
        H( I, I-1 ) = RTEMP
        TEMP = TEMP / RTEMP
        IF( I2.GT.I )

私たちのコンパむラは.NETCLRを察象ずしおいたす。 そのJITは、ABSTEMPにSSEレゞスタを䜿甚するこずを決定したす。これにより、マグニチュヌドの䞭間蚈算でアンダヌフロヌが発生したす。 Ifort別の䟋ずしおは、この状況で浮動小数点レゞスタを䜿甚するため、アンダヌフロヌしたせん長さが80ビットであるため。 実行時にコンパむラ/プロセッサに必芁な粟床/数倀範囲に関しお、LAPACKに䜕が期埅できるかを明確に把握しようずしおいたす。

倍粟床のすべおのテストは、少なくずも64ビットレゞスタを必芁ずするように蚭蚈されおいたすか それずも、今日利甚可胜な人気のあるFORTRANコンパむラヌのセットで成功するように蚭蚈されおいたすか 䞊蚘の最初のケヌスおよび同様の他のケヌスでは泚意が必芁な堎合がありたす。問題を提起する必芁がありたすか

仕様を探したしたが、ただ芋぀かりたせんでした。 任意のリンクもいただければ幞いです。 前もっお感謝したす

党おのコメント16件

アンダヌフロヌ自䜓は本圓の問題ではありたせん。 アンダヌフロヌの埌、アルゎリズムはアンダヌフロヌの傟向が少ないCABS1に切り替わりたす。 発生する問題は、TEMPが完党に単䞀ではなく、Zの䞞めに぀ながるこずです。

考えられる解決策は、CABS1を䜿甚しお事前スケヌリングしおから、ABSを䜿甚しお修正するこずです最初のスケヌリングのため、ABSはオヌバヌフロヌしなくなりたす。 マシンにアンダヌフロヌが発生しないため、テストできたせん

IF (RTEMP .EQ. RZERO) THEN
    RTEMP = CABS1(TEMP)
    H( I, I-1 ) = RTEMP
    TEMP = TEMP / RTEMP
    RTEMP = ABS( TEMP)
    H( I, I-1 ) = H( I, I-1 )*RTEMP
    TEMP = TEMP / RTEMP
END IF

テストは、人気のあるFORTRANコンパむラヌのセットで成功するように蚭蚈されおいるず思いたす。これは、テストが実行される方法だからです。 アンダヌフロヌ/オヌバヌフロヌの予枬は非垞に困難です。 少なくずも私の堎合、これらのサブルヌチンは、䞀般的なコンパむラを䜿甚しお培底的にテストし、芋぀かったオヌバヌフロヌ/アンダヌフロヌを修正するだけで蚭蚈されおいたす。

ありがずうございたした これは非垞に圹立ちたす。
CABS1を䜿甚しおアンダヌフロヌからの回埩を詊みたした。 しかし、私たちの詊みは十分に進んでいたせんでした。 あなたの提案ははるかにうたくいくようです。 䜿甚...

*
*        Ensure that H(I,I-1) is real.
*
         TEMP = H( I, I-1 )
         IF( DIMAG( TEMP ).NE.RZERO ) THEN
            RTEMP = ABS( TEMP)
            IF (RTEMP .EQ. RZERO) THEN 
                RTEMP = CABS1(TEMP)
                H( I, I-1 ) = RTEMP
                TEMP = TEMP / RTEMP
                RTEMP = ABS( TEMP)
                H( I, I-1 ) = H( I, I-1 )*RTEMP
            ELSE 
                H( I, I-1 ) = RTEMP
            END IF
            TEMP = TEMP / RTEMP
            IF( I2.GT.I )
     $         CALL ZSCAL( I2-I, DCONJG( TEMP ), H( I, I+1 ), LDH )
            CALL ZSCAL( I-I1, TEMP, H( I1, I ), 1 )
            IF( WANTZ ) THEN
               CALL ZSCAL( NZ, TEMP, Z( ILOZ, I ), 1 )
            END IF
         END IF
*
  130 CONTINUE

...この反埩は正垞に完了したすABSにSSEレゞスタを䜿甚しおいる堎合でも。

テストは、人気のあるFORTRANコンパむラヌのセットで成功するように蚭蚈されおいるず思いたす。これは、テストが実行される方法だからです。 アンダヌフロヌ/オヌバヌフロヌの予枬は非垞に困難です。 少なくずも私の堎合、これらのサブルヌチンは、䞀般的なコンパむラを䜿甚しお培底的にテストし、芋぀かったオヌバヌフロヌ/アンダヌフロヌを修正するだけで蚭蚈されおいたす。

テストスむヌトは非垞に圹立ちたす 私の倧たかな芋積もりでは、テストの1未満が、このたたは同様のオヌバヌフロヌの問題の圱響を受けおいたすコンパむラヌを䜿甚しおいる堎合。 アンダヌフロヌ/オヌバヌフロヌに察しおテストをさらに堅牢にするこずで、LAPACKをより倚くのプラットフォヌムに導入できる可胜性がありたす。 䞊蚘の倱敗した詊みはほんの䞀䟋であり、私たちの偎で修正を思い付くこずがほずんどできないこずを明確に瀺しおいたす。 耇数の関連する問題を開く前に、そのような旅に興味があるかどうか、そしお䜕が良いアプロヌチになるかに぀いお、議論を始めたいず思いたす。

@hokbず@thijssteelの改善に

プロゞェクトでの私の限られた経隓を考えるず、私はあなたの努力ずあなたのPRをポットのガむドラむンずしお取る機䌚をいただければ幞いです。 私たちからの将来のPR ...それでよろしければ

こんにちは@hokb 、

仕様を探したしたが、ただ芋぀かりたせんでした。 任意のリンクもいただければ幞いです。 前もっお感謝したす

どこにも䜕も指定されおいるかわかりたせん。

私たちのコンパむラは.NETCLRを察象ずしおいたす。 そのJITは、ABSTEMPにSSEレゞスタを䜿甚するこずを決定したす。これにより、マグニチュヌドの䞭間蚈算でアンダヌフロヌが発生したす。 Ifort別の䟋ずしおは、この状況で浮動小数点レゞスタを䜿甚するため、アンダヌフロヌしたせん長さが80ビットであるため。 実行時にコンパむラ/プロセッサに必芁な粟床/数倀範囲に関しお、LAPACKに䜕が期埅できるかを明確に把握しようずしおいたす。

倪字のステヌトメントすべおの蚈算がIEEE 64ビット挔算を䜿甚しお行われる堎合、LAPACKは機胜するはずです。

LAPACKは、80ビットレゞスタがい぀でもその蚈算に圹立぀こずを期埅しおいたせん。 アルゎリズムは、64ビット挔算を念頭に眮いお蚭蚈されおいたす。 さお、 @ thijssteelが述べた

私たちは、これらの問題を解決するための旅の䞭で䜓系的なこずは䜕もしおいたせん。 䞀般に、アルゎリズムがテストスむヌトに合栌すれば十分満足できたす。たた、80ビットレゞスタからの助けがあれば、それで十分です。

倍粟床のすべおのテストは、少なくずも64ビットレゞスタを必芁ずするように蚭蚈されおいたすか それずも、今日利甚可胜な人気のあるFORTRANコンパむラヌのセットで成功するように蚭蚈されおいたすか 䞊蚘の最初のケヌスおよび同様の他のケヌスでは泚意が必芁な堎合がありたす。問題を提起する必芁がありたすか

私の倧たかな芋積もりでは、テストの1未満が、このたたは同様のオヌバヌフロヌの問題の圱響を受けおいたすコンパむラヌを䜿甚しおいる堎合。

ああ、私の。 1 それは恐ろしい数です。

テストはアンダヌフロヌずオヌバヌフロヌ領域の呚りで倚くのテストを行っおいるため、ナヌザヌのコヌドよりもこの問題をトリガヌするずいう点でテストの可胜性がはるかに高いず予想されたすが、それでもなおです。

アンダヌフロヌ/オヌバヌフロヌに察しおテストをさらに堅牢にするこずで、LAPACKをより倚くのプラットフォヌムに導入できる可胜性がありたす。

より倚くのプラットフォヌムぞの移怍性は確かに1぀の関心事です。 もう1぀の関心は、GMPなどのパッケヌゞによる拡匵粟床です。私が理解しおいるように、粟床は蚈算党䜓で固定されおいたす。 たずえば、あなたは256ビットの考えであり、300ビットのレゞスタがありたせん。

䞊蚘の倱敗した詊みはほんの䞀䟋であり、私たちの偎で修正を思い付くこずがほずんどできないこずを明確に瀺しおいたす。 耇数の関連する問題を開く前に、そのような旅に興味があるかどうか、そしお䜕が良いアプロヌチになるかに぀いお、議論を始めたいず思いたす。

はい。 興味がありたす。 しかし、私たちにできるこずはそれだけです。 そしお、私たちは私たちの皿にたくさんありたす。 したがっお、この問題を䞀床に1぀ず぀取り䞊げお、どこたで進んでいるかを確認するこずもできたす。

いずれにせよ、GitHubに問題を投皿するこずは垞に良い考えです。 それは問題ぞの認識を䞎え、問題を解決するための助けやアむデアを集めるのに圹立ちたす。

私たちはこの道を進んでうれしいですが、私はそれを楜にするこずをお勧めしたす。

たぶん、gfortranの堎合、テスト目的でフラグ-mfpmath=sse -msse2を䜿甚しおコンパむルする必芁がありたす。 これにより、すべおの蚈算が64ビット挔算で実行されるようになるず思いたす。 でもわかりたせん。

プロゞェクトでの私の限られた経隓を考えるず、私はあなたの努力ずあなたのPRをポットのガむドラむンずしお取る機䌚をいただければ幞いです。 私たちからの将来のPR ...それでよろしければ

もちろん 577をご芧ください。

@weslleyspereira玠晎らしい これがCLAHQRにも同じように圓おはたるかどうか、私はただチェックしおいたす。 私の結果をできるだけ早く投皿したす明日

こんにちは@langou 

倪字のステヌトメントすべおの蚈算がIEEE 64ビット挔算を䜿甚しお行われる堎合、LAPACKは機胜するはずです。

良い 「仕事」ずは、「特定の範囲のデヌタが䟛絊された堎合」、特定のレゞスタサむズが原因でオヌバヌフロヌしないこずを意味するず思いたすか

LAPACKは、80ビットレゞスタがい぀でもその蚈算に圹立぀こずを期埅しおいたせん。 アルゎリズムは、64ビット挔算を念頭に眮いお蚭蚈されおいたす。 さお、 @ thijssteelが述べた

私たちは、これらの問題を解決するための旅の䞭で䜓系的なこずは䜕もしおいたせん。 䞀般に、アルゎリズムがテストスむヌトに合栌すれば十分満足できたす。たた、80ビットレゞスタからの助けがあれば、それで十分です。

ずおもリヌズナブルですね

私の倧たかな芋積もりでは、テストの1未満が、このたたは同様のオヌバヌフロヌの問題の圱響を受けおいたすコンパむラヌを䜿甚しおいる堎合。

ああ、私の。 1 それは恐ろしい数です。

たあ、おそらくそれはそれよりも「はるかに少ない」です;

より倚くのプラットフォヌムぞの移怍性は確かに1぀の関心事です。 もう1぀の関心は、GMPなどのパッケヌゞによる拡匵粟床です。私が理解しおいるように、粟床は蚈算党䜓で固定されおいたす。 たずえば、あなたは256ビットの考えであり、300ビットのレゞスタがありたせん。

面癜そうに聞こえたすが、このような固定粟床の詊みの経隓が䞍足しおいるため、これに぀いおコメントするこずはできたせん。

はい。 興味がありたす。 しかし、私たちにできるこずはそれだけです。 そしお、私たちは私たちの皿にたくさんありたす。 したがっお、この問題を䞀床に1぀ず぀取り䞊げお、どこたで進んでいるかを確認するこずもできたす。

私はただ良い䞀般的なアプロヌチが䜕であるかわからない。 私の理解があたりにも玠朎であるならば、私ず䞀緒に裞でください。 しかし、オヌバヌフロヌ/アンダヌフロヌは垞に入力デヌタずアルゎリズムの䞡方に䟝存しおいるのではありたせんか したがっお、コヌドをテストする新しい条件ずそれらから回埩するための新しいコヌドで溢れさせる代わりに、入力デヌタの「蚱容範囲」を枛らすこずができたすか ただし、どちらのアプロヌチに必芁な䜜業に぀いおも、必芁な掞察はありたせん。 だから私は䜕がもっず実珟可胜か刀断できたせん。

いずれにせよ、GitHubに問題を投皿するこずは垞に良い考えです。 それは問題ぞの認識を䞎え、問題を解決するための助けやアむデアを集めるのに圹立ちたす。

良い。 進行䞭に問題を提出したす。 アンダヌフロヌを再珟できずに修正を行うのは難しいこずだず理解しおいたす。 では、問題をより明確にするためにどのような情報を提䟛できたすか コンクリヌトのアンダヌフロヌたでの経路は圹に立ちたすか ぀たり、反埩回数、ロヌカルの珟圚の倀をファむル名などずずもに提䟛したすか

私たちはこの道を進んでうれしいですが、私はそれを楜にするこずをお勧めしたす。

ここでも同じです :)

577の結果の1぀は、LAPACKがFORTRANコンパむラヌに䟝存しお、適床に堅牢なアンダヌ/オヌバヌフロヌ耇玠数陀算ずABSを実装するこずです。 ドキュメントの保守を開始し、そのような芁件や同様の芁件を収集する必芁があるのでしょうか。 これらは、LAPACKを他の/新しいコンパむラで䜿甚したい人、コンパむラビルダヌ、およびLAPACKアルゎリズムの䞀郚たたはすべおを他の蚀語に転送したい人にずっおも同様に重芁で䟿利です。

もちろん この情報を十分に文曞化しおおくずよいでしょう。

たず、フォヌムのファむルLAPACK/SRC/z*.f COMPLEX * 16アルゎリズム内のすべおの分割を倚分远跡するこずに時間を費やしたした。

 REAL / COMPLEX   or   COMPLEX / COMPLEX

合蚈53個のファむルが芋぀かりたした。 添付ファむルを参照しおください complexDivisionFound.code-search

  • そのために、Visual StudioCodeでREGEX匏を䜿甚したした。

    \ n。* / ^ 0-9 DBLE?! REAL?! MIN?! MAX[^ 0-9]

たぶん、gfortranの堎合、テスト目的でフラグ-mfpmath=sse -msse2を䜿甚しおコンパむルする必芁がありたす。 これにより、すべおの蚈算が64ビット挔算で実行されるようになるず思いたす。 でもわかりたせん。

はい、GCCを䜿甚する堎合は必芁ですが、このフラグはx86-64でもデフォルトで蚭定されおいる必芁がありたす。 以䞋のドキュメントの抜粋はGCC11甚ですが、はるかに叀いバヌゞョンのGCCでも同じ動䜜を瀺すはずです。 GNUコンパむラコレクションGCCの䜿甚3.19.59x86オプション

sse

SSE呜什セットに存圚するスカラヌ浮動小数点呜什を䜿甚したす。 この呜什セットは、Pentium III以降のチップでサポヌトされおおり、AMDラむンではAthlon-4、Athlon XP、およびAthlonMPチップでサポヌトされおいたす。 以前のバヌゞョンのSSE呜什セットは単粟床挔算のみをサポヌトしおいるため、倍粟床および拡匵粟床の挔算は匕き続き387を䜿甚しお実行されたす。Pentium4およびAMD x86-64チップにのみ存圚する埌のバヌゞョンは、倍粟床挔算をサポヌトしたす。それも。

x86-32コンパむラの堎合、SSE拡匵を有効にしおこのオプションを有効にするには、 -march=cpu-type 、 -msseたたは-msse2スむッチを䜿甚する必芁がありたす。 x86-64コンパむラの堎合、これらの拡匵機胜はデフォルトで有効になっおいたす。

結果ずしお埗られるコヌドは、ほずんどの堎合かなり高速であり、387コヌドの数倀的䞍安定性の問題を回避するはずですが、䞀時的なものが80ビットであるず予想する既存のコヌドを壊す可胜性がありたす。

これは、x86-64コンパむラであるDarwin x86-32タヌゲットのデフォルトの遞択であり、 -ffast-mathが有効になっおいる堎合のSSE2呜什セットを䜿甚したx86-32タヌゲットのデフォルトの遞択です。

䟋
XEIGTSTZ <zec.in-ZLAHQRのアンダヌフロヌが原因で倱敗したす。
再珟手順ZGET37-> knt == 31、ZHSEQR-> ZLAHQR-> 2番目のQRステップITS == 2の最埌に、次のコヌドがアンダヌフロヌを匕き起こしたす特定のレゞスタでは、以䞋を参照

TEMP = H( I, I-1 )
    IF( DIMAG( TEMP ).NE.RZERO ) THEN
        RTEMP = ABS( TEMP)    ! <-- underflow on TEMP = (~1e-0173, ~1e-0173)
        IF (RTEMP .EQ. RZERO) RTEMP = CABS1(TEMP)
        H( I, I-1 ) = RTEMP
        TEMP = TEMP / RTEMP
        IF( I2.GT.I )

私たちのコンパむラは.NETCLRを察象ずしおいたす。 そのJITは、ABSTEMPにSSEレゞスタを䜿甚するこずを決定したす。これにより、マグニチュヌドの䞭間蚈算でアンダヌフロヌが発生したす。 Ifort別の䟋ずしおは、この状況で浮動小数点レゞスタを䜿甚するため、アンダヌフロヌしたせん長さが80ビットであるため。 実行時にコンパむラ/プロセッサに必芁な粟床/数倀範囲に関しお、LAPACKに䜕が期埅できるかを明確に把握しようずしおいたす。

芁点をたずめるず

  • 50䞇行のFortran77をCにトランスパむルしたした。
  • .NETゞャストむンタむムコンパむラを䜿甚するず、トランスパむルされたコヌドのテストが倱敗したす。
  • むンテルFortranコンパむラヌifo​​rtを䜿甚するず、バニラLAPACKコヌドのテストは成功したす。
  • 2぀のケヌスで芳察された違いは、アンダヌフロヌを回避するifortによる80ビット䞭間䜓の䜿甚です。

正しい

デフォルトでは、GCCはx86-64䞊の64ビット浮動小数点レゞスタヌのコヌドのみを生成したす。私のマシンでは通垞、1぀たたは2぀を陀いおすべおのLAPACKテストに合栌したす。

Netlib LAPACKテストスむヌトはGCCでコンパむルするずきに合栌したすか

線集解決枈みhttps://github.com/Reference-LAPACK/lapack/pull/577#issuecomment -859496175

たぶん、gfortranの堎合、テスト目的でフラグ-mfpmath = sse-msse2を䜿甚しおコンパむルする必芁がありたす。 これにより、すべおの蚈算が64ビット挔算で実行されるようになるず思いたす。 でもわかりたせん。

MacOSずLinuxの䞡方でGCC11を䜿甚しお-mfpmath=sse -msse2を詊したした https  https 

@ hokb 、SSEフラグを䜿甚しおGCCでhttps://github.com/Reference-LAPACK/lapack/issues/575#issuecomment -855880000で蚀及したオヌバヌフロヌの問題を再珟できたすか それを手䌝っおくれたせんか。

@weslleyspereira私はGCCを詊したこずがありたせん。 私がアクセスできる/実行䞭のセットアップは、Windowsでのifortだけです。 テストのためにcygwin経由でGCCを起動しお実行するには、数日かかりたす特に、珟圚のホリデヌホテルの郚屋から...|ただし、このチャレンゞに挑戊する必芁がある堎合はお知らせください。
少なくずも、 https //godbolt.org/z/YYv5oPxe9によるず、フラグを䜿甚しおも、gfortranによっお生成されるコヌドには圱響したせん。 しかしもちろん、テスト実行だけが確実にわかりたす...

私はりィンドりを䜿甚しおいたせんが、ここにありたす。 たず、Ubuntuでifortを䜿甚しおLAPACKをテストし、䜕が起こるかを確認したす。 䌑日をお楜しみください

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡