Lapack: ์•”์‹œ์  ๋ฐ ๋ช…์‹œ์  ๋ชจ๋“  ๋‹จ์ •๋ฐ€๋„ ์ž‘์—… ๊ณต๊ฐ„ ์ฟผ๋ฆฌ์˜ ์ •๋ฐ€๋„ ์†์‹ค

์— ๋งŒ๋“  2021๋…„ 07์›” 19์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Reference-LAPACK/lapack

๋ชจ๋‘๋“ค ์•ˆ๋…•,

์ตœ๊ทผ์— lapack ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ssyevd๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ lapack ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

lapack ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ฅด๋ฉด ssyevd์™€ ๊ฐ™์€ ๋งŽ์€ ๋ฃจํ‹ด์€ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํŠน์ • ํ–‰๋ ฌ ํฌ๊ธฐ์— ๋Œ€ํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์Šคํฌ๋ž˜์น˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ์ง€ ๋ฃจํ‹ด์— ๋ฌป๋Š” ๊ฒฝ์šฐ,
๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•„์š”ํ•œ ์Šคํฌ๋ž˜์น˜ ๋ฉ”๋ชจ๋ฆฌ ์„น์…˜์œผ๋กœ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ฃจํ‹ด์„ ํ˜ธ์ถœํ•˜์‹ญ์‹œ์˜ค.
๋งค๊ฐœ๋ณ€์ˆ˜๋กœ.

ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ์ด ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด
ssyevd์™€ ๊ฐ™์€ ๋ฃจํ‹ด์˜ ๊ฒฝ์šฐ lapack ์„ค๋ช…์„œ์— ๋”ฐ๋ฅด๋ฉด
๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ๋‹ค์‹œ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ์ผ๋ จ์˜ ๊ฐ’์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

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๋น„ํŠธ๋กœ ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ณผ๊ฑฐ์™€ ๊ฐ™์ด ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ ์‚ฌํ•ญ ๊ณ„์‚ฐ์„ '์†์œผ๋กœ'๋ผ๊ณ  ํ•˜๋ฉด
์–ด๋””๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ๋ณผ ๊ธฐํšŒ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋‹จ๋ฝ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.
๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’์œผ๋กœ. ์ตœ์‹  lapack ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
์ผ์ƒ์—์„œ ๋Œ๋ด์ฃผ๊ธฐ ์œ„ํ•ด ๊ด‘๊ณ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ฌด์—‡์ด ์ž˜๋ชป๋  ์ˆ˜ ์žˆ๋Š”์ง€์กฐ์ฐจ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
์ž์ฒด์ ์œผ๋กœ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ!

์ด๊ฒƒ์€ lapack์˜ ๋ชจ๋“  ๋‹จ์ •๋ฐ€๋„ ๋ฃจํ‹ด(s/c)์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์ค‘๊ฐ„ ๋‹จ๊ณ„๋กœ ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ ์‚ฌํ•ญ.
๋ฐฐ์ •๋ฐ€๋„๋กœ ์ „ํ™˜ํ•˜๋ฉด ๋ฐฐ์ •๋ฐ€๋„ ์ฐธ์กฐ๊ฐ€ ๋Œ€์‹  ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๋Œ€์‹  ์ค‘๊ฐ„ ๊ฐ’์„ 53๋น„ํŠธ๋กœ ๋Š˜๋ฆฌ๊ณ , ์ด๋Š” ์—ฌ์ „ํžˆ 64๋น„ํŠธ์— ๊ฐ€๊น์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ•˜๋‚˜๋Š” 64๋น„ํŠธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•, ๊ฐ€๋Šฅํ•œ ๋„ค ๊ฐ€์ง€ ๋ฐฉ๋ฒ•:

  1. ๋‹จ์ผ ๋˜๋Š” ๋ณต์žกํ•œ lapack ๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด C lapack ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  2. ์ด์ค‘ ํ˜ธ์ถœ lapack ํ•จ์ˆ˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์‚ฐ์„ ์œ„ํ•ด double(!) ๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  3. lapack ๋ฃจํ‹ด์˜ ์ฐธ์กฐ ๊ตฌํ˜„์„ ์‚ดํŽด๋ณด๊ณ  ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ๊ณ„์‚ฐํ•˜์‹ญ์‹œ์˜ค.
  4. float/complex ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ž‘์€ ํ–‰๋ ฌ ํฌ๊ธฐ๋งŒ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์ด๊ฒƒ์„ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ์ง€๋งŒ ์‹ค์ œ ์›์ธ์„ ๋”ฐ๋ฅด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
