๋ชจ๋๋ค ์๋ ,
์ต๊ทผ์ 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๋นํธ ์ธํฐํ์ด์ค๋ก ๊ฐ์ ํฉ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ, ๊ฐ๋ฅํ ๋ค ๊ฐ์ง ๋ฐฉ๋ฒ:
๋ค๋ฅธ ์ฌ๋๋ค์ ์ด๊ฒ์ ์ฐ์ฐํ ๋ฐ๊ฒฌํ์ง๋ง ์ค์ ์์ธ์ ๋ฐ๋ฅด์ง ์์์ต๋๋ค.
int64๋ฅผ ์ง์ํ๋ openBLAS ๋น๋๋ ssyevd์ ๋ํ ์ ํจํ ์
๋ ฅ์์ ์คํจํฉ๋๋ค.
์ ์ด๋ 2๋ฒ ํธ์ถ ๋ฐฉ์์์๋ ์ด๊ฒ์ด ๋ฒ๊ทธ๊ฐ ์๋๋ผ ์ค๊ณ ๊ฒฐํจ์ด๋ผ๋ ์ ์ ๊ฐ์กฐํด์ผ ํฉ๋๋ค.
lapacke ์๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๊ฒฝ์ฐ ์๋นํ ์ฌ๊ฐํ ๋ฒ๊ทธ๋ก ๊ฐ์ฃผ๋์ด์ผ ํฉ๋๋ค.
๋ฌธ์ ์ธ์ฌ,
์ฅ์๋ค์ด์
(์์ ๋ฐฐ์ด ํฌ์ธํฐ๋ฅผ ํตํด ํฌ๊ธฐ๋ฅผ ๋ฐํํ๊ธฐ ์ํด) ๊ทธ ๋น์์๋ ์๋ฏธ๊ฐ ์์์ ๊ฒ ๊ฐ์ง๋ง ํฌ๊ธฐ ์ง์ ์๋ฅผ 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๊ฐ์ง ๋ค๋ฅธ ๊ฒฐํจ์ ๋ณผ ์ ์์ต๋๋ค.
@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๋ฅผ ์ฌ์ฉํ๋ฉด ํ ๋ฒ์ ๊ณ์ฐ์ด ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
lwork๋ฅผ IN/OUT์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ์๋ ์ข์ ์๋ฃจ์ ์ด์ง๋ง ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง๋ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ฉ ํ๋ก๊ทธ๋จ์ LAPACK ๋ฒ์ ์ด <= 3.10์ธ์ง(๋งํ์๋ฉด) 3.10๋ณด๋ค ํฐ์ง ์ฌ๋ถ๋ฅผ ์์์ผ lwork๋ฅผ ์ป์ ์ ์๋ ์์น๋ฅผ ์ ์ ์์ต๋๋ค. ์ค์๊ฐ์์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด const ๊ฐ์ ์ ๋ฌํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ํด๋น ๊ฐ์ ๋ฎ์ด์ฐ๋๋ก LAPACK์ ๋์์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋งค์ฐ ํด๋กญ์ต๋๋ค(UB). ์๋ฅผ ๋ค์ด, MAGMA์์:
๋ด๊ฐ ๋ช ๋ ์ ์ ์ ์ํ๊ณ MAGMA์์ ๊ตฌํํ ์๋ฃจ์ ์ ๋จ์ํ sgesdd ๋ฑ์ผ๋ก, work[1]์์ ๋ฐํ๋ lwork๋ฅผ ์ฝ๊ฐ ๋ฐ์ฌ๋ฆผํ๋ฏ๋ก ๋ฐํ๋ ๊ฐ์ ํญ์ >= ์๋๋ ๊ฐ์ ๋๋ค. https://bitbucket.org/icl/magma/src/master/control/magma_zauxiliary.cpp๋ฅผ ์ฐธ์กฐ ํ๊ณ ํ์ญ์์ค. (์์ฑ๋ ๋จ์ ๋ฐ๋ ๋ฒ์ ์ ๋ฆด๋ฆฌ์ค๋ฅผ ์ฐธ์กฐํ์ญ์์ค.) ๊ธฐ๋ณธ์ ์ผ๋ก ๊ต์ฒด
~์ ํจ๊ป
์ฌ๊ธฐ์
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๋ฅผ ์ฌ์ฉํ๋ฉด ํ ๋ฒ์ ๊ณ์ฐ์ด ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค.