Julia: ํ–‰๋ ฌ ๊ณฑ์…ˆ API

์— ๋งŒ๋“  2017๋…„ 09์›” 28์ผ  ยท  208์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: JuliaLang/julia

ํ˜„์žฌ, ํฌ์†Œ matmult ์ฝ”๋“œ์—๋Š” ๋‹ค์Œ ์ค„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/JuliaLang/julia/blob/056b374919e11977d5a8d57b446ad1c72f3e6b1d/base/sparse/linalg.jl#L94 -L95

์ด๊ฒƒ์€ ๋ฐ€๋„ ๋ฐฐ์—ด์— ๋Œ€ํ•ด C (BLAS gemm API)๋ฅผ ๋ฎ์–ด ์“ฐ๋Š”๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ A_mul_B*!(ฮฑ,A,B,ฮฒ,C) = ฮฑAB + ฮฒC ๋ฉ”์„œ๋“œ๋ฅผ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๊ทธ๋ž˜์š”? (๊ทธ๊ฒƒ์€ ๋˜ํ•œ ๋‘ API๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ๊ฒƒ, ์ฆ‰๋Š” ๊ณ„์† A_mul_B*!(C,A,B) ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •์˜ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค ๋ฐฉ๋ฒ•, A_mul_B*!(C,A,B) = A_mul_B*!(1,A,B,0,C) .)

๊ฐœ์ธ์ ์œผ๋กœ ๋ชจ๋“  ๋ฐฐ์—ด ์œ ํ˜•์— ๋Œ€ํ•ด gemm API๋ฅผ ์ •์˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค (์ด๊ฒƒ์€ ๋‹ค๋ฅธ ๊ณณ ์—์„œ ํ‘œํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค). ๊ณ ๋ฐ€๋„ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ gemm et al์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๊ฐ„๋‹จ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ํฌ์†Œ ์‚ฌ๋ก€๊ฐ€ ์ด๋ฏธ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์‹ค์ œ ์ˆ˜์ •์€ ฮฑ ๋ฐ ฮฒ ์ธ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ˆœ์ˆ˜ํ•œ julia generic matmult ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ชจ๋“  ์œ ํ˜•์˜ ๋ฐฐ์—ด / ๋ฒˆํ˜ธ์—์„œ ์ž‘๋™ํ•˜๋Š” ์ผ๋ฐ˜ ์ฝ”๋“œ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ํ˜„์žฌ bigfloats ๋ฐ ํฌ์†Œ ๋ฐฐ์—ด๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” expm์˜ ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„ ( _generic_matmatmult! ์ˆ˜์ • ํ•œ ํ›„)์ด ์žˆ์Šต๋‹ˆ๋‹ค.

linear algebra

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

์ง€๊ธˆ๋ถ€ํ„ฐ 10 ์ผ์˜ ๊ธฐํ•œ์„๋‘๊ณ  ๋‹จ์ผ ์Šน์ธ ํˆฌํ‘œ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์Šน์ธ ํˆฌํ‘œ๋Š” ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ† ๋ก ์„ ๊ณ„์†ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์„ ํ˜ธ๋˜๋Š” ๋ชจ๋“  ์˜ต์…˜์— ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์†๋˜๋Š” ํ† ๋ก ๋ณด๋‹ค ์ง€๊ธˆ ๊ฐ€์žฅ ์„ ํ˜ธํ•˜์ง€ ์•Š๋Š” ์ด๋ฆ„์„ ๊ฐ–๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์€ ์„ธ ๊ฐ€์ง€ ๋ชจ๋‘์— ํˆฌํ‘œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜์ด ๊ด‘๋ฒ”์œ„ํ•œ ์Šน์ธ์„๋ฐ›์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ํˆฌํ‘œ ๊ณ„ํš ์ž์ฒด๊ฐ€ ๊ด‘๋ฒ”์œ„ํ•œ ์Šน์ธ์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ๋…ผ์˜๋ฅผ ๊ณ„์†ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์Šน์ธ ๋œ ์˜ต์…˜์ด ๊ฑฐ์˜ ๊ฐ™์€ ๊ฒฝ์šฐ @tkf ๊ฐ€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค (PR ์ž‘์„ฑ์ž์˜ ๊ถŒํ•œ).

+1 :์ด ํˆฌํ‘œ ๊ณ„ํš์— ๋™์˜ํ•˜๋ฉฐ ์Šน์ธ ํˆฌํ‘œ๋ฅผํ–ˆ์Šต๋‹ˆ๋‹ค.
-1 :์ด ํˆฌํ‘œ ๋ฐฉ์‹์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ์ค‘์š”ํ•œ ์‚ฌ๋žŒ๋“ค์ด์ด ์˜ต์…˜์„ ์„ ํƒํ•˜๋ฉด ํˆฌํ‘œ๋Š” ์˜๋ฌธ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Heart : mul! ๊ฐ€ ๊ณ„์† ํ† ๋ก ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.
๋กœ์ผ“ : muladd! ์ด ๊ณ„์†๋˜๋Š” ํ† ๋ก ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.
๋งŒ์„ธ : addmul! ์ด ๊ณ„์† ํ† ๋ก ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” 75 %์˜ ์Šน์ธ๊ณผ 5 ๋ช…์ด ๋ฐ˜๋“œ์‹œ ์ •์กฑ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค๊ณ  ์ž ์ •์ ์œผ๋กœ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค (์ฆ‰, ์ „์ฒด ํˆฌํ‘œ ์ ˆ์ฐจ์— ๋Œ€ํ•œ ์˜๊ฒฌ ๋ถˆ์ผ์น˜๋ฅผ ํฌํ•จํ•˜์—ฌ ์ „ํ˜€ ํˆฌํ‘œ ํ•œ ์‚ฌ๋žŒ์˜ 75 %, ์šฐ์Šน ์˜ต์…˜์— ๋Œ€ํ•ด ์ตœ์†Œ 5 ๋ช…์ด ์Šน์ธ ํ•œ ๊ฒฝ์šฐ, ์ฐธ์—ฌ๋„๊ฐ€ ๋‚ฎ์€ ๊ฒฝ์šฐ) , 5/6 ๋˜๋Š” 6/8์€ ์ฟผ๋Ÿผ์„ ๋งŒ๋“ค์ง€ ๋งŒ ๋งŒ์žฅ์ผ์น˜์˜ 4/4๋Š” ์‹คํŒจ๋กœ ๊ฐ„์ฃผ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

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

Ref. # 9930, # 20053, # 23552. ๋ฒ ์ŠคํŠธ!

์ฐธ์กฐ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” API ๊ฐœํŽธ๋ณด๋‹ค gemm ์Šคํƒ€์ผ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋” ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ # 9930๊ณผ ๋„ˆ๋ฌด ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘์ ์œผ๋กœ _generic_matmatmul! ์— gemm API๊ฐ€์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ง€์›์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ ๋ฉ”์„œ๋“œ๋Š” ฮฑ=1 ๋ฐ ฮฒ=0 ํ•˜์—ฌ ๊ตฌํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋‹นํžˆ ๊ฐ„๋‹จํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฉฐ ์ˆœ์ „ํžˆ ๊ฐ€์‚ฐ / ๋น„ ๋ธŒ๋ ˆ์ดํ‚น์ž…๋‹ˆ๋‹ค. PR์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„๋งˆ๋„์ด ๋ฒ„์ „ ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค (๊ทธ ๋ฒ„์ „์—์„œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ํŠธ๋žœ์Šค ํฌ์ฆˆ๋ฅผ ์ž˜๋ผ ๋ƒˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

์˜ˆ. ์ข‹์€ ์‹œ์ž‘์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ธ์ˆ˜์˜ ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜๋Š” BLAS ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ๋” ์ž์—ฐ ์Šค๋Ÿฝ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์ถœ๋ ฅ ์ธ์ˆ˜๋ฅผ ๋จผ์ € ๊ฐ–๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ์ผ๊ด€ ์ ์ด๋ฉฐ ํ˜„์žฌ์˜ ์„ธ ์ธ์ˆ˜ A_mul_B! ์˜ ๊ฒฝ์šฐ์ด๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฏธ ์ง€์ ํ–ˆ๋“ฏ์ด 3 ๊ฐœ ์ธ์ˆ˜ ๋ฒ„์ „์€ ฮฑ=1 ๋ฐ ฮฒ=0 ๋ฐ ๊ธฐ๋ณธ๊ฐ’ ์ธ์ˆ˜๊ฐ€ ๋งˆ์ง€๋ง‰ ์ธ 5 ๊ฐœ ์ธ์ˆ˜ ๋ฒ„์ „์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก ์ด๋ฅผ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ๊ธฐ๋ณธ๊ฐ’ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

์™œ ์ผ๋ฐ˜์ ์ธ gemm ํ•จ์ˆ˜๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์˜ˆ. ์ข‹์€ ์‹œ์ž‘์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ธ์ˆ˜์˜ ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜๋Š” BLAS ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ๋” ์ž์—ฐ ์Šค๋Ÿฌ์› ๋‹ค ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์ถœ๋ ฅ ์ธ์ˆ˜๋ฅผ ๋จผ์ € ๊ฐ–๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ์ผ๊ด€ ์ ์ด๋ฉฐ ํ˜„์žฌ์˜ 3 ๊ฐœ ์ธ์ˆ˜ A_mul_B!์˜ ๊ฒฝ์šฐ์ด๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฏธ ์ง€์ ํ–ˆ๋“ฏ์ด 3 ๊ฐœ ์ธ์ˆ˜ ๋ฒ„์ „์€ ฮฑ = 1 ๋ฐ ฮฒ = 0 ์ธ 5 ๊ฐœ ์ธ์ˆ˜ ๋ฒ„์ „์— ํ•ด๋‹นํ•˜๋ฉฐ ๊ธฐ๋ณธ๊ฐ’ ์ธ์ˆ˜๋Š” ๋งˆ์ง€๋ง‰์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก ์ด๋ฅผ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ๊ธฐ๋ณธ๊ฐ’ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

์ข‹์•„. # 9930์—์„œ ์‹ค์ œ ์ธ์ˆ˜ ์ˆœ์„œ ๋ฐ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ˜„์žฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋” ๋งŽ์€ ๋‹จ์ง€ ๋‹ค์„ฏ ์ธ์ˆ˜ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ํ•„์š” ์•ฝ Ax_mul_Bx!(ฮฑ,A,B,ฮฒ,C) ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ.

์™œ ์ผ๋ฐ˜์ ์ธ gemm ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์œ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์™ธ์— _generic_matmatmul! ์„ gemm! ๋กœ ๋ณ€๊ฒฝ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด, ์šฐ๋ฆฌ๋Š” mul(C,A,B,ฮฑ=1,ฮฒ=0) ๋‹จ์ผ ๋ฉ”์†Œ๋“œ์™€ ํ•จ๊ป˜ ๋””์ŠคํŒจ์น˜ ํ•  ๊ฒŒ์œผ๋ฅธ ์ „์น˜ / ์ ‘๊ทผ ์œ ํ˜•์„ ๊ฐ€์ ธ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‹ค๋ฅธ PR์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์™œ ์ผ๋ฐ˜์ ์ธ gemm ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ค„๋ฆฌ์•„์—์„œ gemm ์€ ์ž˜๋ชป๋œ ์ด๋ฆ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. BLAS์—์„œ ge ๋ถ€๋ถ„์€ ํ–‰๋ ฌ์ด ์ผ๋ฐ˜์  ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰, ํŠน๋ณ„ํ•œ ๊ตฌ์กฐ๊ฐ€์—†๊ณ , ์ฒซ ๋ฒˆ์งธ m ๋Š” ๊ณฑํ•˜๊ณ  m ๋ชฉ๋ก์€ ํ–‰๋ ฌ ์ž…๋‹ˆ๋‹ค. Julia์—์„œ ge (์ผ๋ฐ˜) ๋ถ€๋ถ„์€ ๋งˆ์ง€๋ง‰ m (๋งคํŠธ๋ฆญ์Šค)์™€ ๊ฐ™์ด ์„œ๋ช…์— ์ธ์ฝ”๋”ฉ๋˜๋ฏ€๋กœ mul! ๋ผ๊ณ  ๋ถ€๋ฅด๋ฉด๋ฉ๋‹ˆ๋‹ค.

SparseArrays.jl์˜ ํ‘œ๊ธฐ๋ฒ• mul!(ฮฑ, A, B, ฮฒ, C) ์ž…๋‹ˆ๋‹ค.

https://github.com/JuliaLang/julia/blob/160a46704fd1b349b5425f104a4ac8b323ea85af/stdlib/SparseArrays/src/linalg.jl#L32

๊ณต์‹ ๊ตฌ๋ฌธ์œผ๋กœ "์™„๋ฃŒ"? ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ mul!(C, A, B) , lmul!(A, B) ๋ฐ rmul!(A,B) ?

์ €๋Š” A , B , C ์„ (๋ฅผ) ๋‹ค๋ฅธ ์ฃผ๋ฌธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

SparseArrays.jl์˜ ํ‘œ๊ธฐ๋ฒ• mul!(ฮฑ, A, B, ฮฒ, C) ๊ฐ€ ๊ณต์‹ ๊ตฌ๋ฌธ์œผ๋กœ "finalised"์ž…๋‹ˆ๊นŒ?

์•„๋‹ˆ์˜ค๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ BLAS๋ฅผ ๋”ฐ๋ฅด๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ์ˆœ์„œ๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜ํ•™์ ์œผ๋กœ ์ž‘์„ฑ๋˜๋Š” ๋ฐฉ์‹๊ณผ ์ผ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค).ํ•˜์ง€๋งŒ ์ด์ œ๋Š” ์Šค์ผ€์ผ๋ง ์ธ์ˆ˜๋ฅผ ์„ ํƒ์ ์ธ ๋„ค ๋ฒˆ์งธ ๋ฐ ๋‹ค์„ฏ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด, ๋‹น์‹ ์€ ์˜๋ฏธ์—์„œ ์„ ํƒ์  ์ธ์ˆ˜๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

function mul!(C, A, B, ฮฑ=1, ฮฒ=0)
 ...
end

๋‹ค๋ฅธ ์˜ต์…˜์€ ์„ ํƒ์  ํ‚ค์›Œ๋“œ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค.

function mul!(C, A, B; ฮฑ=1, ฮฒ=0)
...
end

ํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด ์œ ๋‹ˆ ์ฝ”๋“œ์— ๋„ˆ๋ฌด ๋งŒ์กฑํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์œ ๋‹ˆ ์ฝ”๋“œ์— ๋งค์šฐ ๋งŒ์กฑํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ํ•ญ์ƒ ascii ์˜ต์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ด๋ฉฐ ์—ฌ๊ธฐ์„œ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„ ฮฑ ๋ฐ ฮฒ ๋˜ํ•œ BLAS๋ฅผ ์•Œ์ง€ ์•Š๋Š” ํ•œ ๋งค์šฐ ์ง๊ด€์ ์ด์ง€ ์•Š์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ ์œ„์น˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์—๋Š” ๋” ๋…ผ๋ฆฌ์  ์ธ ๋ช…๋ช…๋ฒ•์€ muladd!(A, B, C, ฮฑ=1, ฮฒ=1) ๋ฅผ ๊ณฑ์…ˆ ๊ณผ ๋ง์…ˆ ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค์–‘ํ•œ BLAS ๋ฃจํ‹ด์— ๋งคํ•‘ํ•˜๋Š” gemm ๋˜ํ•œ ์ƒ๊ธฐ์™€ ๊ฐ™์€, ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ๋ฅผ ๋“ค์–ด axpy ๊ฒฝ์šฐ A ์Šค์นผ๋ผ์ด๋‹ค.)

mul! ํ•จ์ˆ˜๋Š” ๋ชจ๋“  ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๊ฐ€ Y์— ์ €์žฅ ๋  ์ˆ˜์žˆ๋Š” ํ•œ ์ž„์˜์˜ ์ˆ˜์˜ ์ธ์ˆ˜ ( * ์ฒ˜๋Ÿผ)๋ฅผ ์ทจํ•˜๋Š” mul!(Y, A, B, ...) ์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  kwarg๋Š” ์ ์ ˆํ•œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ณฑ์…ˆ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

mul!(Y, A::AbstractVecOrMat, B:AbstractVecOrMat, ฮฑ::Number) ๋Š” ๋‘ ๊ฐœ์˜ ํ–‰๋ ฌ / ๋ฒกํ„ฐ ๋ฐ ์Šค์นผ๋ผ์˜ ๋‹ค๋ฅธ ์ˆœ์—ด์ฒ˜๋Ÿผ ๊ธฐ๋ณธ ๊ตฌํ˜„ muladd!(A, B, Y, ฮฑ=ฮฑ, ฮฒ=0) ๊ฐ–์Šต๋‹ˆ๋‹ค.

๊ณ ๋ฐ€๋„ ํ–‰๋ ฌ์— ๋Œ€ํ•ด ์ •์˜ ๋œ mul!(C, A, B, ฮฑ, ฮฒ) ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ํˆฌํ‘œ. ์ด๋ฅผ ํ†ตํ•ด ์กฐ๋ฐ€ํ•˜๊ณ  ํฌ์†Œ ํ–‰๋ ฌ์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์„ ํ˜• ์ตœ์†Œ ์ œ๊ณฑ ํŒจํ‚ค์ง€์—์„œ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์œ ํ˜• ๋ถˆ๋ฒ• ๋ณต์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ MixedModels ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ mul!(C, A, B, ฮฑ, ฮฒ) ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์•ฝ๊ฐ„์˜ ์œ ํ˜•์˜ ๋ถˆ๋ฒ• ๋ณต์ œ์— ์ฐธ์—ฌํ•˜๊ณ  ์‹ถ์€ ์œ ํ˜น์„ ๋ฐ›์•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ LinearAlgebra ์žˆ์œผ๋ฉด ํ›จ์”ฌ ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊พธ๋Ÿฌ๋ฏธ. ์ด ์ž‘์—…์— ๋Œ€ํ•œ muladd! ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๋‚˜๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹จ์ง€ mul! ๊ณผ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๊ฐ€์ ธ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‚˜๋Š” ํ˜ธ์˜์ ์ด๋‹ค. muladd! ์€ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ํ™•์‹คํžˆ ์ œ์•ˆ์— ๊ฐœ๋ฐฉ์ ์ž…๋‹ˆ๋‹ค.

๊ณฑํ•˜๊ธฐ ์ฆ๊ฐ€๋ฅผ ์œ„ํ•ด mulinc! ์ผ๊นŒ์š”?

addmul!(C, A, B, ฮฑ=1, ฮฒ=1) ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

muladd! ์•„๋‹™๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๊ทธ๊ฒƒ์„ addmul! ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์•„์ด๋””์–ด๊ฐ€ multiply ์ธ์ˆ˜๊ฐ€ ์•„๋‹Œ add ์ธ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ? ๊ณฑํ•˜๊ธฐ ์ธ์ˆ˜๋ฅผ ๋ณ€ํ˜•์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด lmul! ๋ฐ ldiv! ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์ฒซ ๋ฒˆ์งธ๊ฐ€ ์•„๋‹Œ ์š”์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ "muladd"์ˆœ์„œ (์˜ˆ : muladd!(A,B,C) )๋กœ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ฮฑ ๋ฐ ฮฒ ์ฃผ๋ฌธ์ด ๋ฌด์—‡์ธ์ง€์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์˜ต์…˜์€ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

์Šค์นผ๋ผ ฮฑ์™€ ฮฒ์˜ ์œ ํ˜•์— ๋Œ€ํ•œ ์˜ต์…˜์„ ๊ตฌํ˜„ ์ž์—๊ฒŒ ๋‚จ๊ฒจ๋‘๋ฉด ์ข‹์ง€ ์•Š์„๊นŒ์š”? ์ตœ์ข… ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์„คํƒ•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์Šต๋‹ˆ๋‹ค.

ฮฑ , ฮฒ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ mul!(C, A, B, ฮฑ, ฮฒ) ์— ์ •์‚ฐํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฒ„์ „์€ https://github.com/JuliaLang/julia/blob/b8ca1a499ff4044b9cb1ba3881d8c6fbb1f3c03b/stdlib/SparseArrays/src/linalg.jl#L32 -L50์—์„œ ์‚ฌ์šฉํ•˜๊ณ 

๊ฐ์‚ฌ! ๊ทธ๊ฒƒ์ด ๋ฌธ์„œํ™”๋˜์–ด ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ฮฑ , ฮฒ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ mul!(C, A, B, ฮฑ, ฮฒ) ์— ์ •์‚ฐํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

SparseArrays๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์–ด๋””์—์„œ๋‚˜ ๋…ผ์˜ ๋œ ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค๋ฉด์—์„œ muladd! ์ด๋ฆ„์€ ๊ณฑ์…ˆ์— ์ด์–ด ๋”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ž์—ฐ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ฮฑ ๋ฐ ฮฒ์˜ ๊ธฐ๋ณธ๊ฐ’ ์ธ muladd!(C, A, B, ฮฑ=1, ฮฒ=0) (ฮฒ์˜ ๊ธฐ๋ณธ๊ฐ’์€ 1์ด ์•„๋‹ˆ๋ผ 0 ์ž„)์€ ๋‹ค์‹œ mul!(C, A, B) .

์ด๊ฒƒ์„ mul! ๋˜๋Š” muladd! ํ˜ธ์ถœํ• ์ง€ ์—ฌ๋ถ€๋Š” pedantry ๋Œ€ ์ผ๊ด€์„ฑ์˜ ๊ฒฝ์šฐ๋กœ ๋ณด์ด๋ฉฐ SparseArrays์˜ ๊ธฐ์กด ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ mul! ์ฃผ์žฅ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” Oscar Wilde ์ธ์šฉ๊ตฌ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ผ๊ด€์„ฑ์„ ์ฃผ์žฅํ•˜๋Š” ํ˜ธ๊ธฐ์‹ฌ ๋งŽ์€ ๊ฒฝ์šฐ์—์žˆ๋‹ค. "์ผ๊ด€์„ฑ์€ ์ƒ์ƒ๋ ฅ์ด์—†๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๋งˆ์ง€๋ง‰ ํ”ผ๋‚œ์ฒ˜์ด๋‹ค."

์–ด๋–ค๋ฉด์—์„œ muladd! ์ด๋ฆ„์€ ๊ณฑ์…ˆ์— ์ด์–ด ๋”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ž์—ฐ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ฮฑ ๋ฐ ฮฒ์˜ ๊ธฐ๋ณธ๊ฐ’ ์ธ muladd!(C, A, B, ฮฑ=1, ฮฒ=0) (ฮฒ์˜ ๊ธฐ๋ณธ๊ฐ’์€ 1์ด ์•„๋‹ˆ๋ผ 0 ์ž„)์€ ๋‹ค์‹œ mul!(C, A, B) .

C ์— Infs ๋˜๋Š” NaN์ด ํฌํ•จ๋˜์–ด์žˆ์„ ๋•Œ ํฅ๋ฏธ๋กœ์šด ์˜ˆ์™ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ ฮฒ==0 ์ด๋ฉด ๊ฒฐ๊ณผ๋Š” ์—ฌ์ „ํžˆ NaN์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. BLAS์™€ ํฌ์†Œ ํ–‰๋ ฌ ์ฝ”๋“œ ๊ฐ€ ฮฒ==0 ๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ํ™•์ธํ•œ ๋‹ค์Œ 0์œผ๋กœ ๋Œ€์ฒดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

true ๋ฐ false ๋Š” true*x ๊ฐ€ ํ•ญ์ƒ x ๋ผ๋Š” ์ ์—์„œ true ๋ฐ false ๊ฐ€ ๊ฐ๊ฐ "strong"1๊ณผ 0์ด๋ฏ€๋กœ ฮฑ=true, ฮฒ=false ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ–๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค x ๋ฐ false*x ๋Š” ํ•ญ์ƒ zero(x) ์ž…๋‹ˆ๋‹ค.

lmul! ์—๋„ ์˜ˆ์™ธ์  ์ธ ๋™์ž‘์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค : https://github.com/JuliaLang/julia/issues/28972

true ๋ฐ false ๋Š” true*x ๊ฐ€ ํ•ญ์ƒ x ์ด๊ณ  false*x ๊ฐ€ ํ•ญ์ƒ zero(x) ๋ผ๋Š” ์ ์—์„œ ๊ฐ๊ฐ "๊ฐ•๋ ฅํ•œ"1๊ณผ 0์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ชฐ๋ž๋‹ค! :

julia> false*NaN
0.0

FWIW,์ด ์ž‘์—…์— ๋Œ€ํ•œ LazyArrays.jl ๊ตฌ๋ฌธ์˜ ๊ฐ€๋…์„ฑ์— ๋งค์šฐ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

y .= ฮฑ .* Mul(A,x) .+ ฮฒ .* y

BLAS ํ˜ธํ™˜ ๋ฐฐ์—ด (banded ๋ฐ strided)์˜ ๊ฒฝ์šฐ ๋ฐฐํ›„์—์„œ mul!(y, A, x, ฮฑ, ฮฒ) ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ชฐ๋ž๋‹ค!

๊ทธ๊ฒƒ์€ im = Complex(false, true) ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์š”์†Œ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

SparseArrays๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์–ด๋””์—์„œ๋‚˜ ๋…ผ์˜ ๋œ ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ https://github.com/JuliaLang/julia/issues/23919#issuecomment -365463941์—์„œ ๋…ผ์˜๋˜์—ˆ์œผ๋ฉฐ ์ด์˜์—†์ด https://github.com/JuliaLang/julia/pull/26117 ์—์„œ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ€๋„๊ฐ€ ๋†’์€ ๊ฒฝ์šฐ์—๋Š” ฮฑ,ฮฒ ๋ฒ„์ „์ด ์—†์œผ๋ฏ€๋กœ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๊ฒฐ์ •์ด ์ฆ‰๊ฐ์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์œ ์ผํ•œ ์œ„์น˜๋Š” SparseArrays ์ž…๋‹ˆ๋‹ค.

LinearAlgebra.BLAS.gemm! ์–ด๋–ป์Šต๋‹ˆ๊นŒ? 5 ์ง„ mul! ๋กœ ๋ž˜ํ•‘๋˜์–ด์•ผํ•˜์ง€ ์•Š๋‚˜์š”?

๊ทธ๋ž˜์•ผํ•˜์ง€๋งŒ ์•„์ง ์•„๋ฌด๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. matmul.jl ์—๋Š” ๋งŽ์€ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ # 23919 (์ฝ”๋ฉ˜ํŠธ) ์—์„œ ๋…ผ์˜๋˜์—ˆ์œผ๋ฉฐ ์ด์˜์—†์ด # 26117์—์„œ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฑด ๋‚ด ๋ฐ˜๋Œ€๋ผ๊ณ  ์ƒ๊ฐํ•ด ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

์™œ ๋‹ค๋ฅธ ์ด๋ฆ„์ผ๊นŒ์š”? ์กฐ๋ฐ€ ํ•œ ๊ฒฝ์šฐ์™€ ํฌ์†Œ ํ•œ ๊ฒฝ์šฐ ๋ชจ๋‘ ๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ณฑ์…ˆ๊ณผ ๋ง์…ˆ์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ•จ์ˆ˜์— ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋ฉด mul!(C,A,B) = dgemm(C,A,B,1,0) ๋ฐ muladd!(C,A,B,ฮฑ, ฮฒ) = dgemm(C,A,B,ฮฑ, ฮฒ) ๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณด๋Š” ์œ ์ผํ•œ ์žฅ์ ์€ ์‹ค์ œ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ„ํ• ํ•˜๊ณ  C = A*B ์ผ€์ด์Šค์—์„œ if ฮฒ==0 ํ˜ธ์ถœ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ, ๋‚˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ matmul.jl ์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด # 29634์—์„œ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ์„œ๋ช…์ด ๊ฒฐ์ •๋  ๋•Œ๊นŒ์ง€ ๋๋‚ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค :)

muladd! ์˜ ์žฅ์ ์€ ๊ธฐ๋ณธ ฮฑ = ฮฒ = true (์›๋ž˜ ์ œ์•ˆ https์—์„œ ์–ธ๊ธ‰ ํ•œ๋Œ€๋กœ)๋กœ ์‚ผํ•ญ muladd!(A, B, C) (๋˜๋Š” muladd!(C, A, B) ?)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. //github.com/JuliaLang/julia/issues/23919#issuecomment-402953987). ๋ฐฉ๋ฒ• muladd!(A, B, C) ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค muladd ์— ๋Œ€ํ•ด Number ๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๋ฏธ ์•Œ๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ ํŠนํžˆ ๋” ์ž์—ฐ์Šค๋Ÿฌ์šด ์ด๋ฆ„์„ ์ถ”์ธก ์žˆ๋„๋ก์ด์•ผ muladd .