int64๋ฅผ ์ง€์›ํ•˜๋Š” openBLAS ๋นŒ๋“œ๋Š” ssyevd์— ๋Œ€ํ•œ ์œ ํšจํ•œ ์ž…๋ ฅ์—์„œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์ ์–ด๋„ 2๋ฒˆ ํ˜ธ์ถœ ๋ฐฉ์‹์—์„œ๋Š” ์ด๊ฒƒ์ด ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ค๊ณ„ ๊ฒฐํ•จ์ด๋ผ๋Š” ์ ์„ ๊ฐ•์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
lapacke ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์˜ ๊ฒฝ์šฐ ์ƒ๋‹นํžˆ ์‹ฌ๊ฐํ•œ ๋ฒ„๊ทธ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์•ˆ ์ธ์‚ฌ,

์˜ฅ์‹œ๋‹ค์ด์„œ

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

lwork๋ฅผ IN/OUT์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ์›๋ž˜ ์ข‹์€ ์†”๋ฃจ์…˜์ด์ง€๋งŒ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ LAPACK ๋ฒ„์ „์ด <= 3.10์ธ์ง€(๋งํ•˜์ž๋ฉด) 3.10๋ณด๋‹ค ํฐ์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ์•„์•ผ lwork๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์ƒ๊ฐ€์ƒ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด 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์—์„œ ๊ตฌํ˜„ํ•œ ์†”๋ฃจ์…˜์€ ๋‹จ์ˆœํžˆ sgesdd ๋“ฑ์œผ๋กœ, work[1]์—์„œ ๋ฐ˜ํ™˜๋œ lwork๋ฅผ ์•ฝ๊ฐ„ ๋ฐ˜์˜ฌ๋ฆผํ•˜๋ฏ€๋กœ ๋ฐ˜ํ™˜๋œ ๊ฐ’์€ ํ•ญ์ƒ >= ์˜๋„๋œ ๊ฐ’์ž…๋‹ˆ๋‹ค. 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๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋‘ ๋ฐฐ์˜ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ (1 + eps)๋ฅผ ๊ณฑํ•˜์—ฌ ๋ฐ˜์˜ฌ๋ฆผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ธฐ์กด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ž‘์—… ๊ณต๊ฐ„ ์ฟผ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š” ์—†์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ํ›„ lwork > 2^54์— ๋Œ€ํ•ด LAPACK ์ •์˜ slamch("eps") = 5.96e- ๋Œ€์‹  ์—ก์‹ค๋ก  = 1.19e-07(์ผ๋ช… ulp)์˜ C/C++/Fortran ์ •์˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. 08(์ผ๋ช… ๋‹จ์œ„ ๋ฐ˜์˜ฌ๋ฆผ, u). ulp๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ๋ฒˆ์— ๊ณ„์‚ฐ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  6 ๋Œ“๊ธ€

(์ž‘์—… ๋ฐฐ์—ด ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด) ๊ทธ ๋‹น์‹œ์—๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ์—ˆ์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ํฌ๊ธฐ ์ง€์ •์ž๋ฅผ in/out ๋ณ€์ˆ˜๋กœ ๋ฐ”๊พธ๊ณ  ์ •ํ™•ํ•œ ๊ฐ’์„ ๊ฑฐ๊ธฐ์— ๋‹ค์‹œ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ "ํ˜„๋Œ€" ํ˜ธ์ถœ์ž๋Š” ๋จผ์ € ํ™•์ธํ•˜๊ณ  lwork๊ฐ€ ์—ฌ์ „ํžˆ -1์ธ ๊ฒฝ์šฐ์—๋งŒ ์ž‘์—… ๋ฐฐ์—ด ๊ตฌ์„ฑ์›์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. "์ด์ „" ํ˜ธ์ถœ์ž๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์•Œ์•„์ฐจ๋ฆฌ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‹น์‹œ์— ํ•„์š”ํ•œ LWORK๋Š” ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋„ˆ๋ฌด ์ปค์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ๊ณ  ilp64๊ฐ€ ์ด๋ฅผ ๋ถ„๋ช…ํžˆ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํˆฌ์ฝœ ๋ฐฉ์‹์ด ์•„๋‹Œ ๋Ÿฐํƒ€์ž„์— NB ๊ฐ’์ด ํŒŒ์ƒ๋˜๋Š” ์‹œ๋Œ€๋ฅผ ๊ฟˆ๊พธ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ด์™€ ๊ด€๋ จ๋œ ๋‘ ๊ฐœ์˜ ํ† ๋ก  ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค.
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๋ฅผ INPUT์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. LWORK๋ฅผ INPUT/OUTPUT์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ํฐ ๋ณ€ํ™”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ณด๋‹ค:
https://github.com/Reference-LAPACK/lapack/blob/aa631b4b4bd13f6ae2dbab9ae9da209e1e05b0fc/LAPACKE/src/lapacke_dgeqrf_work.c#L35

