Lapack: LAPACK์— ๋Œ€ํ•œ ํ”„๋กœ์„ธ์„œ ์š”๊ตฌ ์‚ฌํ•ญ

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

์šฐ๋ฆฌ๋Š” 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 ์ปดํŒŒ์ผ๋Ÿฌ ์„ธํŠธ์— ์„ฑ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๊นŒ? (์œ„์˜ ๋ฌธ์ œ(๋ฐ ์œ ์‚ฌํ•œ ๋‹ค๋ฅธ ๋ฌธ์ œ)์˜ ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์— ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?)

์‚ฌ์–‘์„ ์ข€ ์ฐพ์•„๋ดค๋Š”๋ฐ ์•„์ง ์•ˆ๋‚˜์˜ค๋„ค์š”. ๋ชจ๋“  ๋งํฌ๋„ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

Question

๋ชจ๋“  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์„ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•  ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ, @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์—์„œ ๋ฌด์—‡์„ ๊ธฐ๋Œ€ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ(์–ด) ๊ทธ๋ฆผ์„ ์–ป์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด:

  • Fortran77์˜ 50๋งŒ ๋ผ์ธ์„ C#์œผ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.
  • .NET just-in-time ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ ์ฝ”๋“œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
  • ์ธํ…” ํฌํŠธ๋ž€ ์ปดํŒŒ์ผ๋Ÿฌ(ifort)๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ”๋‹๋ผ LAPACK ์ฝ”๋“œ ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๊ฒฝ์šฐ ์‚ฌ์ด์—์„œ ๊ด€์ฐฐ๋œ ์ฐจ์ด์ ์€ ์–ธ๋”ํ”Œ๋กœ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ifort์— ์˜ํ•ด 80๋น„ํŠธ ์ค‘๊ฐ„์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ณ์€?

๊ธฐ๋ณธ์ ์œผ๋กœ 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์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋จผ์ € ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํœด๊ฐ€๋ฅผ ์ฆ๊ธฐ์‹ญ์‹œ์˜ค!

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