@andreasnoack ์ด์ „ ๋…ผ์˜๋Š” ๋ฉ”์†Œ๋“œ ์„œ๋ช…์— ๋Œ€ํ•œ ๊ฒƒ์ด๋ฉฐ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜๋ณด๋‹ค ์œ„์น˜ ์ธ์ˆ˜๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. muladd! ๋ผ๋Š” ์ด๋ฆ„์— ๋Œ€ํ•ด ์ด์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ( SparseArrays ์— 5-ary mul! ์˜ ์กด์žฌ๋Š” ํ•˜๋‚˜ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ž˜ํผ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

mul! ๋ฐ muladd! ฮฑ ๋ฐ ฮฒ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ž๊ฐ€ ํ›„์ž ์ผ ๋•Œ ์ค‘๋ณต ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ add ๋ถ€๋ถ„์€ BLAS์— ์˜ํ•ด ํ‘œ์ค€ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. muladd! ๋Œ€ํ•œ ์‹ ๋ขฐํ•  ์ˆ˜์žˆ๋Š” ์ผ๋ฐ˜ ์„ ํ˜• ๋Œ€์ˆ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ƒ๊ฐํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋“ฃ๊ณ  ์‹ถ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ mul! ์˜ ๋…ผ์˜์™€ ๋ณ„๋„๋กœ false ์˜ strong-zero ์†์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. IMO ฮฒ์˜ 0 ๊ฐ’์€ BLAS์—์„œ์™€ ๊ฐ™์ด ํ˜„์žฌ 5 ๊ฐœ์˜ ์ธ์ˆ˜ mul! ๋ฉ”์„œ๋“œ ์—์„œ์ฒ˜๋Ÿผ ๊ฐ•๋ ฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰,์ด ๋™์ž‘์€ ฮฒ ์œ ํ˜•์ด ์•„๋‹ˆ๋ผ mul! ์˜ ๊ฒฐ๊ณผ ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์•ˆ์€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ : mul!(Matrix{Float64}, Matrix{Float64}, Matrix{Float64}, 1.0, 0.0) ~ could ~ BLAS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

BLAS๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ float์— ๋Œ€ํ•œ _requiring_ ๊ฐ•๋ ฅํ•œ ์ œ๋กœ ๋™์ž‘์€ ๋ชจ๋“  ๊ตฌํ˜„์— 0์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„๊ธฐ๊ฐ€ ํ•„์š”ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

muladd! ๋Œ€ํ•œ ์‹ ๋ขฐํ•  ์ˆ˜์žˆ๋Š” ์ผ๋ฐ˜ ์„ ํ˜• ๋Œ€์ˆ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด

์ด๊ฒƒ์— ์˜ํ•˜์—ฌ @andreasnoack, ๋‚˜๋Š” ๋‹น์‹ ์ด "์— ๋Œ€ํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ _three์„-argument_ ์˜๋ฏธ ๊ฐ€์ • muladd! "๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹น์‹ ์€ ๋‹ค์„ฏ ์ธ์ˆ˜ ํฌํ•จ ๋™์˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— mul! ?

ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ muladd!(A, B, C) ๊ฐ€ ์œ ์šฉํ•œ ์˜ˆ๋ฅผ ์ƒ๊ฐํ•ด ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "์ž‘์€ ์„ธ๊ณ„"๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋  ํ–‰๋ ฌ๊ณผ ํฌ์†Œ ํ–‰๋ ฌ์˜ "์ง€์—ฐ"ํ•ฉ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

A :: SparseMatrixCSC
B :: BandedMatrix
x :: Vector  # input
y :: Vector  # output

# Compute `y .= (A .+ B) * x` efficiently:
fill!(y, 0)
muladd!(x, A, y)  # y .+= A * x
muladd!(x, B, y)  # y .+= B * x

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‹จ์ˆœํžˆ ๋‚ด ์‚ฌ์šฉ์„ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ๊ฐ์Œ€ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ๊ธฐ์— true s๋ฅผ ์ˆ˜๋™์œผ๋กœ ์“ฐ๋Š” ๊ฒƒ์„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 5 ๊ฐœ ์ธ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์•ˆ์ •์ ์ธ ๋ฌธ์„œํ™” ๋œ API๋กœ ๊ฐ–๋Š” ๊ฒƒ์ด ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.

์š”์ ์œผ๋กœ ๋Œ์•„ ๊ฐ€๊ธฐ :

mul! ๋ฐ muladd! ฮฑ ๋ฐ ฮฒ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ž๊ฐ€ ํ›„์ž ์ผ ๋•Œ ์ค‘๋ณต ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ถœ๋ ฅ ๋ฐฐ์—ด์˜ "๊ธฐ๋ณธ๊ฐ’"์ด ์ ์ ˆํ•˜๊ฒŒ ์ดˆ๊ธฐํ™” ๋œ mul! ์ธก๋ฉด์—์„œ * ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Base ๋ฐ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ด๋Ÿฌํ•œ "๋ฐ”๋กœ ๊ฐ€๊ธฐ"์˜ˆ์ œ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. mul! ์ด muladd! ์˜ ๋ฐ”๋กœ ๊ฐ€๊ธฐ ์ผ์ง€๋ผ๋„ mul! ์™€ muladd! ์„ ๋ชจ๋‘ ๊ฐ–๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚œ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์šฐ๋ฆฌ์˜ ๊ฐ•ํ•œ ์ œ๋กœ ์†์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์›ํ•ฉ๋‹ˆ๋‹ค false ๋…ผ์˜ ๋ณ„๋„๋กœ mul!

๋จผ์ € ๊ณฑํ•˜๊ธฐ-๋”ํ•˜๊ธฐ์˜ 5 ๊ฐœ ์ธ์ˆ˜ ๋ฒ„์ „์˜ ์ด๋ฆ„์„ ๋…ผ์˜ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ๊ฑด์„ค์ ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค ( mul! ๋Œ€ muladd! ).

ํ–‰๋ ฌ๊ณผ ์ˆซ์ž์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•ด muladd ์ด ํ•„์š”ํ•œ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ ์ €๋Š” ์ž˜ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆซ์ž ๋ฒ„์ „์€ ๋Š๋‚Œํ‘œ๊ฐ€์—†๋Š” muladd ์ด๋ฏ€๋กœ ์ œ๊ฐ€ ์š”์ฒญํ•œ ๋‚ด์šฉ์ด ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mul!(y, A, x, 1, 1)
mul!(y, B, x, 1, 1)

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์—ฌ์ „ํžˆ muladd! ์˜ ํ•„์š”์„ฑ์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ๊ฐ€ ๋„ˆ๋ฌด ํ”ํ•ด์„œ 1, 1 ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ์žฅํ™ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋‚˜ ์ถœ๋ ฅ ๋ฐฐ์—ด์˜ "๊ธฐ๋ณธ๊ฐ’"์ด ์ ์ ˆํ•˜๊ฒŒ ์ดˆ๊ธฐํ™” ๋œ mul! ์ธก๋ฉด์—์„œ * ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Base ๋ฐ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ด๋Ÿฌํ•œ "๋ฐ”๋กœ ๊ฐ€๊ธฐ"์˜ˆ์ œ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์–ป์ง€ ๋ชปํ•œ๋‹ค. ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์ง€๋ฆ„๊ธธ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์—ฌ์ „ํžˆ muladd! ์˜ ํ•„์š”์„ฑ์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ๊ฐ€ ๋„ˆ๋ฌด ํ”ํ•ด์„œ 1, 1 ๊ฒƒ์ด ๋„ˆ๋ฌด ์žฅํ™ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๋‚˜๋Š” muladd! ๋˜ํ•œ ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋ฌด์—‡์„ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๋” ์„ค๋ช… ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (์•„๋งˆ๋„ addmul! ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค).

์ด๋ฆ„ muladd! ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ์„ , ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์œ„ํ•ด ๊ธฐ๋Šฅ์„ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ด์ฐจ์ ์œผ๋กœ muladd! / addmul! ๋Œ€์‹  mul! ๋ฅผ ๋น„์ถ”์ฒœํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ๊ฐ€ ๋„ˆ๋ฌด ํ”ํ•ด์„œ 1, 1์„ ์“ฐ๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ์žฅํ™ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”. ๊ณต์šฉ API ์ธ ํ•œ 5 ๊ฐœ์˜ ์ธ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ ์„ธ ๊ฐ€์ง€ ์ธ์ˆ˜ ๋ฒ„์ „์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค (๋‹น์‹ ์˜ ์š”์ฒญ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค).

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์ง€๋ฆ„๊ธธ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

https://github.com/JuliaLang/julia/blob/f068f21d6099632bd5543ad065d5de96943c9181/stdlib/LinearAlgebra/src/matmul.jl#L140 -L143

์—ฌ๊ธฐ์— ์ •์˜ ๋œ * ๋Š” mul! ์˜ ๋ฐ”๋กœ ๊ฐ€๊ธฐ๋กœ ๊ฐ„์ฃผ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ "๋‹จ์ง€" mul! ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด mul! addmul! ๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ muladd! / addmul! ๋กœ ๋‘์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์œ ์‚ฌํ•œ "๋ฐ”๋กœ ๊ฐ€๊ธฐ"๋กœ ์ •์˜ ๋œ rmul! ๋ฐ lmul! ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/JuliaLang/julia/blob/f068f21d6099632bd5543ad065d5de96943c9181/stdlib/LinearAlgebra/src/triangular.jl#L478 -L479

mul! ์ง€์› ์ค‘๋‹จ

๋‚˜๋Š” ํ† ๋ก ์ด ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค ์ถ”๊ฐ€์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ API๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด mul! ๋ฅผ ์ง€์› ์ค‘๋‹จํ•ด์•ผํ•œ๋‹ค๋ฉด ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” ์ฃผ์š” ์ฃผ์žฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ฐœ๋…์ ์œผ๋กœ 5- ์ธ์ˆ˜ ํ˜•์‹์€ ๋‹จ์ˆœํžˆ "๊ณฑํ•˜๊ธฐ"์ด์ƒ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ์ด๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ mul!(C,A,B,1,1) ๋˜๋Š” mul!(C,A,B,true,true) ๋Œ€์‹  addmul!(C, A, B) ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์ •์˜ ๋œ * ๋Š” mul! ์˜ ๋ฐ”๋กœ ๊ฐ€๊ธฐ๋กœ ๊ฐ„์ฃผ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ "๋‹จ์ง€" mul! ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ์™œ ๋ฉ€์„ ๋‘์ง€ ๋งˆ์‹ญ์‹œ์˜ค! ๊ธฐ๋ณธ๊ฐ’์ด์žˆ๋Š” muladd! / addmul! ์ž…๋‹ˆ๊นŒ?

* ๋Š” ํ–‰๋ ฌ์„ ๊ณฑํ•˜๋Š” ๊ธฐ๋ณธ ๋ฐฉ๋ฒ•์ด๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์— ๋น„ํ•ด muladd! ๋Š” ์‚ฌ์šฉ๋Ÿ‰์ด * ์— ๊ฐ€๊น์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ธฐ์กด ์—ฐ์‚ฐ์ž ์ธ ๋ฐ˜๋ฉด muladd! / addmul! ๋Š” ์ƒˆ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

rmul! ๋ฐ lmul! ์€ ์ผ๋ฐ˜์ ์œผ๋กœ out-of-place mul! ๋ฉ”์„œ๋“œ์˜ ๊ธฐ๋ณธ๊ฐ’ ๋ฒ„์ „์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ํŒจํ„ด์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

Simon์€ ์œ„์˜ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์ด์ ์„ ๋ฉ‹์ง€๊ฒŒ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด๋ฆ„ ๋ณ€๊ฒฝ์˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ( mul! ์ง€์› ์ค‘๋‹จ์„ ์˜๋ฏธ ํ•จ)์„ ์ •๋‹นํ™” ํ• ๋งŒํผ ์ด์ ์ด ์ถฉ๋ถ„ํžˆ ํฐ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฆ„ ๋ณ€๊ฒฝ์ด ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ๋งํ•  ๋•Œ API๊ฐ€ ์™„์ „ํžˆ ๊ณต๊ฐœ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ณ ๋ ค ํ–ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ Julia์˜ ๋ฌธ์„œ์— ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” LazyArrays.jl (๋ฐ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€?)์ด ์ด๋ฏธ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋งน๋ชฉ์ ์œผ๋กœ semver๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋งŒํผ ๊ณต๊ฐœ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

mul! ๋Š” LinearAlgebra ์—์„œ ๋‚ด๋ณด๋‚ด์ง€๊ณ  ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ์ด ์‹œ์ ์—์„œ ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. A_mul_B! ๊ฐ€ mul! ๊ฐ€๋˜์—ˆ์„ ๋•Œ ๋˜๋Š” ์ ์–ด๋„ 0.7 ์ด์ „์—์ด ํ† ๋ก ์„ํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ ๋ถ€๋„๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์ข‹์€์‹œ๊ธฐ ์˜€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ mul! ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  stdlibs๋ฅผ ๋ณ„๋„๋กœ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜์žˆ์„ ๋•Œ LinearAlgebra v2.0 ์˜ ์ด๋ฆ„์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

LazyArrays.jl์€ ๋งŽ์€ ์œ ํ˜•์˜ ํ–‰๋ ฌ์— ๋Œ€ํ•ด ์œ ์—ฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— mul! ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  StridedArray s๋กœ ์žฌ์ •์˜ ํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ ์†๋„ ์ €ํ•˜ ๋ฒ„๊ทธ๋ฅผ ์œ ๋ฐœ ํ•จ). ์–‘์‹์˜ ๋Œ€์ฒด ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

y .= Mul(A, x)

๋‚ด๊ฐ€ ์ฐพ์€ ๊ฒƒ์ด ๋” ์„ค๋ช… ์ ์ž…๋‹ˆ๋‹ค. 5 ๊ฐ€์ง€ ์ธ์ˆ˜ ์•„๋‚ ๋กœ๊ทธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

y .= a .* Mul(A, x) .+ b .* y

๋‚˜๋Š” mul! ๋ฅผ ๋น„์ถ”์ฒœํ•˜๊ณ  LinearAlgebra.jl์—์„œ LazyArrays.jl ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ์ฐฌ์„ฑ ํ•˜๊ฒ ์ง€๋งŒ, ๊ทธ๊ฒƒ์€ ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

LowRankApprox.jl์€ mul! ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ LazyArrays.jl ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„๊ทธ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™•์ธ. ์ €๋Š” ์ œ์•ˆ์ด ๋‘ ๊ฐœ ๋ฐ–์— ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถ„๋ช…ํžˆ ๋Œ€๋žต ์„ธ ๊ฐ€์ง€ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? :

  1. 3 ์ธ์ˆ˜ ๋ฐ 5 ์ธ์ˆ˜ mul!
  2. 3 ์ธ์ˆ˜ ๋ฐ 5 ์ธ์ˆ˜ muladd!
  3. 3 ์ธ์ˆ˜ mul! ๋ฐ 5 ์ธ์ˆ˜ muladd!

( muladd! ๋Š” addmul! ๋ผ๊ณ ๋„ ํ•จ)

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ 1๊ณผ 3์„ ๋น„๊ตํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ์ด์ œ ๋‚ด ์ดํ•ด๋Š” @andreasnoack ์ด 1๊ณผ 2๋ฅผ ๋น„๊ตํ•˜๊ณ  ์žˆ๋‹ค๋Š”

3 ์ธ์ˆ˜ mul! ๋Š” ๊ณต์šฉ API์ด๊ณ  ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— 2๋Š” ์ „ํ˜€ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. "API๊ฐ€ ์™„์ „ํžˆ ๊ณต๊ฐœ๋˜์ง€ ์•Š๋Š”๋‹ค"๋Š” ์˜๋ฏธ๋Š” 5 ๊ฐœ ์ธ์ˆ˜ mul! ๊ฐ€ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ๋‚ด ๊ณ„ํš์€ mul! (3 arg ๋ฐ ๊ฐ€๋Šฅํ•˜๋ฉด 4 arg ํ˜•์‹)์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค. 3 arg mul! ๋ฐ addmul! ์ด ๋‹ค๋ฅธ ๋™์ž‘์„ ๊ฐ€์งˆ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, addmul!(C, A, B, ฮฑ, ฮฒ) ์ฃผ์–ด์ง€๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด๋ฉ๋‹ˆ๋‹ค.

mul!(C, A, B) = addmul!(C, A, B, 1, 0)
mul!(C, A, B, ฮฑ) = addmul!(C, A, B, ฮฑ, 0)
addmul!(C, A, B) = addmul!(C, A, B, 1, 1)
addmul!(C, A, B, ฮฑ) = addmul!(C, A, B, ฮฑ, 1)

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 4 ์ธ์ˆ˜ mul! ๋ฐ addmul! ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  5 ์ธ์ˆ˜ addmul! ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

addmul!(C, A, B, ฮฑ, ฮฒ) = addmul!(C .= ฮฒ .* C, A, B, ฮฑ)

์ถฉ๋Œ!

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 4-arg mul! ๊ทธ๋ฆฌ๊ณ  addmul! ๋ณ„๋„๋กœ ์ •์˜ํ•˜๊ณ  5-arg addmul! ๊ฐ™์ด:
addmul!(C, A, B, ฮฑ, ฮฒ) = addmul!(C .= ฮฒ .* C, A, B, ฮฑ)

๋ฐ”๋กœ ์ตœ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š๋Š” ์š”์ ์€ C ์˜ ์š”์†Œ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ๋ฐฉ๋ฌธํ•˜๋ฉด๋˜๋ฏ€๋กœ ํฐ ํ–‰๋ ฌ์˜ ๊ฒฝ์šฐ ํ™•์‹คํžˆ ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ 5-arg addmul! ์™€ 4-arg mul! ๋ฐ addmul! ๋ณ„๋„๋กœ ์ •์˜ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋” ๊ธธ์–ด์งˆ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ €๋Š” LinearAlgebra์˜ _generic_matmatmul! ๊ตฌํ˜„์„ ์ˆ˜์ •ํ•˜์—ฌ LazyArrays์—์„œ 5 ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ์ทจํ–ˆ์Šต๋‹ˆ๋‹ค : https://github.com/JuliaArrays/LazyArrays.jl/blob/8a50250fc6cf3f2402758088227769cf2de2e053/src/linalg/blasmul.jl#L70

๋‹ค์Œ์„ ํ†ตํ•ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

materialize!(MulAdd(ฮฑ, A, b, ฮฒ, c)) 

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ์ฝ”๋“œ ( tiled_blasmul! )๋Š” LinearAlgebra๋กœ ๋‹ค์‹œ ๋ฒˆ์—ญํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์„ธ์Šค์˜ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์ž‘์—…์ค‘์ธ ๊ฒƒ๋“ค์€ in-place mul + add๊ฐ€์žˆ๋Š” ํ†ตํ•ฉ ํ–‰๋ ฌ ๊ณฑ์…ˆ API์˜ ์ด์ ์„ ์–ป์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Strided.jl ์˜ ์ตœ์‹  ๋ฒ„์ „์€ ์ด์ œ 5 ๊ฐœ์˜ ์ธ์ˆ˜ mul!(C,A,B,ฮฑ,ฮฒ) ํ•˜๊ณ  ๊ฐ€๋Šฅํ•˜๋ฉด BLAS๋กœ ๋””์ŠคํŒจ์น˜ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ž์ฒด (๋‹ค์ค‘ ์Šค๋ ˆ๋“œ) ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@Jutho ํ›Œ๋ฅญํ•œ ํŒจํ‚ค์ง€! ๋‹ค์Œ ๋‹จ๊ณ„์— ๋Œ€ํ•œ ๋กœ๋“œ๋งต์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ณ„ํš์ด ๊ฒฐ๊ตญ LinearAlgebra์™€ ๋ณ‘ํ•ฉ ๋  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์ด๊ฒƒ์€ ๋‚ด ์˜๋„๊ฐ€ ์•„๋‹ˆ์—ˆ์ง€๋งŒ ์–ด๋Š ์‹œ์ ์—์„œ ์š”์ฒญ์ด๋œ๋‹ค๋ฉด ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์ธ mapreduce ๊ธฐ๋Šฅ์—์„œ @generated ํ•จ์ˆ˜ (ํ•˜๋‚˜๋งŒ ์žˆ์Œ)๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด Base์— ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฐœ์ธ ๋กœ๋“œ๋งต : ์ด๊ฒƒ์€ ์ฃผ๋กœ ์ƒ์œ„ ์ˆ˜์ค€ ํŒจํ‚ค์ง€, ์ฆ‰ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ TensorOperations ๋ฐ ๋‚ด๊ฐ€ ์ž‘์—…์ค‘์ธ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•˜์œ„ ์ˆ˜์ค€ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ ์„ ํ˜• ๋Œ€์ˆ˜์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ง€์›์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (์˜ˆ : norm ์— StridedView ํ˜„์žฌ Julia Base์—์„œ norm ์˜ ๋‹ค์†Œ ๋Š๋ฆฐ ๊ตฌํ˜„์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค). ๋‚˜๋Š” ์‹œ๊ฐ„์ด์™€ GPU๋ฅผ ์ž‘์—…์— ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๋™๋“ฑํ•˜๊ฒŒ ์ผ๋ฐ˜์ ์ธ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  mapreducekernel ์— ๋Œ€ํ•ด GPUArray ๋“ค.

์ง€๊ธˆ๊นŒ์ง€ ํ•ฉ์˜ ๋œ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. mul!(C, A, B) ์œ ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค
  2. inplace multiply-add C = ฮฑAB + ฮฒC ์œ„ํ•ด _some_ 5-argument ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € 5- ์ธ์ˆ˜ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ๋‚˜์ค‘์— ์ถ”๊ฐ€ API์— ๋Œ€ํ•ด ๋…ผ์˜ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : 3- ๋ฐ 4- ์ธ์ˆ˜ addmul! ). ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ mul! ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ _not_์—์„œ ์–ป์€ "๊ธฐ๋Šฅ"์ด๋ฏ€๋กœ ํ˜ผํ•ฉํ•˜์ง€ ์•Š๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

@andreasnoack ์‚ฌ์šฉ ์ค‘๋‹จ / ์ด๋ฆ„ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์šฐ๋ ค ์‚ฌํ•ญ์€ ์œ„์˜ @simonbyrne ์˜ ์˜๊ฒฌ์œผ๋กœ ํ•ด๊ฒฐ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? https://github.com/JuliaLang/julia/issues/23919#issuecomment -431046516? ์ง€์› ์ค‘๋‹จ์ด ํ•„์š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ, ๋ฐฉ๊ธˆ ๊ตฌํ˜„ # 29634๋ฅผ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค. LinearAlgebra ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ์ด ๊ฒ€ํ† ํ•ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์ด๋ฆ„์„ mul! ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•˜๊ณ  ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ง€์› ์ค‘๋‹จ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง๋กœ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์›ํ•˜๋ฉด muladd ๊ฐ€ ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

mul! API๋ฅผ ๋…ผ์˜ ํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋‹ค๋ฅธ ์‚ฌํ•ญ :

scale! ๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  0.6-> 0.7 ์ „ํ™˜์— ํก์ˆ˜๋˜์—ˆ์„ ๋•Œ, ์ €๋Š” ์กฐ๊ธˆ ์ŠฌํŽ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ €์—๊ฒŒ ์Šค์นผ๋ผ ๊ณฑ์…ˆ (๋ฒกํ„ฐ ๊ณต๊ฐ„์˜ ์†์„ฑ)์ด ๊ฐ์ฒด๋ฅผ ๊ณฑํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋งค์šฐ ๋‹ฌ๋ž๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค (๋Œ€์ˆ˜์˜ ์†์„ฑ). ). ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ €๋Š” mul! ์ ‘๊ทผ ๋ฐฉ์‹์„ ์™„์ „ํžˆ ์ˆ˜์šฉํ–ˆ์œผ๋ฉฐ ์Šค์นผ๋ผ ๊ณฑ์…ˆ์ด ๊ตํ™˜ ์ ์ด ์ง€ ์•Š์„ ๋•Œ rmul!(vector,scalar) ๋ฐ lmul!(scalar,vector) ๊ธฐ๋Šฅ์„ ๋งค์šฐ ๋†’์ด ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ in place ๋ฒกํ„ฐ ๊ณต๊ฐ„ ์—ฐ์‚ฐ ์ธ axpy! ๋ฐ ์ผ๋ฐ˜ํ™” axpby! ์˜ un-Julian ์ด๋ฆ„์— ๋งค์ผ ๋” ์‹ ๊ฒฝ์„ ์”๋‹ˆ๋‹ค. ์ด๊ฒƒ๋„ mul! / muladd! / addmul! ํก์ˆ˜ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•ฝ๊ฐ„ ์ด์ƒํ•˜์ง€๋งŒ A*B ์˜ ๋‘ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ด๋ฏธ ์Šค์นผ๋ผ์ด๋ฉด ์ถ”๊ฐ€ ์Šค์นผ๋ผ ์š”์†Œ ฮฑ ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ

mul!(C, A, B, ฮฑ, ฮฒ)

๋˜ํ•œ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

add!(Y, X, ฮฑ, ฮฒ)

axpby! ๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

@andreasnoack ์‚ฌ์šฉ ์ค‘๋‹จ / ์ด๋ฆ„ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์šฐ๋ ค ์‚ฌํ•ญ์ด # 23919 (์ฝ”๋ฉ˜ํŠธ) ์œ„์˜ @simonbyrne ์˜ ์˜๊ฒฌ์œผ๋กœ ํ•ด๊ฒฐ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์ง€์› ์ค‘๋‹จ์ด ํ•„์š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

https://github.com/JuliaLang/julia/issues/23919#issuecomment -430952179์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๋ฝ์„ mul! ํ๊ธฐํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ์ƒ๊ฐ @Jutho acp(b)y! ์— add! ์ข‹์€ ์•„์ด๋””์–ด๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

# 23919 (์ฝ”๋ฉ˜ํŠธ) ์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๋ฝ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ €๋Š” ๊ทธ๊ฒƒ์„ ์ฝ๊ณ  5 ๊ฐœ ์ธ์ˆ˜ mul! ๊ฐ€ ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ๊ณต๊ฐœ API์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ _ ๊ธฐ์ˆ ์ ์œผ๋กœ _ ์ง€์› ์ค‘๋‹จ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. https://github.com/JuliaLang/julia/issues/23919#issuecomment -430975159์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๋ฝ์„

์—ฌ๊ธฐ์„œ๋Š” ํ•˜๋‚˜์˜ ์„œ๋ช… (์˜ˆ : mul!(C, A, B) )์˜ ๋ฌธ์„œํ™”๋กœ ์ธํ•œ ๊ณต๊ฐœ API ์„ ์–ธ์ด ๋‹ค๋ฅธ ์„œ๋ช… (์˜ˆ : mul!(C, A, B, ฮฑ, ฮฒ) )์— ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋ผ๋ฉด Julia์™€ stdlib๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๋‚ด๋ถ€๋ฅผ ๋…ธ์ถœํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์€ Pkg.add ์˜ ๋ฌธ์„œํ™” ๋œ ์„œ๋ช…์ž…๋‹ˆ๋‹ค.

https://github.com/JuliaLang/julia/blob/0d713926f85dfa3e4e0962215b909b8e47e94f48/stdlib/Pkg/src/Pkg.jl#L76 -L79

์‹ค์ œ ์ •์˜๋Š”

https://github.com/JuliaLang/julia/blob/0d713926f85dfa3e4e0962215b909b8e47e94f48/stdlib/Pkg/src/API.jl#L69 -L70

https://github.com/JuliaLang/julia/blob/0d713926f85dfa3e4e0962215b909b8e47e94f48/stdlib/Pkg/src/API.jl#L27 -L33

