ํ์ฌ, ํฌ์ matmult ์ฝ๋์๋ ๋ค์ ์ค์ด ์์ต๋๋ค.
์ด๊ฒ์ ๋ฐ๋ ๋ฐฐ์ด์ ๋ํด 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!
์์ ํ ํ)์ด ์์ต๋๋ค.
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)
์
๋๋ค.
๊ณต์ ๊ตฌ๋ฌธ์ผ๋ก "์๋ฃ"? ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ 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 ๊ฐ์ ์ธ์ ํจ์๋ฅผ ํธ์ถํด๋ ๊ด์ฐฎ์ต๋๋ค. ๋๋ ๋จ์ง ์ธ ๊ฐ์ง ์ธ์ ๋ฒ์ ์ด ํ์ํ ๊ฒฝ์ฐ์ ์๋ฅผ ์ ๊ณตํ๋ ค๊ณ ํ์ต๋๋ค (๋น์ ์ ์์ฒญ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค).
์ฌ๊ธฐ์ ๋งํ๋ ์ง๋ฆ๊ธธ์ ๋ฌด์์ ๋๊น?
์ฌ๊ธฐ์ ์ ์ ๋ *
๋ mul!
์ ๋ฐ๋ก ๊ฐ๊ธฐ๋ก ๊ฐ์ฃผ ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ "๋จ์ง" mul!
์
๋๋ค. ๊ทธ๋ ๋ค๋ฉด mul!
addmul!
๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก muladd!
/ addmul!
๋ก ๋์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
์ ์ฌํ "๋ฐ๋ก ๊ฐ๊ธฐ"๋ก ์ ์ ๋ rmul!
๋ฐ lmul!
๋ ์์ต๋๋ค.
mul!
์ง์ ์ค๋จ
๋๋ ํ ๋ก ์ด ์๋ก์ด ์ธํฐํ์ด์ค ์ถ๊ฐ์ ๊ดํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ์ API๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด mul!
๋ฅผ ์ง์ ์ค๋จํด์ผํ๋ค๋ฉด ๊ทธ๋งํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ๊ฐ ์๊ฐํ ์์๋ ์ฃผ์ ์ฃผ์ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
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 ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝํ์ฌ ์ปดํ์ผ๋ฌ ๋ฒ๊ทธ๋ฅผ ํผํ ์ ์์ต๋๋ค.
ํ์ธ. ์ ๋ ์ ์์ด ๋ ๊ฐ ๋ฐ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ถ๋ช ํ ๋๋ต ์ธ ๊ฐ์ง ์ ์์ด ์์ต๋๊น? :
mul!
muladd!
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
๋ค.
์ง๊ธ๊น์ง ํฉ์ ๋ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
mul!(C, A, B)
์ ์งํด์ผํฉ๋๋ค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
์ ๋ฌธ์ํ ๋ ์๋ช
์
๋๋ค.
์ค์ ์ ์๋
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 ๋๋ ๋ค์ด ์คํธ๋ฆผ ์ฌ์ฉ์ ๋ชจ๋ / ์ฝ๋์์ ์ด๋ฆ์ ๋ฐ๊พธ๋ ๊ฒ์ ์๋ฏธํฉ๋๊น?
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_์์ ๊ฐ์ฅ ์ข์ํ๋ ํจ์ ์ด๋ฆ์ ๋ฌด์์ ๋๊น?
mul!
addmul!
muladd!
๋์๊ฒ 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!
).
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_๊ฐ ํ์์ ๋ํด ์ ์ด๋ฆ์ ๋ถ์ฌ ํ ๋งํผ ์ถฉ๋ถํ ๋ค๋ฅธ์ง ์ฌ๋ถ์ ๋๋ค.
๊ทธ๋ค์ ์ถฉ๋ถํ ์ ์ฌํฉ๋๋ค.
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 ๋ฑ)
_ " muladd!
์๋ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ค๋ช
์ ์ผ๋ก ๋ค๋ฆฌ๋ ๋จ์ ์ด ์์ต๋๋ค. ์ค๋ช
์ ์ด๋ฆ์ ์ค์ผ์ผ๋ง ๋ถ๋ถ์ ์ธ๊ธํ๊ธฐ ์ํด scalemuladd!
์ ๊ฐ์ ๊ฒ์
๋๋ค."_ --- https://github.com/ JuliaLang / julia / issues / 23919 # issuecomment -441819470
_ "๊ธฐ์ ์ ์ผ๋ก๋ ํ๋ ฌ ๊ณฑ์ ์ ๋๋ค. [AC] * [Bฮฑ; Iฮฒ]"_ --- https://github.com/JuliaLang/julia/issues/23919#issuecomment -441825009
๊ทธ๋ค์ ์ถฉ๋ถํ ๋ค๋ฅธ ์ด์ ๋ ...
_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 ๋ฑ).
Y = Aโ Aโ โฏ Aโ X
(https://github.com/JuliaLang/julia/issues/23919#issuecomment-402953987 ๋ฑ)๊ณผ ๊ฐ์ mul!
์ ๋ค๋ฅธ ์ผ๋ฐํ๊ฐ์์ ์ ์์ต๋๋ค.
์
๋ ฅ ์ ์ฉ vs ์
๋ ฅ-์ถ๋ ฅ ๋งค๊ฐ ๋ณ์ : ์ธ์ ์์ ๋ฐ๋ผ C
์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํผ๋ ์ค๋ฝ์ต๋๋ค (https://github.com/JuliaLang/julia/issues/23919#issuecomment -441267056, https://github.com/JuliaLang/julia/issues/23919#issuecomment-441824982)
mul!
์ด ๋ ์ข์ ๋ ๋ค๋ฅธ ์ด์ ๋ ... :
mul!
๋ ๋ฌธ์ํ ๋์ด ์์ง ์์ผ๋ฏ๋ก ๊ณต์ฉ API๋ก ๊ฐ์ฃผ ํ ํ์๊ฐ ์์ต๋๋ค.๊ทธ๋ฆฌ๊ณ ์ muladd!
/ addmul!
์ด ๋ ์ข์ ์ด์ ๋ ... :
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!
: 6addmul!
: 2muladd!
: 8์กฐ๊ธ ๋ ์ง์งํ๊ฒ, ๋๋ ์ฌ์ ํ์ด ๋ฐ์ดํฐ๊ฐ 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!
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ์ฅ ์ข์ํ๋ ํตํ ์๋ช
์ ๋ฌด์์
๋๊น?
muladd!(C, A, B, ฮฑ, ฮฒ)
muladd!(A, B, C, ฮฑ, ฮฒ)
muladd!(C, A, B; ฮฑ, ฮฒ)
(: +1 :๊ณผ ๊ฐ์ง๋ง ํค์๋ ์ธ์๋ b)muladd!(A, B, C; ฮฑ, ฮฒ)
(: -1 :๊ณผ ๊ฐ์ง๋ง ํค์๋ ์ธ์ ํฌํจ)muladd!(A, B, ฮฑ, C, ฮฒ)
์ผ๋์๋๊ณ ์๋ ๋ค๋ฅธ ํค์๋ ์ธ์ ์ด๋ฆ์ด์๋ ๊ฒฝ์ฐ ฮฑ
๋ฐ ฮฒ
์ฌ์ฉํ์ฌ ํฌํ ํ ๋ค์ ์ด๋ค ์ด๋ฆ์ด ๋ ์ข์์ง ์๊ฒฌ์ ๋งํ์ญ์์ค.
์ด๋ฆ์ด ๋ฌด์์ธ์ง ๊ฒฐ์ ํ์ง ์์์ผ๋ฏ๋ก mul!
์ ๋ํด์๋ ์ํํด์ผํฉ๋๋ค.
_If_ ์ฐ๋ฆฌ๋ _C = ABฮฑ + Cฮฒ_์ mul!
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ์ฅ ์ข์ํ๋ ํตํ ์๋ช
์ ๋ฌด์์
๋๊น?
mul!(C, A, B, ฮฑ, ฮฒ)
mul!(A, B, C, ฮฑ, ฮฒ)
mul!(C, A, B; ฮฑ, ฮฒ)
(: +1 :๊ณผ ๊ฐ์ง๋ง ํค์๋ ์ธ์๋ ํฌํจ)mul!(A, B, C; ฮฑ, ฮฒ)
mul!(A, B, ฮฑ, C, ฮฒ)
์ฐธ๊ณ : ๊ธฐ์กด 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
๋ฅผ ์๋ฏธํ๋ ๊ฒ์ ๋์ฒด ๋ฌด์์ ์๋ฏธํ ๊น์? ๊ทธ๋์ ๋์๊ฒ ์ ์ผํ ์ด๋ฆฐ ์ง๋ฌธ์ ํ๋ ฌ๊ณผ ์ผ์ชฝ ๋ฐ / ๋๋ ์ค๋ฅธ์ชฝ ์ค์นผ๋ผ์ ํจ๊ป ํํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ถ๋ ฅ ๋ฐฐ์ด์ ์ฆ๊ฐ์ํค๊ณ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ค๋ ๊ฒ์ ํํํ๋ ํฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ์ธ์ง ์ฌ๋ถ์
๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
mul!(Y::Matrx, args...)
: Y .= *(args...)
mul!((ฮฒ, Y)::{Number, Matrix}, args...)
: Y .= ฮฒ*Y + *(args...)
mul!((Y, ฮฒ)::{Matrix, Number}, args...)
: Y .= Y*ฮฒ + *(args...)
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์์ ๊ฐ์ ธ์จ ๊ฒ์ด๋ฏ๋ก ํจ์ ์ด๋ฆ์์ฃผ์ํ์ง ๋ง์ญ์์ค).
๋ ๋ค๋ฅธ ๊ฑฑ์ ์ ์ด๊ฒ์ด ๊ณ์ฐ ๊ทธ๋ํ ์คํ๊ธฐ์ ๋ํด ๋ค์ ์ ํ๋ ์ธํฐํ์ด์ค๋ผ๋ ๊ฒ์
๋๋ค. 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 ์์ ์ ํํํ๋ ๋ฐฉ๋ฒ์ ๋ง์ ๋ณํ๋ฅผ ํ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ฌ๋๋ค์ด ์์ ์ ์๋๋ฅผ ํํํ ์ ์๊ธฐ ๋๋ฌธ์, ์๋๊ฐ ์ผ์ชฝ์ด๋ ์ค๋ฅธ์ชฝ ๋๋ ์์ชฝ ๋ชจ๋์์ ์ฆ๊ฐํ๋ ๊ฒ์ด๋ผ๋ฉด ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ํํํ๊ณ ์ฌ๋ฐ๋ฅธ ๊ตฌํ์ ์ ํํ๋๋ก ํ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋น ๊ตํ ์์ ์ ํ์ ๋ํด์๋ ์ฌ๋ฐ๋ฅธ ์์ ์ ์ํํ๋ ์ผ๋ฐ์ ์ธ ํด๋ฐฑ์ ๊ฐ์ง ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ์์ ์ 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!
๋ฅผ ์ ์ ํ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ๋ด ์ ์ฅ์ด๋ผ๊ณ ์๊ฐํ๋ค.
mul!(C, A, B, a, b)
์ง์ํ ์๋ ์์ต๋๋ค.Applied
์ ๊ฐ์ ๋ฐฉ์ก์ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ์ด ์์
์ Julia 2.0๊น์ง ๊ธฐ๋ค๋ ค์ผํ๋ฉฐ ๋ด ์๊ตฌ์ ๋ง๋ LazyArrays.jl์์ ํ๋กํ ํ์
์ด ๊ณ์ ๊ฐ๋ฐ๋ฉ๋๋ค.@dlfivefifty ๋ง์ญ์์ค ๋น์ ์ ๋์์ด์ ์ด๋ ค์์ ์๊ฐ mul!((Y, ฮฒ), ฮฑ, A, B)
API๊ฐ ๊ฐ์ด ๋์ผ mul!(Y, A, B, ฮฑ, ฮฒ)
? Transpose
์ ๊ฐ์ ๋งคํธ๋ฆญ์ค ๋ํผ๋ฅผ ๊ณ ๋ คํ๋ฉด 2- ํํ๊ณผ 3- ํํ์ ํฌํจํ์ฌ ๋์ด๋๋ฅผ ๋์ด๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค (ํํ์ด Julia์ ์ ํ ์์คํ
์์ ํน๋ณํ ๊ฒฝ์ฐ๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง).
- 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
๋ ์ง์ํ ์ ์์ต๋๋ค.
๋๋ ์ ์ด๋ ์๊ฐ ฮฑโ
๋๋ ฮฑโ
์์ ฮฑโ*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 ์๋ฏธ๋ก ์ ๋ํ ํฌํ๊ฐ ์์์ต๋๋ค. ๊ธฐ๋ฅ ๋๊ฒฐ์ ๋ค์ ์ฃผ์ด๋ฉฐ ์๋ฏธ์๋ ํฌํ๋ฅผ ํ ์๊ฐ์ด ์ถฉ๋ถํ์ง ์์ต๋๋ค.
๋๋ ์ฐ๋ฆฌ ๊ฐ ์ค๋ ๋์ ๋ถ์๊ธฐ์ ๋ํ ์ค๋
์ท์ ์์งํ๋
๋ค์ ์ต์ ์ด ํ์๋ฉ๋๋ค.
mul!
๊ฐ 1.4๊น์ง ์ง์ฐ๋๋ ๊ฒ์
๋๋ค.)NaN
๋ NaN
! ์ฝํ 0์ ๋ํ ๋ฌธ์ํ ๋ ์ฝ์์ผ๋ก 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!
์ด๋ฆ ๋ฐ๊พธ๊ธฐ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๊ฐ ๋ฒ๊ทธ๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ์ถฉ๋ถํ ์๊ฐ์ด์์ ๊ฒ์ ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ง๊ธ๋ถํฐ 10 ์ผ์ ๊ธฐํ์๋๊ณ ๋จ์ผ ์น์ธ ํฌํ๋ฅผ ์ ์ํฉ๋๋ค. ์น์ธ ํฌํ๋ ๋ค์์ ์๋ฏธํฉ๋๋ค. ๋ชจ๋ ์ฌ๋์ด ํ ๋ก ์ ๊ณ์ํ๋ ๊ฒ๋ณด๋ค ์ ํธ๋๋ ๋ชจ๋ ์ต์ ์ ํฌํํฉ๋๋ค. ๊ณ์๋๋ ํ ๋ก ๋ณด๋ค ์ง๊ธ ๊ฐ์ฅ ์ ํธํ์ง ์๋ ์ด๋ฆ์ ๊ฐ๊ณ ์ถ์ ์ฌ๋๋ค์ ์ธ ๊ฐ์ง ๋ชจ๋์ ํฌํํด์ผํฉ๋๋ค. ์ต์ ์ด ๊ด๋ฒ์ํ ์น์ธ์๋ฐ์ง ๋ชปํ๊ฑฐ๋ ํฌํ ๊ณํ ์์ฒด๊ฐ ๊ด๋ฒ์ํ ์น์ธ์ ์ถฉ์กฑํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ๋ ผ์๋ฅผ ๊ณ์ํด์ผํฉ๋๋ค. ์น์ธ ๋ ์ต์ ์ด ๊ฑฐ์ ๊ฐ์ ๊ฒฝ์ฐ @tkf ๊ฐ ๊ฒฐ์ ํฉ๋๋ค (PR ์์ฑ์์ ๊ถํ).
+1 :์ด ํฌํ ๊ณํ์ ๋์ํ๋ฉฐ ์น์ธ ํฌํ๋ฅผํ์ต๋๋ค.
-1 :์ด ํฌํ ๋ฐฉ์์ ๋์ํ์ง ์์ต๋๋ค. ๋๋ฌด ๋ง๊ฑฐ๋ ๋๋ฌด ์ค์ํ ์ฌ๋๋ค์ด์ด ์ต์ ์ ์ ํํ๋ฉด ํฌํ๋ ์๋ฌธ์ ์ฌ์ง๊ฐ ์์ต๋๋ค.
Heart :
mul!
๊ฐ ๊ณ์ ํ ๋ก ํ๋ ๊ฒ๋ณด๋ค ๋ซ์ต๋๋ค.๋ก์ผ :
muladd!
์ด ๊ณ์๋๋ ํ ๋ก ๋ณด๋ค ๋ซ์ต๋๋ค.๋ง์ธ :
addmul!
์ด ๊ณ์ ํ ๋ก ํ๋ ๊ฒ๋ณด๋ค ๋ซ์ต๋๋ค.๋๋ 75 %์ ์น์ธ๊ณผ 5 ๋ช ์ด ๋ฐ๋์ ์ ์กฑ์๋ฅผ ๋ง๋ค์ด์ผํ๋ค๊ณ ์ ์ ์ ์ผ๋ก ์ ์ํฉ๋๋ค (์ฆ, ์ ์ฒด ํฌํ ์ ์ฐจ์ ๋ํ ์๊ฒฌ ๋ถ์ผ์น๋ฅผ ํฌํจํ์ฌ ์ ํ ํฌํ ํ ์ฌ๋์ 75 %, ์ฐ์น ์ต์ ์ ๋ํด ์ต์ 5 ๋ช ์ด ์น์ธ ํ ๊ฒฝ์ฐ, ์ฐธ์ฌ๋๊ฐ ๋ฎ์ ๊ฒฝ์ฐ) , 5/6 ๋๋ 6/8์ ์ฟผ๋ผ์ ๋ง๋ค์ง ๋ง ๋ง์ฅ์ผ์น์ 4/4๋ ์คํจ๋ก ๊ฐ์ฃผ ๋ ์ ์์ต๋๋ค.)