ã¿ãªãããããã«ã¡ã¯ã
æè¿ãlapackeã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠssyevdã䜿çšããŠãããšãã«ãšã©ãŒã«ééããŸããã
ããã¯ãäžè¬çãªlapackã€ã³ã¿ãŒãã§ãŒã¹ã®åé¡ã瀺ããŠããŸãã ãããªãµãã«ãªããŸãïŒ
lapackã®æšæºã€ã³ã¿ãŒãã§ãŒã¹ã«ãããšãssyevdã®ãããªå€ãã®ã«ãŒãã³ã¯2ååŒã³åºãå¿
èŠããããŸãã
ç¹å®ã®ãããªãã¯ã¹ãµã€ãºã«å¿
èŠãªã¹ã¯ã©ããã¡ã¢ãªã®éãã«ãŒãã³ã«å°ãããšã
ãããŠãå¿
èŠãªã¹ã¯ã©ããã¡ã¢ãªã»ã¯ã·ã§ã³ã䜿çšããŠãã«ãŒãã³ãæ¬æ Œçã«åŒã³åºããŸãã
ãã©ã¡ãŒã¿ãšããŠã
ãã®æåã®åŒã³åºããããèŠããšãå¿
èŠãªã¡ã¢ãªãµã€ãºãè¿ãããŸãã
ssyevdã®ãããªã«ãŒãã³ã®å Žåãlapackã®ããã¥ã¡ã³ãã«ãããšã
ã¡ã¢ãªèŠä»¶ã¯ã floatå€ãžã®ãã€ã³ã¿ãä»ããŠè¿ãããŸãã
ãããã£ãŠãã¡ã¢ãªãèšç®ãããšãã¯ãäžé£ã®å€ãééããŸãã
calculate memory -> store value in reference -> retrieve the value for use (allocation)
int64 float int64
ããã¯ãilp64ã€ã³ã¿ãŒãã§ã€ã¹ã®å Žåã¯int64ã§ããããã以å€ã®å Žåã¯int32ã«ãªããŸãã
ãããã£ãŠãæ¬è³ªçã«ã¯ãã¡ã¢ãªå€ã®äžéçãªççž®ããããŸãã
63ããããã24ããã!!!
ïŒããæ£ç¢ºã«ã¯ãIEEE 754ãããŒãè¡šçŸã®æãå€åŽã®ã»ãããããéã®24ããããŸã§ïŒ
32ãããæŽæ°ã®å Žåã§ãã31ããããã24ãããã«ççž®ãããŸãã
ãããã£ãŠãéå»ã®ããã«ã¡ã¢ãªèŠä»¶ã®èšç®ããæåã§ãåŒã³åºãå Žå
ã©ããããŸããããªãããç¥ããã£ã³ã¹ããããããããŸããããããã§ãç絡ãé²ãããšã¯ã§ããŸãã
æµ®åå°æ°ç¹å€ã«ã ææ°ã®lapackeã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠèªåã¡ã¢ãªå²ãåœãŠã䜿çšããå Žå
ã«ãŒãã³ãäžè©±ãããããšã宣äŒããŠããã®ã§ãããªãã¯äœãééã£ãŠããå¯èœæ§ãããã®ãââããåãããŸãã
ããèªäœã§ãã¹ãŠã®ã¡ã¢ãªç®¡çã®ïŒ
ããã¯ãlapackã®ãã¹ãŠã®å粟床ã«ãŒãã³ïŒs / cïŒã§çºçããŸãã
äžéã¹ããããšããŠã®ã¡ã¢ãªèŠä»¶ã
å粟床ã«åãæ¿ãããšã代ããã«å粟床åç
§ã䜿çšãããŸãã
代ããã«äžéå€ã53ãããã«å¢ãããŸãããããã¯ãŸã 64ãããã«è¿ããããŸãã
64ãããã€ã³ã¿ãŒãã§ã€ã¹ãæ³å®ããŸãã
åé¿çã4ã€ã®å¯èœãªæ¹æ³ïŒ
ä»ã®äººã
ã¯ããã«åºããããŸããããæ¬åœã®åå ã«ãããè¿œããããŸããã§ãããäŸãã°
ssyevdã®æå¹ãªå
¥åã§int64ããµããŒãããopenBLASãã«ãã倱æãã
å°ãªããšã2åã®åŒã³åºãæ¹æ³ã§ã¯ãããã¯ãã°ã§ã¯ãªããèšèšäžã®æ¬ é¥ã§ããããšã匷調ããå¿
èŠããããŸãã
lapackeã®èªåã¡ã¢ãªå²ãåœãŠã®å Žåãããªãæ·±å»ãªãã°ãšèŠãªãå¿
èŠããããŸãã
ããããã
é žåå€
åœæã¯ïŒäœæ¥é åãã€ã³ã¿ãŒãä»ããŠãµã€ãºãè¿ãããã«ïŒçã«ããªã£ãŠãããšæããŸããããµã€ãºæå®åãå ¥å/åºåå€æ°ã«å€æããŠæ£ç¢ºãªå€ãè¿ãã®ã劚ãããã®ã¯äœã§ããããïŒ æ¬¡ã«ããææ°ã®ãåŒã³åºãå ã¯æåã«ããã確èªããlworkããŸã ââ-1ã®å Žåã«ã®ã¿ãäœæ¥é åã¡ã³ããŒã«é ŒããŸãããå€ããåŒã³åºãå ã¯å€æŽã«æ°ã¥ããŸããã
ãŸããããããåœæå¿ èŠã ã£ãLWORKã¯ç©ççã«å€§ããããŠãã®åé¡ã解決ã§ãããilp64ããããæããã«ããŸããã 2åŒã³åºãæ¹åŒã§ã¯ãªããå®è¡æã«NBå€ãå°åºãããæ¥ã倢èŠãŠããŸãã
ããã«é¢é£ãã2ã€ã®ãã£ã¹ã«ãã·ã§ã³ã¹ã¬ããã¯æ¬¡ã®ãšããã§ãã
https://icl.cs.utk.edu/lapack-forum/viewtopic.php?t=1418
http://icl.cs.utk.edu/lapack-forum/archives/lapack/msg00827.html
ããã¯ãOïŒn ^ 2ïŒã¯ãŒã¯ã¹ããŒã¹ãå¿ èŠãšããã¢ã«ãŽãªãºã ã§ç¹ã«åé¡ã«ãªããŸãã OïŒn * nbïŒã¯ãŒã¯ã¹ããŒã¹ãå¿ èŠãšããã¢ã«ãŽãªãºã ã®å Žåãããã¯ããã»ã©åé¡ã§ã¯ãããŸããã
ã¯ããããã¯èšèšäžã®æ¬ é¥ã§ãã
@ martin-frbgïŒC _workã€ã³ã¿ãŒãã§ãŒã¹ã®å€æŽæ¡ã¯ã©ã®ããã«ãªããŸããïŒ ããã«ã®ã¿å
¥åãšããŠLWORKããããŸãã LWORKãINPUT / OUTPUTã«å€æŽãããšã倧ããªå€æŽããããŸãã ãã®åé¡ã解決ããããã®ã¢ã€ãã¢ã¯ãããŸããïŒ èŠãïŒ
https://github.com/Reference-LAPACK/lapack/blob/aa631b4b4bd13f6ae2dbab9ae9da209e1e05b0fc/LAPACKE/src/lapacke_dgeqrf_work.c#L35
LAPACK_dgeqrf__workspace_queryïŒïŒãªã©ã®ã¯ãŒã¯ã¹ããŒã¹å²ãåœãŠãµãã«ãŒãã³ãäœæããããšãã§ããããã«ããå¿ èŠãªã¯ãŒã¯ã¹ããŒã¹ãè¿ããããšèããŠããŸããã
ãŠã§ã«ããç§ã®ç¡çŸãªèšç»ã¯ãå°å³ãªãšãã¯å®éã«ã¯æ©èœããŸãã...
ãããããããã¯å®éã«ã¯2ã€ã®åé¡ã ãšæããŸãã1ã€ã¯lapack_intã§ãªãŒããŒãããŒããäœæ¥ãµã€ãºã§ããããã1ã€ã¯ç²ŸåºŠãéãããŠããããã«äžå®è¡šç€ºã®ã¿ã§ããèšç®ããããµã€ãºãåãäžããŠåŸè
ãäºæž¬ããããšã¯å¯èœã§ããããã ãããã€ãã®ãæªäœ¿çšã®ã¡ã¢ãªïŒ
ã¯ããããã¯èšèšäžã®æ¬ é¥ã§ãã
ç§ã¯ããã§2ã€ã®ç°ãªãæ¬ é¥ãèŠãããšãã§ããŸãïŒ
@ martin-frbgã®ã¢ã€ãã¢ã¯ãïŒ1ïŒã®è¯ã解決çã§ãã æ°ããFortranã³ãŒãã§ã¯ãWORKïŒ1ïŒã®ä»£ããã«LWORKã®æ»ãå€ã䜿çšã§ããŸãã 眮æã®ããã®ããã€ãã®ïŒåïŒèªåæé ã§ã³ãŒããå€æŽããŠã¿ãããšãã§ããŸãã ããšãã°ã ssyevd.f
ã§ã¯ã眮ãæããããšãã§ããŸã
ELSE IF( LQUERY ) THEN
RETURN
END IF
ã«
ELSE IF( LQUERY ) THEN
LWORK = LOPT
RETURN
END IF
@langouã瀺åããããã«ã LAPACKE_dgeqrf__work_query()
è¿œå ãããšãïŒ2ïŒã解決ãããŸããããã®å€æŽã«é¢é£ããäœæ¥ã¯ãããããããŸãã
lworkãIN / OUTã«å€æŽããããšã¯ãå ã ã¯åªãããœãªã¥ãŒã·ã§ã³ã§ãããäžäœäºææ§ã¯ãããŸããã ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ã¯ãLAPACKã®ããŒãžã§ã³ã<= 3.10ïŒããšãã°ïŒã§ããã> 3.10ã§ããããèªèããŠãlworkã®å ¥æå ãç¥ãå¿ èŠããããŸãã ããã«æªãããšã«ãã¢ããªã±ãŒã·ã§ã³ãconstå€ãæž¡ãå ŽåããããŸãïŒconstã®ãŸãŸã§ãããšæåŸ ããŸãïŒããã®ãããLAPACKããã®åäœãå€æŽããŠãã®å€ãäžæžããããšãéåžžã«æ害ã«ãªããŸãïŒUBïŒã ããšãã°ãMAGMAã§ã¯æ¬¡ã®ããã«ãªããŸãã
const magma_int_t ineg_one = -1;
...
magma_int_t query_magma, query_lapack;
magma_zgesdd( *jobz, M, N,
unused, lda, runused,
unused, ldu,
unused, ldv,
dummy, ineg_one, // overwriting ineg_one would break MAGMA
#ifdef COMPLEX
runused,
#endif
iunused, &info );
assert( info == 0 );
query_magma = (magma_int_t) MAGMA_Z_REAL( dummy[0] );
ç§ãæ°å¹Žåã«ææ¡ããŠMAGMAã«å®è£ ãããœãªã¥ãŒã·ã§ã³ã¯ãwork [1]ã§è¿ãããlworkãå°ãåãäžããããã«ãåã«sgesddãªã©ã§è¡ããããããæ»ãå€ã¯åžžã«æå³ããå€ä»¥äžã«ãªããŸãã https://bitbucket.org/icl/magma/src/master/control/magma_zauxiliary.cppãåç §ãã ãã ããã ïŒçæãããå粟床ããŒãžã§ã³ã®ãªãªãŒã¹ãåç §ããŠãã ãããïŒåºæ¬çã«çœ®æ
WORK( 1 ) = MAXWRK
ãš
WORK( 1 ) = lapack_roundup_lwork( MAXWRK )
ããã§ãé¢æ°lapack_roundup_lwork
ã¯ã magma_*make_lwork
ãšåæ§ã«ããããã«åãäžããŸãã MAGMAã§ã¯ãå粟床epsã䜿çšããèšç®ã2åã«ããŠãïŒ1 + epsïŒãæããŠåãäžããŸããã ããããã°ãæ¢åã®ã¢ããªã±ãŒã·ã§ã³ã¯ãã¯ãŒã¯ã¹ããŒã¹ã¯ãšãªãå€æŽããããšãªãæ£ããåäœããŸãã
ããã«ãã¹ãããçµæãlwork> 2 ^ 54ã®å ŽåãLAPACKå®çŸ©slamchïŒ "eps"ïŒ= 5.96e-ã§ã¯ãªããã€ãã·ãã³= 1.19e-07ïŒå¥åulpïŒã®C / C ++ / Fortranå®çŸ©ã䜿çšããå¿ èŠãããããšãããããŸããã 08ïŒå¥åãŠãããäžžããuïŒã ulpã䜿çšããŠããå Žåãèšç®ã¯1åã§å®è¡ã§ããããã«èŠããŸãã
æãåèã«ãªãã³ã¡ã³ã
lworkãIN / OUTã«å€æŽããããšã¯ãå ã ã¯åªãããœãªã¥ãŒã·ã§ã³ã§ãããäžäœäºææ§ã¯ãããŸããã ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ã¯ãLAPACKã®ããŒãžã§ã³ã<= 3.10ïŒããšãã°ïŒã§ããã> 3.10ã§ããããèªèããŠãlworkã®å ¥æå ãç¥ãå¿ èŠããããŸãã ããã«æªãããšã«ãã¢ããªã±ãŒã·ã§ã³ãconstå€ãæž¡ãå ŽåããããŸãïŒconstã®ãŸãŸã§ãããšæåŸ ããŸãïŒããã®ãããLAPACKããã®åäœãå€æŽããŠãã®å€ãäžæžããããšãéåžžã«æ害ã«ãªããŸãïŒUBïŒã ããšãã°ãMAGMAã§ã¯æ¬¡ã®ããã«ãªããŸãã
ç§ãæ°å¹Žåã«ææ¡ããŠMAGMAã«å®è£ ãããœãªã¥ãŒã·ã§ã³ã¯ãwork [1]ã§è¿ãããlworkãå°ãåãäžããããã«ãåã«sgesddãªã©ã§è¡ããããããæ»ãå€ã¯åžžã«æå³ããå€ä»¥äžã«ãªããŸãã https://bitbucket.org/icl/magma/src/master/control/magma_zauxiliary.cppãåç §ãã ãã ããã ïŒçæãããå粟床ããŒãžã§ã³ã®ãªãªãŒã¹ãåç §ããŠãã ãããïŒåºæ¬çã«çœ®æ
ãš
ããã§ãé¢æ°
lapack_roundup_lwork
ã¯ãmagma_*make_lwork
ãšåæ§ã«ããããã«åãäžããŸãã MAGMAã§ã¯ãå粟床epsã䜿çšããèšç®ã2åã«ããŠãïŒ1 + epsïŒãæããŠåãäžããŸããã ããããã°ãæ¢åã®ã¢ããªã±ãŒã·ã§ã³ã¯ãã¯ãŒã¯ã¹ããŒã¹ã¯ãšãªãå€æŽããããšãªãæ£ããåäœããŸããããã«ãã¹ãããçµæãlwork> 2 ^ 54ã®å ŽåãLAPACKå®çŸ©slamchïŒ "eps"ïŒ= 5.96e-ã§ã¯ãªããã€ãã·ãã³= 1.19e-07ïŒå¥åulpïŒã®C / C ++ / Fortranå®çŸ©ã䜿çšããå¿ èŠãããããšãããããŸããã 08ïŒå¥åãŠãããäžžããuïŒã ulpã䜿çšããŠããå Žåãèšç®ã¯1åã§å®è¡ã§ããããã«èŠããŸãã