Pkg.add ์„œ๋ช…์ด ํ•˜๋‚˜ ์ด์ƒ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋‹ค๋ฅธ ์„œ๋ช…์ด ๊ณต์šฉ API์ž„์„ ์˜๋ฏธํ•˜๋Š” ๊ฒฝ์šฐ Pkg.jl์€ ์ฃผ์š” ๋ฒ„์ „์„ ์ถฉ๋Œํ•˜์ง€ ์•Š๊ณ  ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ๋™์ž‘์„ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (์˜ˆ : Pkg.add(...; mode = :develop) ์‹คํ–‰ Pkg.develop(...) ; Context! ๋Œ€ํ•œ ๋ชจ๋“  ํ‚ค์›Œ๋“œ ์ธ์ˆ˜๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค (์‹ค์ œ๋กœ ์˜๋„๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Œ).

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์–ด์จŒ๋“  ๋‚ด ์ธ์ƒ์ž…๋‹ˆ๋‹ค. mul!(C, A, B, ฮฑ, ฮฒ) ์ด mul!(C, A, B) ๋งŒํผ ๊ณต๊ฐœ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์„œ๋กœ ๊ณผ๊ฑฐ์— ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ (์—ฌ์ „ํžˆ) ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์ „ ์˜๊ฒฌ์— ๋Œ€ํ•œ ์ฐธ์กฐ. ์ด๋Š” 5 ๊ฐœ ์ธ์ˆ˜ mul! ์˜ ์ง€์› ์ค‘๋‹จ์— ๋Œ€ํ•œ ๋…ผ์˜์™€๋Š” ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋‹ค์Œ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ๋‹ค๋ฉด, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์˜ค ๋…ผ์Ÿ์„ ์ง€์–‘ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹ค ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ mul! ๋Œ€์‹ ์— ๊ทธ๋ƒฅ ํŒŒ๊ดด. ๋ฌผ๋ก , 3 ์ธ์ˆ˜ mul! ๋งŒํผ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€๋Š” ์•Š์ง€๋งŒ, ๊ทธ๋ƒฅ ๊นจ๋œจ๋ฆฌ๋Š” ๋Œ€์‹  ๋น„์ถ”์ฒœํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด๋Š” 5 ๊ฐœ ์ธ์ˆ˜ mul! ์˜ ์ง€์› ์ค‘๋‹จ์— ๋Œ€ํ•œ ๋…ผ์˜์™€๋Š” ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์ฝ”๋ฉ˜ํŠธ์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๋ฝ์˜ ๋‚˜์˜ ํ•ด์„ https://github.com/JuliaLang/julia/issues/23919#issuecomment๊ฐ€ -430952179 ๋‹น์‹ ์ด ํ˜œํƒ์„ ๋‚˜์—ด @simonbyrne ์ธ์ •์ด์—ˆ๋‹ค https://github.com/JuliaLang/julia/issues / 23919 # issuecomment -430809383์€ ์ƒˆ๋กœ์šด 5 ๊ฐœ ์ธ์ˆ˜ ํ•จ์ˆ˜์— ๋Œ€ํ•ด _public API_๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์— ๋น„ํ•ด ๊ฐ€์น˜๊ฐ€ ๋‚ฎ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค ( "์ด๋ฆ„ ๋ณ€๊ฒฝ"๋ฐ "์ง€์› ์ค‘๋‹จ"์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด). ๊ทธ๋ž˜์„œ ์ €๋Š” 5 ๊ฐœ ์ธ์ˆ˜ mul! ๊ฐ€ ๊ณต๊ฐœ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์€ ๋˜ํ•œ ๋‹น์‹ ์ด ์ง€๊ธˆ ์–ธ๊ธ‰ํ•˜๊ณ ์žˆ๋Š” "์ถ”๊ฐ€ ๊ธฐ๋Šฅ"์„ ๊ฐ–๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ •๋‹น์„ฑ์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์‚ฐ _C = AB_ ๋ฐ _C = ฮฑAB + ฮฒC_๊ฐ€ ์ถฉ๋ถ„ํžˆ ์œ ์‚ฌํ•˜์—ฌ ๋™์ผํ•œ ์ด๋ฆ„์ด ๋‘˜ ๋‹ค๋ฅผ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๊นŒ? 3 ๊ฐœ ์ธ์ˆ˜ mul! ๋ฅผ ์ผ๋ฐ˜ํ™”ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด _y = Aโ‚ Aโ‚‚ โ‹ฏ Aโ‚™ x_ https://github.com/JuliaLang/julia์— ๋Œ€ํ•ด mul!(y, Aโ‚, Aโ‚‚, ..., Aโ‚™, x) / issues / 23919 # issuecomment -402953987?

์™œ ๊ทธ๊ฒƒ์„ ๊นจ๋œจ๋ฆฌ๋Š” ๋Œ€์‹  ๋น„๋‚œํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ด์ „ ์˜๊ฒฌ์—์„œ ๋งํ–ˆ๋“ฏ์ด, 5 ๊ฐœ ์ธ์ˆ˜ mul! ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด _if_ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ์˜ณ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์ด๋ฏธ ๋‚ด PR # 29634์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ„์‚ฐ C = AB ๋ฐ C = ฮฑAB + ฮฒC๊ฐ€ ์ถฉ๋ถ„ํžˆ ์œ ์‚ฌํ•˜์—ฌ ๋™์ผํ•œ ์ด๋ฆ„์ด ๋‘˜ ๋‹ค๋ฅผ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ, ์ „์ž๋Š” ฮฒ=0 ์™€ ํ•จ๊ป˜ ํ›„์ž์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. muladd! / addmul! ๊ฐ€ C = ฮฑAB + ฮฒC ๋Œ€ํ•œ ๋” ์ •ํ™•ํ•œ ์ด๋ฆ„์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•˜์ง€๋งŒ ๊ฑฐ๊ธฐ์— ๋„๋‹ฌํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ํ–‰๋ ฌ ๊ณฑ์…ˆ ํ•จ์ˆ˜๋ฅผ ๋„์ž…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ( muladd! / addmul! ) ๋˜๋Š” mul! ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ  ์ง€๊ธˆ์€ ๊ทธ๋Ÿด ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ด„์— ๋‚˜์˜จ๋‹ค๋ฉด ๋ณ€ํ™”๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์› ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

3 ์ธ์ˆ˜ mul์„ ์ผ๋ฐ˜ํ™”ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! :

Julia๋Š” ฮฑ ๋ฐ ฮฒ ์ธ์ˆ˜์—†์ด in-place matrix multiply ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ–ˆ์ง€๋งŒ ํ–‰๋ ฌ ๊ณฑ์…ˆ ์ „ํ†ต์€ ์‹ค์ œ๋กœ BLAS-3์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์ธ ํ–‰๋ ฌ ๊ณฑ์…ˆ ํ•จ์ˆ˜๋Š” C = ฮฑAB + ฮฒC .

mul! ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ

stdlib ๋˜๋Š” ๋‹ค์šด ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ์ž ๋ชจ๋“ˆ / ์ฝ”๋“œ์—์„œ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์ „์ž๋ฅผ ์˜๋ฏธํ•œ๋‹ค๋ฉด, ์ด๋ฏธ # 29634์—์„œ (LinearAlgebra ๋ฐ SparseArrays์˜ ๊ฒฝ์šฐ) ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฏ€๋กœ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž๋ฅผ ์˜๋ฏธํ•œ๋‹ค๋ฉด, ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ณต๊ฐœ ํ† ๋ก ์ด ์•„๋‹Œ ํ† ๋ก ์œผ๋กœ ๊ท€๊ฒฐ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ–‰๋ ฌ ๊ณฑ์…ˆ ์ „ํ†ต์€ ์‹ค์ œ๋กœ BLAS-3์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Julia๋Š” ์ด๋ฏธ BLAS์˜ ๋ช…๋ช… ๊ทœ์น™์„ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋” ์„ค๋ช…์ ์ธ ์ด๋ฆ„์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์ง€ ์•Š์„๊นŒ์š”?

stdlib ๋˜๋Š” ๋‹ค์šด ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ์ž ๋ชจ๋“ˆ / ์ฝ”๋“œ์—์„œ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

29634๋Š” mul! ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ addmul! ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Julia๋Š” ์ด๋ฏธ BLAS์˜ ๋ช…๋ช… ๊ทœ์น™์„ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.

๋ช…๋ช…์— ๋Œ€ํ•ด ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ ์–ด๋„ Fortran 77์—๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„๊ณผ ๋””์ŠคํŒจ์น˜ ์ธก๋ฉด์—์„œ ๋‘˜ ๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํžˆ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ณ„์‚ฐ๋˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. BLAS-3์˜ ์ผ๋ฐ˜ ํ–‰๋ ฌ ๊ณฑ์…ˆ ํ•จ์ˆ˜๋Š” C = ฮฑAB + ฮฒC ๊ณ„์‚ฐํ•˜๊ณ  Julia์—์„œ๋Š” mul! (fka A_mul_B! )์ž…๋‹ˆ๋‹ค.

๋” ์„ค๋ช…์ ์ธ ์ด๋ฆ„์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์ง€ ์•Š์„๊นŒ์š”?

๊ทธ๋Ÿด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ํ–‰๋ ฌ ๊ณฑ์…ˆ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์•ผํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋ฆฌ ์ข‹์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

29634๋Š” mul! ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ addmul! ํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๋งํ•˜๊ณ ์žํ•˜๋Š” ๊ฒƒ์€ 5 ๊ฐœ ์ธ์ˆ˜ mul! ๊ฐ€ addmul! ๋กœ ์ด๋ฆ„์ด ๋ฐ”๋€Œ ์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ํ–‰๋ ฌ ๊ณฑ์…ˆ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์•ผํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋ฆฌ ์ข‹์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ™์€์ง€ ์•„๋‹Œ์ง€๋Š” ๋‹ค์†Œ ์ฃผ๊ด€์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” _C = ฮฑAB + ฮฒC_์™€ _Y = Aโ‚ Aโ‚‚ โ‹ฏ Aโ‚™ X_ ๋ชจ๋‘ _C = AB_์˜ ์ˆ˜ํ•™์ ์œผ๋กœ ์œ ํšจํ•œ ์ผ๋ฐ˜ํ™”๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. _C = ฮฑAB + ฮฒC_๊ฐ€ ๊ณ ์œ  ํ•œ ์ผ๋ฐ˜ํ™”๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด์ด ์ฃผ์žฅ์ด ์ถฉ๋ถ„ํžˆ ๊ฐ•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ BLAS API๋ฅผ ์•Œ๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฉฐ ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ Julia ์‚ฌ์šฉ์ž๋ฅผ์œ„ํ•œ ๊ธฐ๋ณธ ์ง€์‹์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ _C = AB_ ๋ฐ _C = ฮฑAB + ฮฒC_๋Š” C ์ด ์‚ฌ์šฉ๋˜๋Š”์ง€ ์—ฌ๋ถ€๊ฐ€ ๊ณ„์‚ฐ ์ƒ ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ „์ž์˜ ๊ฒฝ์šฐ ์ถœ๋ ฅ ์ „์šฉ ๋งค๊ฐœ ๋ณ€์ˆ˜์ด๊ณ  ํ›„์ž์˜ ๊ฒฝ์šฐ ์ž…๋ ฅ-์ถœ๋ ฅ ๋งค๊ฐœ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ์ฐจ์ด๋Š” ์‹œ๊ฐ์  ์ธ ๋‹จ์„œ๋ฅผ๋ฐ›์„ ๋งŒํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. mul!(some_func(...), ...) ์— mul! ์— 5 ๊ฐœ์˜ ์ธ์ˆ˜ ํ˜•์‹์ด์žˆ๋Š” ๊ฒฝ์šฐ ์ธ์ˆ˜์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (๊ด„ํ˜ธ๋ฅผ ์ผ์น˜์‹œ์ผœ์•ผํ•˜๋ฏ€๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ ์ธ ๊ฒฝ์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค). some_func ๊ฐ€ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ํ• ๋‹น ๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ addmul! ๋‹ค์Œ ๋‚˜๋Š” ์ฆ‰์‹œ ๊ทธ ๊ธฐ๋Œ€ํ•  ์ˆ˜ some_func ์—์„œ mul!(some_func(...), ...) ๋งŒ ์ˆ˜ํ–‰ ํ• ๋‹น.

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ™์€์ง€ ์•„๋‹Œ์ง€๋Š” ๋‹ค์†Œ ์ฃผ๊ด€์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” C = ฮฑAB + ฮฒC์™€ Y = Aโ‚ Aโ‚‚ โ‹ฏ Aโ‚™ X ๋‘˜ ๋‹ค ์ˆ˜ํ•™์ ์œผ๋กœ ์œ ํšจํ•œ C = AB์˜ ์ผ๋ฐ˜ํ™”๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. C = ฮฑAB + ฮฒC๊ฐ€ ๊ณ ์œ  ํ•œ ์ผ๋ฐ˜ํ™”๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด์ด ์ฃผ์žฅ์ด ์ถฉ๋ถ„ํžˆ ๊ฐ•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณ ์œ  ํ•œ ์ผ๋ฐ˜ํ™”๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋Œ€๋žต ๋™์ผํ•œ ๋น„์šฉ์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜์žˆ๋Š” ์ผ๋ฐ˜ํ™”์ด๋ฉฐ ๋‹ค๋ฅธ ์„ ํ˜• ๋Œ€์ˆ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ๊ธฐ๋ณธ ์š”์†Œ๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฒฝ์šฐ์— ๋‹ค์–‘ํ•œ ์„ ํ˜• ๋Œ€์ˆ˜ ๊ด€๋ จ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ๋•Œ 0์ด ์•„๋‹Œ ๋ฒ ํƒ€๋ฅผ ๊ฐ–๊ณ  ์‹ถ์—ˆ๊ณ  ํ•ญ์ƒ BLAS.gemm! ๋Œ์•„ ๊ฐ€์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ธ๊ธ‰ ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ผ๋ฐ˜ํ™”๋Š” ์ค‘๊ฐ„ ์ž„์‹œ์—†์ด ํ•œ ๋ฒˆ์— ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‚ด๋ถ€ ๋ฒ„์ „์€ ํ›จ์”ฌ ๋œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๋ณธ ์ž‘์—…๋งŒํผ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ BLAS API๋ฅผ ์•Œ๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฉฐ ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ Julia ์‚ฌ์šฉ์ž๋ฅผ์œ„ํ•œ ๊ธฐ๋ณธ ์ง€์‹์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ธ์ˆ˜ ฮฑ=1 ๋ฐ ฮฒ=0 ๊ฐ€ ์—ฌ์ „ํžˆ ์ œ์ž๋ฆฌ์—์žˆ๋Š” ํ•œ, ์„ธ ๊ฐœ์˜ ์ธ์ˆ˜ mul! ๋Š” Julia ์‚ฌ์šฉ์ž๊ฐ€ BLAS ๋ฐฐ๊ฒฝ์—†์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๊ธฐ๋Œ€ํ•  ์ˆ˜์žˆ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๊ธ‰ ์˜ต์…˜์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ์–ธ์–ด ๋ฐ ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ์ด ์žˆ์œผ๋ฏ€๋กœ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ,์ด ๋‹จ์ผ mul! ํ˜ธ์ถœ์€ gemm ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ gemv ๋ฐ trmv (์ด์ƒํ•˜๊ฒŒ๋„ ฮฑ ๋ฐ BLAS API์˜ ฮฒ ๋งค๊ฐœ ๋ณ€์ˆ˜) ๋ฐ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ๋งค๊ฐœ ๋ณ€์ˆ˜.

๋‚˜๋Š” BLAS-3์ด ๊ณ„์‚ฐ ์ธก๋ฉด์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์ผ๋ฐ˜ํ™”๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜๋ฉฐ ๋งค์šฐ ์ž˜ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด "์ถฉ๋ถ„ํžˆ ๊ณ ์œ ํ•˜์ง€ ์•Š๋‹ค"๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ๋˜ ๋‹ค๋ฅธ ์ผ๋ฐ˜ํ™”๋ฅผ ์ œ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/JuliaLang/julia/issues/23919#issuecomment -441267056์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๋ฝ์—์„œ ์ถœ๋ ฅ ์ „์šฉ ๋Œ€ ์ž…๋ ฅ-์ถœ๋ ฅ ์ธ์ˆ˜๋„

๋˜ํ•œ์ด ๋‹จ์ผ mul! ํ˜ธ์ถœ์€ gemm ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ gemv ๋ฐ trmv (์ด์ƒํ•˜๊ฒŒ๋„ ฮฑ ๋ฐ BLAS API์˜ ฮฒ ๋งค๊ฐœ ๋ณ€์ˆ˜) ๋ฐ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ๋งค๊ฐœ ๋ณ€์ˆ˜.

๋„ค, ์ด๋ฏธ # 29634์—์„œ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ ์ด๋ฆ„์ด ๊ฒฐ์ •๋˜๊ณ  ๊ฒ€ํ† ๋ฅผ ๋ฐ›์œผ๋ฉด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์ด ๋Œ€ํ™”๋ฅผ ๋”ฐ๋ผ๊ฐ€๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์•ฝ๊ฐ„ ๊ธธ๊ณ  ๋„“์–ด์ง‘๋‹ˆ๋‹ค ... ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!). ์ฃผ์š” ์ œ์•ˆ์ด mul!(C, A, B; ฮฑ=true, ฮฒ=false) ์™€ (๊ณผ) ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ฮฑ์™€ ฮฒ์— ๋Œ€ํ•œ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜๊ฐ€ ํ…Œ์ด๋ธ”์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด @andreasnoack ์€ https://github.com/JuliaLang/julia/issues/23919#issuecomment -365762889์—์„œ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜๋ฅผ ๋ฌด์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. @simonbyrne ์€ https://github.com/JuliaLang/julia/issues/23919#issuecomment -426881998์—์„œ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜๋ฅผ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ๊ทธ์˜ ์ตœ๊ทผ ์ œ์•ˆ์€ https://github.com/JuliaLang/julia/issues/23919#issuecomment -431046516์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜.

์šฐ๋ฆฌ๋Š” ์•„์ง ์ด๋ฆ„์„ ์ •ํ•˜์ง€ ์•Š์•˜๊ณ  (์ฆ‰, mul! vs addmul! vs muladd! ) ์ด๊ฒƒ์ด ํ•ต์‹ฌ ์ฃผ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (๋˜๋Š” ์ ์–ด๋„ ๊ทธ๊ฒƒ์ด ๋‚ด ์†Œ์›์ž…๋‹ˆ๋‹ค).

์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋…ผ์Ÿ์„ ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ? ํˆฌํ‘œ? ๋ถ„๋ฅ˜?

์ฃผ์š” ์ œ์•ˆ์€ mul! (C, A, B; ฮฑ = true, ฮฒ = false)๊ณผ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€๋งŒ kwargs๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ‚ค์›Œ๋“œ ๋ฌผ๊ฑด์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ๋‹ˆ ์ฝ”๋“œ ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ์ฃผ์ €ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง„ ์œ„์น˜ ์ธ์ˆ˜๋Š” ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๊ฐ€์˜ค๋Š” ํˆฌํ‘œ๋Š” mul! ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ƒˆ๋กœ์šด ์ด๋ฆ„์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ •๋„๋กœ ์ถฉ๋ถ„ํžˆ ๊ตฌ์ฒด์ ์ด๊ณ  ์œ ์šฉํ•œ mul! ์˜ ์ผ๋ฐ˜ํ™”๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

(์ ์–ด๋„ ์ง€๊ธˆ์€) ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ธฐ ์œ„ํ•ด ํˆฌํ‘œ๋ฅผํ•ฉ์‹œ๋‹ค.

_C = ฮฑAB + ฮฒC_์—์„œ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • : +1 : mul!
  • : -1 : addmul!
  • : ๋ฏธ์†Œ : muladd!
  • : tada : ๋‹ค๋ฅธ ๊ฒƒ

๋‚˜์—๊ฒŒ addmul! ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ (A+B)C ๋Œ€์‹  AB + C .

์ฒ˜์Œ์— ์ €๋Š” mul! ํˆฌํ‘œ ํ•œ ๋‹ค์Œ ์—ฐ์‚ฐ์„๋ณด๊ณ  "๊ณฑํ•˜๊ธฐ๋ฅผ ํ•œ ๋‹ค์Œ ๋”ํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์—ฐํžˆ muladd! ๋ผ๊ณ  ๋ถˆ๋Ÿฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ํ˜ธ์ถœ ํ•  ์ƒ๊ฐ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ œ์ž๋ฆฌ์— ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์€ ! ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œ์‹œ๋˜๊ณ  ์Šค์ผ€์ผ๋ง ๋ถ€๋ถ„์€ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜์— ์ ํ•ฉ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๊ณฑํ•˜๊ธฐ์™€ ๋”ํ•˜๊ธฐ๋ฅผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์—ฐํžˆ muladd! ๋ผ๊ณ  ๋ถˆ๋Ÿฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’ ฮฒ=true ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋‹ค๋ฅธ ๊ฐ’์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์‹œ ๋” ์ผ๋ฐ˜์ ์ธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์„ mul! ๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๊ฐ’์€ ๊ธฐ๋ณธ๊ฐ’ ฮฒ=false ๋„ ๋‹น์‹ ์—๊ฒŒ ๋” ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  muladd(x,y,z) = x*y + z ์™€ ๋น„๊ตํ•˜์—ฌ ์ธ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ •๋ ฌ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‹ค์†Œ ํ˜ผ๋ž€์Šค๋Ÿฝ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‚ด ์ƒ๊ฐ muladd! ๋ผ๋Š” ์„ค๋ช…์€ ๊ฐ™์€ ๊ฒƒ์ด๋‹ค : ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์„ค๋ช…์„ ์†Œ๋ฆฌ์˜ ๋‹จ์ ์ด์žˆ๋‹ค scalemuladd! ์Šค์ผ€์ผ๋ง ๋ถ€๋ถ„์„ ์–ธ๊ธ‰.

๊ทธ๋ž˜์„œ ์ €๋Š” mul! ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ธฐ๋Œ€์น˜๋กœ ์ด์–ด์ง€์ง€ ์•Š์„๋งŒํผ ์ถฉ๋ถ„ํžˆ ์„ค๋ช… ์ ์ด ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฆ‰, LazyArrays.jl MulAdd ์—์„œ lazy ๋ฒ„์ „์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

C ( mul! )์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์™€ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ธฐ ๋•Œ๋ฌธ์— muladd! mul! ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ( muladd! ).

  • ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ํ–‰๋ ฌ ๊ณฑ์…ˆ์ž…๋‹ˆ๋‹ค. [AC] * [Bฮฑ; Iฮฒ] ๋˜๋Š” ์•„๋ž˜ ์ฃผ์„ ์ฐธ์กฐ [ฮฑA ฮฒC] * [B; ๋‚˜๋Š”]
  • ~ ์šฐ๋ฆฌ๋Š” ํฌ์†Œ ํ–‰๋ ฌ์— ๋Œ€ํ•ด ์ด๋ฏธ 5-arg mul! ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๋ฐ€ ํ•œ linalg์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. (์ƒˆ๋กœ์šด ์ธ์ˆ˜๊ฐ€ ์•„๋‹˜)

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ mul! ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ํŽธ์ด ๋‚ซ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ์ˆ ์ ์œผ๋กœ ์ด๊ฒƒ์€ ํ–‰๋ ฌ ๊ณฑ์…ˆ์ž…๋‹ˆ๋‹ค. [AC] * [Bฮฑ; Iฮฒ]

... eltype์— ๊ตํ™˜ ๊ณฑ์…ˆ์ด์žˆ๋Š” ๊ฒฝ์šฐ

... eltype์ด ๊ตํ™˜ ํ˜•์ธ ๊ฒฝ์šฐ.

@andreasnoack Julia์™€์˜ ํ† ๋ก ์—์„œ ๋‚˜์˜จ IIRC๋Š” gemm / gemv ๋ฅผ y <- A * x * ฮฑ + y * ฮฒ ํ•ฉ๋‹ˆ๋‹ค.

@haampie ์ž˜ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค! # 29634์—์„œ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋„์›€์ด ์ œํ•œ์ ์ด์ง€๋งŒ

       C = ฮฑ*A*B + ฮฒ*C

์ž‘์—…์„ ํ‘œํ˜„ํ•  ์ˆ˜์žˆ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ๋งคํฌ๋กœ <strong i="8">@call</strong> C = ฮฑ*A*B + ฮฒ*C ๋˜๋Š” <strong i="10">@call_specialized</strong> ... ๋˜๋Š” ์ด๋Ÿฌํ•œ ๋ผ์ธ์„ ๋”ฐ๋ผ์žˆ๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฌ์šด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์‚ฌํ•œ ์ƒํ™ฉ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ธฐ๋ณธ ํ•จ์ˆ˜๋ฅผ ๋ฌด์—‡์ด๋“  ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@dlfivefifty์˜ @mschauer LazyArrays.jl ์€ ๊ตฌ๋ฌธ๊ณผ ๊ฐ™์ด 5 ์ธ์ˆ˜ mul! ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ›Œ๋ฅญํ•œ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ API๋ฅผ ์„ค์ •ํ•˜๊ณ  ํŒจํ‚ค์ง€ ์ž‘์„ฑ์ž๊ฐ€ ํŠน์ˆ˜ ํ–‰๋ ฌ์— ๋Œ€ํ•ด ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Julia ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š”์ด๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์„คํƒ•์„ ์‹คํ—˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’ ฮฒ=true ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋‹ค๋ฅธ ๊ฐ’์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์‹œ ๋” ์ผ๋ฐ˜์ ์ธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์„ mul! ๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๊ฐ’์€ ๊ธฐ๋ณธ๊ฐ’ ฮฒ=false ๋„ ๋” ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  muladd(x,y,z) = x*y + z ์™€ ๋น„๊ตํ•˜์—ฌ ์ธ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ •๋ ฌ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‹ค์†Œ ํ˜ผ๋ž€์Šค๋Ÿฝ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

ํ™•์‹คํžˆ ๊ฑฐ๊ธฐ์— ์•ฝ๊ฐ„์˜ ์Šค์ผ€์ผ๋ง์ด ์žˆ์ง€๋งŒ ์ž‘์—…์˜ "๋ณธ"์€ ๋ถ„๋ช…ํžˆ ๊ณฑํ•˜๊ณ  ๋”ํ•ฉ๋‹ˆ๋‹ค. muladd ์˜ ์„œ๋ช…๊ณผ ์ผ์น˜ํ•˜๋„๋ก muladd!(A, B, C, ฮฑ=true, ฮฒ=false) ์œผ๋กœ๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ฌธ์„œํ™”๋˜์–ด์•ผํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋งํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค. muladd ๊ฐ€ ์ฒจ๊ฐ€๋ฌผ ๋ถ€๋ถ„์„ ๋จผ์ € ๊ฐ€์ ธ ๊ฐ”์œผ๋ฉด ์ข‹๊ฒ ์ง€ ๋งŒ ๋ฐฐ๋Š” ๊ทธ ๋ถ€๋ถ„์„ ํƒ€๊ณ  ํ•ญํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  muladd(x,y,z) = x*y + z ์™€ ๋น„๊ตํ•˜์—ฌ ์ธ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ •๋ ฌ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‹ค์†Œ ํ˜ผ๋ž€์Šค๋Ÿฝ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ์ œ๊ฐ€ addmul! ๋ณด๋‹ค muladd! addmul! ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜์˜ ์ˆœ์„œ๊ฐ€ ์Šค์นผ๋ผ muladd ์™€ ๊ด€๋ จ์ด ์—†๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ( muladd! ๋ณด๋‹ค mul! muladd! ๋ฅผ ์„ ํ˜ธํ•˜์ง€๋งŒ)

์—ฌ๊ธฐ FWIW๋Š” ์ง€๊ธˆ๊นŒ์ง€์˜ ์ฃผ์žฅ์„ ์š”์•ฝ ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๋‚˜๋Š” ์ค‘๋ฆฝ์ ์œผ๋กœ ๋…ธ๋ ฅํ–ˆ์ง€๋งŒ ๋‚˜๋Š” ํ”„๋กœ ๋‹ค- muladd! / addmul! ๊ทธ๋ž˜์„œ ๋ช…์‹ฌํ•ด๋ผ ...)

