์ฐ๋ฆฌ๋ LAPACK์ .NET์ผ๋ก ๋ฒ์ญํ๋ ์์ ์ ํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ํ ์คํธ๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ LAPACK์ ์ฑ๊ณต์ ์ผ๋ก ๋ฒ์ญํ๋ FORTRAN ์ปดํ์ผ๋ฌ๋ฅผ ์์ฑํ์ต๋๋ค. ์ค์ ๋ฐ์ดํฐ ์ ํ์์ (๊ฑฐ์) ๋ชจ๋ ํ ์คํธ๊ฐ ํต๊ณผํฉ๋๋ค. ๋ณต์กํ ๋ฐ์ดํฐ์์ ์ฐ๋ฆฌ๋ ์ฌ์ ํ ๋ช ๊ฐ์ง ์ ๋ฐ๋ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ์์ต๋๋ค.
์์:
XEIGTSTZ < zec.in - ZLAHQR์ ์ธ๋ํ๋ก๋ก ์ธํด ์คํจํฉ๋๋ค.
์ฌํ ๋จ๊ณ: ZGET37 -> knt == 31, ZHSEQR -> ZLAHQR -> ๋ ๋ฒ์งธ 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 )
์ปดํ์ผ๋ฌ๋ .NET CLR์ ๋์์ผ๋ก ํฉ๋๋ค. ๊ทธ๊ฒ์ JIT๋ ABS(TEMP)์ ๋ํด SSE ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ , ์ด๋ ํฌ๊ธฐ์ ์ค๊ฐ ๊ณ์ฐ์์ ์ธ๋ํ๋ก๋ก ์ด์ด์ง๋๋ค. Ifort(๋ ๋ค๋ฅธ ์)๋ ์ด ์ํฉ์์ ๋ถ๋ ์์์ ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์ธ๋ํ๋ก๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค(๊ธธ์ด๊ฐ ๋ ๊ธธ๊ธฐ ๋๋ฌธ์: 80๋นํธ). ๋ฐํ์์ ์ปดํ์ผ๋ฌ/ํ๋ก์ธ์์์ ํ์ํ ์ ๋ฐ๋/์ซ์ ๋ฒ์์ ๊ด๋ จํ์ฌ LAPACK์์ ๋ฌด์์ ๊ธฐ๋ํด์ผ ํ๋์ง์ ๋ํ ๋ช ํํ(์ด) ๊ทธ๋ฆผ์ ์ป์ผ๋ ค๊ณ ํฉ๋๋ค.
๋ฐฐ์ ๋ฐ๋์ ๋ํ ๋ชจ๋ ํ ์คํธ ๋ ์ต์ํ 64๋นํธ ๋ ์ง์คํฐ๋ฅผ ์๊ตฌํ๋๋ก ์ค๊ณ๋์์ต๋๊น? ์๋๋ฉด ์ค๋๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์ธ๊ธฐ ์๋ FORTRAN ์ปดํ์ผ๋ฌ ์ธํธ์ ์ฑ๊ณตํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๊น? (์์ ๋ฌธ์ (๋ฐ ์ ์ฌํ ๋ค๋ฅธ ๋ฌธ์ )์ ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ์ ์ฃผ์๊ฐ ํ์ํ ์ ์์ต๋๋ค. ๋ฌธ์ ๋ฅผ ์ ๊ธฐํด์ผ ํฉ๋๊น?)
์ฌ์์ ์ข ์ฐพ์๋ดค๋๋ฐ ์์ง ์๋์ค๋ค์. ๋ชจ๋ ๋งํฌ๋ ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ธ๋ํ๋ก ์์ฒด๊ฐ ์ง์ ํ ๋ฌธ์ ๋ ์๋๋๋ค. ์ธ๋ํ๋ก ํ ์๊ณ ๋ฆฌ์ฆ์ ์ธ๋ํ๋ก ๊ฒฝํฅ์ด ์ ์ 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์ ์์ฑํด์ผํฉ๋๊น ์๋๋ฉด ๊ทธ๋ ๊ฒ ํ ์ํฅ์ด ์์ต๋๊น, @hokb?
ํ๋ก์ ํธ์ ๋ํ ์ ํ๋ ๊ฒฝํ์ ๊ฐ์ํ ๋ ๊ทํ์ ๋ ธ๋ ฅ๊ณผ PR์ ๋๋น์ ์ง์นจ์ผ๋ก ์ผ์ ๊ธฐํ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ฐ๋ฆฌ์ ๋ฏธ๋ PR... (๊ด์ฐฎ๋ค๋ฉด?)
์๋ ํ์ธ์ @hokb ๋
์ฌ์์ ์ข ์ฐพ์๋ดค๋๋ฐ ์์ง ์๋์ค๋ค์. ๋ชจ๋ ๋งํฌ๋ ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
๋๋ ์๋ฌด ๊ฒ๋ ์ง์ ๋์ง ์์๋์ง ํ์คํ์ง ์์ต๋๋ค.
์ปดํ์ผ๋ฌ๋ .NET CLR์ ๋์์ผ๋ก ํฉ๋๋ค. ๊ทธ๊ฒ์ JIT๋ ABS(TEMP)์ ๋ํด SSE ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ , ์ด๋ ํฌ๊ธฐ์ ์ค๊ฐ ๊ณ์ฐ์์ ์ธ๋ํ๋ก๋ก ์ด์ด์ง๋๋ค. Ifort(๋ ๋ค๋ฅธ ์)๋ ์ด ์ํฉ์์ ๋ถ๋ ์์์ ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์ธ๋ํ๋ก๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค(๊ธธ์ด๊ฐ ๋ ๊ธธ๊ธฐ ๋๋ฌธ์: 80๋นํธ). ๋ฐํ์์ ์ปดํ์ผ๋ฌ/ํ๋ก์ธ์์์ ํ์ํ ์ ๋ฐ๋/์ซ์ ๋ฒ์์ ๊ด๋ จํ์ฌ LAPACK์์ ๋ฌด์์ ๊ธฐ๋ํด์ผ ํ๋์ง์ ๋ํ ๋ช ํํ(์ด) ๊ทธ๋ฆผ์ ์ป์ผ๋ ค๊ณ ํฉ๋๋ค.
๊ตต์ ๋ฌธ์ฅ: ๋ชจ๋ ๊ณ์ฐ์ด IEEE 64๋นํธ ์ฐ์ ์ ์ฌ์ฉํ์ฌ ์ํ๋๋ฉด LAPACK์ด ์๋ํด์ผ ํฉ๋๋ค.
LAPACK์ 80๋นํธ ๋ ์ง์คํฐ๊ฐ ์ธ์ ๋ ์ง ๊ณ์ฐ์ ๋์์ด ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํ์ง ์์ต๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ 64๋นํธ ์ฐ์ ์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์์ต๋๋ค. ์ด์ @thijssteel์ด ์ธ๊ธํ
์ฐ๋ฆฌ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ฌ์ ์์ ์ฒด๊ณ์ ์ธ ์กฐ์น๋ฅผ ์ทจํ์ง ์์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด ํ ์คํธ ์ค์ํธ๋ฅผ ํต๊ณผํ์ ๋ ์ถฉ๋ถํ ๋ง์กฑํ๋ฉฐ, 80๋นํธ ๋ ์ง์คํฐ์ ๋์์ด ์๋ค๋ฉด ๊ทธ๋ ๊ฒ ๋ ๊ฒ์ ๋๋ค.
๋ฐฐ์ ๋ฐ๋์ ๋ํ ๋ชจ๋ ํ ์คํธ๋ ์ต์ 64๋นํธ ๋ ์ง์คํฐ๋ฅผ ์๊ตฌํ๋๋ก ์ค๊ณ๋์์ต๋๊น? ์๋๋ฉด ์ค๋๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์ธ๊ธฐ ์๋ FORTRAN ์ปดํ์ผ๋ฌ ์ธํธ์ ์ฑ๊ณตํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๊น? (์์ ๋ฌธ์ (๋ฐ ์ ์ฌํ ๋ค๋ฅธ ๋ฌธ์ )์ ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ์ ์ฃผ์๊ฐ ํ์ํ ์ ์์ต๋๋ค. ๋ฌธ์ ๋ฅผ ์ ๊ธฐํด์ผ ํฉ๋๊น?)
๋๋ต์ ์ธ ์ถ์ ์ ํ ์คํธ์ 1% ๋ฏธ๋ง์ด ์ด์ ์ ์ฌํ ์ค๋ฒํ๋ก ๋ฌธ์ (์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ ๋)์ ์ํฅ์ ๋ฐ๋๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋จธ. 1%? ๋ฌด์์ด ์ซ์์ ๋๋ค.
ํ ์คํธ๋ ์ธ๋ํ๋ก ๋ฐ ์ค๋ฒํ๋ก ์์ญ์ ์ค์ฌ์ผ๋ก ๋ง์ด ํ ์คํธ ์ค์ด๋ฏ๋ก ์ฌ์ฉ์์ ์ฝ๋๋ณด๋ค ์ด ๋ฌธ์ ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ์ธก๋ฉด์์ ํ ์คํธ๊ฐ ํจ์ฌ ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ง๋ง ์ฌ์ ํ ๊ทธ๋ด ๊ฒ์ผ๋ก ์์ํ ์ ์์ต๋๋ค.
์ธ๋/์ค๋ฒํ๋ก์ ๋ํ ํ ์คํธ๋ฅผ ๋์ฑ ๊ฐ๋ ฅํ๊ฒ ๋ง๋๋ ๊ฒ์ LAPACK์ ๋ ๋ง์ ํ๋ซํผ์ผ๋ก ๊ฐ์ ธ์ค๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
๋ ๋ง์ ํ๋ซํผ์ผ๋ก์ ์ด์์ฑ์ ์ค์ ๋ก ํ๋์ ๊ด์ฌ์ฌ์ ๋๋ค. ๋ ๋ค๋ฅธ ๊ด์ฌ์ GMP์ ๊ฐ์ ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฐ๋๋ฅผ ํ์ฅํ๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ์ ๋ฐ๋๋ ๊ณ์ฐ ์ ๋ฐ์ ๊ฑธ์ณ ๊ณ ์ ๋ฉ๋๋ค. (์๋ฅผ ๋ค์ด ๋น์ ์ 256๋นํธ ์๊ฐ์ด๊ณ 300๋นํธ ๋ ์ง์คํฐ๋ ๋น์ ์ ๋์ธ ์ ์์ต๋๋ค.)
์์ (์คํจํ) ์๋๋ ํ ๊ฐ์ง ์์ผ ๋ฟ์ด๋ฉฐ, ์ฐ๋ฆฌ ์ธก์์ ์์ ์ฌํญ์ ๊ฑฐ์ ์ฐพ์๋ผ ์ ์์์ ๋ถ๋ช ํ ๋ณด์ฌ์ค๋๋ค. ์ฌ๋ฌ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ์์ํ๊ธฐ ์ ์ ๊ทธ๋ฌํ ์ฌ์ ์ ๊ด์ฌ์ด ์๋์ง ์ฌ๋ถ์ ์ข์ ์ ๊ทผ ๋ฐฉ์์ด ๋ฌด์์ธ์ง์ ๋ํ ํ ๋ก ์ ์์ํ๊ณ ์ถ์ต๋๋ค.
์. ์ฐ๋ฆฌ๋ ๊ด์ฌ์ด ์์ต๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ํ ์ ์๋ ๋งํผ๋ง ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ ์ ์์ ๋ง์ด ์์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ด ๋ฌธ์ ๋ฅผ ํ ๋ฒ์ ํ๋์ฉ ์ฒ๋ฆฌํ๊ณ ์ฐ๋ฆฌ๊ฐ ์ผ๋ง๋ ๋ฉ๋ฆฌ ๊ฐ ์ ์๋์ง ์ ์ ์์ต๋๋ค.
์ด์จ๋ GitHub์ ๋ฌธ์ ๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ ํญ์ ์ข์ ์๊ฐ์ ๋๋ค. ๋ฌธ์ ์ ๋ํ ์ธ์์ ์ ๊ณตํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์์ด๋์ด์ ๋์์ ์์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ด ๊ธธ์ ๊ฐ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ ๋๊ธํ๊ฒ ๊ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค.
gfortran์ ๊ฒฝ์ฐ ํ
์คํธ ๋ชฉ์ ์ผ๋ก -mfpmath=sse -msse2
ํ๋๊ทธ๋ก ์ปดํ์ผํด์ผ ํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ชจ๋ ๊ณ์ฐ์ด 64๋นํธ ์ฐ์ ๋ก ์ํ๋๋๋ก ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์คํ์ง ์์ต๋๋ค.
ํ๋ก์ ํธ์ ๋ํ ์ ํ๋ ๊ฒฝํ์ ๊ฐ์ํ ๋ ๊ทํ์ ๋ ธ๋ ฅ๊ณผ PR์ ๋๋น์ ์ง์นจ์ผ๋ก ์ผ์ ๊ธฐํ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ฐ๋ฆฌ์ ๋ฏธ๋ PR... (๊ด์ฐฎ๋ค๋ฉด?)
ํ์ ํ๋! #577์ ์ฐธ์กฐํ์ญ์์ค.
@weslleyspereira ๊ต์ฅํฉ๋๋ค! ์ด๊ฒ์ด CLAHQR์๋ ๋์ผํ๊ฒ ์ ์ฉ๋๋์ง ๊ณ์ ํ์ธํ๊ณ ์์ต๋๋ค. ๋ด ๊ฒฐ๊ณผ๋ฅผ ์ต๋ํ ๋นจ๋ฆฌ ๊ฒ์ํ ๊ฒ์ ๋๋ค(๋ด์ผ)
์๋ ํ์ธ์ @langou๋ !
๊ตต์ ๋ฌธ์ฅ: ๋ชจ๋ ๊ณ์ฐ์ด IEEE 64๋นํธ ์ฐ์ ์ ์ฌ์ฉํ์ฌ ์ํ๋๋ฉด LAPACK์ด ์๋ํด์ผ ํฉ๋๋ค.
๋ฉ์ง! ๋ด ์๊ฐ์ '์์ '์ด๋ ๋ค์์ ์๋ฏธํฉ๋๋ค. 'ํน์ ๋ฒ์์' ๋ฐ์ดํฐ๊ฐ ๊ณต๊ธ๋ ๋ ์ฃผ์ด์ง ๋ ์ง์คํฐ ํฌ๊ธฐ๋ก ์ธํด ๋ฐ์ดํฐ๊ฐ ์ค๋ฒํ๋ก๋์ง ์์ต๋๊น?
LAPACK์ 80๋นํธ ๋ ์ง์คํฐ๊ฐ ์ธ์ ๋ ์ง ๊ณ์ฐ์ ๋์์ด ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํ์ง ์์ต๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ 64๋นํธ ์ฐ์ ์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์์ต๋๋ค. ์ด์ @thijssteel์ด ์ธ๊ธํ
์ฐ๋ฆฌ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ฌ์ ์์ ์ฒด๊ณ์ ์ธ ์กฐ์น๋ฅผ ์ทจํ์ง ์์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด ํ ์คํธ ์ค์ํธ๋ฅผ ํต๊ณผํ์ ๋ ์ถฉ๋ถํ ๋ง์กฑํ๋ฉฐ, 80๋นํธ ๋ ์ง์คํฐ์ ๋์์ด ์๋ค๋ฉด ๊ทธ๋ ๊ฒ ๋ ๊ฒ์ ๋๋ค.
๋งค์ฐ ํฉ๋ฆฌ์ ์ธ ์๋ฆฌ!
๋๋ต์ ์ธ ์ถ์ ์ ํ ์คํธ์ 1% ๋ฏธ๋ง์ด ์ด์ ์ ์ฌํ ์ค๋ฒํ๋ก ๋ฌธ์ (์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ ๋)์ ์ํฅ์ ๋ฐ๋๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋จธ. 1%? ๋ฌด์์ด ์ซ์์ ๋๋ค.
๊ธ์์, ์๋ง๋ ๊ทธ๋ณด๋ค 'ํจ์ฌ ์ ์ต๋๋ค';)
๋ ๋ง์ ํ๋ซํผ์ผ๋ก์ ์ด์์ฑ์ ์ค์ ๋ก ํ๋์ ๊ด์ฌ์ฌ์ ๋๋ค. ๋ ๋ค๋ฅธ ๊ด์ฌ์ GMP์ ๊ฐ์ ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฐ๋๋ฅผ ํ์ฅํ๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ์ ๋ฐ๋๋ ๊ณ์ฐ ์ ๋ฐ์ ๊ฑธ์ณ ๊ณ ์ ๋ฉ๋๋ค. (์๋ฅผ ๋ค์ด ๋น์ ์ 256๋นํธ ์๊ฐ์ด๊ณ 300๋นํธ ๋ ์ง์คํฐ๋ ๋น์ ์ ๋์ธ ์ ์์ต๋๋ค.)
ํฅ๋ฏธ๋กญ๊ฒ ๋ค๋ฆฌ์ง๋ง ์ด๋ฌํ ๊ณ ์ ์ ๋ฐ๋ ์๋์ ๋ํ ๊ฒฝํ์ด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํด ์ธ๊ธํ ์ ์์ต๋๋ค.
์. ์ฐ๋ฆฌ๋ ๊ด์ฌ์ด ์์ต๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ํ ์ ์๋ ๋งํผ๋ง ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ ์ ์์ ๋ง์ด ์์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ด ๋ฌธ์ ๋ฅผ ํ ๋ฒ์ ํ๋์ฉ ์ฒ๋ฆฌํ๊ณ ์ฐ๋ฆฌ๊ฐ ์ผ๋ง๋ ๋ฉ๋ฆฌ ๊ฐ ์ ์๋์ง ์ ์ ์์ต๋๋ค.
๋๋ ์ฌ์ ํ ์ข์ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด ๋ฌด์์ธ์ง ํ์ ํ ์ ์์ต๋๋ค. ๋ด ์ดํด๊ฐ ๋๋ฌด ์์งํ๋ค๋ฉด ๋์ ํจ๊ปํ์ญ์์ค. ํ์ง๋ง ์ค๋ฒํ๋ก/์ธ๋ํ๋ก๋ ํญ์ ์ ๋ ฅ ๋ฐ์ดํฐ์ ์๊ณ ๋ฆฌ์ฆ ๋ชจ๋์ ์์กดํ์ง ์์ต๋๊น? ๋ฐ๋ผ์ ์ฝ๋๋ฅผ ์๋ก์ด ์กฐ๊ฑด๋ถ ํ ์คํธ์ ๋ณต๊ตฌ๋ฅผ ์ํ ์๋ก์ด ์ฝ๋๋ก ์ฑ์ฐ๋ ๋์ ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋ํ 'ํ์ฉ ๋ฒ์'๋ฅผ ์ค์ผ ์ ์์ต๋๊น? ๊ทธ๋ฌ๋ ๋ ์ ๊ทผ ๋ฐฉ์ ๋ชจ๋์ ํ์ํ ๋ ธ๋ ฅ์ ๋ํ ํต์ฐฐ๋ ฅ์ด ์์ต๋๋ค. ๊ทธ๋์ ๋ฌด์์ด ๋ ์คํ ๊ฐ๋ฅํ์ง ํ๋จํ ์ ์์ต๋๋ค.
์ด์จ๋ GitHub์ ๋ฌธ์ ๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ ํญ์ ์ข์ ์๊ฐ์ ๋๋ค. ๋ฌธ์ ์ ๋ํ ์ธ์์ ์ ๊ณตํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์์ด๋์ด์ ๋์์ ์์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ข์. ์ฐ๋ฆฌ๋ ๊ฐ๋ ๋๋ก ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ ๊ฒ์ ๋๋ค. ์ธ๋ํ๋ก๋ฅผ ์ฌํํ ์ ์๋ ์ํ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ด ์ด๋ ค์ธ ๊ฒ์ด๋ผ๋ ์ ์ ์ดํดํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ฌธ์ ๋ฅผ ๋ณด๋ค ๋ช ํํ๊ฒ ํ๊ธฐ ์ํด ์ด๋ค ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น? ์ฝํฌ๋ฆฌํธ ์ธ๋ํ๋ก๋ก ๋ด๋ ค๊ฐ๋ ๊ฒฝ๋ก๊ฐ ๋์์ด ๋ฉ๋๊น? ์: ๋ฐ๋ณต ํ์, ํ์ผ ์ด๋ฆ๊ณผ ํจ๊ป ๋ก์ปฌ์ ํ์ฌ ๊ฐ ๋ฑ์ ์ ๊ณตํฉ๋๊น?
์ฐ๋ฆฌ๊ฐ ์ด ๊ธธ์ ๊ฐ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ ๋๊ธํ๊ฒ ๊ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง! :)
#577์ ํ ๊ฐ์ง ๊ฒฐ๊ณผ๋ LAPACK์ด FORTRAN ์ปดํ์ผ๋ฌ์ ์์กดํ์ฌ ํฉ๋ฆฌ์ ์ผ๋ก ๊ฐ๋ ฅํ(์ธ๋/์ค๋ฒํ๋ก) ๋ณต์กํ ๋ถํ ๋ฐ ABS()๋ฅผ ๊ตฌํํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ฌธ์ ์ ์ง ๊ด๋ฆฌ๋ฅผ ์์ํ๊ณ ์ด์ ์ ์ฌํ ์๊ตฌ ์ฌํญ์ ์์งํด์ผ ํ๋์ง ๊ถ๊ธํฉ๋๋ค. ๋ค๋ฅธ/์ ์ปดํ์ผ๋ฌ์ ํจ๊ป LAPACK์ ์ฌ์ฉํ๋ ค๋ ์ฌ๋, ์ปดํ์ผ๋ฌ ๋น๋ ๋ฐ LAPACK ์๊ณ ๋ฆฌ์ฆ์ ์ผ๋ถ ๋๋ ์ ์ฒด๋ฅผ ๋ค๋ฅธ ์ธ์ด๋ก ์ ์กํ๊ธฐ ์ํด ๋ชจ๋ ๋๊ฐ์ด ์ค์ํ๊ณ ์ ์ฉํฉ๋๋ค.
ํ์ ํ๋! ์ด ์ ๋ณด๋ฅผ ์ ๋ฌธ์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฐ์ LAPACK/SRC/z*.f
(COMPLEX*16 ์๊ณ ๋ฆฌ์ฆ) ํ์์ ํ์ผ์์ ๋ชจ๋ ๋ถํ ์ ์ถ์ ํ๋ ๋ฐ ์๊ฐ์ ๋ณด๋์ต๋๋ค.
REAL / COMPLEX or COMPLEX / COMPLEX
์ด 53๊ฐ์ ํ์ผ์ ์ฐพ์์ต๋๋ค. ์ฒจ๋ถ ํ์ผ ์ฐธ์กฐ: complexDivisionFound.code-search
์ด๋ฅผ ์ํด Visual Studio Code์์ REGEX ํํ์์ ์ฌ์ฉํ์ต๋๋ค.
\n .*/ ^0-9 (?!DBLE)(?!REAL)(?!MIN)(?!MAX)[^0-9]
gfortran์ ๊ฒฝ์ฐ ํ ์คํธ ๋ชฉ์ ์ผ๋ก
-mfpmath=sse -msse2
ํ๋๊ทธ๋ก ์ปดํ์ผํด์ผ ํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ชจ๋ ๊ณ์ฐ์ด 64๋นํธ ์ฐ์ ๋ก ์ํ๋๋๋ก ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์คํ์ง ์์ต๋๋ค.
์, GCC๋ฅผ ์ฌ์ฉํ ๋ ํด์ผ ํ์ง๋ง ์ด ํ๋๊ทธ๋ x86-64์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ๋์ด์ผ ํฉ๋๋ค. ์๋์์ ๋ฐ์ทํ ๋ฌธ์๋ GCC 11์ฉ์ด์ง๋ง ํจ์ฌ ์ด์ GCC ๋ฒ์ ์์๋ ๋์ผํ ๋์์ ๋ณด์ฌ์ผ ํฉ๋๋ค. GNU ์ปดํ์ผ๋ฌ ์ปฌ๋ ์ (GCC) ์ฌ์ฉ: 3.19.59 x86 ์ต์
sse
SSE ๋ช ๋ น์ด ์ธํธ์ ์๋ ์ค์นผ๋ผ ๋ถ๋ ์์์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ช ๋ น์ด ์ธํธ๋ Pentium III ๋ฐ ์ต์ ์นฉ์์ ์ง์๋๋ฉฐ AMD ๋ผ์ธ์์๋ Athlon-4, Athlon XP ๋ฐ Athlon MP ์นฉ์์ ์ง์๋ฉ๋๋ค. SSE ๋ช ๋ น์ด ์ธํธ์ ์ด์ ๋ฒ์ ์ ๋จ์ ๋ฐ๋ ์ฐ์ ๋ง ์ง์ํ๋ฏ๋ก ๋ฐฐ์ ๋ฐ๋ ๋ฐ ํ์ฅ ์ ๋ฐ๋ ์ฐ์ ์ ์ฌ์ ํ โโ387์ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค. Pentium 4 ๋ฐ AMD x86-64 ์นฉ์๋ง ์๋ ์ต์ ๋ฒ์ ์ ๋ฐฐ์ ๋ฐ๋ ์ฐ์ ์ ์ง์ํฉ๋๋ค. ๋.
x86-32 ์ปดํ์ผ๋ฌ์ ๊ฒฝ์ฐ
-march=cpu-type
,-msse
๋๋-msse2
์ค์์น๋ฅผ ์ฌ์ฉํ์ฌ SSE ํ์ฅ์ ํ์ฑํํ๊ณ ์ด ์ต์ ์ ์ ์ฉํด์ผ ํฉ๋๋ค. x86-64 ์ปดํ์ผ๋ฌ์ ๊ฒฝ์ฐ ์ด๋ฌํ ํ์ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ต๋๋ค.๊ฒฐ๊ณผ ์ฝ๋๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์๋นํ ๋นจ๋ผ์ผ ํ๊ณ 387 ์ฝ๋์ ์์น์ ๋ถ์์ ์ฑ ๋ฌธ์ ๋ฅผ ํผํด์ผ ํ์ง๋ง ์์๊ฐ 80๋นํธ๊ฐ ๋ ๊ฒ์ผ๋ก ์์ํ๋ ์ผ๋ถ ๊ธฐ์กด ์ฝ๋๊ฐ ์์๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ x86-64 ์ปดํ์ผ๋ฌ, Darwin x86-32 ๋์์ ๋ํ ๊ธฐ๋ณธ ์ ํ์ด๋ฉฐ
-ffast-math
๊ฐ ํ์ฑํ๋ ๊ฒฝ์ฐ SSE2 ๋ช ๋ น์ด ์ธํธ๊ฐ ์๋ x86-32 ๋์์ ๋ํ ๊ธฐ๋ณธ ์ ํ์ ๋๋ค.
์์:
XEIGTSTZ < zec.in - ZLAHQR์ ์ธ๋ํ๋ก๋ก ์ธํด ์คํจํฉ๋๋ค.
์ฌํ ๋จ๊ณ: ZGET37 -> knt == 31, ZHSEQR -> ZLAHQR -> ๋ ๋ฒ์งธ 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 )
์ปดํ์ผ๋ฌ๋ .NET CLR์ ๋์์ผ๋ก ํฉ๋๋ค. ๊ทธ๊ฒ์ JIT๋ ABS(TEMP)์ ๋ํด SSE ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ , ์ด๋ ํฌ๊ธฐ์ ์ค๊ฐ ๊ณ์ฐ์์ ์ธ๋ํ๋ก๋ก ์ด์ด์ง๋๋ค. Ifort(๋ ๋ค๋ฅธ ์)๋ ์ด ์ํฉ์์ ๋ถ๋ ์์์ ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์ธ๋ํ๋ก๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค(๊ธธ์ด๊ฐ ๋ ๊ธธ๊ธฐ ๋๋ฌธ์: 80๋นํธ). ๋ฐํ์์ ์ปดํ์ผ๋ฌ/ํ๋ก์ธ์์์ ํ์ํ ์ ๋ฐ๋/์ซ์ ๋ฒ์์ ๊ด๋ จํ์ฌ LAPACK์์ ๋ฌด์์ ๊ธฐ๋ํด์ผ ํ๋์ง์ ๋ํ ๋ช ํํ(์ด) ๊ทธ๋ฆผ์ ์ป์ผ๋ ค๊ณ ํฉ๋๋ค.
์์ฝํ์๋ฉด:
์ณ์?
๊ธฐ๋ณธ์ ์ผ๋ก GCC๋ x86-64์์ 64๋นํธ ๋ถ๋ ๋ ์ง์คํฐ์ ๋ํ ์ฝ๋๋ง ์์ฑํ๊ณ ๋ด ์ปดํจํฐ์์๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋ ๋๋ ๋ ๊ฐ๋ฅผ ์ ์ธํ ๋ชจ๋ LAPACK ํ
์คํธ๋ฅผ ํต๊ณผํฉ๋๋ค.
GCC๋ก ์ปดํ์ผํ ๋ Netlib LAPACK ํ
์คํธ ์ค์ํธ๊ฐ ํต๊ณผํฉ๋๊น?
ํธ์ง: ํด๊ฒฐ https://github.com/Reference-LAPACK/lapack/pull/577#issuecomment -859496175
gfortran์ ๊ฒฝ์ฐ ํ ์คํธ ๋ชฉ์ ์ผ๋ก -mfpmath=sse -msse2 ํ๋๊ทธ๋ก ์ปดํ์ผํด์ผ ํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ชจ๋ ๊ณ์ฐ์ด 64๋นํธ ์ฐ์ ๋ก ์ํ๋๋๋ก ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์คํ์ง ์์ต๋๋ค.
๋๋ MacOS์ Linux ๋ชจ๋์์ GCC 11์ ์ฌ์ฉํ์ฌ -mfpmath=sse -msse2
๋ฅผ ์๋ํ์ต๋๋ค: https://github.com/weslleyspereira/lapack/actions/runs/966071530. ํด๋น ํ๋๊ทธ๊ฐ ์๋ ์ํฌํ๋ก์ ๋น๊ตํ ๋ ์ถ๊ฐ ์ค๋ฅ๋ ์์์ต๋๋ค( https://github.com/Reference-LAPACK/lapack/actions/runs/945060330). #591 ์ฐธ์กฐ
@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์ ํ ์คํธํ๊ณ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ๋จผ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ํด๊ฐ๋ฅผ ์ฆ๊ธฐ์ญ์์ค!