LAPACK_dgeqrf__workspace_query()์™€ ๊ฐ™์€ ์ž‘์—… ๊ณต๊ฐ„ ํ• ๋‹น ์„œ๋ธŒ๋ฃจํ‹ด์„ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ๊ณ  ํ•„์š”ํ•œ ์ž‘์—… ๊ณต๊ฐ„์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๋‚ด ๊ตํ™œํ•œ ๊ณ„ํš์€ ์ˆ ์— ์ทจํ–ˆ์„ ๋•Œ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ...
๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ๋“ค์€ ์‹ค์ œ๋กœ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” lapack_int๋ฅผ ์˜ค๋ฒ„ํ”Œ๋กœํ•˜๋Š” ์ž‘์—… ํฌ๊ธฐ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ œํ•œ๋œ ์ •๋ฐ€๋„๋กœ ์ธํ•œ "์˜ค์ง" ์ž˜๋ชป๋œ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. ๊ณ„์‚ฐ๋œ ํฌ๊ธฐ๋ฅผ ๋ฐ˜์˜ฌ๋ฆผํ•˜์—ฌ "์ผ๋ถ€" ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ ?

์˜ˆ, ์ด๊ฒƒ์€ ์„ค๊ณ„ ๊ฒฐํ•จ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ 2๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฒฐํ•จ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. LAPACK์—์„œ: ๋ฃจํ‹ด์€ ์‹ค์ œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—… ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  2. LAPACK์—์„œ: ๋ฃจํ‹ด์€ LAPACK์—์„œ ๊ฒฐํ•จ์„ ์ „ํŒŒํ•ฉ๋‹ˆ๋‹ค.

@martin-frbg์˜ ์•„์ด๋””์–ด๋Š” (1)์— ๋Œ€ํ•œ ์ข‹์€ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ์ƒˆ ํฌํŠธ๋ž€ ์ฝ”๋“œ๋Š” 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 ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๊ฐ’์„ ๋ฎ์–ด์“ฐ๋„๋ก 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์—์„œ ๊ตฌํ˜„ํ•œ ์†”๋ฃจ์…˜์€ ๋‹จ์ˆœํžˆ sgesdd ๋“ฑ์œผ๋กœ, work[1]์—์„œ ๋ฐ˜ํ™˜๋œ lwork๋ฅผ ์•ฝ๊ฐ„ ๋ฐ˜์˜ฌ๋ฆผํ•˜๋ฏ€๋กœ ๋ฐ˜ํ™˜๋œ ๊ฐ’์€ ํ•ญ์ƒ >= ์˜๋„๋œ ๊ฐ’์ž…๋‹ˆ๋‹ค. 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๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋‘ ๋ฐฐ์˜ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ (1 + eps)๋ฅผ ๊ณฑํ•˜์—ฌ ๋ฐ˜์˜ฌ๋ฆผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ธฐ์กด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ž‘์—… ๊ณต๊ฐ„ ์ฟผ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š” ์—†์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ํ›„ lwork > 2^54์— ๋Œ€ํ•ด LAPACK ์ •์˜ slamch("eps") = 5.96e- ๋Œ€์‹  ์—ก์‹ค๋ก  = 1.19e-07(์ผ๋ช… ulp)์˜ C/C++/Fortran ์ •์˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. 08(์ผ๋ช… ๋‹จ์œ„ ๋ฐ˜์˜ฌ๋ฆผ, u). ulp๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ๋ฒˆ์— ๊ณ„์‚ฐ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