์ฃผ๋œ ์˜๊ฒฌ ์ฐจ์ด๋Š” _C = AB_ ๋ฐ _C = ฮฑAB + ฮฒC_๊ฐ€ ํ›„์ž์— ๋Œ€ํ•ด ์ƒˆ ์ด๋ฆ„์„ ๋ถ€์—ฌ ํ• ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๋‹ค๋ฅธ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ์ถฉ๋ถ„ํžˆ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  1. BLAS-3์ด๋ฉฐ ๋ฉ‹์ง€๊ฒŒ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ _C = ฮฑAB + ฮฒC_๋Š” _C = AB_์˜ ๋ช…๋ฐฑํ•œ ์ผ๋ฐ˜ํ™”์ž…๋‹ˆ๋‹ค (https://github.com/JuliaLang/julia/issues/23919#issuecomment-441246606, https://github.com/JuliaLang/julia/issues/ 23919 # issuecomment-441312375 ๋“ฑ)

  2. _ " muladd! ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์„ค๋ช… ์ ์œผ๋กœ ๋“ค๋ฆฌ๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค๋ช… ์  ์ด๋ฆ„์€ ์Šค์ผ€์ผ๋ง ๋ถ€๋ถ„์„ ์–ธ๊ธ‰ํ•˜๊ธฐ ์œ„ํ•ด scalemuladd! ์™€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค."_ --- https://github.com/ JuliaLang / julia / issues / 23919 # issuecomment -441819470

  3. _ "๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ํ–‰๋ ฌ ๊ณฑ์…ˆ์ž…๋‹ˆ๋‹ค. [AC] * [Bฮฑ; Iฮฒ]"_ --- https://github.com/JuliaLang/julia/issues/23919#issuecomment -441825009

๊ทธ๋“ค์€ ์ถฉ๋ถ„ํžˆ ๋‹ค๋ฅธ ์ด์œ ๋Š” ...

  1. _C = ฮฑAB + ฮฒC_๋Š” ๊ณฑํ•˜๊ธฐ ๊ทธ ์ด์ƒ์ž…๋‹ˆ๋‹ค (https://github.com/JuliaLang/julia/issues/23919#issuecomment-430809383, https://github.com/JuliaLang/julia/issues/23919#issuecomment-427075792, https://github.com/JuliaLang/julia/issues/23919#issuecomment-441813176 ๋“ฑ).

  2. Y = Aโ‚ Aโ‚‚ โ‹ฏ Aโ‚™ X (https://github.com/JuliaLang/julia/issues/23919#issuecomment-402953987 ๋“ฑ)๊ณผ ๊ฐ™์€ mul! ์˜ ๋‹ค๋ฅธ ์ผ๋ฐ˜ํ™”๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ์ž…๋ ฅ ์ „์šฉ vs ์ž…๋ ฅ-์ถœ๋ ฅ ๋งค๊ฐœ ๋ณ€์ˆ˜ : ์ธ์ˆ˜ ์ˆ˜์— ๋”ฐ๋ผ C ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค (https://github.com/JuliaLang/julia/issues/23919#issuecomment -441267056, https://github.com/JuliaLang/julia/issues/23919#issuecomment-441824982)

mul! ์ด ๋” ์ข‹์€ ๋˜ ๋‹ค๋ฅธ ์ด์œ ๋Š” ... :

  1. ํฌ์†Œ ํ–‰๋ ฌ์—๋Š” ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์— ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€ ์ธ์ˆ˜ : 5 ๊ฐœ ์ธ์ˆ˜ mul! ๋Š” ๋ฌธ์„œํ™” ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ณต์šฉ API๋กœ ๊ฐ„์ฃผ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์™œ muladd! / addmul! ์ด ๋” ์ข‹์€ ์ด์œ ๋Š” ... :

  1. mul! ๋ฐ muladd! / addmul! ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ 3 ๊ฐœ ๋˜๋Š” 4 ๊ฐœ ์ธ์ˆ˜ "ํ•ธ๋”” ํ•จ์ˆ˜"๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (https://github.com/JuliaLang/julia/issues / 23919 # issuecomment-402953987, https://github.com/JuliaLang/julia/issues/23919#issuecomment-431046516 ๋“ฑ). ๋ฐ˜๋Œ€ ์ฃผ์žฅ : mul!(y, A, x, 1, 1) ์“ฐ๋Š” ๊ฒƒ์€ mul!(y, A, x) (https://github.com/JuliaLang/julia/issues/23919#issuecomment-430674934 ๋“ฑ)์— ๋น„ํ•ด ๊ทธ๋‹ค์ง€ ์žฅํ™ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ๊ด€์ ์ธ ์š”์•ฝ @tkf์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

muladd์˜ ์„œ๋ช…๊ณผ ์ผ์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•ด muladd! (A, B, C, ฮฑ = true, ฮฒ = false)๋กœ๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

mulladd! ๋ผ๋Š” ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์ด ฮฒ=true ์ด๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ muladd ์—์„œ ์ง€์‹œ๋˜๋Š”์ด ์ธ์ˆ˜ ์ˆœ์„œ๋Š” mul!(C,A,B) ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋งค์šฐ ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฐฉ๊ฐํ–ˆ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ / ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ / ๊ณ ์ˆ˜์ค€ ์ฝ”๋“œ (์ด๋ฏธ ๊ณฑ์…ˆ ์—ฐ์‚ฐ์ž * ๋งŒ์œผ๋กœ ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ์•Š์Œ)์—๋Š” mul! ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ฮฒC ๋ฅผ ฮฒ=1 ( true ) ๋˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๊ณผ ํ˜ผํ•ฉํ•˜๋Š” ๊ธฐ๋Šฅ์€ ํ–‰๋ ฌ ๊ณฑ์…ˆ์„์œ„ํ•œ BLAS API๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•„๋Š” ์‚ฌ๋žŒ๋“ค์— ์˜ํ•ด ํ•˜์œ„ ์ˆ˜์ค€ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด. ๋‚˜๋Š”์ด ์‚ฌ๋žŒ๋“ค์ด gemm , gemv ๋Œ€ํ•œ Julia ์ธํ„ฐํŽ˜์ด์Šค ์ธ mul! ์•„๋ž˜์—์„œ์ด ๊ธฐ๋Šฅ์„ ์ฐพ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ... ์ƒˆ ์ด๋ฆ„ ์ถ”๊ฐ€ (ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ฐ˜๋Œ€ ์ธ์ˆ˜ ์ˆœ์„œ) ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋“์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š”์ด ์‚ฌ๋žŒ๋“ค์ด gemm , gemv ๋Œ€ํ•œ Julia ์ธํ„ฐํŽ˜์ด์Šค ์ธ mul! ์•„๋ž˜์—์„œ์ด ๊ธฐ๋Šฅ์„ ์ฐพ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ... ์ƒˆ ์ด๋ฆ„ ์ถ”๊ฐ€ (ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ฐ˜๋Œ€ ์ธ์ˆ˜ ์ˆœ์„œ) ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋“์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๊นŒ?

mul! ๋… ์ŠคํŠธ๋ง์—์„œ muladd! ๋ฅผ ๊ฐ„๋‹จํžˆ ์–ธ๊ธ‰ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ์„ฑ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. BLAS์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ์•Œ๊ณ ์žˆ๋Š” ์‚ฌ๋žŒ์€ API๋ฅผ ์–ด๋””์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ„์น˜ ๋Œ€ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜์™€ ๊ด€๋ จํ•˜์—ฌ : ์•„์ง ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜๋˜์ง€ ์•Š์•˜์ง€๋งŒ ฮฑ ๋Œ€๊ฐ ํ–‰๋ ฌ ์ธ C = ฮฑAB + ฮฒC ๋Š” ์Šค์นผ๋ผ ฮฑ ๋งŒํผ ํšจ์œจ์ ์ด๊ณ  ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ™•์žฅ์„ ์œ„ํ•ด์„œ๋Š” ํ‚ค์›Œ๋“œ ์ธ์ž๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ฮฑ ์œ ํ˜•์„ ๋””์ŠคํŒจ์น˜ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋น„๊ต ํ™˜ํ˜• eltype์˜ ๊ฒฝ์šฐ muladd!(ฮฑ', B', A', ฮฒ', C') (๊ฐ€์ƒ ์ธ์ˆ˜ ์ˆœ์„œ)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ C = ABฮฑ + Cฮฒ ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ ๋ž˜ํผ Adjoint(ฮฑ) ๋ฐ Adjoint(ฮฒ) ์—์„œ ๋””์ŠคํŒจ์น˜ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ Julia์—์„œ ๋น„ ๊ตํ™˜ ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ๋งค์šฐ ๊ฐ€์„ค ์ ์ž…๋‹ˆ๋‹ค.)

์ด ๊ณฑํ•˜๊ธฐ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„ ์ž์™€ ๊ฐ™์€ ์ˆ™๋ จ ๋œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ์œ„ํ•œ ์ €์ˆ˜์ค€ API๋ผ๋Š” @Jutho ์˜ ์š”์ ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅ ์„ฑ์ด์ด API์— ๋Œ€ํ•ด ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’๊ณ  ์œ„์น˜ ์ธ์ˆ˜๊ฐ€ ๊ฐˆ ๊ธธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ‚ค์›Œ๋“œ ์ธ์ˆ˜๋ฅผ ํ”ผํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ธ์ˆ˜๋Š” @andreasnoack์ด https://github.com/JuliaLang/julia/issues/23919#issuecomment -365762889 ์ „์— ๋งํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ฮฑ ๋ฐ ฮฒ ๋„ BLAS๋ฅผ ์•Œ์ง€ ์•Š๋Š” ํ•œ ๋งค์šฐ ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@tkf , ๋ฌผ๋ก , ๋‚ด ์ฃผ์žฅ์€ ฮฒ != 0 ์˜ ์‹ค์ œ ์‚ฌ์šฉ ํšŸ์ˆ˜๊ฐ€ ฮฒ == 0 ๋ณด๋‹ค ์ ์„ ๊ฒƒ์ด๋ฉฐ์ด๋ฅผ ํ•„์š”๋กœํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ด๊ฒƒ์ด ์•ฝ๊ฐ„ ๋” ์ผ๋ฐ˜์ ์ด๋ผ๋Š” ์‚ฌ์‹ค์— ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. mul! ์•„๋ž˜์˜ ๋™์ž‘. ๋”ฐ๋ผ์„œ, ํŠนํžˆ ์ธ์ˆ˜ ์ˆœ์„œ๊ฐ€ ์—‰๋ง์ด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— (์ ์–ด๋„ muladd! ๋กœ) ์ƒˆ๋กœ์šด ์ด๋ฆ„์œผ๋กœ ์ด๊ฒƒ์„ ๋ถ„๋ฆฌํ•˜๋Š” ์ด๋“์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์ด์–ด์•ผํ•œ๋‹ค๋ฉด addmul! ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ฃผ์žฅ์—๋„ ๊ณต๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์‚ฌ๋žŒ๋“ค์€ mul! ์—์„œ ์•ฝ๊ฐ„ ๋” ์ผ๋ฐ˜์ ์ธ ๋™์ž‘์„ ๋ฐœ๊ฒฌํ•ด๋„ ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š”์ด ์ ์— ๋™์˜ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ƒˆ๋กœ์šด ์ด๋ฆ„์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์ด๋“์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์•ฝ๊ฐ„์˜ ํ”ผํ•ด๋ฅผ ๋ณด์ง€ ์•Š๋Š” ํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ํ˜œํƒ์„ ๋ณด๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ์ด์ต์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ์ธ์ˆ˜ ์ˆœ์„œ๊ฐ€ ์—‰๋ง์ด๊ธฐ ๋•Œ๋ฌธ์— (์ ์–ด๋„ muladd! )

๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๊ฒƒ์„ ํ•ด๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ๋‚˜๋Š” ์š”์ ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. muladd! / addmul! ๋Œ€ํ•œ ๋‹ค๋ฅธ ํ˜œํƒ์ด ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๊ฒƒ์„ ํ•ด๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ๋‚˜๋Š” ์š”์ ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. muladd! / addmul!์˜ ๋‹ค๋ฅธ ํ˜œํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ mul! ๊ฐ€ ๊ณฑ์…ˆ๊ณผ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ BLAS ์—ฐ์‚ฐ์— ๋Œ€ํ•œ ๋‹จ์ผ ์ง„์ž… ์ ์ด๋ผ๋Š” ์‚ฌ์‹ค๊ณผ ํ•จ๊ป˜ ์‹ค์ œ๋กœ ํ•ด๋ฅผ ๋ผ์นฉ๋‹ˆ๋‹ค. ฮฑ ๋ฐ ฮฒ์— ๋Œ€ํ•œ ์ „์ฒด ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ์ œํ•œ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์ œ muladd! ํ•˜๋ฉด ์š”์ฒญ ๋œ ์ž‘์—…์˜ ์•ฝ๊ฐ„์˜ ์ฐจ์ด์— ๋”ฐ๋ผ ์ธ์ˆ˜๋กœ ์‰ฝ๊ฒŒ ์บก์ฒ˜ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹ค์ œ๋กœ BLAS API์˜ ์ธ์ˆ˜๋กœ ์บก์ฒ˜ ํ•  ์ˆ˜์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ง„์ž… ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. . BLAS API์— ๋Œ€ํ•œ ์ „์ฒด ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด Julia์˜ ์‹ค์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (@tkf๋ฅผ ์ˆ˜์ • ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค). ์˜ค๋ž˜๋œ ๋”์ฐํ•œ ํฌํŠธ๋ž€ ๋ช…๋ช… ๊ทœ์น™์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ ์ด ์‚ฌ๋žŒ๋“ค์€ ์™œ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ผ์„ํ•˜๋Š”์ง€ ์•Œ๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ์ด ์—ฐ์‚ฐ๊ตฐ (์ฆ‰ ฮฑ์™€ ฮฒ๋กœ ๋งค๊ฐœ ๋ณ€์ˆ˜ํ™” ๋œ 2- ํŒŒ๋ผ๋ฏธํ„ฐ ์—ฐ์‚ฐ๊ตฐ)์€ BLAS์—์„œ์™€ ๊ฐ™์ด ๋‹จ์ผ ์ง„์ž… ์  ์•„๋ž˜์— ํ•จ๊ป˜ ์†ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ด€์ ์—์„œ ๊ฐ€์žฅ ์œ ํšจํ•œ ์นด์šดํ„ฐ ์ธ์ˆ˜๋Š” C ์˜ ์›๋ณธ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ• ์ง€ ์—ฌ๋ถ€์˜ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Julia๊ฐ€ ์ œ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ false ๊ณฑํ•˜๊ธฐ๋ฅผ ๋ฐ›์•„ ๋“ค์˜€๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ฐ์•ˆํ•  ๋•Œ, ๋‹ค๋ฅธ ์š”์†Œ๊ฐ€ NaN ๊ฒฝ์šฐ์—๋„ ์ด๊ฒƒ๋„ ์ฒ˜๋ฆฌ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„๋งˆ๋„์ด ์‚ฌ์‹ค์€ ๋” ์ž˜ ์ „๋‹ฌ / ๋ฌธ์„œํ™”๋˜์–ด์•ผ ํ•  ํ•„์š”๊ฐ€์žˆ์„ ๊ฒƒ์ด๋ฉฐ (๋ฌธ์„œ๋ฅผ ์ฝ์€ ์ง€ ์˜ค๋ž˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค). (๊ทธ๋ž˜์„œ KrylovKit.jl์—์„œ 0์œผ๋กœ ์ž„์˜์˜ ๋ฒกํ„ฐ์™€ ์œ ์‚ฌํ•œ ์‚ฌ์šฉ์ž ์œ ํ˜•์„ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด fill! ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ด์ œ๋Š” ๋Œ€์‹  rmul!(x,false) ๋งŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” fill! ๊ฐ€ ๊ตฌํ˜„๋˜๋„๋ก ๊ฐ•์š” ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค).

muladd! / addmul!์˜ ๋‹ค๋ฅธ ํ˜œํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์งˆ๋ฌธ์„ ๋’ค์ง‘์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ๋•Œ ์–ป์„ ์ˆ˜์žˆ๋Š” ๋‹ค๋ฅธ ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์š”์•ฝ์„ ๋‹ค์‹œ ์ฝ์—ˆ์ง€๋งŒ ๋ฐฉ๊ธˆ ์–ธ๊ธ‰ ํ•œ C ์•ก์„ธ์Šค ์ง€์  ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์˜ค๋Š˜ ์•„์นจ ์•„๋‚ด์—๊ฒŒ ์ˆ˜์ˆ  ์ด๋ฆ„์„ ์ง“๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ Julia ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ 2 ๊ฐœ์›” ๋™์•ˆ ๊ธด ๋Œ€ํ™”๊ฐ€ ์žˆ์—ˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋…€๋Š” "ํ”„๋ ˆ๋“œ!"๋ผ๊ณ  ๋ถˆ๋ €์Šต๋‹ˆ๋‹ค. -๋‘๋ฌธ์ž์–ด๋„์—†๊ณ , ๊นŠ์€ ์˜๋ฏธ๋„์—†๊ณ , ์ข‹์€ ์ด๋ฆ„ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋…€๋ฅผ ๋Œ€์‹ ํ•ด์„œ ์ด๊ฑธ ๋‚ด๋†“์œผ์„ธ์š”.

๊ทธ๋…€๊ฐ€ ๋Š๋‚Œํ‘œ๋ฅผ ํฌํ•จํ•ด์„œ ๋‹คํ–‰์ž…๋‹ˆ๋‹ค! ๐Ÿ˜„

์šฐ์„ , ๋งŒ์ผ์„ ๋Œ€๋น„ํ•˜์—ฌ, ์ €์˜ ์šฐ๋ ค๋Š” ์“ฐ๊ธฐ ๊ฐ€๋Šฅ์„ฑ์ด๋‚˜ ๋ฐœ๊ฒฌ ๊ฐ€๋Šฅ์„ฑ์ด ์•„๋‹Œ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์—์„œ ๋น„๋กฏ๋œ๋‹ค๋Š” ์ ์„ ๋ถ„๋ช…ํžˆํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ์ž‘์„ฑํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฝ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์˜ ๋‹ค๋ฅธ ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ถœ๋ ฅ ๋Œ€ ์ž…๋ ฅ-์ถœ๋ ฅ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ธ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด _C = ฮฑAB + ฮฒC_๊ฐ€ _C = AB_์™€ ๋‹ค๋ฅธ ์ด์œ  ์ค‘ ํ•˜๋‚˜ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ „์ž์˜ ํ‘œํ˜„์ด ํ›„์ž์˜ ์—„๊ฒฉํ•œ "์ˆ˜ํผ ์„ธํŠธ"๋ผ๋Š” ์ ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋Š” ๋‹จ์ˆœํ•œ ์‚ฌ์‹ค์€ ์ฝ”๋“œ์—์„œ ๋ช…ํ™•ํ•œ ์‹œ๊ฐ์  ํ‘œ์‹œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ด๋ฆ„์€ ์ค‘๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋จธ (๋˜๋Š” ์•ฝ๊ฐ„ ์ง‘์ค‘๋˜์ง€ ์•Š์€ ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋จธ)๊ฐ€ ์ฝ”๋“œ๋ฅผ ํ›‘์–ด๋ณด๊ณ  mul! ๋ณด๋‹ค ์ด์ƒํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ์•„ ์ฐจ๋ฆฌ๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์„ค๋ฌธ ์กฐ์‚ฌ๋ฅผ ๋‹ค์‹œ ํ™•์ธํ–ˆ๋Š”๋ฐ (์œ„์˜ "์ถ”๊ฐ€๋กœ๋“œ"๋ฅผ ํด๋ฆญํ•ด์•ผ ํ•จ) ์ผ๋ถ€ ํˆฌํ‘œ๊ฐ€ mul! ์—์„œ muladd! ๋กœ ์ด๋™ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ๋ดค์„ ๋•Œ mul! ์ด ์ด๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ์ด์‚ฌํ•˜๊ธฐ ์ „์— ์—ฌ๊ธฐ์— ๊ธฐ๋กํ•ฉ์‹œ๋‹ค : ์›ƒ์Œ :

  • mul! : 6
  • addmul! : 2
  • muladd! : 8
  • ๋‹ค๋ฅธ ๊ฒƒ : 1

์กฐ๊ธˆ ๋” ์ง„์ง€ํ•˜๊ฒŒ, ๋‚˜๋Š” ์—ฌ์ „ํžˆ์ด ๋ฐ์ดํ„ฐ๊ฐ€ mul! ๋˜๋Š” muladd! ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ( addmul! ์ด ์†Œ์ˆ˜์ž„์„ ๋ณด์—ฌ ์ฃผ์ง€๋งŒ : sob :)

์šฐ๋ฆฌ๊ฐ€ ๊ฐ‡ํžŒ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ๋‚˜์•„๊ฐˆ๊นŒ์š”?

๋Œ€์‹  gemm! ๋ผ๊ณ  ๋ถ€๋ฅด์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ƒฅ gemm์ด๋ผ๊ณ  ๋ถ€๋ฅด์„ธ์š”! ๋Œ€์‹ ?

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋†๋‹ด์ด๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค ... ํ–‰๋ ฌ * ๋ฒกํ„ฐ์— ๋Œ€ํ•ด gemm!(ฮฑ, A::Matrix, x::Vector, ฮฒ, y::Vector) = gemv!(ฮฑ, A, x, ฮฒ, y) ์„ ์ œ์•ˆํ•˜์ง€ ์•Š๋Š” ํ•œ.

์ด๋ฏธ ์กด์žฌํ•˜๋Š” (ํฌ์†Œ ํ–‰๋ ฌ์ด์žˆ๋Š”) mul! ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ทธ๋Œ€๋กœ๋‘๊ณ  PR์„ ๋ณ‘ํ•ฉํ•˜๊ณ  ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ PR์— muladd! ์„ ์ถ”๊ฐ€ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฑฑ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ?

์—ฌ๊ธฐ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ด๋ฏธ ๋ถ„๋ช…ํ•œ ๊ฒƒ์ด์ง€๋งŒ ์ €๋Š” ๊ทธ์ € ํˆฌํ‘œ๊ฐ€

  • mul! ๋Œ€ muladd!

๊ทธ๋Ÿฌ๋‚˜

  • mul! ๋Œ€ ( mul! ๋ฐ muladd! )

์ฆ‰, ๋‹จ์ผ ๋Œ€์‹ ์— ๋‘ ๊ฐœ์˜ ๋Œ์—ฐ๋ณ€์ด ๊ณฑ์…ˆ ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

mul! ์ฐฌ์„ฑ ๊ฒŒ์‹œ๋ฌผ์„ ์˜ฌ๋ฆด ๋•Œ๋งˆ๋‹ค ํˆฌํ‘œ๊ฐ€ mul! ์—์„œ ( mul! ๋ฐ muladd! )๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ๊ฒŒ์‹œํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ ๊ณผ๋ฐ˜์ˆ˜ ํˆฌํ‘œ๋กœ ์ง„ํ–‰ํ•˜๊ณ  ๋™์‹œ์— mul!(C,A,B) ๋ฐ muladd!(A,B,C,ฮฑ=true,ฮฒ=true) ๋ฅผ ๋ณด์œ ํ•˜๊ณ  axpy! ๋ฐ axpby! ์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” PR์„ ์ค€๋น„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์ค„๋ฆฌ์•ˆ ์ด๋ฆ„ add! , add!(y, x, ฮฑ=true, ฮฒ=true) ๋˜๋Š” add!(x, y, ฮฑ=true, ฮฒ=true) ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด y ๋Š” ๋ณ€ํ˜• ๋จ). ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ?

๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ muladd!(A,B,C) ๋Š” ๋ณ€๊ฒฝ๋œ ์ธ์ˆ˜๊ฐ€ ๋จผ์ € ์ ์šฉ ๋˜๋Š” ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ ์กด์žฌํ•˜๋Š” mul! ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ข…๋ฃŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@jebej ์ €๋Š”์ด "์—ญ ํ˜ธํ™˜์„ฑ"์ฃผ์žฅ์ด ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋…ผ์˜๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋ˆ„๊ตฌ์—๊ฒŒ๋„ ์„ค๋“๋ ฅ์ด ์—†์Šต๋‹ˆ๋‹ค (ํˆฌํ‘œ๋ฅผ ๋ณด๋ฉด ๋‚˜ ๋ฟ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค).

๋‹ค๋ฅธ PR์— muladd! ์„ ์ถ”๊ฐ€ ํ•  ๊ฒƒ์ธ์ง€ ๊ฑฑ์ •ํ•˜์‹ญ๋‹ˆ๊นŒ?

๊ณต๊ฐœ API๋ฅผ ๊นจ๋Š” ๊ฒƒ์€ ๋‚˜์˜๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ mul! ๋ผ๊ณ  ๋งํ•˜๋ฉด ์˜์›ํžˆ mul! (์ด๋ก ์ƒ LinearAlgebra๋Š” API๋ฅผ ๊นจ๊ธฐ ์œ„ํ•ด ์ฃผ์š” ๋ฒ„์ „์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

axpy! ๋ฐ axpby! ์„ ๋” ๋งŽ์€ ์ค„๋ฆฌ์•ˆ ์ด๋ฆ„ add! ๋Œ€์ฒดํ•˜๋Š” PR์„ ์ค€๋น„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. add!(y, x, ฮฑ=true, ฮฒ=true) ๋˜๋Š” add!(x, y, ฮฑ=true, ฮฒ=true) ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@ Jutho ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ๊ทธ๊ฑฐ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค! multiply-add API์˜ ํ˜ธ์ถœ ์„œ๋ช…์„ ๊ฒฐ์ •ํ•˜๋ฉด ์ธ์ˆ˜ ์ˆœ์„œ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

muladd!(A,B,C) ๋Š” ๋ณ€๊ฒฝ๋œ ์ธ์ˆ˜๊ฐ€ ๋จผ์ € ์ ์šฉ ๋˜๋Š” ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค.

@simonbyrne ๊ทธ๋Ÿฌ๋‚˜ (https://github.com/JuliaLang/julia/issues/23919#issuecomment-426881998์—์„œ ์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด), lmul! ๋ฐ ldiv! ์ฒซ ๋ฒˆ์งธ๊ฐ€ ์•„๋‹Œ ์ธ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ muladd!(A,B,C,ฮฑ,ฮฒ) ๋ฅผ ์„ ํƒ์—์„œ ์ œ์™ธ ํ•  ํ•„์š”๊ฐ€์—†๊ณ  ์˜คํžˆ๋ ค์ด ์„œ๋ช…์˜ ๋ถ€์ •์ ์ธ ์ ์œผ๋กœ ๊ฐ„์ฃผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

(ํ•˜์ง€๋งŒ "textual order"API๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด muladd!(ฮฑ, A, B, ฮฒ, C) ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.)

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ํˆฌํ‘œ ๊ฒฐ๊ณผ๋กœ ๋‚ด๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ muladd! ๋ฐ addmul! ์˜ ๋น„๋Œ€์นญ์ž…๋‹ˆ๋‹ค. C = ฮฒC + ฮฑAB ๋ฅผ ์“ฐ๋ฉด addmul! ์ด ๋” ์ž์—ฐ์Šค๋Ÿฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค.

@tkf ๋จผ์ € ์–ด๋–ค ์ž‘์—…์„ํ•˜๋Š”์ง€์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ addmul! ๋Š” (A+B)C ์—์„œ์ฒ˜๋Ÿผ ๋จผ์ € ๋ง์…ˆ์„ ํ•œ ๋‹ค์Œ ๊ณฑํ•˜๊ธฐ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ฃผ๊ด€์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ข‹์€ ์ด๋ฆ„์€ ์ง๊ด€์— ํ˜ธ์†Œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์•„, ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๋ฉˆ ์ท„๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ์ œ์•ˆ์—๋Š” ํ•จ์ˆ˜ ์ •์˜๋กœ ๊ตฌ์„ฑ๋œ ์‚ฌ์šฉ ํŒจํ„ด์ด ์žˆ์Šต๋‹ˆ๋‹ค (์ดˆ๋‹น @callexpr )

@callexpr(C .= ฮฒ*C + ฮฑ*A*B) = implementation(C, ฮฒ, ฮฑ, A, B)
@callexpr(C .= ฮฒ*C + A*B) = implementation(C, ฮฒ, true, A, B)

๊ทธ๋ฆฌ๊ณ  ์ข€ ๋” ๋””์ŠคํŒจ์น˜ ์นœํ™”์  ์ธ ์–‘์‹ (๋‘ ๋ฒˆ์งธ๋กœ @callname )

function @callname(ฮฒ*C + A*B)(C::Number, ฮฒ::Number, A::Number, B::Number)
     ฮฒ*C + A*B
end

๊ทธ๋ฆฌ๊ณ  ์ „ํ™”

@callexpr(A .= 2*C + A*B)
@callexpr(2*3 + 3*2)

๊ทธ๋ฆฌ๊ณ  ์•„๋ฌด๋„ callexpr ๋Œ€์ˆ˜ ์—ฐ์‚ฐ์„ ๊ณ ์œ  ํ•œ ํ•จ์ˆ˜ ์ด๋ฆ„ (์ธ์ˆ˜ ๊ธฐํ˜ธ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์—ฐ์‚ฐ๊ณผ ์—ฐ์‚ฐ ์ˆœ์„œ์—๋งŒ ์˜์กด ํ•จ)์œผ๋กœ ์–ด๋–ป๊ฒŒ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค์ง€ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ตฌํ˜„์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์ƒ๊ฐํ–ˆ๊ณ  ๊ทธ๊ฒƒ์€ ์ž˜ ํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ด๋‹ค.

@mschauer ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šด ๋ฐฉํ–ฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ œ์•ˆํ•˜๋Š” API๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ๋ฌธ์ œ์˜ ๋‹จ์ผ ์‚ฌ๋ก€๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‹ ์ค‘ํ•œ ์„ค๊ณ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฑฐ์ณ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ 1.1์˜ ๊ธฐ๋Šฅ ๋™๊ฒฐ์ด ๋‹ค์Œ ์ฃผ๋ผ๋Š” ์†Œ๋ฌธ์„ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค๋Š” "๋‹จ์ง€"4 ๊ฐœ์›” ๋‚จ์•˜์ง€ ๋งŒ 1.1 ๋ฒ„์ „์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“  PR์„ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœ ์„œ๋ช… (์ธ์ˆ˜ ๋ฐ ํ‚ค์›Œ๋“œ์˜ ์ˆœ์„œ ์—ฌ๋ถ€)์„ ๊ฒฐ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ ๋‹ค์‹œ ํˆฌํ‘œ๋ฅผํ•ฉ์‹œ๋‹ค (์ข‹์€ ์ž๊ทน์ œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์œผ๋ฏ€๋กœ).

_If_ _C = ABฮฑ + Cฮฒ_์— ๋Œ€ํ•ด muladd! ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ํ†ตํ™” ์„œ๋ช…์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • : +1 : muladd!(C, A, B, ฮฑ, ฮฒ)
  • : -1 : muladd!(A, B, C, ฮฑ, ฮฒ)
  • : smile : muladd!(C, A, B; ฮฑ, ฮฒ) (: +1 :๊ณผ ๊ฐ™์ง€๋งŒ ํ‚ค์›Œ๋“œ ์ธ์ž๋Š” b)
  • : tada : muladd!(A, B, C; ฮฑ, ฮฒ) (: -1 :๊ณผ ๊ฐ™์ง€๋งŒ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜ ํฌํ•จ)
  • : ํ˜ผ๋ž€ : muladd!(A, B, ฮฑ, C, ฮฒ)
  • : heart : ๋‹ค๋ฅธ ๊ฒƒ

์—ผ๋‘์—๋‘๊ณ ์žˆ๋Š” ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜ ์ด๋ฆ„์ด์žˆ๋Š” ๊ฒฝ์šฐ ฮฑ ๋ฐ ฮฒ ์‚ฌ์šฉํ•˜์—ฌ ํˆฌํ‘œ ํ•œ ๋‹ค์Œ ์–ด๋–ค ์ด๋ฆ„์ด ๋” ์ข‹์€์ง€ ์˜๊ฒฌ์„ ๋งํ•˜์‹ญ์‹œ์˜ค.

์ด๋ฆ„์ด ๋ฌด์—‡์ธ์ง€ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ mul! ์— ๋Œ€ํ•ด์„œ๋„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

_If_ ์šฐ๋ฆฌ๋Š” _C = ABฮฑ + Cฮฒ_์— mul! ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ํ†ตํ™” ์„œ๋ช…์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • : +1 : mul!(C, A, B, ฮฑ, ฮฒ)
  • : -1 : mul!(A, B, C, ฮฑ, ฮฒ)
  • : smile : mul!(C, A, B; ฮฑ, ฮฒ) (: +1 :๊ณผ ๊ฐ™์ง€๋งŒ ํ‚ค์›Œ๋“œ ์ธ์ž๋Š” ํฌํ•จ)
  • : tada : mul!(A, B, C; ฮฑ, ฮฒ) (๋ถˆ๊ฐ€๋Šฅ)
  • : ํ˜ผ๋ž€ : mul!(A, B, ฮฑ, C, ฮฒ)
  • : heart : ๋‹ค๋ฅธ ๊ฒƒ

์ฐธ๊ณ  : ๊ธฐ์กด API mul!(C, A, B) ์€ (๋Š”) ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  : ๊ธฐ์กด API mul!(C, A, B) ์€ (๋Š”) ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ €๋Š”์ด ์‚ฌ์‹ค์— ์ถฉ๋ถ„ํžˆ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ mul! ์žˆ๊ณ  ์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”์ž…๋‹ˆ๋‹ค.

mul!(Y, A, B) -> Y

ํ–‰๋ ฌ-ํ–‰๋ ฌ ๋˜๋Š” ํ–‰๋ ฌ-๋ฒกํ„ฐ ๊ณฑ A*B ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ Y ์— ์ €์žฅํ•˜์—ฌ Y ์˜ ๊ธฐ์กด ๊ฐ’์„ ๋ฎ์–ด ์”๋‹ˆ๋‹ค. Y ๋Š” A ๋˜๋Š” B ๋กœ ๋ณ„์นญ์„ ์ง€์ •ํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ž์—ฐ์Šค๋Ÿฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค.

mul!(Y, A, B) -> Y
mul!(Y, A, B, ฮฑ) -> Y
mul!(Y, A, B, ฮฑ, ฮฒ) -> Y

ํ–‰๋ ฌ-ํ–‰๋ ฌ ๋˜๋Š” ํ–‰๋ ฌ-๋ฒกํ„ฐ ๊ณฑ A*B ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ Y ์— ์ €์žฅํ•˜์—ฌ Y ์˜ ๊ธฐ์กด ๊ฐ’์„ ๋ฎ์–ด ์”๋‹ˆ๋‹ค. Y ๋Š” A ๋˜๋Š” B ๋กœ ๋ณ„์นญ์„ ์ง€์ •ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์Šค์นผ๋ผ ๊ฐ’ ฮฑ ๊ฐ€ ์ œ๊ณต๋˜๋ฉด A*B ๋Œ€์‹  ฮฑ*A*B ๊ฐ€ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์Šค์นผ๋ผ ๊ฐ’ ฮฒ ๊ฐ€ ์ œ๊ณต๋˜๋ฉด ฮฑ*A*B + ฮฒ*Y ๊ฐ€ ๋Œ€์‹  ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€ํ˜•์—๋Š” ๋™์ผํ•œ ๋ณ„์นญ ์ œํ•œ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ํฐ ์šฐ๋ ค๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. A*B*C*D ๋ฅผ Y ๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด ์ ์–ด๋„ mul!(Y, A, B, C, D) ๊ฐ€ ๋‹น์—ฐํ•ด ๋ณด์ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋…์€ mul!(Y, A, B, ฮฑ, ฮฒ) ์ปดํ“จํŒ… ฮฑ*A*B + ฮฒ*C . ๊ฒŒ๋‹ค๊ฐ€, A*B*C*D ์„ Y ๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ ๊ฐ™๊ณ  ์ค‘๊ฐ„ ํ• ๋‹น์„ ํ”ผํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ ์˜๋ฏธ๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .

mul! ์˜ ๋‹ค๋ฅธ ์ž์—ฐ์ ์ธ ์ผ๋ฐ˜ํ™”๋ฅผ ์—ผ๋‘์—๋‘๊ณ  ์—ฌ๊ธฐ์— ๋˜ ๋‹ค๋ฅธ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

mul!(Y, ฮฑ, A, B) # Y .= ฮฑ*A*B

์ด๊ฒƒ์€ args ๋ฅผ ๊ณฑํ•˜์—ฌ out ์— ๊ณ„์‚ฐํ•˜๊ณ  ์“ฐ๋Š” mul!(out, args...) ์˜ ์ผ๋ฐ˜ ๋ชจ๋ธ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ ฮฑ ๋ฅผ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋””์ŠคํŒจ์น˜์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ณฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ผ์ž…๋‹ˆ๋‹ค. ฮฑ ๊ฐ€ ์Šค์นผ๋ผ์ด๊ณ  A , B ๋ฐ Y ๊ฐ€ ํ–‰๋ ฌ ์ธ ๊ฒฝ์šฐ BLAS๋กœ ๋””์ŠคํŒจ์น˜ํ•˜์—ฌ์ด๋ฅผ ๋งค์šฐ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ผ๋ฐ˜์ ์ธ ๊ตฌํ˜„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋น„ ๊ตํ™˜ ํ•„๋“œ (์˜ˆ : ์ฟผํ„ฐ๋‹ˆ์–ธ)์—์žˆ๋Š” ๊ฒฝ์šฐ ฮฑ ์˜ํ•œ ๋ฐฐ์œจ ์กฐ์ •์ด ๋ฐœ์ƒํ•˜๋Š” ์ชฝ์„ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. mul!(Y, A, B, ฮฑ) ๋ฐฐ์œจ์€ ฮฑ ์™ผ์ชฝ ๋Œ€์‹  ์˜ค๋ฅธ์ชฝ :

mul!(Y, A, B, ฮฑ) # Y .= A*B*ฮฑ

์˜ˆ, ์ฟผํ„ฐ๋‹ˆ์–ธ์— ๋Œ€ํ•ด BLAS๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์ผ๋ฐ˜์ ์ด๋ฉฐ ์—ฌ์ „ํžˆ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์–ด์จŒ๋“  BLAS ํ˜ธ์ถœ๋กœ ๋ณ€ํ™˜ ํ•  ์ˆ˜๋„ ์žˆ์Œ).

Y .= ฮฑ*A*B ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ฐ€์ •ํ•˜๋ฉด ๋‹ค์Œ ์งˆ๋ฌธ์ด๋ฉ๋‹ˆ๋‹ค. Y ํ™•์žฅ ๋ฐ ์ฆ๋ถ„

mul!((ฮฒ, Y), ฮฑ, A, B) # Y .= ฮฒ*Y .+ ฮฑ*A*B

์กฐ๊ธˆ ์ด์ƒํ•˜์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋น„ ๊ตํ™˜ ํ•„๋“œ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜ค๋ฅธ์ชฝ์— Y ์— ฮฒ ์„ ๊ณฑํ•˜๋„๋ก ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mul!((Y, ฮฒ), ฮฑ, A, B) # Y .= Y*ฮฒ .+ ฮฑ*A*B

๋น„ ๊ตํ™˜ ํ•„๋“œ์—์„œ ์™„์ „ํžˆ ์ผ๋ฐ˜ํ™”ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๋ชจ๋‘์—์„œ ํ™•์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mul!((ฮฒโ‚, Y, ฮฒโ‚‚), ฮฑโ‚, A, B, ฮฑโ‚‚) # Y .= ฮฒโ‚*Y*ฮฒโ‚‚ + ฮฑโ‚*A*B*ฮฑโ‚‚

๋ฌผ๋ก  ์ด๊ฒƒ์€ ์•ฝ๊ฐ„ ์ด์ƒํ•˜๊ณ  ์ด์— ๋Œ€ํ•œ BLAS ์—ฐ์‚ฐ์ด ์—†์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ GEMM์˜ ์ผ๋ฐ˜ํ™”๋กœ ๋งŽ์€ ๊ฒƒ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ถˆ์พŒํ•œ if / else๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„ BLAS ์—ฐ์‚ฐ์— ์‚ฌ์†Œํ•˜๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ง€.

์ €๋Š” @StefanKarpinski ์˜ ์ œ์•ˆ์„ ๊ธฐ๋ณธ API ํ˜ธ์ถœ๋กœ ์ •๋ง ์ข‹์•„ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ์ง€ ์—ฌ๋ถ€๋„ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. IMO๋Š” ๊ฒฐ๊ตญ ๊ด€๋ จ ๋งคํฌ๋กœ์ฒ˜๋Ÿผ ๋‹จ์ˆœ ํ•ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@affine! Y = ฮฒโ‚*Y*ฮฒโ‚‚ + ฮฑโ‚*A*B*ฮฑโ‚‚

๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ @StefanKarpinski๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ๊ณผ

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ ๋” ๋‚˜์•„๊ฐ€ ์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„์œ„ํ•œ API์™€ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€ ๊ทธ๊ฒƒ์„ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” Julia ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋ผ๊ณ  ์ •๋ง๋กœ ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ BLAS๋ฅผ ๊ณ ์ˆ˜ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์— ๋™์˜ํ•œ๋‹ค. MatrixChainMultiply.jl๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์€ ์ด๋ฏธ ๋‹ค์ค‘ ํ–‰๋ ฌ ๊ณ„์‚ฐ์„์œ„ํ•œ DSL์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ DiffEq๋Š” ์•„ํ•€ ์—ฐ์‚ฐ์ž ํ‘œํ˜„์‹์œผ๋กœ ์ž์ฒด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Base์—์„œ affine ํ‘œํ˜„์‹์— ๋Œ€ํ•œ ํ‘œํ˜„์ด ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฉด ๋ชจ๋“  ์ž‘์—…์ด ๋™์ผํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@dlfivefifty ๋Š” ์ „์— ๊ฒŒ์œผ๋ฅธ ์„ ํ˜• ๋Œ€์ˆ˜ํ•™์„ ์‚ดํŽด ๋ณด์•˜์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ์‹ค์ œ๋กœ ๋ถ€ํ™œํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ์†ก์˜ ๊ฒŒ์œผ๋ฅธ ํ‘œํ˜„์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์€ ์ถ”์ƒ ๋ฐฐ์—ด๊ณผ ๋Œ€์ฒด ๊ณ„์‚ฐ ํ•˜๋“œ์›จ์–ด์—์„œ ์š”์†Œ ๋ณ„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์„ ํ˜• ๋Œ€์ˆ˜์—๋„ ๋™์ผํ•˜๊ฒŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„ ํ˜• ๋Œ€์ˆ˜ ํ‘œํ˜„์‹์„ ํ‘œํ˜„ํ•˜๋ฉด Julia BLAS์—์„œ ์ฆ‰์„์—์„œ ์ƒˆ๋กœ์šด BLAS ์ปค๋„์„ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ๋ฐฉ์ •์‹์„ GPU / TPU๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณธ์งˆ์ ์œผ๋กœ ๊ณผํ•™ ์ปดํ“จํŒ…์˜ ๋ชจ๋“  ๊ณ„์‚ฐ์€ ์š”์†Œ ๋ณ„ ๋ฐ ์„ ํ˜• ๋Œ€์ˆ˜ ์—ฐ์‚ฐ์œผ๋กœ ๊ท€๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘์— ๋Œ€ํ•œ ๋†’์€ ์ˆ˜์ค€์˜ ์„ค๋ช…์€ ๋ฉ”ํƒ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ณ  ์ƒˆ๋กœ์šด ์„ค๊ณ„๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋„๊ตฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์ƒ๊ฐํ•ด์•ผํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์ž„์‹œ์—†์ด A*B*C ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ์ ์ธ ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์„ ์ง€๋ถˆํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ž„์‹œ์—†์ด A*B*C ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ mul! ์ด๋ฏธ ์ถœ๋ ฅ ๋ฐฐ์—ด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋„์›€์ด๋˜๋Š”์ง€ ์•„๋‹Œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. API mul!(Y, A, B, C...) ๋Š” ๊ณ„์‚ฐํ•˜๋ ค๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•˜๊ณ  ๊ตฌํ˜„์—์„œ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๋ชฉํ‘œ์˜€์Šต๋‹ˆ๋‹ค.

์ €๋Š” @StefanKarpinski ์˜ ์ œ์•ˆ์„ ๊ธฐ๋ณธ API ํ˜ธ์ถœ๋กœ ์ •๋ง ์ข‹์•„ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ์ง€ ์—ฌ๋ถ€๋„ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@ChrisRackauckas : ๋‹น์‹ ์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์€ ์™ธ๋ถ€ ํŒจํ‚ค์ง€์—์„œ ํƒ๊ตฌ ํ•  ์ˆ˜ ์žˆ๊ณ  ํƒ๊ตฌํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์œผ๋ฆ„, ์›ํ•˜๋Š” ๊ณ„์‚ฐ์„ ์ž‘์„ฑํ•˜๊ณ  ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ ์žˆ๋Š” ํŠน์ • ๋Œ€์ˆ˜ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ถ€๋ถ„์„ ์„ ํƒํ•˜๋„๋กํ•˜๋Š” ์ตœ์ ํ™” ๋“ฑ. ์ด์™€ ๊ฐ™์ด mul! ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€์ด ์ˆ˜์ค€์—์„œ ์›ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ž‘์—…์ด์ง€๋งŒ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ž‘์—…์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

mul!(Y, ฮฑ, A, B) ์— ๋Œ€ํ•œ ์‹ค์งˆ์ ์ธ ๋…ผ์Ÿ์ด ์—†๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. Y .= ฮฑ*A*B ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ๋Œ€์ฒด ๋ฌด์—‡์„ ์˜๋ฏธํ• ๊นŒ์š”? ๊ทธ๋ž˜์„œ ๋‚˜์—๊ฒŒ ์œ ์ผํ•œ ์—ด๋ฆฐ ์งˆ๋ฌธ์€ ํ–‰๋ ฌ๊ณผ ์™ผ์ชฝ ๋ฐ / ๋˜๋Š” ์˜ค๋ฅธ์ชฝ ์Šค์นผ๋ผ์™€ ํ•จ๊ป˜ ํŠœํ”Œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ถœ๋ ฅ ๋ฐฐ์—ด์„ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋ ค๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•˜๋Š” ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ•์ธ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. mul!(Y::Matrx, args...) : Y .= *(args...)
  2. mul!((ฮฒ, Y)::{Number, Matrix}, args...) : Y .= ฮฒ*Y + *(args...)
  3. mul!((Y, ฮฒ)::{Matrix, Number}, args...) : Y .= Y*ฮฒ + *(args...)
  4. mul!((ฮฒโ‚, Y, ฮฒโ‚‚)::{Number, Matrix, Number}, args...) : Y .= ฮฒโ‚*Y*ฮฒโ‚‚ + *(args...)

์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„ ํƒ์ ์œผ๋กœ ์Šค์ผ€์ผ๋ง๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ถœ๋ ฅ ๋ฐฐ์—ด์— ๋ฎ์–ด ์“ฐ๊ฑฐ๋‚˜ ๋ˆ„์ ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋‹นํ•œ ๋‹ค๋ฅธ ์ž‘์—…์— ๋Œ€ํ•œ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์œผ๋กœ ์ฑ„ํƒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mul!(out, args...) ์™€ GEMM๊ณผ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ "๋ณ‘ํ•ฉ"ํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค! ๋‚˜๋Š” ๊ทธ๊ฒƒ์˜ ํ™•์žฅ ์„ฑ์„ ์ข‹์•„ํ•œ๋‹ค (๊ทธ๋Ÿฌ๋‚˜ ์•„๋ž˜์— ๋‹ต์žฅ์„ ์“ฐ๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ์ง€๊ธˆ ๋‚˜๋Š” ํ™•์‹คํ•˜์ง€ ์•Š๋‹ค ...)

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ๊ฑฑ์ •์€ ๊ณผ๋ถ€ํ•˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ค‘์ฒฉ ๋œ ํŠœํ”Œ์— ๋Œ€ํ•ด ์ž˜ ์ž‘๋™ํ•˜๋ ค๋ฉด ์œ ํ˜• ์‹œ์Šคํ…œ์— ์˜์กดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ค‘์ฒฉ ๋œ ํŠœํ”Œ์ด Julia์˜ ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ํ”Œ๋žซ ํŠœํ”Œ๋งŒํผ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? Tuple{A1,B1,C1,D1} ๊ฐ€ Tuple{A2,B2,C2,D2} ๋ณด๋ฅ˜๋ณด๋‹ค ๋” ๊ตฌ์ฒด์ ์ธ ๊ฒฝ์šฐ " Tuple{Tuple{A1,B1},C1,D1} ๊ฐ€ Tuple{Tuple{A2,B2},C2,D2} ๋ณด๋‹ค ๋” ๊ตฌ์ฒด์ ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฒ„๋กœ๋”ฉ API๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊นŒ๋‹ค๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ํ–‰๋ ฌ์— ๋Œ€ํ•ด ์žฌ ํ•ด์„ ํ•ดํ‚น์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์Šค์นผ๋ผ ์œ ํ˜•์„ ๋””์ŠคํŒจ์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (PR # 29634์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ด๋ฏ€๋กœ ํ•จ์ˆ˜ ์ด๋ฆ„์—์ฃผ์˜ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค).

https://github.com/JuliaLang/julia/blob/fae1a7a3ae646c7ea1c08982976b57096fb0ae8d/stdlib/LinearAlgebra/src/matmul.jl#L157 -L169

๋˜ ๋‹ค๋ฅธ ๊ฑฑ์ •์€ ์ด๊ฒƒ์ด ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„ ์‹คํ–‰๊ธฐ์— ๋Œ€ํ•ด ๋‹ค์†Œ ์ œํ•œ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. multiply-add ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฃผ์š” ๋ชฉ์ ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„์ž๊ฐ€ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ๋Š” ์ž‘์€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณ„์‚ฐ ์ปค๋„์„ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜ค๋ฒ„๋กœ๋”ฉ API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, _C = ABฮฑ_ ๋งŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ  _ฮฑAB_๋Š” ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (https://github.com/JuliaLang/julia/pull/29634#issuecomment-443103667 ์ฐธ์กฐ). ๋น„๊ต ํ™˜ํ˜• eltype์— ๋Œ€ํ•ด _ฮฑโ‚ABฮฑโ‚‚_๋ฅผ ์ง€์›ํ•˜๋ ค๋ฉด ์ž„์‹œ ๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์‚ฐ์ˆ  ์—ฐ์‚ฐ ์ˆ˜๋ฅผ ๋Š˜๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด์ƒ์ ์œผ๋กœ๋Š”์ด๋ฅผ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” ์‹คํ–‰ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ๋ถ„๋ฆฌ ๋œ ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„ ํ‘œํ˜„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์™ธ๋ถ€ ํŒจํ‚ค์ง€ (์˜ˆ : LazyArrays.jl, MappedArrays.jl)์—์„œ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ธ์  ๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ตฌํ˜„ ์ „๋žต์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด mul! ๋ฅผ ๊ธฐ๋ณธ ์ง„์ž… ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ muladd! ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ–ฅํ›„ ํ˜ธ์ถœ API๋ฅผ์œ„ํ•œ ๊ณต๊ฐ„ ํ• ๋‹น.

์ด ์ œ์•ˆ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์ƒ๊ฐํ•ด์•ผํ•˜์ง€๋งŒ, ์ง€๊ธˆ์€ ์ž„์‹œ์—†์ด A B C๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ์ ์ธ ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์„ ์ง€๋ถˆํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์„ ํ‰๊ฐ€ํ•˜๋Š” ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์€ ํ•ญ์ƒ ์Œ ๋‹จ์œ„ ์ˆ˜์ถ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ํ–‰๋ ฌ์„ ๊ณฑํ•˜๋Š” ๊ฒƒ์€ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ ์ผ ๋ฟ์ด๋ฏ€๋กœ ์Œ์œผ๋กœ ๊ณฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (๋ฌผ๋ก  ์ตœ์ƒ์˜ ์ˆœ์„œ๋Š” ์‚ฌ์†Œํ•œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ์ €๋Š” mul!(Y,X1,X2,X3...) ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์œ ์šฉํ•œ ๊ธฐ๋ณธ ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ ์ด๊ฒƒ์ด mul! ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ํŠน์ • ์œ ํ˜•์— ๋Œ€ํ•ด ์˜ค๋ฒ„๋กœ๋“œ ํ•  ์ˆ˜์žˆ๋Š” ์›์‹œ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋” ๋ณต์žกํ•œ ์—ฐ์‚ฐ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๊ฒฐ๊ตญ mul! ์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ์—ฐ์‚ฐ์„ ํ˜ธ์ถœํ•˜์—ฌ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๊ทธ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋Š” @StefanKarpinski๊ฐ€ ์–ธ๊ธ‰ ํ•œ ๋น„ ๊ตํ™˜ ์  ์‚ฌ๋ก€์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ํฌํ•จํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ์ผ๋ฐ˜์  ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งคํŠธ๋ฆญ์Šค ๊ณฑ์…ˆ / ํ…์„œ ์ˆ˜์ถ•์ด ํฌํ•จ๋˜์ง€ ์•Š๋Š” ํ•œ, ์›์‹œ ์—ฐ์‚ฐ ์ธก๋ฉด์—์„œ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฐฉ์†ก์ฒ˜๋Ÿผ ๋ชจ๋“  ๊ฒƒ์„ ์œตํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์œ ์ต ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ Base์— ๊ธฐ๋ณธ ๊ฒŒ์œผ๋ฅธ ํ‘œํ˜„ / ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ mul! ๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@tkf :

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ๊ฑฑ์ •์€ ๊ณผ๋ถ€ํ•˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ค‘์ฒฉ ๋œ ํŠœํ”Œ์— ๋Œ€ํ•ด ์ž˜ ์ž‘๋™ํ•˜๋ ค๋ฉด ์œ ํ˜• ์‹œ์Šคํ…œ์— ์˜์กดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ค‘์ฒฉ ๋œ ํŠœํ”Œ์ด Julia์˜ ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ํ”Œ๋žซ ํŠœํ”Œ๋งŒํผ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

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

์ฆ‰, _C = ABฮฑ_ ๋งŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ _ฮฑAB_๋Š” ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ—ท๊ฐˆ๋ฆฌ๋„ค์š” ... mul!(C, A, B, ฮฑ) ๋ฐ mul!(C, ฮฑ, A, B) ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. mul!(C, ฮฑโ‚, A, ฮฑโ‚‚, B, ฮฑโ‚ƒ) ๋ผ๊ณ  ์“ธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง€๊ธˆ๊นŒ์ง€ ์ œ์•ˆ ๋œ ๊ฐ€์žฅ ์œ ์—ฐํ•œ ์ผ๋ฐ˜ ํ–‰๋ ฌ ๊ณฑ์…ˆ API์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๊ฑฑ์ •์€ ์ด๊ฒƒ์ด ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„ ์‹คํ–‰๊ธฐ์— ๋Œ€ํ•ด ๋‹ค์†Œ ์ œํ•œ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. multiply-add ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฃผ์š” ๋ชฉ์ ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„์ž๊ฐ€ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ๋Š” ์ž‘์€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณ„์‚ฐ ์ปค๋„์„ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜ค๋ฒ„๋กœ๋”ฉ API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” ์‹คํ–‰ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ๋ถ„๋ฆฌ ๋œ ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„ ํ‘œํ˜„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฐœ๋ฐœํ•ด์•ผํ•˜๋Š” ๊ณณ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์€ BLAS ์ž‘์—…์— ์ „๋‹ฌํ•  ์ˆ˜์žˆ๋Š” ํ•ญ๋ชฉ์„ ์ผ๋ฐ˜ํ™”ํ•˜๋Š” ํ–‰๋ ฌ ๊ณฑ์…ˆ API๋ฟ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด๊ฒƒ์ดํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

@Jutho

๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ํ–‰๋ ฌ์„ ๊ณฑํ•˜๋Š” ๊ฒƒ์€ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ ์ผ ๋ฟ์ด๋ฏ€๋กœ ์Œ์œผ๋กœ ๊ณฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (๋ฌผ๋ก  ์ตœ์ƒ์˜ ์ˆœ์„œ๋Š” ์‚ฌ์†Œํ•œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ์ €๋Š” mul!(Y,X1,X2,X3...) ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์œ ์šฉํ•œ ๊ธฐ๋ณธ ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

mul! ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌํ˜„์‹œ ์œ ์šฉํ•œ ์†์„ฑ ์ธ ๊ณฑ์…ˆ ์ˆœ์„œ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ, ์ž ์žฌ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜์žˆ๋Š” ๋Šฅ๋ ฅ์€ ์šฐ๋ฆฌ๊ฐ€ * ์—ฐ์‚ฐ์„ ์ฒ˜์Œ์— n-ary๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋„๋ก ๋งŒ๋“  ์ด์œ ์˜€์œผ๋ฉฐ ๋™์ผํ•œ ์ถ”๋ก ์ด mul! ๋” ๋งŽ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. , ์•„๋งˆ๋„ ๋‹น์‹ ์€ ์„ฑ๋Šฅ์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ๊ด€์‹ฌ์„ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๊ท€ํ•˜๊ฐ€ mul! ์— ๋Œ€ํ•œ ์ œ ์ œ์•ˆ์— ๋Œ€ํ•ด ๋ฐ˜๋Œ€ํ•˜๋Š”์ง€ ๋˜๋Š” ๋ฐ˜๋Œ€ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ค‘์ฒฉ์ด ์–ด๋””๋กœ ๋“ค์–ด์˜ค๋Š” ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ํŠœํ”Œ์—์„œ ์ผ๋ถ€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์ฆ‰์‹œ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๋งŒ ํผ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ์˜ LinearAlgebra์กฐ์ฐจ๋„ ๋‹ค์†Œ ์ทจ์•ฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์„ฑ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  ์˜คํžˆ๋ ค ๋””์ŠคํŒจ์น˜ ๋ฐ ๋ฉ”์„œ๋“œ ๋ชจํ˜ธํ•จ์„ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค (์œ ํ˜• ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ๋†€๋ž์Šต๋‹ˆ๋‹ค). ๋ฉ”์„œ๋“œ์˜ ํ•ด๊ฒฐ์ด ๋ชจ๋“  ์œ„์น˜ ์ธ์ˆ˜์˜ ํŠœํ”Œ ์œ ํ˜•์„ ๊ต์ฐจํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์ฒฉ ๋œ ํŠœํ”Œ์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์—๊ฒŒ ํ‰ํ‰ํ•œ ํŠœํ”Œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜์— ํŠœํ”Œ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘์ฒฉ ๋œ ํŠœํ”Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, _C = ABฮฑ_ ๋งŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ _ฮฑAB_๋Š” ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ—ท๊ฐˆ๋ฆฌ๋„ค์š” ... mul!(C, A, B, ฮฑ) ๋ฐ mul!(C, ฮฑ, A, B) ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"์šฐ๋ฆฌ๋Š” _C = ABฮฑ_ ๋ฅผ _C = AB_ _ฮฑAB_ ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ›„๋ณด๋Š” ๋ชจ๋“  ๋งคํŠธ๋ฆญ์Šค ์œ ํ˜• ์กฐํ•ฉ์—์„œ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค." (ํšจ์œจ์ ์œผ๋กœ๋Š” ํฐ O ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.) ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์‚ฌ์‹ค์ธ์ง€ ํ™•์‹คํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ ์–ด๋„ ํฌ์†Œ ํ–‰๋ ฌ์˜ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” ์‹คํ–‰ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ๋ถ„๋ฆฌ ๋œ ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„ ํ‘œํ˜„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฐœ๋ฐœํ•ด์•ผํ•˜๋Š” ๊ณณ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ๋‚˜์˜ ์š”์ ์ž…๋‹ˆ๋‹ค. ์ด API๋ฅผ ๊ทธ๋Ÿฌํ•œ ์‚ฌ์šฉ์„์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค (๋ฌผ๋ก  ์ „์ฒด ๋ชฉ์ ์€ ์•„๋‹™๋‹ˆ๋‹ค). vararg mul! ์˜ ๊ตฌํ˜„ ๋ฐ ๋””์ž์ธ์€ ์‚ฌ๋žŒ๋“ค์ด ์™ธ๋ถ€ ํŒจํ‚ค์ง€์˜ ๋””์ž์ธ ๊ณต๊ฐ„์„ ํƒ์ƒ‰ ํ•œ ํ›„์— ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ mul! ์กฐ์ฐจ๋„ ์œ ํ˜•์— ๋Œ€ํ•œ ๋””์ŠคํŒจ์น˜๊ฐ€ ์ด๋ฏธ "๊นจ์กŒ์Šต๋‹ˆ๋‹ค". SubArray ๋ฐ Adjoint ์™€ ๊ฐ™์€ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจํ˜ธ์„ฑ ์žฌ์ •์˜์˜ ์กฐํ•ฉ ์ฆ๊ฐ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์€ ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ LazyArrays.jl์—๋Š” ํŠน์„ฑ์ด์žˆ๋Š” mul! ์˜ ๊ฐœ๋… ์ฆ๋ช… ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ API๋ณด๋‹ค ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋…ผ์˜์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŠœํ”Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์šฉ์–ด๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋œ ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์œ ํ˜• ์‹œ์Šคํ…œ์ด์žˆ๋Š” ์ด์œ ๊ฐ€ ์•„๋‹Œ๊ฐ€์š”? ์ด ๊ฒฝ์šฐ LazyArrays.jl ์†”๋ฃจ์…˜์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๋ฉ€! ์—ฐ์‚ฐ์€ ๊ตฌํ˜„์—์„œ ์œ ์šฉํ•œ ์†์„ฑ ์ธ ๊ณฑ์…ˆ์˜ ์ˆœ์„œ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ, ์ž ์žฌ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜์žˆ๋Š” ๋Šฅ๋ ฅ์€ ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜์Œ์— * ์—ฐ์‚ฐ์„ n-ary๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋„๋ก ๋งŒ๋“  ์ด์œ ์˜€์œผ๋ฉฐ ๋™์ผํ•œ ์ถ”๋ก ์ด mul์— ๋” ๋งŽ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค! ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์•„๋งˆ ์„ฑ๋Šฅ์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ์‹ ๊ฒฝ์„ ์“ฐ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

* ๊ฐ€ n -ary๋กœ ๊ตฌ๋ฌธ ๋ถ„์„๋˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. TensorOperations.jl์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ๋กœ ์ˆ˜์ถ• ์ˆœ์„œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” @tensoropt ๋งคํฌ๋กœ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. n -ary ๋ฒ„์ „์˜ mul! ๋œ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์€ ํšจ์œจ์„ฑ ์ธก๋ฉด์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋„ฃ์„ ์ˆ˜์žˆ๋Š” ์‚ฌ์ „ ํ• ๋‹น ๋œ ์žฅ์†Œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ์žˆ์–ด ์ค‘์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ํ• ๋‹น ๋œ ๋‹ค์Œ gc '๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ TensorOperations.jl์—์„œ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์€ ๋Œ€๊ทœ๋ชจ ์ž„์‹œ ํ• ๋‹น์ด Julia์˜ gc ์„ฑ๋Šฅ์ด ๋งค์šฐ ์ข‹์ง€ ์•Š์€ ๊ณณ ์ค‘ ํ•˜๋‚˜๋ผ๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค (๋Œ€๋ถ€๋ถ„ gc ์‹œ๊ฐ„์ด 50 %๋กœ ์ด์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค).

๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด @tkf ๊ฐ€ ์˜นํ˜ธํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ mul! ์„ ์ง„์ •ํ•œ ์›์‹œ ์—ฐ์‚ฐ์œผ๋กœ ์ œํ•œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค : ์Šค์นผ๋ผ ๊ณ„์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ํ–‰๋ ฌ์„ ์„ธ ๋ฒˆ์งธ ํ–‰๋ ฌ๋กœ ๊ณฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ, ์šฐ๋ฆฌ๋Š” ๋น„ ๊ตํ™˜ ๋Œ€์ˆ˜์— ๋Œ€ํ•ด ์ด๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ง€๊ธˆ ๋‹น์žฅ์€ Julia์˜ mul! BLAS (gemm, gemv, ...)์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํŽธ๋ฆฌํ•œ ์•ก์„ธ์Šค๊ฐ€ ์ฆ‰์‹œ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŠœํ”Œ์„ ์‚ฌ์šฉํ•œ ์ œ์•ˆ์ด ๋งˆ์Œ์— ๋“ค์ง€๋Š” ์•Š์ง€๋งŒ ์ž ์žฌ์  ์ธ ํ˜ผ๋ž€์„ ์˜ˆ๊ฒฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ๋ก€ 4์—์„œ ์‚ฌ๋ก€ 2/3๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ์€ ๊ธฐ๋ณธ๊ฐ’ ฮฒโ‚ = 1 ๋ฐ ฮฒโ‚‚ = 1 (๋˜๋Š” ์‹ค์ œ๋กœ true )๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‘˜ ๋‹ค ์ง€์ •๋˜์ง€ ์•Š์œผ๋ฉด ๊ฐ‘์ž๊ธฐ ฮฒโ‚ = ฮฒโ‚‚ = 0 ( false )๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก , mul!((Y,), args...) ์•„๋‹ˆ๋ผ mul!(Y, args...) ๋ฅผ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ฌธ์ด ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋ฌธ์„œ์˜ ๋ฌธ์ œ์ด๋ฏ€๋กœ์ด ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด ์ €๋Š”์ด ๊ตฌ๋ฌธ์— ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์œ ํ˜•์˜ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ๋„์ž…๋˜๊ณ  ์žˆ๊ณ  ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ๋”ฐ๋ผ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ์€ ์ด๊ฒƒ์„ ์ž„์˜์˜ ์ˆ˜์˜ ํ–‰๋ ฌ์˜ ๊ณฑ์…ˆ์œผ๋กœ ์ฆ‰์‹œ ์ผ๋ฐ˜ํ™”ํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋‚˜๋Š” ์ด์ ์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

@dlfivefifty : ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ API๋ณด๋‹ค ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋…ผ์˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŠœํ”Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์šฉ์–ด๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋œ ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์œ ํ˜• ์‹œ์Šคํ…œ์ด์žˆ๋Š” ์ด์œ ๊ฐ€ ์•„๋‹Œ๊ฐ€์š”? ์ด ๊ฒฝ์šฐ LazyArrays.jl ์†”๋ฃจ์…˜์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ ์™„์ „ํ•œ lazy ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ LazyArrays๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œํŽธ, Y ์Šค์ผ€์ผ๋ง์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠœํ”Œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ทธ ์ ์€ ์–‘์˜ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ€๋ฒผ์šด ์ ‘๊ทผ ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ๋‹ค๋ฅธ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ฮฒโ‚ ๋ฐ ฮฒโ‚‚ ๋Œ€ํ•ด lscale ๋ฐ / ๋˜๋Š” rscale ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ์ด์ƒ ์šฐ์•„ํ•˜๊ฒŒ ๋Š๊ปด์ง€์ง€ ์•Š๊ณ  ์ค‘์š”ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

@Jutho : ๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด @tkf ๊ฐ€ ์˜นํ˜ธํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ mul! ์„ ์ง„์ •ํ•œ ์›์‹œ ์—ฐ์‚ฐ์œผ๋กœ ์ œํ•œ ํ•ฉ๋‹ˆ๋‹ค : ์Šค์นผ๋ผ ๊ณ„์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ํ–‰๋ ฌ์„ ์„ธ ๋ฒˆ์งธ ํ–‰๋ ฌ๋กœ ๊ณฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ์šฐ๋ฆฌ๋Š” ๋น„ ๊ตํ™˜ ๋Œ€์ˆ˜์— ๋Œ€ํ•ด ์ด๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ง€๊ธˆ ๋‹น์žฅ์€ Julia์˜ mul! BLAS (gemm, gemv, ...)์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํŽธ๋ฆฌํ•œ ์•ก์„ธ์Šค๊ฐ€ ์ฆ‰์‹œ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

mul! ๋Œ€ํ•œ ์ž‘์—…์˜ ์ž‘์€ ํ•˜์œ„ ์ง‘ํ•ฉ ๋งŒ ์ •์˜ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ ์œผ๋กœ ์œ ํšจํ•œ BLAS ํ˜ธ์ถœ์— ํ•ด๋‹นํ•˜๋Š” ์ž‘์—… ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

# gemm: alpha = 1.0, beta = 0.0
mul!(Y::Matrix, A::Matrix, B::Matrix) # gemm! Y, A

# gemm: alpha = ฮฑ, beta = 0.0 (these all do the same thing for BLAS types)
mul!(Y::Matrix, ฮฑ::Number, A::Matrix, B::Matrix)
mul!(Y::Matrix, A::Matrix, ฮฑ::Number, B::Matrix)
mul!(Y::Matrix, A::Matrix, B::Matrix, ฮฑ::Number)

# gemm: alpha = ฮฑ, beta = ฮฒ (these all do the same thing for BLAS types)
mul!((ฮฒ::Number, Y::Matrix), ฮฑ::Number, A::Matrix, B::Matrix)
mul!((ฮฒ::Number, Y::Matrix), A::Matrix, ฮฑ::Number, B::Matrix)
mul!((ฮฒ::Number, Y::Matrix), A::Matrix, B::Matrix, ฮฑ::Number)
mul!((Y::Matrix, ฮฒ::Number), ฮฑ::Number, A::Matrix, B::Matrix)
mul!((Y::Matrix, ฮฒ::Number), A::Matrix, ฮฑ::Number, B::Matrix)
mul!((Y::Matrix, ฮฒ::Number), A::Matrix, B::Matrix, ฮฑ::Number)

# gemm: alpha = ฮฑ, beta = ฮฒโ‚*ฮฒโ‚‚ (these all do the same thing for BLAS types)
mul!((ฮฒโ‚::Number, Y::Matrix, ฮฒโ‚‚::Number), ฮฑ::Number, A::Matrix, B::Matrix)
mul!((ฮฒโ‚::Number, Y::Matrix, ฮฒโ‚‚::Number), A::Matrix, ฮฑ::Number, B::Matrix)
mul!((ฮฒโ‚::Number, Y::Matrix, ฮฒโ‚‚::Number), A::Matrix, B::Matrix, ฮฑ::Number)

๋ฌด์—‡์„ ์œ„ํ•ด? BLAS ์ž‘์—…์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋งŽ์€ ๋ณ€ํ™”๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  1. ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ ์˜๋„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์˜๋„๊ฐ€ ์™ผ์ชฝ์ด๋‚˜ ์˜ค๋ฅธ์ชฝ ๋˜๋Š” ์–‘์ชฝ ๋ชจ๋‘์—์„œ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ํ‘œํ˜„ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๊ตฌํ˜„์„ ์„ ํƒํ•˜๋„๋ก ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  2. ๋น„ ๊ตํ™˜ ์š”์†Œ ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋„ ์˜ฌ๋ฐ”๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ํด๋ฐฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์˜ ์š”์ ์€ gemm์„ ํฌํ•จํ•˜๋Š” ๋‚ด๋ถ€ ํ–‰๋ ฌ ๊ณฑ์…ˆ์„ ์ผ๋ฐ˜ํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค! gemm๋ณด๋‹ค ๋” ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค!. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ณ„์†ํ•ด์„œ gemm! ๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ์ „์ฒด ๊ฒŒ์œผ๋ฅธ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” "full lazy arrays"๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ถ๊ทน์ ์œผ๋กœ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ œ๊ฑฐ๋˜๋Š” Broadcasted ์™€ ๊ฐ™์€ ์˜๋ฏธ์—์„œ lazy๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Applied ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•จ์ˆ˜์˜ ์ง€์—ฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ํŠœํ”Œ (์ปจํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์Œ)์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ–๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

materialize!(applied(+, applied(*, ฮฑ, A, B), applied(*, ฮฒ, C)))

์ด๊ฒƒ์€ ๋ฐฉ์†ก์˜ .* ํ‘œ๊ธฐ๋ฒ•์ฒ˜๋Ÿผ ์„คํƒ• ์ฝ”ํŒ…์„ํ•˜์—ฌ ๋” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, ํŠœํ”Œ ๊ธฐ๋ฐ˜ ์ œ์•ˆ๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์›ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ๋ช…ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@StefanKarpinski , ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด, ๋‚˜๋Š” ๋ฏธ๋ž˜์˜ ์ฆ๋ช…์ด๊ณ  ๋‹ค๋ฅธ ์ˆซ์ž ์œ ํ˜•์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ผ๋ฐ˜ํ™”๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค๋Š” ๋ฐ ํ™•์‹คํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ๋ชฉ๋ก์ด ์™„์ „ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์›์น™์ ์œผ๋กœ ๋‹ค์Œ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mul!((ฮฒโ‚::Number, Y::Matrix, ฮฒโ‚‚::Number), ฮฑโ‚::Number, A::Matrix, ฮฑโ‚‚::Number, B::Matrix, ฮฑโ‚ƒ::Number)

๋ชจ๋“  ์ถ•์†Œ ๋œ ๋ฒ„์ „, ์ฆ‰ 5 ๊ฐœ์˜ ์Šค์นผ๋ผ ์ธ์ˆ˜๊ฐ€ ๋ชจ๋‘ ์—†์„ ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ 2 ^ 5 = 32 ๊ฐœ์˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ํ–‰๋ ฌ์ด๋‚˜ ๋ฒกํ„ฐ์˜ ๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ๊ณผ ๊ฒฐํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฐฉ์†ก๊ณผ ๊ฐ™์€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋” ์‹คํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” @dlfivefifty์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์„ ์ƒ๋žตํ–ˆ์Œ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ 32 ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ๋‚˜์—๊ฒŒ ๊ทธ๋‹ค์ง€ ๋ฏธ์นœ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋Š” "๋ฐฉ์†ก๊ณผ ๊ฐ™์€ ์‹œ์Šคํ…œ"๋˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์“ธ ์ˆ˜์žˆ๋Š” ๊ฒŒ์œผ๋ฅธ ํ‰๊ฐ€ ์‹œ์Šคํ…œ์„ ์ถ”๊ฐ€ materialize!(applied(+, applied(*, ฮฑ, A, B), applied(*, ฮฒ, C))) ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ฒ”์œ„ ๋ฐ–์œผ๋กœ ํ›จ์”ฌ ๋” ํฐ ์ถ”๊ฐ€ ๋ฐ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜ ํ–‰๋ ฌ ๊ณฑ์…ˆ์„ ์ฒ ์žํ•˜๊ณ  BLAS๋กœ ๋ณด๋‚ผ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๋™์˜ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์‚ฌ๋žŒ๋“ค์ด ๊ณ„์†ํ•ด์„œ gemm! ์ง์ ‘ ์ „ํ™”๋ฅผ ๊ฑธ๋„๋กํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์•„๋งˆ๋„ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์Šค์นผ๋ผ ์ธ์ˆ˜๊ฐ€ ๋’ค์ชฝ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ ์‰ฝ๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ @eval ๋ฉ”ํƒ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ 32 ๊ฐœ์˜ ์ •์˜๋ฅผ ๋ชจ๋‘ ์‰ฝ๊ฒŒ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋˜‘๊ฐ™์ด ์ข‹์Šต๋‹ˆ๋‹ค. (์•„์‹œ๋‹ค์‹œํ”ผ mul ๋Š” gemm! ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ gemv ๋ฐ trmm ๋ฐ ...์ž…๋‹ˆ๋‹ค.)

BLAS ๋ž˜ํผ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. stdlib์—๋Š” ๋‹ค๋ฅธ ์ˆœ์ˆ˜ ์ค„๋ฆฌ์•„ ํŠน์ˆ˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ์ด๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉ API๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์ž‘์„ฑ์ž๋Š” ํŠน์ˆ˜ ๋งคํŠธ๋ฆญ์Šค ์œ ํ˜•์— ๋Œ€ํ•ด mul! ๋ฅผ ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‚ด ์ž…์žฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

  1. SparseArrays.jl์— ์ด๋ฏธ ์กด์žฌํ•˜๋ฏ€๋กœ mul!(C, A, B, a, b) ์ง€์›ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋งคํŠธ๋ฆญ์Šค ์œ ํ˜•์— ๋Œ€ํ•œ ๋””์ŠคํŒจ์น˜๊ฐ€ ์ œ๋Œ€๋กœ ํ™•์žฅ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค. (BandedMatrices.jl, BlockArrays.jl, LowRankApprox.jl ๋“ฑ์˜ ๊ด€๋ฆฌ์ž๋กœ์„œ ๊ฒฝํ—˜์„ ํ†ตํ•ด ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)
  3. ๋””์ž์ธ ๊ธฐ๋ฐ˜์˜ ํŠน์„ฑ์€ ํ™•์žฅ ์„ฑ์ด ์ข‹์ง€๋งŒ ๋””์ž์ธ ํŒจํ„ด์ด ์ด๋ฏธ ํ™•๋ฆฝ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ Applied ์™€ ๊ฐ™์€ ๋ฐฉ์†ก์„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ Julia 2.0๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผํ•˜๋ฉฐ ๋‚ด ์š”๊ตฌ์— ๋งž๋Š” LazyArrays.jl์—์„œ ํ”„๋กœํ†  ํƒ€์ž…์ด ๊ณ„์† ๊ฐœ๋ฐœ๋ฉ๋‹ˆ๋‹ค.

@dlfivefifty ๋งˆ์‹ญ์‹œ์˜ค ๋‹น์‹ ์˜ ๋™์Œ์ด์˜ ์–ด๋ ค์›€์„ ์ƒ๊ฐ mul!((Y, ฮฒ), ฮฑ, A, B) API๊ฐ€ ๊ฐ™์ด ๋™์ผ mul!(Y, A, B, ฮฑ, ฮฒ) ? Transpose ์™€ ๊ฐ™์€ ๋งคํŠธ๋ฆญ์Šค ๋ž˜ํผ๋ฅผ ๊ณ ๋ คํ•˜๋ฉด 2- ํŠœํ”Œ๊ณผ 3- ํŠœํ”Œ์„ ํฌํ•จํ•˜์—ฌ ๋‚œ์ด๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค (ํŠœํ”Œ์ด Julia์˜ ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ).

  1. SparseArrays.jl์— ์ด๋ฏธ ์กด์žฌํ•˜๋ฏ€๋กœ mul!(C, A, B, a, b) ์ง€์›ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ mul!(C, A, B, a, b) ์„ ์™„์ „ํžˆ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  C .= b*C + a*A*B ์„ ์˜๋ฏธํ•ด์•ผํ•œ๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์ด๊ฒƒ์„ ๋‘ ๋ฐฐ๋กœ ์ค„์—ฌ์•ผ ํ•  ์ข‹์€ ์ด์œ ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. mul! ์ด * ์˜ ์ธํ”Œ๋ ˆ ์ด์Šค ๋ฒ„์ „์ด๋ฉด mul!(out, args...) ์ด out .= *(args...) ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฒƒ์„ ์˜๋ฏธ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ, ์ด๊ฒƒ์€ ์—ญ์‚ฌ์  ์šฐ์—ฐ์— ์˜ํ•ด์„œ๋งŒ ์กด์žฌํ•˜๋Š” ์ž˜๋ชป ์ƒ๊ฐ๋˜๊ณ  ์ผ๊ด€์„ฑ์—†๋Š” API๊ฐ€ ์—‰๋ง์ธ ์‹œ์Šคํ…œ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. mul! ํ•จ์ˆ˜๋Š” SparseArrays ๋‚ด๋ณด๋‚ด์ง€์ง€ ์•Š๊ณ  ํŠน์ • ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ์ด ํ•จ์ˆ˜๊ฐ€ ์ถ”๊ฐ€ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€๋˜์—ˆ์„ ์ˆ˜์žˆ๋Š” ์ž˜๋ชป๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ™•๊ณ ํžˆ ํ•  ์ˆ˜์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ณต๊ฐœํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค! ๊ทธ ์‹ค์ˆ˜๋ฅผ ์ทจ์†Œํ•˜๊ณ  ๋Œ€์‹  mul! ๋ฉ”์„œ๋“œ๋ฅผ ์‚ญ์ œ / ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์ด ํ† ๋ก ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์—์„œ๋Š” ๋ชจ๋“  ์ดํ•ด ๊ด€๊ณ„์ž๊ฐ€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์™ธ๋ถ€์—์„œ ํŠน์„ฑ ๋ฐ / ๋˜๋Š” ๊ฒŒ์œผ๋ฆ„์œผ๋กœ ๋” ๋ฉ‹์ง„ ์ผ์„ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์„œ๋Š” ์•ˆ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋ฌผ๊ฑด์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์ด ํ† ๋ก ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์—์„œ๋Š” ๋ชจ๋“  ์ดํ•ด ๊ด€๊ณ„์ž๊ฐ€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์™ธ๋ถ€์—์„œ ํŠน์„ฑ ๋ฐ / ๋˜๋Š” ๊ฒŒ์œผ๋ฆ„์œผ๋กœ ๋” ๋ฉ‹์ง„ ์ผ์„ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์„œ๋Š” ์•ˆ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋ฌผ๊ฑด์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์กฐ๊ธˆ ์ง€์ณ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ ๊ฒฐ๋ก ์ด ์‚ฌ์‹ค์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ œ์•ˆ์ด ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ ๋  ์ˆ˜ ์žˆ๊ณ  ํŒจํ‚ค์ง€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž์‹ ์˜ ํ–‰๋ ฌ ๋ฐ ๋ฒกํ„ฐ ์œ ํ˜• (@tkf์—์„œ ์–ธ๊ธ‰ ํ•œ๋Œ€๋กœ)์— ๋Œ€ํ•ด ํ•ด๋‹น ์ •์˜๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•˜๋„๋ก ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜๋Š” ๊ฒฝ์šฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ.

ํŠนํžˆ ํŒจํ‚ค์ง€ ๊ฐœ๋ฐœ์ž๋Š” ๋‹ค์Œ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

mul!((ฮฒโ‚, Y::MyVecOrMat, ฮฒโ‚‚), ฮฑโ‚, A::MyMat, ฮฑโ‚‚, B:: MyVecOrMat, ฮฑโ‚ƒ)

๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„

mul!((ฮฒโ‚, Y::MyVecOrMat, ฮฒโ‚‚), ฮฑโ‚, A::Adjoint{<:MyMat}, ฮฑโ‚‚, B:: MyVecOrMat, ฮฑโ‚ƒ)
...

Julia Base (๋˜๋Š” LinearAlgebra ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๋Š” ๋ชจ๋“  ๊ธฐ๋ณธ๊ฐ’ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ๊ฐœ๋ฐœ์ž๋Š” ๋‹ค์Œ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

mul!((ฮฒโ‚, Y::MyVecOrMat, ฮฒโ‚‚), ฮฑโ‚, A::MyMat, ฮฑโ‚‚, B:: MyVecOrMat, ฮฑโ‚ƒ)

๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

mul!((Y, ฮฒ), A, B, ฮฑ)

์˜ค๋ฒ„๋กœ๋“œ ํ•  ์„œ๋ช…์œผ๋กœ. ์ด๋Š” ฮฑ ๋‹ค๋ฅธ ์œ„์น˜๊ฐ€ ํฐ O ์‹œ๊ฐ„ ๋ณต์žก์„ฑ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐ : https://github.com/JuliaLang/julia/pull/29634#issuecomment -443103667. ์ด๊ฒƒ์€ ๋น„ ๊ตํ™˜ ์ˆ˜์— ๋น„ ์ผ๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ AFAICT๋Š” ์—ฌ๊ธฐ์— ์•„๋ฌด๋„ ์‹ค์ œ๋กœ ๋น„ ๊ตํ™˜ ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‹ค์ œ ํ•„์š”๊ฐ€์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@StefanKarpinski ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” ํ•œ ๊ฐ€์ง€๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  A (์˜ˆ : Adjoint{_,<:SparseMatrixCSC} )์˜ _some_ ํ–‰๋ ฌ ์œ ํ˜•์— ๋Œ€ํ•ด mul!((Y, ฮฒ), ฮฑ::Diagonal, A, B) ๋Œ€ํ•œ ํŠน์ˆ˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. . (์ด๊ฒƒ์€ ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.) ๋ฌผ๋ก ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด API, ํŠนํžˆ ํŠน์ˆ˜ ๋ฉ”์„œ๋“œ์˜ ์กด์žฌ๋ฅผ ์ฟผ๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋…ผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ API๋ฅผ ํ™•์žฅ ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋Œ€๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ๋ฉ”์„œ๋“œ ๋ชจํ˜ธ์„ฑ์— ๋Œ€ํ•œ ๋‚ด ๊ฑฑ์ •์„ ๋ช…ํ™•ํžˆํ•œ๋‹ค๋ฉด ๋‚˜๋Š” ๊ทธ๋ฃน ๋ณ„ ํŠœํ”Œ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋ชจ๋‘ ์ฐธ์—ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Š” ฮฑ์˜ ๋‹ค๋ฅธ ์œ„์น˜๊ฐ€ ํฐ O ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํŠน๋ณ„ํžˆ ํฌ์†Œ ํ–‰๋ ฌ์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ํŠนํžˆ ๋ฐ€๋„๊ฐ€ ๋†’์€ ํ–‰๋ ฌ์— ๋Œ€ํ•ด์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐํ•˜๋Š” ๊ตฌํ˜„์—์„œ ฮฑ ๊ฐ€ A ์™€ B ์‚ฌ์ด์—์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ๊ฐœ๋ฐœ์ž๋Š” ๊ตฌํ˜„ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. BlockArrays.jl์˜ PseudoBlockMatrix ์™€ ๊ฐ™์ด strided ํ–‰๋ ฌ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ํ–‰๋ ฌ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด gemm! ์šฐ๋ฆฌ์˜ ๋ชจ๋“  ์ˆœ์—ด ์˜ค๋ฒ„๋ผ์ด๋“œ (override) ํ•  ํ•„์š”๊ฐ€ PseudoBlockMatrix (1) ์ž์ฒด, (2) StridedMatrix , (3) Adjoint ์˜ ์ž์ฒด๋ฅผ , (4) Transpose s ์ž์ฒด, (5) Adjoint s of StridedMatrix , (6) Transpose s of StridedMatrix , ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ๋‹ค๋ฅธ. ์ด๊ฒƒ์€ ์ด๋ฏธ 6 ^ 3 = 216 ๊ฐœ์˜ ๋‹ค๋ฅธ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ trmm! ๋ฅผ ์ง€์›ํ•˜๊ณ  UpperTriangular , UnitUpperTriangular , ๊ทธ๋“ค์˜ adjoints, ๊ทธ๋“ค์˜ transposes ๋“ฑ์œผ๋กœ ๋˜‘๊ฐ™์ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ gsmm! Symmetric ๋ฐ Hermitian ์™€ ํ•จ๊ป˜

๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์šฐ๋ฆฌ๋Š” ํ–‰๋ ฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•˜์œ„ ๋ทฐ, ํŠนํžˆ ๋ธ”๋ก์œผ๋กœ ์ž‘์—…ํ•˜๋ ค๋Š” ๋ธ”๋ก ํ–‰๋ ฌ์— ๋Œ€ํ•ด ์ž‘์—…ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์œ„์˜ 6 ๊ฐ€์ง€ ์กฐํ•ฉ๊ณผ ํ•จ๊ป˜ ๋งคํŠธ๋ฆญ์Šค ๋ทฐ์˜ ๋ชจ๋“  ํผ๋ฎค ๋ ˆ์ด์…˜์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์šฐ๋ฆฌ๋Š” ๋งค์šฐ ๋ณต์žกํ•œ ๊ณต์šฉ์ฒด ์œ ํ˜• ์ธ StridedMatrix ์™€ ๊ด€๋ จ๋œ ์ˆ˜์ฒœ ๊ฐœ์˜ ์žฌ์ •์˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์ด๋ฏ€๋กœ using ์‹œ๊ฐ„์ด ๋ช‡ ์ดˆ๊ฐ€ ์•„๋‹Œ ๋ช‡ ๋ถ„ ์ด์ƒ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ํ˜„์žฌ mul! ๋ฐ ์ œ์•ˆ ๋œ ํ™•์žฅ mul! ๋Š” ์„ค๊ณ„ ์ƒ ๊ฒฐํ•จ์ด ์žˆ์œผ๋ฏ€๋กœ ํŒจํ‚ค์ง€ ๊ฐœ๋ฐœ์ž๋Š” ์ด์— ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ LazyArrays.jl์€ ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์ž„์‹œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” @StefanKarpinski ๊ฐ€ ์ข€ ๋” ์‹ค์งˆ์ ์ธ ์žฌ ์„ค๊ณ„๋ฅผ ์ถ”๊ตฌ ํ•  ๋•Œ๊นŒ์ง€ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋””์ž์ธ์— ๊ฒฐํ•จ์ด์žˆ๋Š” ๊ฒƒ์— ๋…ธ๋ ฅ์„ ํˆฌ์žํ•˜๋Š” ๊ฒƒ์€ ๋ˆ„๊ตฌ์˜ ์‹œ๊ฐ„์„ ์ž˜ ํ™œ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@dlfivefifty , ์Šค์นผ๋ผ ์ธ์ˆ˜๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹ ๋งŒ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ mul!(C,A,B) ๋Œ€ํ•ด ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋‹ค๋ฅธ ๋งคํŠธ๋ฆญ์Šค ์œ ํ˜•์˜ ๋ชจ๋“  ์ปด ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ฌผ๋ก  ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์ด๋Š” ฮฑ์˜ ๋‹ค๋ฅธ ์œ„์น˜๊ฐ€ ํฐ O ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํŠน๋ณ„ํžˆ ํฌ์†Œ ํ–‰๋ ฌ์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ํŠนํžˆ ๋ฐ€๋„๊ฐ€ ๋†’์€ ํ–‰๋ ฌ์— ๋Œ€ํ•ด์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐํ•˜๋Š” ๊ตฌํ˜„์—์„œ ฮฑ ๊ฐ€ A ์™€ B ์‚ฌ์ด์—์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

@Jutho ์ผ๋ฐ˜์ ์œผ๋กœ ฮฑ ๋ฅผ ๊ฐ€์žฅ ์•ˆ์ชฝ์˜ ๋ฃจํ”„ ์œ„์น˜์— ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,์ด ๊ฒฝ์šฐ ฮฑโ‚*A*B*ฮฑโ‚ƒ ๋Š” ์ง€์›ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ A*ฮฑโ‚‚*B ๋Š” ์ง€์›ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

https://github.com/JuliaLang/julia/blob/11c5680d5620b0b64420055e8474a2b8cf757010/stdlib/LinearAlgebra/src/matmul.jl#L661 -L670

๋‚˜๋Š” ์ ์–ด๋„ ์ƒ๊ฐ ฮฑโ‚ ๋˜๋Š” ฮฑโ‚‚ ์—์„œ ฮฑโ‚*A*ฮฑโ‚‚*B*ฮฑโ‚ƒ ๊ฐ€ ๋  1 ์ ๊ทผ ์‹œ๊ฐ„ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๋„๋กํ•ฉ๋‹ˆ๋‹ค.

@dlfivefifty ํ•˜์ง€๋งŒ

์•„๋‹ˆ์š”, Broadcasted ์— "primitive"๊ฐ€์—†๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ "primitive"๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” "์ปค๋„"๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ApplyStyle ์™€ ํ•จ๊ป˜ ๊ฒŒ์œผ๋ฅธ Applied ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋„๋ก ์žฌ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ BLAS์™€ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ธ์‹ํ•˜๋Š” MulAddStyle ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” materialize! ๋˜๋Š” copyto! ๋ฅผ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ๋ฐฉ์†ก ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, LazyArrays.jl์ด ๋ฃจํ”„๊ฐ€์žˆ๋Š” ํ•จ์ˆ˜๋กœ ์ง€์—ฐ ํ‘œํ˜„์„ ๋‚ฎ์ถ”๊ฑฐ๋‚˜ ์–ธ์  ๊ฐ€๋Š” ccall s๋ฅผ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋‚ฎ์ถ”์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์ด mul! ์ด๋ฉด ๋‚˜์ ๊นŒ์š”?

์ด๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. BlockArrays.jl์˜ PseudoBlockMatrix์™€ ๊ฐ™์ด strided ํ–‰๋ ฌ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ํ–‰๋ ฌ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. gemm์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค! PseudoBlockMatrix์˜ ๋ชจ๋“  ์ˆœ์—ด์„ (1) ์ž์ฒด, (2) StridedMatrix, (3) ์ž์ฒด์˜ ์ธ์ ‘, (4) ์ž์‹ ์˜ ์ „์น˜, (5) StridedMatrix์˜ ์ธ์ ‘, (6) StridedMatrix์˜ ์ „์น˜ ๋ฐ ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ์žฌ์ •์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. . ์ด๊ฒƒ์€ ์ด๋ฏธ 6 ^ 3 = 216 ๊ฐœ์˜ ๋‹ค๋ฅธ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด trmm์„ ์ง€์›ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ UpperTriangular, UnitUpperTriangular, ๊ทธ๋“ค์˜ ์ธ์ ‘, ๊ทธ๋“ค์˜ ์ „์น˜ ๋“ฑ๋“ฑ์— ๋Œ€ํ•ด ๋˜‘๊ฐ™์ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ gsmm! Symmetric ๋ฐ Hermitian๊ณผ ํ•จ๊ป˜.
๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์šฐ๋ฆฌ๋Š” ํ–‰๋ ฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•˜์œ„ ๋ทฐ, ํŠนํžˆ ๋ธ”๋ก์œผ๋กœ ์ž‘์—…ํ•˜๋ ค๋Š” ๋ธ”๋ก ํ–‰๋ ฌ์— ๋Œ€ํ•ด ์ž‘์—…ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์œ„์˜ 6 ๊ฐ€์ง€ ์กฐํ•ฉ๊ณผ ํ•จ๊ป˜ ๋งคํŠธ๋ฆญ์Šค ๋ทฐ์˜ ๋ชจ๋“  ํผ๋ฎค ๋ ˆ์ด์…˜์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ ์šฐ๋ฆฌ๋Š” ๋งค์šฐ ๋ณต์žกํ•œ ๊ณต์šฉ์ฒด ์œ ํ˜• ์ธ StridedMatrix๋ฅผ ํฌํ•จํ•˜๋Š” ์ˆ˜์ฒœ ๊ฐœ์˜ ์žฌ์ •์˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์ด๋ฏ€๋กœ ์‚ฌ์šฉ ์‹œ๊ฐ„์ด ๋ช‡ ์ดˆ๊ฐ€ ์•„๋‹Œ ๋ช‡ ๋ถ„ ์ด์ƒ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ˜„์žฌ StridedArray ์œ ํ˜• ์œ ๋‹ˆ์˜จ์ด ์ฃผ์š” ๋””์ž์ธ ๊ฒฐํ•จ์ด๋ผ๋Š” ๋ฐ ํ™•์‹คํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š”์ด ๋ฌธ์ œ๋ฅผ ์–ด๋Š ์‹œ์ ์—์„œ ๊ณ ์น˜๋ ค๋Š” ๋‹น์‹ ์˜ ์‹œ๋„๋ฅผ์ง€์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.

Strided.jl์—์„œ๋Š” ๊ด€๋ จ๋œ ๋ชจ๋“  ํ–‰๋ ฌ์ด ๋‚ด ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜• (Abstract)StridedView ์ผ ๋•Œ mul! ๋งŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. A, B ๋ฐ C ์œ ํ˜•์ด ํ˜ผํ•ฉ ๋  ๋•Œ๋งˆ๋‹ค Julia์—๊ฒŒ Base / LinearAlgebra๊ฐ€์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ธฐ๋ณธ ์œ ํ˜•์„ StridedView ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” @strided ๋งคํฌ๋กœ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ StridedView ๋Š” ๋™์ผํ•œ (ํŒŒ๋ผ ๋ฉ”ํŠธ๋ฆญ) ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜์œ„๋ณด๊ธฐ, ์ „์น˜ ๋ฐ ์ธ์ ‘, ํŠน์ • ๋ชจ์–‘ ๋ณ€๊ฒฝ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ ์ „์ฒด ๊ณฑ์…ˆ ์ฝ”๋“œ๋Š” ์•ฝ 100 ์ค„์ž…๋‹ˆ๋‹ค.
https://github.com/Jutho/Strided.jl/blob/master/src/abstractstridedview.jl#L46 -L147
BLAS๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋„ค์ดํ‹ฐ๋ธŒ Julia ๋Œ€์ฒด๋Š” ํ•ด๋‹น ํŒจํ‚ค์ง€์—์„œ ์ œ๊ณตํ•˜๋Š”๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ mapreducedim! ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜๋ฉฐ LinearAlgebra ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋œ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค.

์ ๊ทผ ์‹œ๊ฐ„ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๋„๋ก ฮฑโ‚*A*ฮฑโ‚‚*B*ฮฑโ‚ƒ ์—์„œ ฮฑโ‚ ๋˜๋Š” ฮฑโ‚‚ ์ด์ƒ์ด ฮฑโ‚ ์ด์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@tkf , ๋‚˜๋Š” ์ด๋Ÿฌํ•œ ์Šค์นผ๋ผ ๊ณ„์ˆ˜๊ฐ€ ๊ธฐ๋ณธ๊ฐ’ one(T) ๋˜๋Š” ๋” ๋‚˜์€ ๊ฒฝ์šฐ true , ์ƒ์ˆ˜ ์ „ํŒŒ ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™”๊ฐ€ ์ž๋™์œผ๋กœ ํ•ด๋‹น ๊ณฑ์…ˆ์„ ์ œ๊ฑฐํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๋•Œ ๊ฐ€์žฅ ์•ˆ์ชฝ ๋ฃจํ”„์—์„œ. ๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ˜•์‹์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์—ฌ์ „ํžˆ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1 ( true )์˜ ๋ชจ๋“  ๊ณฑ์…ˆ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์ˆ˜ ์ „ํŒŒ์— ์˜์กด ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, eltype์€ Matrix ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ true * x ( x::Matrix )๊ฐ€ x ์˜ ํž™ ํ• ๋‹น ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Julia๊ฐ€ ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์ˆ ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@Jutho ์ €๋Š”์ด ๋ฒค์น˜ ๋งˆํฌ๊ฐ€ Julia๊ฐ€ ์–ด๋–ค ๊ฒฝ์šฐ์— ์ค‘๊ฐ„ ๊ณฑ์…ˆ์„ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

function simplemul!((ฮฒโ‚, Y, ฮฒโ‚‚), ฮฑโ‚, A, ฮฑโ‚‚, B, ฮฑโ‚ƒ)
    <strong i="7">@assert</strong> size(Y, 1) == size(A, 1)
    <strong i="8">@assert</strong> size(Y, 2) == size(B, 2)
    <strong i="9">@assert</strong> size(A, 2) == size(B, 1)
    <strong i="10">@inbounds</strong> for i in 1:size(A, 1), j = 1:size(B, 2)
        acc = zero(ฮฑโ‚ * A[i, 1] * ฮฑโ‚‚ * B[1, j] * ฮฑโ‚ƒ +
                   ฮฑโ‚ * A[i, 1] * ฮฑโ‚‚ * B[1, j] * ฮฑโ‚ƒ)
        for k = 1:size(A, 2)
            acc += A[i, k] * ฮฑโ‚‚ * B[k, j]
        end
        Y[i, j] = ฮฑโ‚ * acc * ฮฑโ‚ƒ + ฮฒโ‚ * Y[i, j] * ฮฒโ‚‚
    end
    return Y
end

function simplemul!((Y, ฮฒ), A, B, ฮฑ)
    <strong i="11">@assert</strong> size(Y, 1) == size(A, 1)
    <strong i="12">@assert</strong> size(Y, 2) == size(B, 2)
    <strong i="13">@assert</strong> size(A, 2) == size(B, 1)
    <strong i="14">@inbounds</strong> for i in 1:size(A, 1), j = 1:size(B, 2)
        acc = zero(A[i, 1] * B[1, j] * ฮฑ +
                   A[i, 1] * B[1, j] * ฮฑ)
        for k = 1:size(A, 2)
            acc += A[i, k] * B[k, j]
        end
        Y[i, j] = acc * ฮฑ + Y[i, j] * ฮฒ
    end
    return Y
end

fullmul!(Y, A, B) = simplemul!((false, Y, false), true, A, true, B, true)
minmul!(Y, A, B) = simplemul!((Y, false), A, B, true)

using LinearAlgebra
k = 50
n = 50
A = [randn(k, k) for _ in 1:n, _ in 1:n]
B = [randn(k, k) for _ in 1:n]
Y = [zeros(k, k) for _ in 1:n]
<strong i="15">@assert</strong> mul!(copy(Y), A, B) == fullmul!(copy(Y), A, B) == minmul!(copy(Y), A, B)

using BenchmarkTools
<strong i="16">@btime</strong> mul!($Y, $A, $B)     # 63.845 ms (10400 allocations: 99.74 MiB)
<strong i="17">@btime</strong> fullmul!($Y, $A, $B) # 80.963 ms (16501 allocations: 158.24 MiB)
<strong i="18">@btime</strong> minmul!($Y, $A, $B)  # 64.017 ms (10901 allocations: 104.53 MiB)

์ข‹์€ ๋ฒค์น˜ ๋งˆํฌ. ๋‚˜๋Š” ๋˜ํ•œ ์ด๋ฏธ ์œ ์‚ฌํ•œ ์‹คํ—˜์— ์˜ํ•ด ์ด๋Ÿฌํ•œ ํ• ๋‹น์ด ์‹ค์ œ๋กœ ์ œ๊ฑฐ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž„์„ ์ด๋ฏธ ์•Œ๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ *(::One, x::Any) = x ๋ฐ *(x::Any, ::One) = x ๋งŒ ์ •์˜ํ•˜๊ณ  ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉ์ž ์œ ํ˜•์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ํŠน์ˆ˜ ๋ชฉ์  One ์‹ฑ๊ธ€ ํ†ค ์œ ํ˜•์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ธฐ๋ณธ๊ฐ’์— ๋Œ€ํ•œ ์ตœ์†Œํ•œ ฮฑโ‚‚ , ์ˆ˜ One() .

์•„, ๋„ค, ์˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ์ฒ˜์Œ์— ฮฑโ‚ * A * ฮฑโ‚‚ * B * ฮฑโ‚ƒ ๋ฅผ ์ง€์›ํ•ด๋„ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. A ์ด ํ–‰๋ ฌ์˜ ํ–‰๋ ฌ์ด๊ณ  (์˜ˆ๋ฅผ ๋“ค์–ด) ์šฐ๋ฆฌ๊ฐ€ํ•ด์•ผ ํ•  ์ผ์ด ์ˆ˜ํ•™์ ์œผ๋กœ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. ฮฑโ‚ ๋Š” ํ–‰๋ ฌ์ž…๋‹ˆ๋‹ค. ฮฑ ์œ„์น˜์—์„œ ์Šค์นผ๋ผ๊ฐ€ ์•„๋‹Œ ์ธ์ˆ˜๋ฅผ _ ์ ˆ๋Œ€ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๊ทธ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ ์ œ์‹œ ํ•  ์ˆ˜ Y .= ฮฒโ‚*Y*ฮฒโ‚‚ + *(args...) ์˜ ์ •์‹  ๋ชจ๋ธ๋กœ mul!((ฮฒโ‚, Y, ฮฒโ‚‚), args...) . ๊ฒŒ๋‹ค๊ฐ€ ๋Œ€๊ฐ ํ–‰๋ ฌ์„ ฮฑโ‚ ๋˜๋Š” ฮฑโ‚‚ ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฑฐ์˜ "๋ฌด๋ฃŒ๋กœ"๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ค‘์š” ํ•จ). ๋‘ ๊ฐ€์ง€ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

(1) mul!((ฮฒโ‚, Y, ฮฒโ‚‚), ฮฑโ‚, A, ฮฑโ‚‚, B, ฮฑโ‚ƒ) ํ•˜์ง€๋งŒ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋กœ๋“œ ํ•  ๋•Œ ฮฑ ๋ฐ ฮฒ ์ธ์ˆ˜๋Š” Diagonal ํ—ˆ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ข… ์‚ฌ์šฉ์ž ์ฝ”๋“œ๊ฐ€ ์—ฌ์ „ํžˆ ์Šค์นผ๋ผ ๊ฐ’์„ ํ†ตํ•ด ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ˜ธ์ถœ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋ ค๋ฉด Diagonal(fill(ฮป, n)) https://github.com/JuliaLang/julia/pull/30298#discussion_r239845163 ์˜ "O (1) ๋ฒ„์ „"์ด LinearAlgebra์—์„œ ๊ตฌํ˜„๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์Šค์นผ๋ผ ๋ฐ ๋Œ€๊ฐ ฮฑ ๋Œ€ํ•œ ๊ตฌํ˜„์€ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ข…์ข… ฮฑ ๋ฐ ฮฑ.diag[i] ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํŒจํ‚ค์ง€ ์ž‘์„ฑ์ž์—๊ฒŒ ํฐ ๋ถ€๋‹ด์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์ œ A ๊ฐ€ ํ–‰๋ ฌ์˜ ํ–‰๋ ฌ์ด๊ณ  ฮฑ ๊ฐ€ A ๋•Œ mul!(Y, ฮฑ * I, A, B) ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ ๋ชจํ˜ธํ•จ์ด ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค eltype / A

(2) ์œ„์˜ ๊ฒฝ๋กœ (1)๊ฐ€ ์—ฌ์ „ํžˆ ๋„ˆ๋ฌด ๋ณต์žกํ• ๊นŒ์š”? ๊ทธ๋ ‡๋‹ค๋ฉด ์ง€๊ธˆ์€ muladd! ๋Œ€์‹  ์‚ฌ์šฉํ•˜์„ธ์š”. mul!((ฮฒโ‚, Y, ฮฒโ‚‚), ฮฑโ‚, A, ฮฑโ‚‚, B, ฮฑโ‚ƒ) ๋ฅผ ์ง€์›ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ์ €๋Š”์ด ์ผ๋ฐ˜ ์„œ๋ช…์— ๋Œ€ํ•ด์„œ๋งŒ ์ž‘๋™ํ•˜๋„๋ก ์ •์˜ ๋œ ๋งค์šฐ ์ œํ•œ์ ์ด๊ณ  ํŠน์ˆ˜ํ•œ matmul!(C, A, B, ฮฑ, ฮฒ) ๋ฅผ ๊ฐ€์ ธ์„œ๋Š” ์•ˆ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

matmul!(
    C :: VecOrMatT,
    A :: Matrix{T},
    B :: VecOrMatT,
    ฮฑ :: Union{Bool,T} = true,
    ฮฒ :: Union{Bool,T} = false,
) where {
    T <: Number,
    VecOrMatT <: VecOrMat{T},
}

๋˜ํ•œ์ด ์„œ๋ช…์ด ์ž‘์„ฑ๋˜๊ณ  ๋ฐœ์†ก ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ •๋ง ๋†€๋ž์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋‚ด ์ œ์•ˆ (2)์ž…๋‹ˆ๋‹ค. (๋‚˜๋Š” A :: Matrix{T} ๊ฐ€ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ Core.Array{T,2} ์˜๋ฏธํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด gemm! )

๋‚˜๋Š” ์ž„์‹œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ๋งŒ์กฑํ•  ๊ฒƒ์ด๋ฉฐ ๋‚ด๊ฐ€ ์œ ์ง€ํ•˜๋Š” ํŒจํ‚ค์ง€์—์„œ ๋ถ€๋ถ„์ ์œผ๋กœ ์ง€์›ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ (๋ฏธํ•ด๊ฒฐ ํŠน์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด "๋ถ€๋ถ„์ ") ๋ฏน์Šค์— ๋‹ค๋ฅธ ์ด๋ฆ„์ด ์ถ”๊ฐ€๋˜์ง€๋งŒ : mul! , muladd! ๋ฐ ํ˜„์žฌ matmul! .

... ๋ˆ„๊ตฐ๊ฐ€ "๋ถ„๋ฅ˜ ์ธ์ด ๋งํ•œ๋‹ค ..."๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ  ์ „ํ™”๋ฅผ ๊ฑธ ์‹œ๊ฐ„์ด ์•„๋‹™๋‹ˆ๊นŒ?

๋˜ํ•œ์ด ์„œ๋ช…์ด ์ž‘์„ฑ๋˜๊ณ  ๋ฐœ์†ก ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ •๋ง ๋†€๋ž์Šต๋‹ˆ๋‹ค.

์ด ์„œ๋ช…์„ ์ •ํ™•ํžˆ mul! ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค๊ธฐ์œ„ํ•œ ์ธ์ˆ˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ข€ ๋” ์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜์ด ๋‚˜์˜ฌ ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•˜์—ฌ ์™„์ „ํžˆ ํ๊ธฐ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ mul! ์˜ ๋ฉ”์†Œ๋“œ๋กœ ๋งŒ๋“ค๊ธฐ

mul!(C, A, B, ฮฑ, ฮฒ) ๊ฐ€๋ฉด ํ˜ธํ™˜์„ฑ์„ ๊นจ์ง€ ์•Š๊ณ  mul!((ฮฒโ‚, Y, ฮฒโ‚‚), ฮฑโ‚, A, ฮฑโ‚‚, B, ฮฑโ‚ƒ) ๋“ฑ์œผ๋กœ ์ผ๋ฐ˜ํ™” ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. (์•„๋งˆ๋„์ด โ€‹โ€‹ํ† ๋ก ์—์„œ ์˜์›ํžˆ ์ž์œ ๋กญ๊ธฐ ๋•Œ๋ฌธ์— "ํŠน์ง•"์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค : smile :).

๋˜ํ•œ ๊ฒฝ๊ณ„ ์š”์†Œ ์œ ํ˜•์„ Number _and_ ํ˜„์žฌ 3-arg mul! (์ด๋ฏธ Number ์š”์†Œ ์œ ํ˜•์„ ์ง€์›ํ•˜์ง€ ์•Š์Œ)๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด ์ค‘๋ณต.

mul!((ฮฒโ‚, Y, ฮฒโ‚‚), ฮฑโ‚, A, ฮฑโ‚‚, B, ฮฑโ‚ƒ) ์ด (๊ฐ€) ๋ฌด์—‡์„ ๊ธฐ๋Œ€ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค ... ๊ทธ๋ž˜์„œ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ถฉ๋Œ. ๋” ๋‚˜์€ ๋‚ด๋ถ€ ์„ฑ๋Šฅ์„ ์–ป๊ธฐ ์œ„ํ•ด ์–ด๋””์—์„œ๋‚˜ BLAS ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด ์Šฌํ”„๋‹ค.

@StefanKarpinski ๋ถ„๋ฅ˜์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ „ํ™”์— ์•ฝ๊ฐ„์˜ ์‚ฌ๋žŒ๋“ค์ด ์—†์œผ๋ฉด ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ํ† ๋ก  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์š”์ฆ˜์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ ๋งํ•ด์„œ, ์ €๋Š”์ด ํ† ๋ก ์„ ์–ด๋–ค ์ข…๋ฅ˜์˜ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ์˜ฎ๊ธฐ๊ธฐ ์œ„ํ•ด ์ƒ๋‹นํ•œ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ๋“ค์˜€๊ณ  ๋ชจ๋“  ์•„์ด๋””์–ด๊ฐ€ ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ๊พธ์ค€ํžˆ ๊ฑฐ๋ถ€ ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ฑฐ์˜ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค ์ด ์ . ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฌธ์ œ๋ฅผ ์š”์•ฝํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์ œ์•ˆ์ด ๋ถ€์ ์ ˆํ•œ ์ด์œ ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ƒ์‚ฐ์ ์ธ ๋ถ„๋ฅ˜ ๋…ผ์˜์— ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋งŽ์€ ๊ฒƒ์„ ํ•  ์ˆ˜์žˆ์„ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•ฉ์˜๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์ด๊ฒƒ์„ StdLib์— ํ†ตํ•ฉํ•˜๊ธฐ์— ์ ์ ˆํ•œ์‹œ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์šด ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ œ์•ˆ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํŒจํ‚ค์ง€ MatMul.jl์ด ์•„๋‹Œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‹ค์ œ๋กœ StdLib์—์žˆ๋Š” ๊ฒƒ์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์œ ์ง€ํ•˜๋Š” ํŒจํ‚ค์ง€์—์„œ ์ด๊ฒƒ์„ ๊ธฐ๊บผ์ด ์ง€์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” gemm์˜ ๋ฉ‹์ง„ Julian ๋ฒ„์ „์„ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  gemv! ์ด๋ฏธ SparseArrays์—์žˆ๋Š” ๊ฒƒ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ @andreasnoack ๋‹น :

ฮฑ , ฮฒ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ mul!(C, A, B, ฮฑ, ฮฒ) ์— ์ •์‚ฐํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š”์ด ๋ฒ„์ „์„

์ค„๋ฆฌ์•„ /stdlib/SparseArrays/src/linalg.jl

b8ca1a4์˜ 32 ~ 50 ํ–‰

...
์ผ๋ถ€ ํŒจํ‚ค์ง€๋„์ด ์–‘์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‚ด ๋จธ๋ฆฌ ์œ„์— ์–ด๋–ค ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋Š”์ง€ ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ ์ œ์•ˆ์—๋Š” 7 ๊ฐœ์˜ ์—„์ง€ ์†๊ฐ€๋ฝ์ด ์žˆ๊ณ  ๊ฑฐ์ ˆ์€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ€๋„๊ฐ€ ๋†’์€ ๋ฒกํ„ฐ / ํ–‰๋ ฌ์— ๋Œ€ํ•ด์ด ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜ ์ด๊ฒ ์ฃ ?

ํ™•์ธ. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ํ•ฉ์˜๊ฐ€ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ํ•ฉ์˜๋„ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค : sweat_smile :

_I_ ๊ฑฐ์˜ ๋ชจ๋“  [*]์ด์ด API๋ฅผ ์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ด๋ฆ„๊ณผ ์„œ๋ช…์˜ ๋ฌธ์ œ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด API๊ฐ€ _not_์žˆ๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ๋‚˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ค ์˜ต์…˜ (์˜ˆ mul!((ฮฒโ‚, Y, ฮฒโ‚‚), ฮฑโ‚, A, ฮฑโ‚‚, B, ฮฑโ‚ƒ) , muladd!(C, A, B, ฮฑ, ฮฒ) , mul!(C, A, B, ฮฑ, ฮฒ) )์— ๋งŒ์กฑํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํŠน์ • API๊ฐ€์—†๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜์˜๋‹ค๋Š” ์„ค๋“๋ ฅ์žˆ๋Š” ์ฃผ์žฅ์„ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ๋‚˜๋Š” ์–ด๋–ค ๋ถ„๋ฅ˜๊ฐ€ ๊ฒฐ์ •ํ•˜๋“  ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@StefanKarpinski ๊ทธ๋Ÿฌ๋‚˜ ํ† ๋ก ์ด ์•„์ง ์ถฉ๋ถ„ํžˆ ํ†ตํ•ฉ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด triage ํƒœ๊ทธ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค.

[*] ์ข‹์•„์š”, @dlfivefifty , ํ˜„์žฌ์˜ 3 ๊ฐœ ์ธ์ˆ˜ mul! ์กฐ์ฐจ ์˜์‹ฌ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 3 ์ธ์ˆ˜ mul! ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋ฏ€๋กœ์ด ๋…ผ์˜์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค (5 ์ธ์ˆ˜ ๋ณ€ํ˜•์˜ ์ผ๋ถ€ ํ˜•ํƒœ๋กœ _adding_์— ๋Œ€ํ•ด ํ•ด์„ํ–ˆ์Šต๋‹ˆ๋‹ค). LazyArrays.jl์ด ์„ฑ์ˆ™ ํ•  ๋•Œ๊นŒ์ง€ "์ถฉ๋ถ„ํžˆ"์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์šด ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ œ์•ˆ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํŒจํ‚ค์ง€ MatMul.jl์ด ์•„๋‹Œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@dlfivefifty ๋‚˜๋Š” LinearAlgebra.jl์—์žˆ๋Š” ๊ฒƒ์ด ์ธํ„ฐํŽ˜์ด์Šค ํ•จ์ˆ˜ (์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•œ API)์ด๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ๋˜ํ•œ, mul!(C::AbstractMatrix, A::AbstractVecOrMat, B::AbstractVecOrMat) LinearAlgebra.jl์— ๊ตฌํ˜„๋˜์–ด, ์šฐ๋ฆฌ๊ฐ€ ์ •์˜ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค mul! ์˜ ์ธก๋ฉด์—์„œ MatMul.muladd! . ๋ฌผ๋ก  ๋ช‡ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ, ํŠนํžˆ "๋‹จ์ง€"์ด๋ฆ„๊ณผ ์„œ๋ช…์„ ๊ฒฐ์ •ํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•  ๋•Œ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฐ€๋„๊ฐ€ ๋†’์€ ๋ฒกํ„ฐ / ํ–‰๋ ฌ์— ๋Œ€ํ•ด์ด ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@chriscoey ๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ข‹์•„ํ•˜๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค : https://github.com/JuliaLang/julia/issues/23919#issuecomment -441717678. ๋‹ค์Œ์€์ด ์˜ต์…˜ ๋ฐ ๊ธฐํƒ€ ์˜ต์…˜์— ๋Œ€ํ•œ ์žฅ๋‹จ์ ์— ๋Œ€ํ•œ ์š”์•ฝ์ž…๋‹ˆ๋‹ค. https://github.com/JuliaLang/julia/issues/23919#issuecomment -441865841. (๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋Œ“๊ธ€๋„ ์ฐธ์กฐ)

๋ถ„๋ฅ˜์—์„œ : ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์› ๋ฐ BLAS์— ๋Œ€ํ•œ ์„ ํƒ์„ ํฌํ•จํ•˜์—ฌ ์ผ๋ฐ˜ ํ…์„œ ์ถ•์†Œ API๋ฅผ ํฌํ•จํ•˜๋Š” ์žฅ๊ธฐ ๊ณ„ํš์ด ์žˆ์ง€๋งŒ ์ค‘๊ธฐ ์ ์œผ๋กœ๋Š” ์ฆ‰๊ฐ์ ์ธ ์š”๊ตฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” API๋ฅผ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค. BLAS์™€ ์ผ์น˜ํ•˜๋ฉด BLAS ์ด๋ฆ„์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

@Keno , ์ผ๋ฐ˜ ํ…์„œ ์ˆ˜์ถ• API ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์›์— ๋Œ€ํ•ด ๊ณต์œ  ํ•  ์ˆ˜์žˆ๋Š” ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ณต๊ฐœ์ ์œผ๋กœ๋Š” ์•„๋‹ˆ์ง€๋งŒ (์•„์ง) ๊ณต์œ  ํ•  ํฅ๋ฏธ๋กœ์šด ์ •๋ณด๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

API ์„ค๊ณ„๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์€ ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ ธ์•ผํ•œ๋‹ค๋Š” ์ผ๋ฐ˜์ ์ธ ์˜๋ฏธ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค ์ค‘ ์ผ๋ถ€๋ฅผ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ ์ ˆํ•œ ์‹œ์ ์—์„œ ๋””์ž์ธ ์„ธ์…˜์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„์ง ์šฐ๋ฆฌ๊ฐ€ ๊ฑฐ๊ธฐ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

BLAS์™€ ์ผ์น˜ํ•˜๋ฉด BLAS ์ด๋ฆ„์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ผ๋ฐ˜ ์„ ํ˜• ๋Œ€์ˆ˜ ํ•จ์ˆ˜ ์ด๋ฆ„์— ๋Œ€ํ•ด ์ง€๊ธˆ๊นŒ์ง€ ์ˆ˜ํ–‰ ํ•œ ์ž‘์—…๊ณผ ์™„์ „ํžˆ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค.

ฮฒ == 0 ์˜ ์ œ์•ˆ ๋œ ์ผ๋ฐ˜ ๋ฒ„์ „์—์„œ ๊ฐ• / ์•ฝ BLAS.gemm!(ฮฑ, A, B, ฮฒ, C) ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

BLAS ํ˜ธ์ถœ๋กœ ๋‚ฎ์ถ”๋ฉด lmul! ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋”๋ผ๋„ ๊ฐ•๋ ฅํ•œ ์ œ๋กœ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. generic_muladd! ๊ฒฝ์šฐ ฮฒ == 0 generic_muladd! ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ ์™ธ์—๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ•ํ•จ / ์•ฝํ•จ ฮฒ == 0์— ๋Œ€ํ•œ ๊ณ„ํš์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

https://github.com/JuliaLang/julia/issues/23919#issuecomment -430139849์˜ ๋‚ด ์˜๊ฒฌ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ๋…ผ์˜๋˜์—ˆ์œผ๋ฏ€๋กœ ๋ถ„๋ฅ˜์—์„œ ํ•ด๋‹น ์งˆ๋ฌธ์„ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Keno ์•„์ง API ์„ค๊ณ„๊ฐ€ ์—†์—ˆ์ง€๋งŒ "์ปดํŒŒ์ผ๋Ÿฌ ์ง€์› ๋ฐ BLAS์— ๋Œ€ํ•œ ์„ ํƒ์„ ํฌํ•จํ•œ API"๊ฐ€ ๋Œ์—ฐ๋ณ€์ด๋กœ ์ •์˜๋˜๊ฑฐ๋‚˜ XLA ์„ ํ˜• ๋Œ€์ˆ˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝ mul! ๋ฐ / ๋˜๋Š” muladd! ๊ฐ€ ์ด๋Ÿฌํ•œ API์˜ ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

@andreasnoack '์— ๋Œ€ํ•œ ํ•‘ @Keno์€์— ์งˆ๋ฌธ์ด์•ผ https://github.com/JuliaLang/julia/issues/23919#issuecomment -475534454

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.์ด ๋ฌธ์ œ๋กœ ๋Œ์•„ ์˜ค๋ ค๊ณ ํ–ˆ์ง€๋งŒ (ํŠนํžˆ ์‹ฌ์‚ฌ๋ฅผ ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค) ์‹ฌ์‚ฌ์˜ ๊ฒฐ์ •์— ๋”ฐ๋ผ ๋‹ค์Œ ์กฐ์น˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ ์ง€ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค.

BLAS์™€ ์ผ์น˜ํ•˜๋ฉด BLAS ์ด๋ฆ„์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

@andreasnoack์ด ์ง€์ ํ–ˆ๋“ฏ์ด, ์šฐ๋ฆฌ๋Š” ํ–‰๋ ฌ-๋ฒกํ„ฐ ๊ณฑ์…ˆ ๋“ฑ์„ ์ง€์›ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— gemm! ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ์ด ๋ถ„๋ฅ˜ ๊ฒฐ์ •์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋‹จ์ง€ "BLAS์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ"๋ผ๊ณ  ํ‘œ์‹œ๋จ). ; ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

๋‹น์žฅ ํ•„์š”ํ•œ API๋ฅผ ์„ ํƒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š”์ด ๋ฐฉํ–ฅ์„ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @StefanKarpinski๊ฐ€ ์ œ์•ˆํ•œ ํŠœํ”Œ ๊ธฐ๋ฐ˜ API๋ฅผ ์žŠ์–ด ๋ฒ„๋ฆฌ๊ณ  mul! / muladd! / addmul! ์ค‘ ํ•˜๋‚˜๋ฅผ "๊ทธ๋ƒฅ"์„ ํƒํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์›๋ž˜ ํ† ๋ก ์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ API์— ๋Œ€ํ•ด ๋” ์ด์ƒ ๋…ผ์˜ํ•˜์ง€ ์•Š์„ ์ œ์•ฝ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

mul! / muladd! / addmul! ์—์„œ ์ด๋ฆ„์„ ๊ณ ๋ฅด๋Š” ๋ฐฉ๋ฒ•์„ ์•„์‹ญ๋‹ˆ๊นŒ?


@chriscoey ๋‚˜๋Š” ๋ฏธ๋ž˜์˜ API๋ฅผ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ด๋ฏธ ๋งค์šฐ ๊ธธ๊ณ  ์ค‘๊ธฐ ํ•ด๊ฒฐ์— ์ง‘์ค‘ํ•˜์ง€ ์•Š์œผ๋ฉด ์ง„์ „์„ ์ด๋ฃฐ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ด์Šˆ (๋˜๋Š” ๋‹ดํ™” ์Šค๋ ˆ๋“œ)๋ฅผ ์—ฌ๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์ง€๊ธˆ๋ถ€ํ„ฐ 10 ์ผ์˜ ๊ธฐํ•œ์„๋‘๊ณ  ๋‹จ์ผ ์Šน์ธ ํˆฌํ‘œ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์Šน์ธ ํˆฌํ‘œ๋Š” ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ† ๋ก ์„ ๊ณ„์†ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์„ ํ˜ธ๋˜๋Š” ๋ชจ๋“  ์˜ต์…˜์— ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์†๋˜๋Š” ํ† ๋ก ๋ณด๋‹ค ์ง€๊ธˆ ๊ฐ€์žฅ ์„ ํ˜ธํ•˜์ง€ ์•Š๋Š” ์ด๋ฆ„์„ ๊ฐ–๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์€ ์„ธ ๊ฐ€์ง€ ๋ชจ๋‘์— ํˆฌํ‘œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜์ด ๊ด‘๋ฒ”์œ„ํ•œ ์Šน์ธ์„๋ฐ›์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ํˆฌํ‘œ ๊ณ„ํš ์ž์ฒด๊ฐ€ ๊ด‘๋ฒ”์œ„ํ•œ ์Šน์ธ์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ๋…ผ์˜๋ฅผ ๊ณ„์†ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์Šน์ธ ๋œ ์˜ต์…˜์ด ๊ฑฐ์˜ ๊ฐ™์€ ๊ฒฝ์šฐ @tkf ๊ฐ€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค (PR ์ž‘์„ฑ์ž์˜ ๊ถŒํ•œ).

+1 :์ด ํˆฌํ‘œ ๊ณ„ํš์— ๋™์˜ํ•˜๋ฉฐ ์Šน์ธ ํˆฌํ‘œ๋ฅผํ–ˆ์Šต๋‹ˆ๋‹ค.
-1 :์ด ํˆฌํ‘œ ๋ฐฉ์‹์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ์ค‘์š”ํ•œ ์‚ฌ๋žŒ๋“ค์ด์ด ์˜ต์…˜์„ ์„ ํƒํ•˜๋ฉด ํˆฌํ‘œ๋Š” ์˜๋ฌธ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Heart : mul! ๊ฐ€ ๊ณ„์† ํ† ๋ก ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.
๋กœ์ผ“ : muladd! ์ด ๊ณ„์†๋˜๋Š” ํ† ๋ก ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.
๋งŒ์„ธ : addmul! ์ด ๊ณ„์† ํ† ๋ก ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” 75 %์˜ ์Šน์ธ๊ณผ 5 ๋ช…์ด ๋ฐ˜๋“œ์‹œ ์ •์กฑ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค๊ณ  ์ž ์ •์ ์œผ๋กœ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค (์ฆ‰, ์ „์ฒด ํˆฌํ‘œ ์ ˆ์ฐจ์— ๋Œ€ํ•œ ์˜๊ฒฌ ๋ถˆ์ผ์น˜๋ฅผ ํฌํ•จํ•˜์—ฌ ์ „ํ˜€ ํˆฌํ‘œ ํ•œ ์‚ฌ๋žŒ์˜ 75 %, ์šฐ์Šน ์˜ต์…˜์— ๋Œ€ํ•ด ์ตœ์†Œ 5 ๋ช…์ด ์Šน์ธ ํ•œ ๊ฒฝ์šฐ, ์ฐธ์—ฌ๋„๊ฐ€ ๋‚ฎ์€ ๊ฒฝ์šฐ) , 5/6 ๋˜๋Š” 6/8์€ ์ฟผ๋Ÿผ์„ ๋งŒ๋“ค์ง€ ๋งŒ ๋งŒ์žฅ์ผ์น˜์˜ 4/4๋Š” ์‹คํŒจ๋กœ ๊ฐ„์ฃผ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

1.3 ๊ธฐ๋Šฅ ๋™๊ฒฐ์€ 8 ์›” 15 ์ผ๊ฒฝ์ž…๋‹ˆ๋‹ค : https://discourse.julialang.org/t/release-1-3-branch-date-approaching-aug-15/27233?u=chriscoey. ๊ทธ๋•Œ๊นŒ์ง€ ๋ณ‘ํ•ฉ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค ๐Ÿ˜ƒ. ์ด๋ฏธ ํˆฌํ‘œ ํ•ด ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๋˜ํ•œ ์ด๋ฆ„์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ์ง๊ตํ•˜๋Š” ฮฒ == 0 https://github.com/JuliaLang/julia/issues/23919#issuecomment -475420149์˜ ๋™์ž‘๋„ ๊ฒฐ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚ด PR์˜ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•ด์•ผํ•˜๋ฉฐ PR์€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : ๋Œ€์ƒ ๋ฐฐ์—ด์—์„œ undef s๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ์ ‘๊ทผ ๋ฐฉ์‹). ๊ฒ€ํ†  ์ค‘์— ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ 1.3์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค ....

Re : ฮฒ == 0 , @andreasnoack ์˜ ๋Œ“๊ธ€ https://github.com/JuliaLang/julia/issues/23919#issuecomment -430139849 (๋‚ด ์š”์•ฝ : ฮฒ == 0 -handling์€ BLAS ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. -BLAS๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธํ™˜ ๋จ)์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์•„๋ž˜์—์„œ @simonbyrne ์˜ ์ฃผ์žฅ ์™ธ์— ๋ฐ˜๋Œ€ ์˜๊ฒฌ์„ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค ( "๋ชจ๋“  ๊ตฌํ˜„์—๋Š” 0์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„๊ธฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค"). BLAS์™€ ๊ฐ™์€ ฮฒ == 0 ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ฃผ์žฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@simonbyrne ๊ท€ํ•˜์˜ ์˜๊ฒฌ https://github.com/JuliaLang/julia/issues/23919#issuecomment -430375349 ์™€ ๊ด€๋ จํ•˜์—ฌ, ๋ช…์‹œ ์  ๋ถ„๊ธฐ๋Š” ๋Œ€๋ถ€๋ถ„ ์ผ ์„ ํ˜• ฮฒ != 0 ? rmul!(C, ฮฒ) : fill!(C, zero(eltype(C))) ์ด๊ธฐ ๋•Œ๋ฌธ์— ํฐ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๊ตฌํ˜„ (์˜ˆ : C = Matrix{Any}(undef, 2, 2) )์˜ ๊ฒฝ์šฐ ๊ตฌํ˜„์—๋Š” ์–ด์จŒ๋“  ๋ช…์‹œ์ ์ธ "๊ฐ•๋ ฅํ•œ ์ œ๋กœ"์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค (๋‚ด PR https : // github์˜ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜ _modify! . .com / JuliaLang / julia / pull / 29634 / files # diff-e5541a621163d78812e05b4ec9c33ef4R37). ๊ทธ๋ž˜์„œ ์ €๋Š” BLAS์™€ ๊ฐ™์€ ํ•ธ๋“ค๋ง์ด ์—ฌ๊ธฐ์„œ ์ตœ์„ ์˜ ์„ ํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

๊ณ ์„ฑ๋Šฅ ์•ฝํ•œ ์ œ๋กœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์˜๋ฏธ์—์„œ :

julia> A = [NaN 0;
                     1 0]

julia> b = [0.0,0];

julia> 0.0*A*b
2-element Array{Float64,1}:
 NaN  
   0.0

julia> false*A*b
2-element Array{Float64,1}:
 0.0
 0.0

์ฆ‰, BLAS (๊ฐ•๋ ฅ 0 ์‚ฌ์šฉ)๋กœ ๋‚ฎ์ถ”๋ฉด NaN ๊ฐ€ ๋  ํ–‰์„ ์ˆ˜๋™์œผ๋กœ ๊ฒฐ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@dlfivefifty BLAS๊ฐ€ A ๋ฐ B ์—์„œ NaN์„ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ C ์—†์Šต๋‹ˆ๊นŒ?

BLAS.gemm! ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ NaN ์ธ์‹ _C = ฮฑ * A * B + 0 * C_๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. [1] @andreasnoack ์˜ ์ธ์ˆ˜๊ฐ€ ๋‚˜์˜ค๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.

[1] isnan.(C) ์–ด๋”˜๊ฐ€์— ์ €์žฅํ•˜๊ณ  ๋‚˜์ค‘์— C "์˜ค์—ผ"์‹œ์ผœ์•ผํ•ฉ๋‹ˆ๋‹ค.

@chethega ํˆฌํ‘œ ํ›„ 10 ์ผ์ด

@chriscoey ๋‹น์‹ ์ด ๋งž์•„, ํˆฌํ‘œ๊ฐ€ ๋งˆ๊ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํˆฌํ‘œ ํ•œ ์‚ฌ๋žŒ๋“ค์˜ ์ „์ฒด ๋ชฉ๋ก์„ ์–ป๊ธฐ์—๋Š” github์— ๋„ˆ๋ฌด ๋‚˜์ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜์น˜๋ฅผ ์‚ดํŽด๋ณด๋ฉด mul! ๊ฐ€ ์••๋„์  ์ธ์ง€์ง€๋ฅผ ๋ฐ›๊ณ  (์•„๋งˆ 75 % ์Šน์ธ ์ฟผ๋Ÿผ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์Œ) ๋‘ ๋ฒˆ์งธ ๊ฒฝ์Ÿ์ž muladd! ๊ฐ€ 50 %๋ณด๋‹ค ํ›จ์”ฌ ๋‚ฎ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

ํˆฌํ‘œ ๊ณ„ํš์— ๋Œ€ํ•œ ์ด์˜๋Š” ๋‹จ ํ•œ ๊ฑด๋„ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํˆฌํ‘œ๋ฅผ ๋ถ€๋ฅด๊ณ , mul! ๊ฐ€ ์ด๊ธฐ๊ณ  ์ด๋ฆ„์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. @tkf ๋Š”

@chethega ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ์ด๊ฒƒ์„ ๊ฒฐ์ •ํ•˜๋Š” ์ข‹์€ ๊ณ„ํš์ด์—ˆ์Šต๋‹ˆ๋‹ค!

BTW, ์ฆ‰์‹œ ๋ฆฌ๋ฒ ์ด์Šค๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ (๋ช‡ ์ฃผ ๋‚ด์—) ๋ˆ„๊ตฐ๊ฐ€ ๋ฆฌ๋ฒ ์ด์Šค ๋˜๋Š” ์žฌ ๊ตฌํ˜„์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋‚˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์•ˆํƒ€๊น๊ฒŒ๋„ NaN ์˜๋ฏธ๋ก ์— ๋Œ€ํ•œ ํˆฌํ‘œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ๋™๊ฒฐ์€ ๋‹ค์Œ ์ฃผ์ด๋ฉฐ ์˜๋ฏธ์žˆ๋Š” ํˆฌํ‘œ๋ฅผ ํ•  ์‹œ๊ฐ„์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ ๊ฐ€ ์Šค๋ ˆ๋“œ์˜ ๋ถ„์œ„๊ธฐ์— ๋Œ€ํ•œ ์Šค๋ƒ… ์ƒท์„ ์ˆ˜์ง‘ํ•˜๋Š”

๋‹ค์Œ ์˜ต์…˜์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  1. ๊ณ„์† ๋…ผ์˜ํ•˜๊ณ , ๊ธฐํ•œ ์ „์— ํ•ฉ์˜๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ธฐ๋ฅผ ๋ฐ”๋ผ๊ฑฐ๋‚˜, ํ•ต์‹ฌ ์‚ฌ๋žŒ๋“ค์ด ์šฐ๋ฆฌ์—๊ฒŒ ์—ฐ์žฅ์„ ํ—ˆ๋ฝ ํ•ด์ฃผ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. : tada : (๋ช…ํ™•ํ•˜๊ฒŒ ํŽธ์ง‘ : ์ด๊ฒƒ์€ ๊ธฐ๋ณธ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ์˜ต์…˜์— ๋Œ€ํ•œ ํ•ฉ์˜์— ๋„๋‹ฌ ํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ๊ฒฐ๊ณผ๋Š” 5-arg mul! ๊ฐ€ 1.4๊นŒ์ง€ ์ง€์—ฐ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.)
  2. ์ •์˜๋˜์ง€ ์•Š์€ NaN ๋™์ž‘์„ ๋ฐฑ์Šคํ†ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ๊ธฐ๋Šฅ์„ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ํ•ฉ์˜์— ๋„๋‹ฌํ•˜์ž๋งˆ์ž ์ฝ”๋“œ ๋ฐ / ๋˜๋Š” ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๊ฒฐ์ •๋œ NaN ๋™์ž‘ (๊ฐ•ํ•œ 0๊ณผ ์•ฝํ•œ 0)์„ ์–ป์Šต๋‹ˆ๋‹ค. ์ •์˜๋˜์ง€ ์•Š์€ ๊ตฌํ˜„ ์ •์˜ NaN ๋™์ž‘์˜ ๋ฐฑ์Šคํ†ฑ์€ ๋ฌด๊ธฐํ•œ์œผ๋กœ ๋๋‚  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜ค๋Š˜์€ ํˆฌํ‘œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (๊ฐ€์žฅ ๋น ๋ฅธ ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค. ๊ด€์‹ฌ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค). : ์ข‹์•„์š” :
  3. Gemm์€ Gemm์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค! ๊ฐ•๋ ฅํ•œ ์ œ๋กœ์— ๋Œ€ํ•œ ๋ฌธ์„œํ™” ๋œ ์•ฝ์†์œผ๋กœ 1.3์„ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. :์‹ฌ์žฅ:
  4. NaN ๋Š” NaN ! ์•ฝํ•œ 0์— ๋Œ€ํ•œ ๋ฌธ์„œํ™” ๋œ ์•ฝ์†์œผ๋กœ 1.3์„ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. : ๋ˆˆ :
  5. 1.3 ์ ˆ๋ฒฝ์— ๋ถ€๋”ชํžˆ๊ธฐ ์ „์— ๋ฌด์—‡์ด๋“ ํ•˜์„ธ์š”. :๋กœ์ผ“:
  6. ์„ค๋ฌธ ์กฐ์‚ฌ๋ฅผ ๊ฑฐ๋ถ€ํ•˜์‹ญ์‹œ์˜ค. : thumbsdown :
  7. ์“ฐ๊ธฐ
  8. ์ œ์•ˆ ๋œ ๋‹ค์šด ์Šค๋ ˆ๋“œ : ๋Œ€์ฒด ๋ฐฑ์Šคํ†ฑ ๋ฐฐ์—ด. ๋‚˜์ค‘์— ๋” ๊ณ ๋ ค ๋œ ๊ฒฐ์ •์— ๋„๋‹ฌ ํ•  ์ˆ˜์žˆ์„ ๋•Œ๊นŒ์ง€ ๋น ๋ฅด๊ฒŒ ๋ณ‘ํ•ฉํ•˜๊ณ  1.3 ์•ŒํŒŒ์— ๋Œ€ํ•ด ์•ฝํ•œ / ๊ฐ•ํ•œ ์ œ๋กœ ๋ฐœ์‚ฐ์„ ์˜ค๋ฅ˜๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ฆ‰, !(alpha === false) && iszero(alpha) && !all(isfinite, C) && throw(ArgumentError()) ์™€ ๋ณ‘ํ•ฉํ•˜๊ณ ์ด ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์„ ์œ„ํ•ด ํ๊ธฐ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ์„ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค. : ํ˜ผ๋ž€ :

๋ชจ์ˆœ ๋  ์ˆ˜์žˆ๋Š” ์—ฌ๋Ÿฌ ์˜ต์…˜์„ ์ž์œ ๋กญ๊ฒŒ ์„ ํƒํ•˜๊ณ  @tkf / triage ์„ค๋ฌธ ์กฐ์‚ฌ๋ฅผ ๋ฌด์‹œ

ํŽธ์ง‘ : ํ˜„์žฌ : tada : (์ธ๋‚ด)์™€ : rocket : (์ธ๋‚ด)๋Š” ๋ชจ์ˆœ๋˜์ง€๋งŒ ๋‘˜ ๋‹ค ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช… ๋œ๋Œ€๋กœ, ๋ถ„๋ฅ˜๋Š” 14 ์ผ (์ˆ˜)๊ณผ 15 ์ผ (๋ชฉ) ์‚ฌ์ด์— ์ง€์ •๋˜์ง€ ์•Š์€ ๋‚ ์งœ์— ์„ค๋ฌธ ์กฐ์‚ฌ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์ง€์ •๋˜์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์‹œ "์Šน์ธ ํˆฌํ‘œ"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ข‹์•„ํ•˜๋Š” ์˜ต์…˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์›ํ•˜๋Š” ๋ชจ๋“  ์˜ต์…˜์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. : rocket :์€ : thumbsup :, : heart :, : eyes : ๋ฐ : confused :๋ฅผ ๋น„ ์Šน์ธํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ด

"Merge for 1.3"๋Œ€์‹  "Merge for 1.x"๋ผ๋ฉด ๊ฐ•ํ•œ ์ œ๋กœ (: heart :)์— ํˆฌํ‘œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  "Merge for 1.3"์ด "Merge 1.x"์ด๋ฉด ์˜ต์…˜์ด ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @chethega. @tkf ๋‚˜๋Š” ์ •๋ง๋กœ ์ƒˆ๋กœ์šด mul์ด ํ•„์š”ํ•œ ์œ„์น˜์— ์žˆ์Šต๋‹ˆ๋‹ค! NaN ๊ฒฐ์ •์— ๋„ˆ๋ฌด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ (์„ฑ๋Šฅ์ด ์†์ƒ๋˜์ง€ ์•Š๋Š” ํ•œ).

LazyArrays.jl์„ ํ™•์ธํ•˜์…จ์Šต๋‹ˆ๊นŒ? ์ฐธ๊ณ ๋กœ, ์ •๋ง ๋ฉ‹์ง„ ์œตํ•ฉ ํ–‰๋ ฌ ๊ณฑ์…ˆ ์ง€์›์ด ์žˆ์Šต๋‹ˆ๋‹ค. BLAS.gemm! ๋“ฑ์€ ๊ณต์šฉ ๋ฉ”์†Œ๋“œ์ด๋ฏ€๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://docs.julialang.org/en/latest/stdlib/LinearAlgebra/#LinearAlgebra.BLAS.gemm!

๋‚˜๋Š” ์ •๋ง๋กœ ์ผ๋ฐ˜์ ์ธ mul์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค! ๋‹ค์–‘ํ•œ ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๊ตฌ์กฐํ™”๋˜๊ณ  ํฌ์†Œํ•˜๊ณ  ํ‰๋ฒ”ํ•œ ์˜ค๋ž˜๋œ ์กฐ๋ฐ€ ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ผ๋ฐ˜ ์„ฑ๊ณผ ์†๋„๋ฅผ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฐธ์กฐ. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ LazyArrays.jl์—์„œ ๋…ผ์˜ํ•œ ๊ฒƒ์„ ๊ธฐ์–ตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์—ฌ๋Ÿฌ๋ถ„์€ ์ด๋ฏธ ์•Œ๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

"ASAP"์™€ ๊ด€๋ จํ•˜์—ฌ Julia์˜ 4 ๊ฐœ์›” ๋ฆด๋ฆฌ์Šค์ฃผ๊ธฐ ๋Š” ์ ์–ด๋„ ๊ธฐ๋Šฅ์ด ๋™๊ฒฐ๋˜๊ธฐ ์ง์ „์˜ "๋ณ‘ํ•ฉ ๋Ÿฌ์‹œ"๋ฅผ ํ”ผํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ „์— ๊ฐ™์€ ๊ฒƒ์„ ์‹œ๋„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋งํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ณตํ‰ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ˆ„๊ตฐ๊ฐ€ ์ด๊ฒƒ์„ ์ƒ๊ธฐ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์–ธ๊ธ‰ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์€๋ฉด์€ Julia๊ฐ€ ๋งŒ๋“ค๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณ‘ํ•ฉ ํ›„ ๋ฐ”๋กœ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค๊นŒ์ง€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ํ•ด์ œ-> ๋ณ‘ํ•ฉ

๊ฐ์‚ฌ. ๋‚˜๋Š” ๊ธฐํ•œ์ด ๋„์›€์ด๋˜๋Š” ๋™๊ธฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ์ด ๋‹ค์‹œ ๋‚ก์•„์ง€๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋งˆ๊ฐ์ผ์„ ๋ชฉํ‘œ๋กœ ์‚ผ๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์— ์ ๊ทน์ ์œผ๋กœ ์—๋„ˆ์ง€๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค!

๋‚˜๋Š” ์ •๋ง๋กœ ์ผ๋ฐ˜์ ์ธ mul์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค! ๋‹ค์–‘ํ•œ ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๊ตฌ์กฐํ™”๋˜๊ณ  ํฌ์†Œํ•˜๊ณ  ํ‰๋ฒ”ํ•œ ์˜ค๋ž˜๋œ ์กฐ๋ฐ€ ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ผ๋ฐ˜ ์„ฑ๊ณผ ์†๋„๋ฅผ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

5 ๊ฐœ ์ธ์ˆ˜ mul! ์€ ๋‹ค์–‘ํ•œ ์œ ํ˜•์ด์žˆ๋Š” ๊ฒฝ์šฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจํ˜ธํ•จ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์กฐํ•ฉ ์ ์œผ๋กœ ๋งŽ์€ ์žฌ์ •์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด LazyArrays.jl MemoryLayout ์‹œ์Šคํ…œ์˜ ๋™๊ธฐ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ BandedMatrices.jl ๋ฐ BlockBandedMatrices.jl์—์„œ "๊ตฌ์กฐํ™” ๋ฐ ํฌ์†Œ"ํ–‰๋ ฌ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (์—ฌ๊ธฐ์—๋Š” banded BLAS ๋ฃจํ‹ด์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” banded ํ–‰๋ ฌ์˜ ํ•˜์œ„ ๋ทฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.)

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ LazyArrays๋ฅผ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

5-arg mul์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ผ์‹œ์ ์ธ ์ž„์‹œ ๋ฐฉํŽธ์œผ๋กœ ๊ฐ„์ฃผ๋˜๊ธฐ ๋•Œ๋ฌธ์— (LazyArrays์™€ ๊ฐ™์€ ์ผ๋ถ€ ์†”๋ฃจ์…˜์ด 2.0์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜์žˆ์„ ๋•Œ๊นŒ์ง€) ์žฅ๊ธฐ์ ์œผ๋กœ ์ด์ƒ์ ์ด๊ฑฐ๋‚˜ ์™„๋ฒฝํ•œ ์†”๋ฃจ์…˜์ด ๋  ํ•„์š”์—†์ด ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@chethega ์–ธ์ œ ์šฐ๋ฆฌ๊ฐ€ ์ƒˆ๋กœ์šด ๊ตฌ์†๋ ฅ์—†๋Š” ํˆฌํ‘œ์— ๋Œ€ํ•œ ์ง‘๊ณ„๋ฅผ ๊ณ„์‚ฐํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

@tkf ๋ฌผ๋ก , ๋‹น์‹ ์€ 1.x์—๋„ ๊ฐ•ํ•จ / ์•ฝํ•จ /

๊ทธ๋Ÿฌ๋‚˜ ์ €๋Š” 1.4๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  5 ์ธ์ˆ˜ mul! ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด 1.3 mul! ๊ฐ–๊ณ  ์‹ถ์–ดํ•˜๋Š” ์‚ฌ๋žŒ์ด ๊ฝค ๋งŽ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐํ•œ์ด ์—†๋‹ค๋ฉด ์ข€ ๋” ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ ์ ˆํ•œ ํˆฌํ‘œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ–ˆ์Šต๋‹ˆ๋‹ค (ํˆฌํ‘œ๋ฅผ ์œ„ํ•ด ์ตœ์†Œ 10 ์ผ). ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์•ฝํ•œ / ๊ฐ•ํ•œ ์ œ๋กœ์˜ ์†๋„์™€ ์šฐ์•„ํ•จ์— ๋Œ€ํ•œ ๊ฒฝ์Ÿ ๊ตฌํ˜„์„ ๋จผ์ € ์ œ์‹œํ•˜๊ณ  ๋ฒค์น˜๋งˆํ‚นํ•˜์ง€ ์•Š๊ณ ์„œ๋Š” ์˜๋ฏธ์žˆ๋Š” ํˆฌํ‘œ๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ iszero(alpha) ๋ฅผ ๋จผ์ € ํ™•์ธํ•œ ๋‹ค์Œ ํ–‰๋ ฌ์—์„œ !isfinite ๊ฐ’์„ ๊ฒ€์ƒ‰ ํ•œ ๋‹ค์Œ ์ถ”๊ฐ€ ํ• ๋‹น์ด์žˆ๋Š” ๋Š๋ฆฐ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฝํ•œ 0์ด ๊ฐ•ํ•œ 0๋งŒํผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด ์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด์จŒ๋“  ๊ฐ•๋ ฅํ•œ ์ œ๋กœ ์˜๋ฏธ๋ก ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

@chethega ์–ธ์ œ ์šฐ๋ฆฌ๊ฐ€ ์ƒˆ๋กœ์šด ๊ตฌ์†๋ ฅ์—†๋Š” ํˆฌํ‘œ์— ๋Œ€ํ•œ ์ง‘๊ณ„๋ฅผ ๊ณ„์‚ฐํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

Triage๋Š” 1.3 ์•ŒํŒŒ์— ๋Œ€ํ•ด ์ด๋ฒˆ ์ฃผ์— ๊ฒฐ์ • (์ง€์—ฐ / ๊ฐ• / ์•ฝ / ๋ฐฑ์Šคํ†ฑ)์„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. 15 ์ผ ๋ชฉ์š”์ผ ๋˜๋Š” 14 ์ผ ์ˆ˜์š”์ผ์€ ์„ ๋ณ„ ๊ฒ€์‚ฌ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๊ณ ๋ คํ•  ์ˆ˜์žˆ๋Š” ํ•ฉ๋ฆฌ์ ์ธ ์˜ต์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„๋งˆ๋„ ๋ชฉ์š”์ผ์— ๊ฐ€์ž… ํ•  ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ณ„์‚ฐํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์‹ค์ ์œผ๋กœ ์—ฌ๊ธฐ์—์„œ ๋ณด์ˆ˜์ ์ด๋ฉฐ ๊ธฐํ•œ์„ ๋†“์น˜๊ณ  ํ† ๋ก ์„ ๊ณ„์†ํ•˜๊ณ  1.4๋ฅผ ๊ธฐ๋‹ค๋ ค๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ, ์šฐ๋ฆฌ๋Š” ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ ์ฑ„ ์ด๋ฏธ ํ•ฉ์˜์— ๋„๋‹ฌํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @andreasnoack ์€ ๊ณ„์ˆ˜๊ฐ€ 0์ด๋ฉด ๊ฐ•ํ•œ 0์ด๋˜์–ด์•ผํ•œ๋‹ค๋Š” ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ์•ฝํ•œ ์ œ๋กœ ์ง€์ง€์ž๋“ค์„ ๋ชจ๋‘ ์„ค๋“ ํ•  ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ž‘๋…„์—, ๋ฐ”๋žŒ์งํ•˜๊ฒŒ๋Š” ์ž‘๋…„์— 5-arg mul!์„ ์ •๋ง๋กœ ์›ํ•˜๊ณ ์ด ์ž‘์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ •๋ง๋กœ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ๋Œ€๋‹ค์ˆ˜๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ๊ฒฝ์šฐ ์•„๋ฌด๋„ ํ† ๋ก ์„ ๋‹ซ๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋Šฅ์„ ๋” ์ง€์—ฐ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์œ ๊ฐ์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€์ง€ ์•Š๋Š” ์ด์œ  :

ฮฒ == 0.0 && any(isnan,C) && throw(ArgumentError("use ฮฒ = false"))

์ง€๊ธˆ์€ ๊ทธ๋ƒฅ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€์ง€ ์•Š๋Š” ์ด์œ 

์ด ์˜ต์…˜์„ ์„ค๋ฌธ ์กฐ์‚ฌ์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ›Œ๋ฅญํ•œ ํƒ€ํ˜‘ ์•„์ด๋””์–ด!

๊ธฐ๋Œ€์น˜๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด 1.3์˜ ๊ธฐ๋Šฅ ๋™๊ฒฐ์€ 3 ์ผ ๋‚ด์— ์ด๋ฃจ์–ด ์ง€๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ ์‹œ๊ฐ„์— ์™„๋ฃŒ ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ๋™๊ฒฐ ๋ฐ ๋ถ„๊ธฐ๋Š” ๋ฆด๋ฆฌ์Šค์ฃผ๊ธฐ์—์„œ ์‹ค์ œ๋กœ ํƒ€์ด๋ฐ์„ ์ œ์–ด ํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๋ถ€๋ถ„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์—„๊ฒฉํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…์€ ์ด๋ฏธ https://github.com/JuliaLang/julia/pull/29634 ์—์„œ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์กฐ์ •ํ•˜๊ณ  ๋ฆฌ๋ฒ ์ด์Šคํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

@tkf for # 29634 (ํˆฌํ‘œ์— ๋”ฐ๋ผ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ๋ฐ 0 ์ฒ˜๋ฆฌ ํฌํ•จ) ๋‚จ์€ ์ž‘์—…์„ ๋‚˜์—ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฐ”์˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‚จ์€ ํ•  ์ผ์„ ๋ถ„ํ•  ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์„œ ๋‹ค์‹œ๋Š” ๋ถ€๋‹ด์ด ๊ฐ€์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ATM์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” TODO๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ฆฌ๋ฒ ์ด์Šค
  • addmul! -> mul! ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ

    • ์ƒˆ API๊ฐ€ mul! (์˜ˆ : <strong i="15">@deprecate</strong> mul!(C, A, B, ฮฑ, ฮฒ) addmul!(C, A, B, ฮฑ, ฮฒ) )๋กœ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

  • MulAddMul ๋“ฑ์˜ ๊ตฌํ˜„ ์ „๋žต์— ๋Œ€ํ•ด ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๋กœ๋ถ€ํ„ฐ ํ™•์ธ์„๋ฐ›์Šต๋‹ˆ๋‹ค. https://github.com/JuliaLang/julia/pull/29634#issuecomment -440510551์„ ์ฐธ์กฐ @andreasnoack , ๊ทธ๊ฒƒ์„ ๋ณผ ๊ธฐํšŒ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ?
  • Quaternion ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. https://github.com/JuliaLang/julia/pull/29634#issuecomment -443379914 ์ฐธ์กฐ

๋‚ด PR์€ ฮฒ = 0 ์ฒ˜๋ฆฌ์˜ BLAS ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๋„ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚ด PR์€ ฮฒ = 0 ์ฒ˜๋ฆฌ์˜ BLAS ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๋ฏธ์•ˆ ํ•ด์š”, ์ œ ๊ธฐ์–ต์€ ๋‚ก์•˜์–ด์š”. ๋‚ด ๊ตฌํ˜„์ด ์ผ๊ด€๋˜์ง€ ์•Š์•˜๊ณ  NaN _ ๊ฐ€๋” ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค _. ๋”ฐ๋ผ์„œ ์ถ”๊ฐ€ TODO๋Š” ฮฒ = 0.0 ์˜ ๋™์ž‘์„ ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

MulAddMul ์œ ํ˜•์€ ๋‚ด๋ถ€ ์šฉ์ผ ๋ฟ์ด์ฃ ?

์˜ˆ, ๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ ๋‚ด๋ถ€ ์„ธ๋ถ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋‚ด ๊ฑฑ์ •์€ (1) ๋„ˆ๋ฌด ๋งŽ์€ ์ „๋ฌธํ™” (beta = 0 ๋“ฑ์€ type ๋งค๊ฐœ ๋ณ€์ˆ˜์— ์ธ์ฝ”๋”ฉ ๋จ)๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ๊ณ  (2) ์†Œ์Šค ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด ๋œจ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ๋“ค์€ ํƒ€๋‹นํ•œ ์šฐ๋ ค์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์„ ํ˜• ๋Œ€์ˆ˜ ์ฝ”๋“œ์—์„œ ์ˆ˜๋งŽ์€ ์ „๋ฌธํ™”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ์ „๋ฌธํ™”ํ•ด์•ผํ•˜๋Š”์ง€ ์ƒ๊ฐํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌด๋ฃŒ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์€ ํ–‰๋ ฌ์„ ์ตœ์ ํ™”ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (๋งํ–ˆ๋“ฏ์ด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Œ). ์‚ฌ๋žŒ๋“ค์€ ์ž‘์€ ํ–‰๋ ฌ ๊ณฑ์…ˆ์— StaticArrays ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ €๋Š” ๋Ÿฐํƒ€์ž„์— ๊ฐ’์„ ํ™•์ธํ•˜๋Š”์ชฝ์œผ๋กœ ๊ธฐ์šธ์ด์ง€ ๋งŒ ๋งˆ์Œ์ด ๋ฐ”๋€Œ๋ฉด ๋‚˜์ค‘์— ์–ธ์ œ๋“ ์ง€ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์†Œํ”„ํŠธ ์ œ๋กœ๋Š” ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

if iszero(ฮฒ) && ฮฒ !== false && !iszero(ฮฑ)
   lmul!(zero(T),y) # this handles soft zeros correctly
   BLAS.gemv!(ฮฑ, A, x, one(T), y) # preserves soft zeros
elseif iszero(ฮฑ) && iszero(ฮฒ)
   BLAS.gemv!(one(T), A, x, one(T), y) # puts NaNs in the correct place
   lmul!(zero(T), y) # everything not NaN should be zero
elseif iszero(ฮฑ) && !iszero(ฮฒ)
   BLAS.gemv!(one(T), A, x, ฮฒ, y) # puts NaNs in the correct place
   BLAS.gemv!(-one(T), A, x, one(T), y) # subtracts out non-NaN changes
end

@andreasnoack ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. mul!(C, A::BiTriSym, B, ฮฑ, ฮฒ) https://github.com/JuliaLang/julia/pull/29634#issuecomment -440510551๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ๊ตฌ์กฐํ™” ๋œ ํ–‰๋ ฌ์˜ ๊ฐ€์žฅ ์•ˆ์ชฝ ๋ฃจํ”„๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ๋กœ ์ „๋ฌธํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ „๋ฌธํ™”๋Š” ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค (๋”ฐ๋ผ์„œ ์ง€์—ฐ).

๋”ฐ๋ผ์„œ ์ €๋Š” ๋Ÿฐํƒ€์ž„์— ๊ฐ’์„ ํ™•์ธํ•˜๋Š”์ชฝ์œผ๋กœ ๊ธฐ์šธ์ด์ง€ ๋งŒ ๋งˆ์Œ์ด ๋ฐ”๋€Œ๋ฉด ๋‚˜์ค‘์— ์–ธ์ œ๋“ ์ง€ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํฐ!

https://github.com/JuliaLang/julia/pull/29634์— ์˜ํ•ด ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@andreasnoack ์ œ ์‹œ๊ฐ„์— ์ด๊ฒƒ์„ ๊ฒ€ํ† ํ•˜๊ณ  ๋ณ‘ํ•ฉ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด์ œ 1.3์— ๋ณ‘ํ•ฉ ๋˜์—ˆ์œผ๋ฏ€๋กœ ๊ตฌํ˜„์— ๋Œ€ํ•ด ๋งค์šฐ ๊ธด์žฅํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. 1.3 RC + PkgEvals๊ฐ€ ๋ฒ„๊ทธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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