çŸåšãã¹ããŒã¹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)
A_mul_B*!(C,A,B)
ã¡ãœãããä¿æããããšãå¯èœã§ããïŒ
å人çã«ã¯ããã¹ãŠã®é
åã¿ã€ãã«å¯ŸããŠgemm
APIãå®çŸ©ããŠããããããšæããŸãïŒããã¯ä»ã®å Žæã§è¡šçŸããŸãïŒã å¯ãªé
åã«ãããã®ã¡ãœãããå®è£
ããããšã¯ã gemm
çŽæ¥åŒã³åºãã ããªã®ã§ãããªãç°¡åã«æããŸãã ã¹ããŒã¹ã±ãŒã¹ã¯ãã§ã«å®è£
ãããŠããŸãã å¯äžã®å®éã®å€æŽã¯ã α
ããã³Î²
åŒæ°ãåãå
¥ããªãçŽç²ãªjuliaãžã§ããªãã¯matmultãžã®å€æŽã§ãã
ããã«ãããä»»æã®ã¿ã€ãã®é
å/æ°å€ã§æ©èœãããžã§ããªãã¯ã³ãŒããäœæãããŸãã ç§ã¯çŸåšãbigfloatsãšã¹ããŒã¹é
åã§æ©èœããexpmã®ç°¡åãªå®è£
ãæã£ãŠããŸãïŒ _generic_matmatmult!
å€æŽãå ããåŸïŒã
åç §ã ïŒ9930ãïŒ20053ãïŒ23552ã ãã¹ãïŒ
åç
§ããŠããã ãããããšãããããŸãã ãã®åé¡ã¯ãAPIã®æ¹è¯ãããgemm
ã¹ã¿ã€ã«ã®ã¡ãœããã®è¿œå ã«é¢ä¿ããŠãããšæããŸãããããã§ãïŒ9930ãšããŸãã«ãé¡äŒŒããŠãããšæãããå Žåã¯ãéããããšãã§ããŸãã
åºçºç¹ãšããŠã _generic_matmatmul!
ã«gemm
APIãæãããããã®ãµããŒãã¯ãããŸããïŒ çŸåšã®ã¡ãœããã¯Î±=1
ãšÎ²=0
䜿çšããã ãã§å®è£
ããããããããã¯ããªãåçŽãªå€æŽã§ãããçŽç²ã«ä»å ç/éç Žå£çã§ãã PRã§ããŸãã ç§ã¯ãããããã®ããŒãžã§ã³ãšåãããã«è¡ããŸãïŒãã®ããŒãžã§ã³ã§ã¯ãå¿
èŠããªãã£ãã®ã§ãã¹ãŠã®ãã©ã³ã¹ããŒãºãã«ããããŸãããããã§ã¯ãããè¡ããŸããïŒã
ã¯ãã ããã¯è¯ãã¹ã¿ãŒãã«ãªãã§ãããã ãã ããåŒæ°ã®é åºãèæ
®ããå¿
èŠããããŸãã ããšããšãBLASã®é åºã«åŸãæ¹ãèªç¶ã ãšæã£ãŠããŸããããçŸåšã®3ã€ã®åŒæ°A_mul_B!
ãåœãŠã¯ãŸããæåã«åºååŒæ°ãæã€ããšã«ã€ããŠã¯ããªãäžè²«ããŠããŸãã ããã«ããã§ã«ææããããã«ã3ã€ã®åŒæ°ã®ããŒãžã§ã³ã¯Î±=1
ãšÎ²=0
ã®5ã€ã®ââåŒæ°ã®ããŒãžã§ã³ã«å¯Ÿå¿ããããã©ã«ãå€ã®åŒæ°ã¯æåŸã«ãªããŸãã ãã¡ãããããã«å¿
ãããããã©ã«ãå€ã®æ§æã䜿çšããå¿
èŠã¯ãããŸããããããã§äœ¿çšããããšã¯çã«ããªã£ãŠããŸãã
ãªãäžè¬çãªgemm
é¢æ°ãå°å
¥ããªãã®ã§ããïŒ
ã¯ãã ããã¯è¯ãã¹ã¿ãŒãã«ãªãã§ãããã ãã ããåŒæ°ã®é åºãèæ ®ããå¿ èŠããããŸãã ããšããšãBLASã®é åºã«åŸãæ¹ãèªç¶ã ãšæã£ãŠããŸããããçŸåšã®3ã€ã®åŒæ°A_mul_BïŒã«ãåœãŠã¯ãŸããæåã«åºååŒæ°ãæã€ããšã«ã€ããŠã¯ããªãäžè²«ããŠããŸãã ããã«ããã§ã«ææããããã«ã3ã€ã®åŒæ°ã®ããŒãžã§ã³ã¯Î±= 1ããã³Î²= 0ã®5ã€ã®åŒæ°ã®ããŒãžã§ã³ã«å¯Ÿå¿ããããã©ã«ãå€ã®åŒæ°ã¯æåŸã«ãªããŸãã ãã¡ãããããã«å¿ ãããããã©ã«ãå€ã®æ§æã䜿çšããå¿ èŠã¯ãããŸããããããã§äœ¿çšããããšã¯çã«ããªã£ãŠããŸãã
ããã§ããã ïŒ9930ã§ãå®éã®åŒæ°ã®é åºãšã¡ãœããã®ååå€æŽã«ã€ããŠã®è°è«ãç¶ããããšãã§ããŸãã ç§ã¯çŸåšãããã®ã§ãããã¯ãããããã5åŒæ°ããŒãžã§ã³ãå©çšå¯èœã«ãªãçšåºŠã§ãã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ã«åŸããšããã¢ã€ãã¢ã奜ãã§ããïŒãããŠé åºããããéåžžæ°åŠçã«æžãããæ¹æ³ãšäžèŽããŸããïŒããä»ã§ã¯ãªãã·ã§ã³ã®4çªç®ãš5çªç®ã®åŒæ°ãšããŠã¹ã±ãŒãªã³ã°åŒæ°ãè¿œå ããã®ãçã«ããªã£ãŠãããšæããŸãã
æ確ã«ããããã«ãããæå³ã§ãªãã·ã§ã³ã®åŒæ°ãå¿ èŠã§ã
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)
ã«ã¯ã2ã€ã®è¡å/ãã¯ãã«ãšã¹ã«ã©ãŒã®ä»ã®é åãšåæ§ã«ãããã©ã«ãã®å®è£
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!
ãšåŒã¶èåŸã«ããèãæ¹ã¯ãä¹ç®åŒæ°ã§ã¯ãªãå ç®åŒæ°ãå€æŽãããšãããã®ã§ããïŒ ä¹ç®åŒæ°ãå€æŽããããšã¯ãããŸããïŒ
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ã§ã¯ãªããŒãã§ããããšã«æ³šæããŠãã ããïŒã¯ã mul!(C, A, B)
ã«æ»ããŸãã
ãããmul!
ãšmuladd!
ã©ã¡ãã§åŒã³åºããã¯ãè¡åŠãšäžè²«æ§ã®ã±ãŒã¹ã®ããã§ãããSparseArraysã®æ¢åã®ã¡ãœããã®ã±ãŒã¹ã¯mul!
ã䞻匵ãããšæããŸãã ç§ã®ãæ°ã«å
¥ãã®ãªã¹ã«ãŒã¯ã€ã«ãã®åŒçšã«ãããããããäžè²«æ§ã䞻匵ãããšããå¥åŠãªã±ãŒã¹ã«èªåèªèº«ãèŠã€ããŸãããäžè²«æ§ã¯æ³åã絶ããæåŸã®é¿é£æã§ããã
ããã€ãã®ç¹ã§ã
muladd!
ååã¯ãä¹ç®ãšããã«ç¶ãå ç®ã§ãããããããèªç¶ã§ãã ãã ããαãšÎ²ã®ããã©ã«ãå€muladd!(C, A, B, α=1, β=0)
ïŒÎ²ã®ããã©ã«ãã¯1ã§ã¯ãªããŒãã§ããããšã«æ³šæããŠãã ããïŒã¯ãmul!(C, A, B)
ã«æ»ããŸãã
C
ã«InfsãŸãã¯NaNãå«ãŸããŠããå Žåãããã«ã¯èå³æ·±ãäŸå€ããããŸããçè«çã«ã¯ã β==0
å Žåãçµæã¯NaNã®ãŸãŸã§ãã BLASãšã¹ããŒã¹è¡åã³ãŒããæ瀺çã«Î²==0
ãã§ãã¯ããããããŒãã«çœ®ãæãããããããã¯å®éã«ã¯çºçããŸããã
true*x
ã¯åžžã«x
ã§ãããšããæå³ã§ã true
ãšfalse
ã¯ããããã匷ãã1ãš0ã§ãããããããã©ã«ããα=true, β=false
ã§ãããšèããããšãã§ããŸãã x
ãšfalse*x
ã¯åžžã«zero(x)
ã§ãã
lmul!
ãããã®äŸå€çãªåäœãå¿
èŠã§ãïŒ https ïŒ
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äºæã¢ã¬ã€ïŒãã³ãããã³ã¹ãã©ã€ãïŒã®å Žåã 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ã§è¿°ã¹ãããã«ïŒã§3é
ã®muladd!(A, B, C)
ïŒãŸãã¯muladd!(C, A, B)
ïŒïŒãæã€ããšãã§ããããšã§ãã //github.com/JuliaLang/julia/issues/23919#issuecomment-402953987ïŒã æ¹æ³muladd!(A, B, C)
ã«äŒŒãŠmuladd
ã®ããã«Number
ç§ã¯ããã¯ããªããæ¢ã«ç¥ã£ãŠããå Žåã¯ç¹ã«ãããèªç¶ãªååã ãšæãã®ã§ãS muladd
ã
@andreasnoack以åã®è°è«ã¯ãã¡ãœããåã§ã¯ãªããã¡ãœããã®ã·ã°ããã£ãšããŒã¯ãŒãåŒæ°ãããäœçœ®åŒæ°ãåªå
ããããšã«é¢ãããã®ã®ããã§ãã muladd!
ãšããååã«ç°è°ã¯ãããŸããïŒ ïŒ SparseArrays
ã«5ã€ã®mul!
ãååšããããšããããŸãããäžäœäºææ§ã®ããã©ãããŒãå®çŸ©ããããšã¯é£ãããããŸãããïŒ
mul!
ãšmuladd!
äž¡æ¹ãæã€ããšã¯ãåè
ãα
ãšÎ²
ããã©ã«ãå€ãæã€åŸè
ã§ããå Žåãåé·ã«èŠããŸãã ããã«ã add
éšåã¯BLASã«ãã£ãŠæ£èŠåãããŠããŸãã muladd!
ã§ä¿¡é Œã§ããäžè¬çãªç·åœ¢ä»£æ°ã¢ããªã±ãŒã·ã§ã³ãæãä»ãããšãã§ããã°ãããã«ã€ããŠèãããã®ã§ããããã以å€ã®å Žåã¯åé·æ§ãé¿ããããšæããŸãã
ãŸããç§ã¯åŒ·ãç§ãã¡ã¯åŒ·ããŒãããããã£ããããšã奜ãã ããfalse
ã®è°è«ãšã¯å¥ã«mul!
ã IMOã®Î²ã®ãŒãå€ã¯ãBLASã®å Žåãšåæ§ã«ãçŸåšã®5ã€ã®åŒæ°mul!
ã¡ãœããã®å Žåãšåæ§ã«åŒ·åã§ããå¿
èŠããããŸãã ã€ãŸãããã®åäœã¯Î²
ã¿ã€ãã§ã¯ãªãã mul!
çµæã§ããå¿
èŠããããŸãã 代æ¿æ¡ãæ±ãã®ã¯é£ããã§ãããã äŸïŒ mul!(Matrix{Float64}, Matrix{Float64}, Matrix{Float64}, 1.0, 0.0)
ãã§ããŸãããBLASã䜿çšã§ããŸããã§ããã
BLASã®åäœãå€æŽããããšã¯ã§ããŸããããfloatã®åŒ·ããŒãã®åäœã_requiring_ãããšããããšã¯ããã¹ãŠã®å®è£ ã§ãŒãããã§ãã¯ããããã®ãã©ã³ããå¿ èŠã«ãªãããšãæå³ããŸãã
muladd!
ä¿¡é Œã§ããäžè¬çãªç·åœ¢ä»£æ°ã¢ããªã±ãŒã·ã§ã³ãæãä»ãããšãã§ããã°
@andreasnoackããã¯ãã_ three-argument_ muladd!
ç³è«ããæå³ããŠãããšæããŸããããããªããšã5ã€ã®åŒæ°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
æžã蟌ãã§ãããŸããŸããã å®å®ããææžåãããAPIãšããŠ5ã€ã®åŒæ°ã®é¢æ°ãæã€ããšã¯ãããã§ã®æãéèŠãªç®æšã§ãã
èŠç¹ã«æ»ãïŒ
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ã€ã®åŒæ°é¢æ°ãåŒã³åºããŠããŸã£ããåé¡ãããŸããã ç§ã¯ã¡ããã©3ã€ã®åŒæ°ããŒãžã§ã³ã ããå¿ èŠãªäŸãæããããšããŸããïŒãããããªãã®èŠæ±ã ãšæã£ãã®ã§ïŒã
ããã§è©±ããŠããã·ã§ãŒãã«ããã¯äœã§ããïŒ
ããã§å®çŸ©ãããŠãã*
ã¯ã 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!
ã§ãã ã ããããªãmulãããªãã§ãã ããïŒ ããã©ã«ãå€ã§muladd!
/addmul!
ãªããŸããïŒ
*
ã¯è¡åãä¹ç®ããããã©ã«ãã®æ¹æ³ã§ãããã»ãšãã©ã®ãŠãŒã¶ãŒããããè¡ãæ¹æ³ã ããã§ãã æ¯èŒãããšã muladd!
䜿çšéã¯*
ã«è¿ããªããŸããã ããã«ãããã¯æ¢åã®æŒç®åã§ããã muladd!
/ addmul!
ã¯æ°ããé¢æ°ã«ãªããŸãã
rmul!
ãšlmul!
ã¯ãéåžžãã¢ãŠããªããã¬ãŒã¹ã®mul!
ã¡ãœããã®ããã©ã«ãå€ããŒãžã§ã³ã§ã¯ãªãããããã®ãã¿ãŒã³ã«é©åãããšã¯æããªãã§ãã ããã
ãµã€ã¢ã³ã¯ãããäžã®æçš¿ã§å©ç¹ãããŸãèŠçŽããŠããŸãã åé¡ã¯ãååå€æŽã®è¿œå æ©èœïŒ mul!
éæšå¥šãæå³ããïŒã®ãããããæ£åœåããã®ã«ååãªã¡ãªããããããã©ããã§ãã ããã¯ç§ãã¡ãåæããªããšããã§ãã ããã ãã®äŸ¡å€ã¯ãªããšæããŸãã
ååãå€æŽãã䟡å€ããªããšèšããšããAPIãå®å šã«å ¬éãããŠããªãããšãèæ ®ããŸãããïŒ ã€ãŸããããã¯Juliaã®ããã¥ã¡ã³ãã«ã¯ãªããšããããšã§ãã
LazyArrays.jlïŒããã³ä»ã®ããã±ãŒãžïŒïŒã¯ãã§ã«ããã䜿çšããŠããã®ã§ãç²ç®çã«semverããã©ããŒããã®ã¯è¯ããããŸããã ããããããã§ããä»ã®é¢æ°ã»ã©å ¬éãããŠããŸããã
mul!
ã¯LinearAlgebra
ãããšã¯ã¹ããŒããããåºã䜿çšãããŠããããããã®æç¹ã§ç¢ºå®ã«éæšå¥šã«ããå¿
èŠããããŸãã A_mul_B!
ãmul!
ãŸãã¯å°ãªããšã0.7ããåã«ãé¢æ°ã®ååãå€æŽããæ¹ãã¯ããã«è¯ãææã ã£ãã®ã§ããã®è°è«ããªãã£ãã®ã¯æ®å¿µã§ãã
ä»ã®ãšããmul!
ã䜿çšããŠãstdlibãåå¥ã«æŽæ°ã§ãããšãã«LinearAlgebra v2.0
ã®ååãæŽæ°ããã®ã¯ã©ãã§ããïŒ
LazyArrays.jlã¯ãå€ãã®çš®é¡ã®è¡åã«å¯ŸããŠæè»æ§ããªãããã mul!
䜿çšããŸããïŒ StridedArray
ãªãŒããŒã©ã€ããããšãã³ã³ãã€ã©ã®é床äœäžã®ãã°ãçºçããŸãïŒã ãã©ãŒã ã®ä»£æ¿æ§é ãæäŸããŸã
y .= Mul(A, x)
ç§ãèŠã€ãããã®ã¯ãã説æçã§ãã 5ã€ã®åŒæ°ã®ã¢ããã°ã¯
y .= a .* Mul(A, x) .+ b .* y
mul!
ãéæšå¥šã«ããLinearAlgebra.jlã®LazyArrays.jlã¢ãããŒãã«ç§»è¡ããããšã«è³æã§ãããããã¯é£ããã±ãŒã¹ã«ãªããŸãã
LowRankApprox.jlã¯mul!
ã䜿çšããŸãããLazyArrays.jlã¢ãããŒãã䜿çšããããã«å€æŽããŠãã³ã³ãã€ã©ã®ãã°ãåé¿ããå¯èœæ§ããããŸãã
OKã ææ¡ã¯2ã€ãããªããšæããŸããã ããããã©ããã倧ãŸãã«3ã€ã®ææ¡ããããŸããïŒïŒ
mul!
muladd!
mul!
ãš5ã€ã®åŒæ°muladd!
ïŒ muladd!
ã¯addmul!
ãšåŒã°ããå ŽåããããŸãïŒ
1ãš3ãæ¯èŒããŠãããšæã£ãŠããŸããã ããããŸããã
3ã€ã®åŒæ°mul!
ã¯ãããªãã¯APIã§ãããåºã䜿çšãããŠããããã2ã¯ãŸã£ãããªãã·ã§ã³ã§ã¯ãªããšæããŸãã ãAPIãå®å
šã«å
¬éãããŠããªãããšã¯ã 5ã€ã®åŒæ°mul!
ãææžåãããŠããªãããšãæå³ããŸãã
ã¯ããç§ã®èšç»ã¯mul!
ãä¿æããããš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åŒæ°ã®mulã ãã®æ¹ãç°¡åãªå ŽåããããŸãã ãããŠaddmulïŒ åå¥ã«ã5åŒæ°ã®addmulãå®çŸ©ããŠãã ããïŒ ãªã®ã§ïŒ
addmul!(C, A, B, α, β) = addmul!(C .= β .* C, A, B, α)
ããã«æé©ã«ãã£ãŠã¿ãŸãããïŒ ãã®ããã«ããªãããšã®ãã€ã³ãã¯ã C
ã®èŠçŽ ã«äžåºŠã ãã¢ã¯ã»ã¹ããå¿
èŠããããšããããšã§ããããã¯ã倧ããªè¡åã®å Žåã¯ééããªãããå¹ççã§ãã ããã«ã5åŒæ°ã®addmul!
ã ããå®çŸ©ããã®ã«å¯ŸããŠã4åŒæ°ã®mul!
ãšaddmul!
äž¡æ¹ãå¥ã
ã«å®çŸ©ããããšã§ãã³ãŒããé·ããªããšã¯ä¿¡ããããŸããã
åèãŸã§ã«ãLinearAlgebraã®_generic_matmatmul!
ã®å®è£
ãå€æŽããŠãLazyArraysã§5ã€ã®åŒæ°ãåãããã«ããŸããïŒ https ïŒ
ããã§ã¯ãçµç±ã§åŒã³åºãããŸãïŒ
materialize!(MulAdd(α, A, b, β, c))
ãã ããå®éã®ã³ãŒãïŒ tiled_blasmul!
ïŒã¯ãLinearAlgebraã«ç°¡åã«å€æããŠæ»ãããšãã§ããŸãã
ãã®ããã»ã¹ãã¹ããŒãã¢ããããããã«äœãã§ããã§ããããïŒ ç§ãåãçµãã§ããããšã¯ãã€ã³ãã¬ãŒã¹mul + addãåããçµ±åè¡åä¹ç®APIããæ¬åœã«æ©æµãåããã§ããã
Strided.jlã®ææ°ããŒãžã§ã³ã¯ã5ã€ã®åŒæ°mul!(C,A,B,α,β)
ããµããŒãããããã«ãªããå¯èœãªå Žåã¯BLASã«ãã£ã¹ããããããã以å€ã®å Žåã¯ç¬èªã®ïŒãã«ãã¹ã¬ããïŒå®è£
ã䜿çšããŸãã
@JuthoçŽ æŽãããããã±ãŒãžïŒ 次ã®ããŒããããã¯ãããŸããïŒ æçµçã«LinearAlgebraãšããŒãžããèšç»ã¯ãããŸããïŒ
ããã¯ç§ã®æå³ã§ã¯ãããŸããã§ããããããæç¹ã§èŠæ±ãããå Žåãç§ã¯ããã«å察ããŸããã ãã ããäžè¬çãªmapreduce
æ©èœã§ã®@generated
é¢æ°ã®èªç±ãªäœ¿çšïŒ1ã€ã ãã§ããïŒã¯ãBaseã«ã¯ããŸãé©ããŠããªãå¯èœæ§ããããŸãã
ç§ã®å人çãªããŒããããïŒããã¯äž»ã«ãé«ã¬ãã«ã®ããã±ãŒãžãã€ãŸãæ°ããããŒãžã§ã³ã®TensorOperationsããç§ãåãçµãã§ããä»ã®ããã±ãŒãžã§äœ¿çšãããäœã¬ãã«ã®ããã±ãŒãžã§ãã ãã ããåºæ¬çãªç·åœ¢ä»£æ°ãããã«ãµããŒãããããšããå§ãããŸãïŒããšãã°ã norm
ãStridedView
çŸåšãJulia Baseã§ã®norm
å®è£
ãããªãé
ããªããŸãïŒã ãŸããæéããããGPUã®æäœæ¹æ³ãåŠã¶å Žåã¯ãåæ§ã«äžè¬çãªmapreducekernel
ãGPUArray
ã«å®è£
ããŠã¿ãŠãã ããã
ãããŸã§ã®ã³ã³ã»ã³ãµã¹ã¯æ¬¡ã®ãšããã ãšæããŸãã
mul!(C, A, B)
ãç¶æããå¿
èŠããããŸãC = αAB + βC
è¿œå ããŸãæåã«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)
ã§ããããšãéåžžã«é«ãè©äŸ¡ããŠããŸãã ãããä»ãç§ã¯æ¯æ¥ãä»ã®2ã€ã®ã€ã³ãã¬ãŒã¹ãã¯ãã«ç©ºéæŒç®ã®éãžã¥ãªã¢ã³åã§ããaxpy!
ãšãã®äžè¬åaxpby!
æ©ãŸãããŠããŸãã ããããmul!
/ muladd!
/ addmul!
ã«åžåãããå¯èœæ§ããããŸãã å°ãå¥åŠã§ããã A*B
ã®2ã€ã®èŠçŽ ã®1ã€ããã§ã«ã¹ã«ã©ãŒã§ããå Žåãè¿œå ã®ã¹ã«ã©ãŒèŠçŽ α
ã¯å¿
èŠãããŸããã
ãããå€åãããªãã
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ã®æåŸã®æ®µèœãåç
§ããŠ
ããã§ã¯ã1ã€ã®çœ²åïŒäŸïŒ mul!(C, A, B)
ïŒã®ææžåã«ãããããªãã¯APIã®å®£èšã¯ãä»ã®çœ²åïŒäŸïŒ mul!(C, A, B, α, β)
ïŒã«ã¯é©çšãããªããšæ³å®ããŠããŸãã ããã§ãªãå Žåã¯ãJuliaãšãã®stdlibãå
éšãå
¬éããããŠãããšæããŸãã ããšãã°ãããã¯Pkg.add
ææžåããã眲åã§ã
äžæ¹ãå®éã®å®çŸ©ã¯
Pkg.add
å°ãªããšã1ã€ã®çœ²åã®ããã¥ã¡ã³ãã®ååšããä»ã®çœ²åããããªãã¯APIã§ããããšãæå³ããå ŽåãPkg.jlã¯ãã¡ãžã£ãŒããŒãžã§ã³ããã³ãããã«ãå®è£
ã®è©³çŽ°ã®ããã«åäœãåé€ã§ããŸãããäŸïŒ Pkg.add(...; mode = :develop)
ã¯Pkg.develop(...)
ãŸã; Context!
ãžã®ãã¹ãŠã®ããŒã¯ãŒãåŒæ°ããµããŒããããŠããŸãïŒå®éã«ã¯æå³ãããŠããå¯èœæ§ããããŸãïŒã
ããããããã¯ãšã«ããç§ã®å°è±¡ã§ãã mul!(C, A, B, α, β)
ã¯mul!(C, A, B)
åããããå
¬éãããŠãããšæããŸããïŒ
ç§ãã¡ã¯ãäºããè¶
ããŠè©±ããŠãããšæããŸãã ç§ãèšã£ãŠããã®ã¯ãç§ã¯ïŒãŸã ïŒå¥ã®æ©èœãå°å
¥ãã䟡å€ããããšã¯æããªããšããããšã§ãã ãããã£ãŠãç§ã®åã®ã³ã¡ã³ããžã®ç§ã®åç
§ã ããã¯ã5ã€ã®åŒæ°mul!
ã®éæšå¥šã«é¢ãã説æãšã¯å¥ã®ãã®ã§ãã
ãã ããå¥ã®é¢æ°ãè¿œå ããããšã«ããå Žåã¯ã5ã€ã®åŒæ°mul!
ãåã«å£ãã®ã§ã¯ãªããéæšå¥šã«ããã®ãæåã ãšæããŸãã ãã¡ããã3ã€ã®åŒæ°mul!
ã»ã©äžè¬çã«ã¯äœ¿çšãããŠããŸããããåã«å£ãã®ã§ã¯ãªããéæšå¥šã«ããªãã®ã¯ãªãã§ããïŒ
ããã¯ã5ã€ã®åŒæ°
mul!
ã®éæšå¥šã«é¢ãã説æãšã¯å¥ã®ãã®ã§ãã
ã³ã¡ã³ãã®æåŸã®æ®µèœhttps://github.com/JuliaLang/julia/issues/23919#issuecomment-430952179ã®ç§ã®è§£éã¯ã@ simonbyrneãã§ããã / 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!
éæšå¥šã«ããããšã¯ãå¥ã®é¢æ°ãå°å
¥ããå Žåã«è¡ãã¹ãæ£ããããšã§ããããšã«åæããŸãã ãã®ã³ãŒãã¯ç§ã®PRïŒ29634ã«ãã§ã«ååšããŸãã
C = ABãšC =αAB+βCã®èšç®ã¯ååã«é¡äŒŒããŠããã®ã§ãåãååã§äž¡æ¹ã説æã§ãããšäž»åŒµããŠããŸããïŒ
ã¯ããåè
ã¯Î²=0
ã®åŸè
ã§ããããã§ãã muladd!
/ addmul!
ã¯C = αAB + βC
ããæ£ç¢ºãªååã§ãããšäž»åŒµããã®ã¯å
¬æ£ã§ãããããã«å°éããã«ã¯ãå¥ã®è¡åä¹ç®é¢æ°ïŒ muladd!
/ addmul!
ïŒãŸãã¯mul!
ååãå€æŽãããšãä»ã¯äŸ¡å€ããªããšæããŸãã ãããããæ¥ã«èµ·ãã£ãŠããããå€æŽãæ€èšããã®ã¯ç°¡åã ã£ãã§ãããã
3ã€ã®åŒæ°ã®mulãäžè¬åããä»ã®æ¹æ³ãããå¯èœæ§ãããã®ã§ãç§ã¯å®éã«ã¯åæããŸããïŒïŒ
ãžã¥ãªã¢ã¯ããŸããŸÎ±
ãšÎ²
åŒæ°ãªãã§ã€ã³ãã¬ãŒã¹è¡åä¹ç®ã¡ãœãããå®çŸ©ããŸããããè¡åä¹ç®ã®äŒçµ±ã¯å®éã«ã¯BLAS-3ã«åºã¥ããŠãããäžè¬çãªè¡åä¹ç®é¢æ°ã¯C = αAB + βC
ã
mul!
ååãå€æŽ
stdlibãŸãã¯ããŠã³ã¹ããªãŒã ãŠãŒã¶ãŒã¢ãžã¥ãŒã«/ã³ãŒãã§ååãå€æŽããããšãæå³ããŸããïŒ åè ã®å Žåã¯ãïŒ29634ã§ïŒLinearAlgebraãšSparseArraysã®å ŽåïŒãã§ã«å®è¡ãããŠããã®ã§ãå¿é ããå¿ èŠã¯ãªããšæããŸãã åŸè ãæå³ãããªããç§ã¯ãããåã³å ¬ã®è°è«ã«åž°çãããšæããŸãã
è¡åä¹ç®ã®äŒçµ±ã¯ãå®éã«ã¯BLAS-3ã«åºã¥ããŠããŸã
ãããããžã¥ãªã¢ã¯ãã§ã«BLASã®åœåèŠåããéžè±ããŠããŸãã ããã§ããã£ãšããããããååãä»ããã®ã¯ããããšã§ã¯ãªãã§ããããïŒ
stdlibãŸãã¯ããŠã³ã¹ããªãŒã ãŠãŒã¶ãŒã¢ãžã¥ãŒã«/ã³ãŒãã§ååãå€æŽããããšãæå³ããŸããïŒ
mul!
é¢æ°ã®ååãå€æŽããŸããã æ°ããé¢æ°addmul!
è¿œå ãããŸãããããããžã¥ãªã¢ã¯ãã§ã«BLASã®åœåèŠåããéžè±ããŠããŸãã
ããŒãã³ã°ã«ã€ããŠè©±ããŠããã®ã§ã¯ãããŸããã å°ãªããšããFortran 77ã«ã¯ãé¢æ°åãšãã£ã¹ãããã®äž¡æ¹ã«é¢ããŠã¯ãªãããã€ãã®å¶éããããããæ£ç¢ºã§ã¯ãããŸããã ç§ã¯äœãèšç®ãããŠãããã«ã€ããŠè©±ããŠããã BLAS-3ã®äžè¬çãªè¡åä¹ç®é¢æ°ã¯C = αAB + βC
ãèšç®ããJuliaã§ã¯mul!
ïŒfka A_mul_B!
ïŒã«ãªã£ãŠããŸãã
ããã§ããã£ãšããããããååãä»ããã®ã¯ããããšã§ã¯ãªãã§ããããïŒ
ãããªãã§ãããããããŠç§ã¯ãããæ°åèšããŸããã åé¡ã¯ãåºæ¬çã«åãããšãè¡ã2ã€ã®è¡åä¹ç®é¢æ°ãå¿ èŠã«ãªãã»ã©è¯ããªãããšã§ãã
29634ã¯
mul!
é¢æ°ã®ååãå€æŽããŸããã æ°ããé¢æ°addmul!
è¿œå ãããŸãã
ç§ãèšãããã£ãã®ã¯ã5ã€ã®åŒæ°mul!
ãaddmul!
ã«ååãå€æŽãããããšã§ãã
åé¡ã¯ãåºæ¬çã«åãããšãè¡ã2ã€ã®è¡åä¹ç®é¢æ°ãå¿ èŠã«ãªãã»ã©è¯ããªãããšã§ãã
åºæ¬çã«åããã©ããã¯äž»èŠ³çã ãšæããŸãã _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!
å Žåã mul!(some_func(...), ...)
some_func
ã¯å²ãåœãŠã®ã¿ãè¡ããšããã«äºæ³ã§ããŸãã
åºæ¬çã«åããã©ããã¯äž»èŠ³çã ãšæããŸãã C =αAB+βCãšY =AâAââ¯AâXã¯ã©ã¡ããC = ABã®æ°åŠçã«æå¹ãªäžè¬åã ãšæããŸãã C =αAB+βCãç¬èªã®äžè¬åã§ãªãéããè°è«ã¯ååã«åŒ·åã§ã¯ãªããšæããŸãã
ããã¯äžæã®äžè¬åã§ã¯ãªããããããŸããããã»ãŒåãã³ã¹ãã§èšç®ã§ããäžè¬åã§ãããä»ã®ç·åœ¢ä»£æ°ã¢ã«ãŽãªãºã ãæ§ç¯ããããã®æçšãªããªããã£ãã圢æããŸãã å€ãã®å ŽåãããŸããŸãªç·åœ¢ä»£æ°é¢é£ã®ã¢ã«ãŽãªãºã ãå®è£
ãããšãã«ãŒã以å€ã®ããŒã¿å€ãå¿
èŠã§ãããåžžã«BLAS.gemm!
ã«ãã©ãŒã«ããã¯ããå¿
èŠããããŸããã ããªããèšåãããããªä»ã®äžè¬åã¯ããšã«ããäžéã®äžæçãªãã®ãªãã§ã¯äžçºã§èšç®ããããšãã§ããªãã®ã§ãã€ã³ãã¬ãŒã¹ããŒãžã§ã³ã¯ã¯ããã«æçšã§ã¯ãããŸããã ããã«ããããã¯åºæ¬çãªæäœã»ã©äžè¬çã«ã¯æçšã§ã¯ãããŸããã
ãŸããBLAS APIãç¥ã£ãŠãããã©ããã«ããããŸããããããäžè¬çãªJuliaãŠãŒã¶ãŒã®åºæ¬çãªç¥èã§ãããã©ããã¯ããããŸããã
ããã©ã«ãã®åŒæ°Î±=1
ãšÎ²=0
ããŸã ååšããŠããéãã3ã€ã®åŒæ°mul!
ã¯ãBLASã®ããã¯ã°ã©ãŠã³ãããªããŠãJuliaãŠãŒã¶ãŒãåççã«æåŸ
ããããšãå®è¡ããŸãã ããé«åºŠãªãªãã·ã§ã³ã«ã€ããŠã¯ãä»»æã®èšèªãšæ©èœã䜿çšããå¿
èŠããããããããã¥ã¢ã«ãåç
§ããå¿
èŠããããŸãã ããã«ããã®1åã®mul!
åŒã³åºãã¯ã gemm
ã ãã§ãªãã gemv
ãštrmv
ïŒå¥åŠãªããšã«Î±
ãšBLAS APIã®Î²
ãã©ã¡ãŒã¿ïŒããã³ããããä»ã®å€ãã®ãã©ã¡ãŒã¿ã
ç§ã¯ãBLAS-3ãèšç®ã®èŠ³ç¹ããæ£ããäžè¬åã§ãããéåžžã«ããŸãæ§æãããŠããããšã«åæããŸãã åãååã䜿çšããããšãæ£åœåããã®ã¯ãååã«ãŠããŒã¯ãã§ã¯ãªããšæããšããçç±ã ãã§ãå¥ã®å¯èœãªäžè¬åãæèµ·ããŠããŸãã https://github.com/JuliaLang/julia/issues/23919#issuecomment-442167056ã®æåŸã®æ®µèœã«ããoutput-onlyãšinput-outputã®åŒæ°ãåç §ããŠãã ããã ååãéããšã³ãŒãã®èªã¿åã/ã¬ãã¥ãŒãç°¡åã«ãªããšæããŸãã
ããã«ããã®åäžã®
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ïŒã®ãããªãã®ã§ããïŒ
ç§ã¯ããã奜ãã§ãããã¯ã¯ãŒã°ã¯ãããŸããã
ããŒã¯ãŒãã®äºãèŠãŸããã§ããã ãŸããUnicodeããŒã¯ãŒããè¿œå ããããšãèºèºããŠããŸãã ãããã®ããã©ã«ãå€ã䜿çšããäœçœ®åŒæ°ã¯åé¡ãªããšæããŸãã 次ã®æ祚ã«é¢ããŠã¯ãç§ã®ãã®ã¯æ®éã®mul!
ã§ãã ããã¯mul!
äžè¬åã§ãããæ°ããååãå¿
èŠãšããªãã»ã©å
·äœçã§äŸ¿å©ã ãšæããŸãã
ïŒå°ãªããšãçŸæç¹ã§ã¯ïŒããŒã¿ãåéããããã«ãæ祚ãè¡ããŸãããã
_C =αAB+βC_ã®ãæ°ã«å ¥ãã®é¢æ°åã¯äœã§ããïŒ
mul!
addmul!
muladd!
ç§ã«ã¯ã addmul!
ã¯AB + C
ã§ã¯ãªã(A+B)C
ã説æããŠããããã§ãã
æåã¯mul!
ã«æ祚ãã次ã«æäœãèŠãŠããä¹ç®ããŠããå ç®ããã®ã§ãæããã«muladd!
ãšåŒã¶å¿
èŠããããŸããä»ã§ã¯åŒã³åºãããšã¯èããããŸããããããã€ã³ãã¬ãŒã¹ã§ãããšããäºå®ã¯ã !
ã«ãã£ãŠæ確ã«ç€ºãããã¹ã±ãŒãªã³ã°éšåã¯ããŒã¯ãŒãåŒæ°ã«é©ããŠããããã§ãã
ä¹ç®ããŠããå ç®ããã®ã§ãæããã«
muladd!
ãšåŒã¶å¿ èŠããããŸãã
ããã©ã«ãå€Î²=true
ã䜿çšããå Žåã®ã¿ã§ãããä»ã®å€ã®å Žåã¯ãããã«äžè¬çãªãã®ã«ãªããŸãã ããã§ã¯ããããmul!
ãšåŒã°ãªãããšã®ãã€ã³ãã¯äœã§ããïŒããã©ã«ãå€Î²=false
以å€ã®å€ããããäžè¬çãªãã®ãæäŸããŸãã ãããŠã muladd(x,y,z) = x*y + z
ãšæ¯èŒããŠãåŒæ°ãã©ã®ããã«äžŠã¹ãŸããïŒ ããæ··ä¹±ããã§ããããïŒ
muladd!
ã¯ãããã§ãªãå Žåã«èª¬æçã«èããããšããæ¬ ç¹ããããšæããŸããååãä»ãããã説æã¯ãã¹ã±ãŒãªã³ã°éšåã«ã€ããŠèšåãããšscalemuladd!
ããã«ãªããŸãã
ã§ããããç§ã¯mul!
ã奜ã¿ãŸããããã¯ãæåŸ
ã«ã€ãªãããªãã»ã©èª¬æããªãããã§ãã
ããã¯èšã£ãŠããç§ã¯LazyArrays.jl MulAdd
ã¬ã€ãžãŒããŒãžã§ã³ãåŒã³åºããŸãã
C
ïŒ mul!
ïŒã®å€ã䜿çšããªãé¢æ°ãšãããã䜿çšããé¢æ°ãåºå¥ããã®ã¯è¯ãããšãªã®ã§ã mul!
ãããmuladd!
æ¹ã奜ãã§ãã ïŒ muladd!
ïŒã
mul!
ããããå¯è¡åã®å Žåãåãã§ããïŒæ°ããåŒæ°ã§ã¯ãããŸããïŒã ããç§ã¯ãããmul!
ãšåŒã¶ããšã«è³æã ããã
- æè¡çã«ã¯ãè¡åã®ä¹ç®ã§ãïŒ[AC] * [Bα; Iβ]
... eltypeã«å¯æä¹ç®ãããå Žå
... eltypeãå¯æã§ããå Žåã
IIRC @andreasnoackãžã¥ãªã¢ãšã®è°è«ãããããå®çŸ©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ã«ãã@ mschauerLazyArrays.jlã«ã¯ãæ§æã®ããã«5ã€ã®åŒæ°mul!
ãåŒã³åºãããã®åªããæ§æããããŸãïŒãã®ä»ïŒïŒã
æåã«é¢æ°ããŒã¹ã®APIã確ç«ããããã±ãŒãžã®äœæè ãç¹æ®ãªãããªãã¯ã¹ã®ããã«APIã®ãªãŒããŒããŒããéå§ã§ããããã«ããå¿ èŠããããšæããŸãã ãã®åŸããžã¥ãªã¢ã³ãã¥ããã£ã¯ãããåŒã³åºãããã®ç ç³ã®å®éšãéå§ã§ããŸãã
ããã©ã«ãå€
β=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
ãšæ¯èŒããŠãåŒæ°ãã©ã®ããã«äžŠã¹ãŸããïŒ ããæ··ä¹±ããã§ããããïŒ
ããããç§ãmuladd!
ãããaddmul!
ã奜ãçç±ã§ãã åŒæ°ã®é åºãã¹ã«ã©ãŒ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
ãããªmul!
ä»ã®äžè¬åãããå¯èœæ§ããããŸãïŒhttps://github.com/JuliaLang/julia/issues/23919#issuecomment-402953987ãªã©ïŒ
å
¥åºåãã©ã¡ãŒã¿ãŒïŒåŒæ°ã®æ°ã«åºã¥ããŠC
ã®ããŒã¿ã䜿çšããé¢æ°ããããšæ··ä¹±ããŸãïŒhttps://github.com/JuliaLang/julia/issues/23919#issuecomment -441267056ãhttpsïŒ//github.com/JuliaLang/julia/issues/23919#issuecomment-441824982ïŒ
mul!
ãåªããŠãããã1ã€ã®çç±ã¯...ïŒ
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ãæå¹ã§ããããšãç¥ã£ãŠãã人ã
ã«ãã£ãŠãäœã¬ãã«ã®ã³ãŒãã§äœ¿çšãããŸãããã®ã ãããã®äººã
ã¯ã mul!
äžã§ãã®æ©èœãæ¢ããšæããŸããããã¯ã gemm
ã gemv
ã...ãžã®ç¢ºç«ãããJuliaã€ã³ã¿ãŒãã§ã€ã¹ã§ããæ°ããååãè¿œå ããŸãïŒæ··ä¹±ããŸãïŒå察ã®åŒæ°ã®é åºïŒã¯äŸ¡å€ããªãããã§ãã ç§ã¯å©çãèŠãããšãã§ããŸãããïŒ
ãããã®äººã ã¯ã
mul!
äžã§ãã®æ©èœãæ¢ããšæããŸããããã¯ãgemm
ãgemv
ã...ãžã®ç¢ºç«ãããJuliaã€ã³ã¿ãŒãã§ã€ã¹ã§ããæ°ããååãè¿œå ããŸãïŒæ··ä¹±ããŸãïŒå察ã®åŒæ°ã®é åºïŒã¯äŸ¡å€ããªãããã§ãã ç§ã¯å©çãèŠãããšãã§ããŸãããïŒ
mul!
docstringã§muladd!
ã«èšåã§ããã®ã§ãçºèŠå¯èœæ§ã¯å€§ããªåé¡ã§ã¯ãªããšæããŸãã BLASãååã«ç解ããŠãã人ã¯ãAPIãæ¢ãå Žæãç¥ã£ãŠããã§ãããã
äœçœ®åŒæ°ãšããŒã¯ãŒãåŒæ°ã«ã€ããŠïŒããã§ã¯ãŸã 説æããŠããŸãããã α
察è§è¡åãšããC = αAB + βC
ã¯ãã¹ã«ã©ãŒÎ±
ãšåããããå¹ççãã€ç°¡åã«å®è£
ã§ãããšæããŸãã ãã®ãããªæ¡åŒµã§ã¯ãããŒã¯ãŒãåŒæ°ã§ã¯äžå¯èœãªÎ±
ã®åã§ãã£ã¹ãããã§ããå¿
èŠããããŸãã
ãŸããéå¯æeltypeã®å Žåã muladd!(α', B', A', β', C')
ïŒä»®æ³åŒæ°ã®é åºïŒãåŒã³åºãããšã«ããã C = ABα + Cβ
ãå¹ççã«èšç®ããããšãã§ããŸãã ã¬ã€ãžãŒã©ãããŒAdjoint(α)
ããã³Adjoint(β)
ãã£ã¹ãããã§ããå¿
èŠãããå ŽåããããŸãã ïŒç§ã¯ãžã¥ãªã¢ã§éå¯ææ°ãå人çã«äœ¿çšããªãã®ã§ãããã¯ããããéåžžã«ä»®èª¬çã§ããïŒ
ãã®multiply-addé¢æ°ã¯ãã©ã€ãã©ãªå®è£ è ã®ãããªçç·Žããããã°ã©ããŒåãã®äœã¬ãã«APIã§ãããšãã@Juthoã®ææã«åæããŸãã ãã®APIã§ã¯æ¡åŒµæ§ãåªå 床ãé«ããäœçœ®çãªè°è«ãé²ãã¹ãéã ãšæããŸãã
ããŒã¯ãŒãåŒæ°ãåé¿ããããã®ãã1ã€ã®åŒæ°ã¯ã @ 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ã®åŒæ°ã«ãã£ãŠãã£ããã£ãããïŒèŠæ±ãããæäœã®ããããªéãã«å¿ããŠã2ã€ã®ç°ãªããšã³ããªãã€ã³ãããããŸãã ã ãããããBLAS APIãžã®ãã«ã¢ã¯ã»ã¹ãæäŸããªãã£ãã®ã¯ãžã¥ãªã¢ã®ééãã ã£ããšæããŸãïŒ@tkfãä¿®æ£ããŠãããŠããããšãïŒã ããã¯å€ãæãããFortranåœåèŠåã«ãããããããç§ã¯ãããã®äººããªã圌ãããã®ããã«ç©äºãããŠããã®ãç¥ã£ãŠãããšæããŸãã ããããåæ§ã«ããã®æäœãã¡ããªãŒïŒã€ãŸããαãšÎ²ã«ãã£ãŠãã©ã¡ãŒã¿ãŒåããã2ãã©ã¡ãŒã¿ãŒã®æäœãã¡ããªãŒïŒã¯ãBLASã®å Žåãšåæ§ã«ãåäžã®ãšã³ããªãã€ã³ãã«å±ããŠãããšæããŸãã
ç§ã®èŠè§£ã§æãæå¹ãªåè«ã¯ã C
ã®å
ã®ããŒã¿ã«ã¢ã¯ã»ã¹ãããã©ããã®éãã§ãã ãããããžã¥ãªã¢ããŒãã®çµæãä¿èšŒããæ¹æ³ãšããŠfalse
ä¹ç®ãæ¡çšããŠãããšããäºå®ãèãããšãä»ã®èŠçŽ ãNaN
ããããåŠçããããšæããŸãã ãããããããããã®äºå®ã¯ããããäŒé/ææžåããå¿
èŠãããïŒç§ãææžãèªãã§ãããã°ããçµã¡ãŸããïŒãç§ãæè¿ããã«ã€ããŠåŠã³ãŸããã ïŒãã®ãããKrylovKit.jlã§ã¯ãä»»æã®ãã¯ãã«ã®ãããªãŠãŒã¶ãŒã¿ã€ãããŒãã§åæåããããã«ã fill!
ã¡ãœããã®ååšãå¿
èŠã§ãããããã代ããã«rmul!(x,false)
ã«ããããšãã§ããããšãããããŸããããããã£ãŠã fill!
ãå®è£
ãããŠããããšã匷å¶ããå¿
èŠã¯ãããŸããïŒã
muladdïŒ/ addmulïŒã«ã¯ä»ã«ãã¡ãªããããããšæããŸãã ããéèŠã§ãã
ã§ã¯ã質åãéã«ããŸããããæ°ããæ¹æ³ãæã€ããšã®ãããã®ä»ã®å©ç¹ã¯äœã§ããïŒ ããäžåºŠèŠçŽãèªã¿ãŸããããã³ã¡ã³ãããã°ããã®C
ã«ã¢ã¯ã»ã¹ãããã€ã³ãããããããŸããã
ç§ã¯ä»æ劻ã«ãæè¡ã®åœåã«é¢ããŠãžã¥ãªã¢ã³ãã¥ããã£ã§2ã¶æã®é·ãäŒè©±ããã£ããšèšããŸããã 圌女ã¯ãããããã¬ããããšåŒã¶ããšãææ¡ããã -é åèªãæ·±ãæå³ããããŸãããè¯ãååã§ãã 圌女ã«ä»£ãã£ãŠãããåºãã ãã§ãã
圌女ãæå笊ãä»ããŠãããŠè¯ãã£ãã§ãïŒ ð
ãŸãã念ã®ãããç§ã®æžå¿µã¯ã»ãšãã©ã³ãŒãã®å¯èªæ§ã«ã®ã¿èµ·å ããæžã蟌ã¿å¯èœæ§ãçºèŠå¯èœæ§ã«ã¯èµ·å ããªãããšãæ確ã«ããŠãããŸãã ããªãã¯äžåºŠã³ãŒããæžããŸãããäœåºŠãèªã¿ãŸãã
æ°ããæ¹æ³ãæã€ããšã®ãããã®ä»ã®å©ç¹ã¯äœã§ããïŒ
ããªããã³ã¡ã³ãããããã«ãç§ã¯åºå察å
¥åºåãã©ã¡ãŒã¿ã®åŒæ°ãæãéèŠã ãšæããŸãã ããããããã_C =αAB+βC_ã_C = AB_ãšç°ãªããšæãçç±ã®1ã€ã«ãããŸããã ãŸããåè
ã®è¡šçŸãåŸè
ã®å³å¯ãªãã¹ãŒããŒã»ãããã§ãããšããæå³ã§ç°ãªããšããåçŽãªäºå®ã¯ãã³ãŒãå
ã§æ確ãªèŠèŠç衚瀺ãå¿
èŠã ãšæããŸãã å¥ã®ååã¯ãäžçŽããã°ã©ããŒïŒãŸãã¯å°ãçŠç¹ã®å®ãŸããªãäžçŽããã°ã©ããŒïŒãã³ãŒããã¹ããã³ã°ãã mul!
ãããå¥åŠãªãã®ã䜿çšããŠããããšã«æ°ä»ãã®ã«åœ¹ç«ã¡ãŸãã
æ祚ãããäžåºŠç¢ºèªmul!
ããmuladd!
ã§ãã ååèŠããšãã¯mul!
ãåã£ãŠããŸããã 圌ãã移åããåã«ããã«ãããèšé²ããŸãããïŒç¬ãïŒ
mul!
ïŒ6addmul!
ïŒ2muladd!
ïŒ8ããå°ãçå£ã«ãç§ã¯ãŸã ãã®ããŒã¿ãmul!
瀺ããŠããªããã muladd!
ãä»ãããæ確ã§ãããšæããŸãã ïŒ addmul!
ãå°æ°æŽŸã§ããããšã瀺ããŠããŸããïŒsob :)
è¡ãè©°ãŸã£ããããªæ°ãããŸãã ã©ãããã°å ã«é²ã¿ãŸããïŒ
代ããã«gemm!
ãšåŒãã§ãã ããã
ãžã§ã ãšåŒãã§ãã ããïŒ ä»£ããã«ïŒ
ãããåè«ã ãšââããã®ã§ãã...è¡å*ãã¯ãã«ã«gemm!(α, A::Matrix, x::Vector, β, y::Vector) = gemv!(α, A, x, β, y)
ãææ¡ããŠããªãéãã
PRãããŒãžããŠæ¹åããä»ã®PRã«muladd!
ãè¿œå ãããã©ãããå¿é
ã§ããããã«ãä»ã®ãšããïŒã¹ããŒã¹è¡åã§ïŒãã§ã«ååšããmul!
ã€ã³ã¿ãŒãã§ã€ã¹ãæ®ããŠããããšãã§ããŸããïŒ ïŒ
ãã¶ããããã®èª°ã«ãšã£ãŠããã§ã«æããã§ãããç§ã¯æ祚ãããã§ã¯ãªãããšã匷調ãããã£ãã ãã§ã
mul!
vs muladd!
ã ã
mul!
vsïŒ mul!
ããã³muladd!
ïŒã€ãŸãã1ã€ã§ã¯ãªã2ã€ã®çªç¶å€ç°ä¹ç®é¢æ°ãæã£ãŠããŸãã
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,α,β)
ãéžæããé€å€ããå¿
èŠã¯ãªãããã®çœ²åã®ãã€ãã¹ç¹ãšããŠæ°ããå¿
èŠããããšæããŸãã
ïŒãã ãããããã¹ã泚æãAPIã䜿çšããå Žåã¯ã muladd!(α, A, B, β, C)
ã䜿çšãããšæããŸããïŒ
ã¡ãªã¿ã«ãæ祚ã®çµæã§ããããªãã®ã¯ã muladd!
ãšaddmul!
ã®é察称æ§ã§ãã C = βC + αAB
ãšæžããšã addmul!
æ¹ãèªç¶ã«èŠãããšæããŸãã
@tkfããã¯ããªããæåã«è¡ãæäœã«ã€ããŠã§ãã ç§ã«ãšã£ãŠaddmul!
ã¯ã (A+B)C
ããã«ãæåã«å ç®ãè¡ã£ãŠããä¹ç®ããããšãææ¡ããŠããŸãã ãã¡ããããã¯äž»èŠ³çã§ãã ããããè¯ãååã¯çŽæã«èšŽããã¯ãã§ãã
ããããã®ç¹ã¯ããããŸãã
ããã¯ãŸã è¡ãè©°ãŸã£ãŠããã®ã§ãç§ã®ææ¡ã§ã¯ãé¢æ°å®çŸ©ã§æ§æããã䜿çšãã¿ãŒã³ããããŸãïŒ2çªç®ã¯@callexpr
ã«ãªããŸãïŒ
@callexpr(C .= β*C + α*A*B) = implementation(C, β, α, A, B)
@callexpr(C .= β*C + A*B) = implementation(C, β, true, A, B)
ãããŠå€åãã£ãšãã£ã¹ããããããããã©ãŒã ïŒ2çªç®ã¯@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ãããŒãžããåã«ãåŒã³åºãã®çœ²åïŒåŒæ°ãšããŒã¯ãŒãã®é åºãã©ããïŒã決å®ããå¿ èŠããããŸãã
ããã§ã¯ãããäžåºŠæ祚ããŠã¿ãŸãããïŒããã¯çŽ æŽãããåºæ¿ç©ã§ããããšãããã£ãã®ã§ïŒã
_C =ABα+Cβ_ã«muladd!
ã䜿çšããå Žåããæ°ã«å
¥ãã®é話眲åã¯äœã§ããïŒ
muladd!(C, A, B, α, β)
muladd!(A, B, C, α, β)
muladd!(C, A, B; α, β)
ïŒïŒ+ 1ïŒã®ããã§ãããããŒã¯ãŒãargumentsbsä»ãïŒmuladd!(A, B, C; α, β)
ïŒïŒ-1ïŒãšåæ§ã§ãããããŒã¯ãŒãåŒæ°ä»ãïŒmuladd!(A, B, α, C, β)
ä»ã®ããŒã¯ãŒãåŒæ°åââã念é ã«çœ®ããŠããå Žåã¯ã α
ãšÎ²
ã䜿çšããŠæ祚ããã©ã®ååãåªããŠãããã«ã€ããŠã³ã¡ã³ãããŠãã ããã
ååã決å®ããŠããªãã®ã§ã mul!
ã«ã€ããŠã決å®ããå¿
èŠããããŸãã
_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
ãèšç®ãããŸãã åããšã€ãªã¢ã·ã³ã°å¶éããããã®ããªã¢ã³ãã«é©çšãããŸãã
ãã ããããã«ã¯å€§ããªæžå¿µããããšæããŸããå°ãªããšãmul!(Y, A, B, C, D)
ãA*B*C*D
ã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...)
ã®äžè¬çãªã¢ãã«ã«é©åããŸãã α
ãç¹å¥ãªå Žåã§ã¯ãªããã¹ã«ã©ãŒã§ããããšã«å¯ŸåŠããããã«ãã£ã¹ãããã«äŸåããŠããŸããããã¯ãä¹ç®ããŠãããã1ã€ã®ããšã§ãã α
ãã¹ã«ã©ãŒã§ã 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æäœã«ç°¡åã«ãã£ã¹ãããã§ããŸãããã©ã³ãã
åºã«ãªãAPIåŒã³åºããšããŠ@StefanKarpinskiã®ææ¡ãæ¬åœã«å¥œã
@affine! Y = βâ*Y*βâ + αâ*A*B*αâ
åºç€ãšãªãé¢æ°ã¯ã @ StefanKarpinskiãææ¡ãããããªãã®ã«ãªããŸãã
ããããããã§ããã«é²ãå¿ èŠããããŸãã ãã®ããã®APIãšãžã§ããªãã¯é¢æ°ãäœæããã°ã誰ãããããå¹ççã«å®è¡ããJuliaã©ã€ãã©ãªãäœæãããšæ¬åœã«æããŸãããããã£ãŠãããã§BLASã«åºå·ããã¹ãã§ã¯ãªãããšã«åæããŸãã MatrixChainMultiply.jlã®ãããªãã®ã¯ããã§ã«è€æ°ã®è¡åèšç®çšã®DSLãæ§ç¯ããŠãããDiffEqã¯ã¢ãã£ã³æŒç®ååŒã䜿çšããŠç¬èªã®ããšãè¡ã£ãŠããŸãã Baseã«ã¢ãã£ã³åŒã®è¡šçŸã1ã€ãããªãå Žåã¯ããã¹ãŠã®äœæ¥ãåããã®ã«å®çŸ©ã§ããŸãã
@dlfivefiftyã¯ä»¥åã«æ æ°ãªç·åœ¢ä»£æ°ã調ã¹ãŸããããããã¯æ¬åœã«ããã§åŸ©æŽ»ããå¿ èŠããããšæããŸãã ãããŒããã£ã¹ãã®é 延衚çŸãæ§ç¯ããããšã¯ãèŠçŽ ããšã®æäœãæœè±¡é åããã³ä»£æ¿ã®èšç®ããŒããŠã§ã¢ã§æ©èœãããããã«éèŠã§ããã ç·åœ¢ä»£æ°ã«ãåãããšãå¿ èŠã§ãã ç·åœ¢ä»£æ°åŒã®è¡šçŸã«ãããJulia BLASãããã®å Žã§æ°ããBLASã«ãŒãã«ãå®çŸ©ããããæ¹çšåŒãGPU / TPUã«è»¢éãããã§ããŸãã
æ¬è³ªçã«ãç§åŠèšç®ã«ããããã¹ãŠã®èšç®ã¯ãèŠçŽ ããšã®ç·åœ¢ä»£æ°æŒç®ã«èŠçŽããããããäž¡æ¹ã®é«ã¬ãã«ã®èšè¿°ãæã€ããšã¯ãã¡ã¿ããã°ã©ãã³ã°ããŠæ°ããèšèšãæ¢çŽ¢ããããã®ããŒã«ãæ§ç¯ããã®ã«åœ¹ç«ã€ããã§ãã
ãã®ææ¡ã«ã€ããŠãã£ãšèããå¿
èŠããããŸãããä»ã®ãšãããäžæçãªãã®ãªãã§A*B*C
ãèšç®ããããªããšæããšã³ã¡ã³ãããŸãã äžæçãªãã®ãé¿ããããã«ãå€ãã®ç®è¡æŒç®ã§æ¯æãå¿
èŠãããããã«ç§ã«ã¯æããŸãã
äžæçãªãã®ãªãã§
A*B*C
ãèšç®ããããšã¯æããªãã
ãã ãã mul!
å Žåããã§ã«åºåé
åããããŸãã ããã圹ç«ã€ãã©ããã¯ããããŸããã ãããã«ãããããã¯å®è£
ã®è©³çŽ°ã®ããã§ãã API mul!(Y, A, B, C...)
ã¯ãèšç®ããããã®ãè¡šçŸããå®è£
ããããè¡ãããã®æè¯ã®æ¹æ³ãéžæã§ããããã«ããŸãããããããã§ã®äžè¬çãªç®æšã§ããã
åºã«ãªãAPIåŒã³åºããšããŠ@StefanKarpinskiã®ææ¡ãæ¬åœã«å¥œã
@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{Tuple{A1,B1},C1,D1}
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ããã®ãã®ãªã®ã§ãé¢æ°åã«æ³šæãæããªãã§ãã ããïŒã
ãã1ã€ã®æžå¿µã¯ããããèšç®ã°ã©ããšã°ãŒãã¥ãŒã¿ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«å€å°å¶éãããããšã§ãã multiply-addã€ã³ã¿ãŒãã§ãŒã¹ã®äž»ãªç®çã¯ãã©ã€ãã©ãªã®å®è£
è
ãå¹ççã«å®è£
ã§ããå°ããªåå©çšå¯èœãªèšç®ã«ãŒãã«ãå®çŸ©ã§ããããã«ãããªãŒããŒããŒãAPIãæäŸããããšã ãšæããŸãã ããã¯ã_C =ABα_ã®ã¿ãå®è£
ã§ããããšãã°_αAB_ã¯å®è£
ã§ããªãããšãæå³ããŸãïŒhttps://github.com/JuliaLang/julia/pull/29634#issuecomment-443103667ãåç
§ïŒã éå¯æeltypeã«å¯ŸããŠ_αâABαâ_ããµããŒãããã«ã¯ãäžæé
åãŸãã¯ç®è¡æŒç®ã®æ°ãå¢ããå¿
èŠããããŸãã 1人ã®ãŠãŒã¶ãŒãã©ã¡ããæãã§ãããã¯æ確ã§ã¯ãªããçæ³çã«ã¯ãããæ§æå¯èœã«ããå¿
èŠããããŸãã ãã®æç¹ã§ãå®è¡ã¡ã«ããºã ããåé¢ãããèšç®ã°ã©ãè¡šçŸãå¿
èŠã§ãã ããã¯ãå€éšããã±ãŒãžïŒLazyArrays.jlãMappedArrays.jlãªã©ïŒã§èª¿ã¹ãæ¹ããããšæããŸãã ãã ããããæç¹ã§ã»ãšãã©ã®ãŠãŒã¹ã±ãŒã¹ãã«ããŒããå®è£
æŠç¥ãèŠã€ããããšãã§ããã°ãã¡ã€ã³ã®ãšã³ããªãã€ã³ããšããŠmul!
ã䜿çšããããšã¯çã«ããªã£ãŠããŸãã ãããå®éã«muladd!
ãæ¯æãããã1ã€ã®çç±ã ãšæããŸãã å°æ¥ã®åŒã³åºã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ã®ããã§ãã
ãã1ã€ã®æžå¿µã¯ããããèšç®ã°ã©ããšã°ãŒãã¥ãŒã¿ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«å€å°å¶éãããããšã§ãã multiply-addã€ã³ã¿ãŒãã§ãŒã¹ã®äž»ãªç®çã¯ãã©ã€ãã©ãªã®å®è£ è ãå¹ççã«å®è£ ã§ããå°ããªåå©çšå¯èœãªèšç®ã«ãŒãã«ãå®çŸ©ã§ããããã«ãããªãŒããŒããŒãAPIãæäŸããããšã ãšæããŸãã
ãã®æç¹ã§ãå®è¡ã¡ã«ããºã ããåé¢ãããèšç®ã°ã©ãè¡šçŸãå¿ èŠã§ãã
ããã¯äºå®ãããããŸããããããã¯ãã®ããã®å Žæã§ã¯ãããŸãããå€éšããã±ãŒãžã§éçºããããšãã§ããéçºããå¿ èŠããããŸãã ãã®ç¹å®ã®åé¡ã解決ããããã«å¿ èŠãªã®ã¯ãBLASæäœã«ãã£ã¹ãããã§ãããã®ãäžè¬åããè¡åä¹ç®APIã ãã§ããããã¯ããããè¡ãããšãšã»ãŒåãã§ãã
@Jutho
ãããã£ãŠãããã€ãã®è¡åãä¹ç®ããããšã¯ããã®ç¹æ®ãªã±ãŒã¹ã«ãããŸããããã¢ããšã«ä¹ç®ããå¿ èŠããããŸãïŒãã¡ãããæè¯ã®é åºã¯éèŠãªåé¡ã§ãïŒã ãã®ããã
mul!(Y,X1,X2,X3...)
ã¯ããã»ã©æçšãªããªããã£ãã§ã¯ãªããšæããŸãã
mul!
æŒç®ã䜿çšãããšãå®è£
ã§ä¹ç®ã®é åºãéžæã§ããŸããããã¯äŸ¿å©ãªããããã£ã§ãã å®éããããå®è¡ã§ããå¯èœæ§ãããããã *
æäœãæåã«né
ãšããŠè§£æããŸãããåãçç±ãã mul!
ã䜿çšããŠããå Žåã¯ãããã«åœãŠã¯ãŸããŸãã ãããããããã©ãŒãã³ã¹ã«ååæ°ãé
ã£ãŠããŸãã
äžè¬çã«ã mul!
ææ¡ã«è³æãå察ãã¯ããããŸããã
ãã¹ããã©ãã«æ¥ãã®ãããããŸããããã¿ãã«ã§ããã€ãã®ãã®ãæž¡ãããšã¯ãããããã¹ãŠãå³æã®åŒæ°ãšããŠæž¡ãã®ãšåããããå¹ççã§ã
çŸåšã®LinearAlgebraã§ããããå£ããããã®ã§ãå¹çã«ã€ããŠã¯å¿é ããŠããŸããã§ãããããã£ã¹ããããšã¡ãœããã®ãããŸãããå¿é ããŠããŸããïŒããã¯ãåã·ã¹ãã ã«ã€ããŠã®ç解ãäžè¶³ããŠãããããããããŸãããæã é©ããããŸãïŒã ã¡ãœããã®è§£æ±ºã¯ãã¹ãŠã®äœçœ®åŒæ°ã®ã¿ãã«ã¿ã€ãã亀差ãããããšã«ãã£ãŠè¡ããããšæã£ãã®ã§ããã¹ããããã¿ãã«ã«ã€ããŠèšåããŠããŸããã ããã¯ããªãã«å¹³ããªã¿ãã«ãäžããŸãã æåã®åŒæ°ã§ã¿ãã«ã䜿çšããå Žåããã¹ããããã¿ãã«ããããŸãã
ããã¯ã_C =ABα_ã®ã¿ãå®è£ ã§ããããšãã°_αAB_ã¯å®è£ ã§ããªãããšãæå³ããŸãã
ç§ã¯æ··ä¹±ããŠããŸã...ããªãã¯
mul!(C, A, B, α)
ãšmul!(C, α, A, B)
ãæžãããšãã§ããŸãã
ã_C =ABα_ã¯_C = AB_ãšã_αAB_ã®ãããªä»ã®åè£ã¯è¡åã¿ã€ãã®ãã¹ãŠã®çµã¿åããã§å¹ççã«å®è£ ã§ããããã§ã¯ãããŸããããšèšãããã®ã§ãã ïŒå¹çãšã¯ãOæéã®è€éãã倧ããããšãæå³ããŸããïŒãããå®éã«åœãŠã¯ãŸããã©ããã¯å®ãã§ã¯ãããŸããããå°ãªããšãã¹ããŒã¹è¡åã®å Žåãä»ã®2ã€ã®ãªãã·ã§ã³ã¯ãããŸããã
ãã®æç¹ã§ãå®è¡ã¡ã«ããºã ããåé¢ãããèšç®ã°ã©ãè¡šçŸãå¿ èŠã§ãã
ããã¯äºå®ãããããŸããããããã¯ãã®ããã®å Žæã§ã¯ãããŸãããå€éšããã±ãŒãžã§éçºããããšãã§ããéçºããå¿ èŠããããŸãã
ããããŸãã«ç§ã®ãã€ã³ãã§ãã ãã®APIãããã®ãããªäœ¿çšæ³ã®æå°éã®æ§æèŠçŽ ãšèŠãªãããšããå§ãããŸãïŒãã¡ãããããããã¹ãŠã®ç®çã§ã¯ãããŸããïŒã vararg mul!
å®è£
ãšèšèšã¯ã人ã
ãå€éšããã±ãŒãžã®èšèšç©ºéã調æ»ããåŸã«è¡ãããšãã§ããŸãã
çŸåšã®mul!
ã§ãããåã®ãã£ã¹ãããã¯ãã§ã«ãå£ããŠããŸããã SubArray
ãAdjoint
ãªã©ã®æ§æå¯èœãªé
ååãæäœããããã«å¿
èŠãªãããŸããã®ãªãŒããŒã©ã€ãã®çµã¿åãããå¢ããŠããŸãã
解決çã¯ç¹æ§ã䜿çšããããšã§ãããLazyArrays.jlã«ã¯ç¹æ§ãåããmul!
ã®æŠå¿µå®èšŒããŒãžã§ã³ããããŸãã
ããããããã¯APIãšãããããå®è£ ã«é¢ããè°è«ã§ãã ããããã¿ãã«ã䜿çšããŠçšèªãã°ã«ãŒãåããã®ã¯ééã£ãŠãããšæããŸããããã¯ãåã·ã¹ãã ã®ç®çã§ã¯ãããŸãããïŒ ãã®å ŽåãLazyArrays.jlãœãªã¥ãŒã·ã§ã³ã«å°éããŸãã
ãã«ïŒ æäœã«ãããå®è£ ã¯ä¹ç®ã®é åºãéžæã§ããŸããããã¯äŸ¿å©ãªããããã£ã§ãã 確ãã«ããããå®è¡ã§ããå¯èœæ§ããããããæåã«*æäœãné ãšããŠè§£æããåãçç±ãmulã«ãåœãŠã¯ãŸããŸãã ããã䜿çšããŠããå Žåã¯ãããããããã©ãŒãã³ã¹ã«ååæ°ãé ã£ãŠããã®ã§ã
*
ãn
aryãšããŠè§£æãããããšã¯éåžžã«äŸ¿å©ã§ãã TensorOperations.jlã§ããã䜿çšããŠã @tensoropt
ãã¯ããå®è£
ããŸããããã«ãããå®éã«åçž®é åºãæé©åãããŸãã n
aryããŒãžã§ã³ã®mul!
æçšæ§ãäœããšæãã®ã¯ãå¹çã®èŠ³ç¹ãããçµæãé
眮ããããã®äºåã«å²ãåœãŠãããå ŽæãæäŸããããšã«ã»ãšãã©æå³ããªãããã§ããé
åã¯é¢æ°å
ã§å²ãåœãŠãŠããgcããå¿
èŠããããŸãã å®éãTensorOperations.jlã§ã¯ã倧èŠæš¡ãªäžæçãªå²ãåœãŠããJuliaã®gcã®ããã©ãŒãã³ã¹ãéåžžã«æªãå Žæã®1ã€ã§ããããšã«æ°ä»ãã人ãäœäººãããŸãïŒgcæéã50ïŒ
ã«ãªãããšããããããŸãïŒã
ãããã£ãŠãç§ãæ£ããç解ããŠããã°ã @ tkfã«ãã£ãŠãæå±ãããŠmul!
ãçã«ããªããã£ããªæŒç®ã«å¶éããŸãã2ã€ã®è¡åã3çªç®ã®è¡åã«ä¹ç®ããå Žåã«ãã£ãŠã¯ã¹ã«ã©ãŒä¿æ°ã䜿çšããŸãã ã¯ããéå¯æ代æ°ã«å¯ŸããŠãããè¡ãæãäžè¬çãªæ¹æ³ãèããããšãã§ããŸãããä»ã®ãšãããåœé¢ã®å¿
èŠæ§ã¯ããžã¥ãªã¢ã®mul!
BLASïŒgemmãgemvã...ïŒã«ãã£ãŠæäŸãããæ©èœãžã®äŸ¿å©ãªã¢ã¯ã»ã¹ã§ãããšæããŸãã
ã¿ãã«ã䜿çšããææ¡ã¯å«ãã§ã¯ãããŸããããæ··ä¹±ãçããå¯èœæ§ããããŸãã
ã±ãŒã¹4ããã±ãŒã¹2/3ã«å¶éãããšãããã©ã«ãå€Î²â = 1
ãšÎ²â = 1
ïŒãŸãã¯å®éã«ã¯true
ïŒãæå³ããããã§ãã ããããã©ã¡ããæå®ãããŠããªãå Žåã¯ãçªç¶Î²â = βâ = 0
ïŒ false
ïŒãæå³ããŸãã 確ãã«ã mul!((Y,), args...)
ã§ã¯ãªãmul!(Y, args...)
ãšæžãã®ã§ãæ§æã¯å°ãç°ãªããŸãã çµå±ãããã¯ããã¥ã¡ã³ãã®åé¡ãªã®ã§ãç§ã¯ãããææãããã£ãã ãã§ãã
èŠçŽãããšãç§ã¯ãã®æ§æã«å®éã«å察ããŠããããã§ã¯ãããŸããããããã¯å°å ¥ãããŠããæ°ããã¿ã€ãã®ãã©ãã€ã ã§ãããããããä»ã®å Žæã§ãåŸãå¿ èŠããããŸãã ç§ãå察ããŠããã®ã¯ããããä»»æã®æ°ã®è¡åã®ä¹ç®ã«äžè¬åããããšããããšã§ããããã¯ãäžã§è«ããããã«ãã®å©ç¹ãããããŸããã
@dlfivefifty ïŒããããããã¯APIãšãããããå®è£ ã«é¢ããè°è«ã§ãã ããããã¿ãã«ã䜿çšããŠçšèªãã°ã«ãŒãåããã®ã¯ééã£ãŠãããšæããŸããããã¯ãåã·ã¹ãã ã®ç®çã§ã¯ãããŸãããïŒ ãã®å ŽåãLazyArrays.jlãœãªã¥ãŒã·ã§ã³ã«å°éããŸãã
ãã ããããã§ã¯å®å
šãªã¬ã€ãžãŒé
åã䜿çšããã€ããã¯ãããŸããããã®ããã®LazyArrayã¯ãã§ã«ååšããŸãã äžæ¹ãã¹ã±ãŒãªã³ã°Y
ãè¡šçŸããæ¹æ³ãå¿
èŠã§ãã ã¿ãã«ã䜿çšããããšã¯ããã®å°éã®æ§é ãè¡šçŸããããã®åçŽã§è»œéãªã¢ãããŒãã®ããã«æããŸãã ä»ã«äœãææ¡ã¯ãããŸããïŒ Î²â
ãšÎ²â
ã«lscale
ãrscale
ããŒã¯ãŒããèšå®ããããšãã§ããŸããããã以äžã®ãšã¬ã¬ã³ããã¯æãããããããããã£ã¹ãããããŸããããã¯éèŠã§ã¯ãããŸããããæã£ãŠãããšäŸ¿å©ã§ãã
@Jutho ïŒãããã£ãŠãç§ãæ£ããç解ããŠããã°ã @ tkfã«ãã£ãŠãæå±ãããŠ
mul!
ãçã«ããªããã£ããªæŒç®ã«å¶éããŸãã2ã€ã®è¡åã3çªç®ã®è¡åã«ä¹ç®ããããããã¹ã«ã©ãŒä¿æ°ã䜿çšããŸãã ã¯ããéå¯æ代æ°ã«å¯ŸããŠãããè¡ãæãäžè¬çãªæ¹æ³ãèããããšãã§ããŸãããä»ã®ãšãããåœé¢ã®å¿ èŠæ§ã¯ããžã¥ãªã¢ã®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!
ãæžãç¶ããŠã¿ãŸãããïŒ
ãã ããããã§ã¯å®å šãªã¬ã€ãžãŒé åã䜿çšããã€ããã¯ãããŸããã
ãå®å
šãªã¬ã€ãžãŒé
åããšèšã£ãŠããã®ã§ã¯ãªããã³ã³ãã€ã«æã«æçµçã«åé€ãããBroadcasted
ãšåãæå³ã§ã¬ã€ãžãŒãææ¡ããŠããŸãã åºæ¬çã«ãé¢æ°ã®æ æ°ãªã¢ããªã±ãŒã·ã§ã³ãè¡šãããã«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)))
èšè¿°ã§ããããããŒããã£ã¹ãã®ãããªã·ã¹ãã ããŸãã¯é
延è©äŸ¡ã·ã¹ãã ãè¿œå ããããšã¯ãã¯ããã«å€§ããªè¿œå ã§ããããã®åé¡ã®ç¯å²å€ã®gemm!
çŽæ¥é»è©±ãããç¶ããããšãèš±å¯ããåŸåããããŸãã
ã¯ããããã¯ããããæ¬åœã§ãã ããã©ã«ããç°¡åã«æäŸããããã«ãã¹ã«ã©ãŒåŒæ°ãåŸãã«çœ®ãæ¹ãç°¡åã ãšæããŸããã ããããããã€ãã®@eval
ã¡ã¿ããã°ã©ãã³ã°ã䜿çšããŠã32ã®å®çŸ©ãã¹ãŠãç°¡åã«çæã§ããå Žåãããã¯åæ§ã«åªããŠããŸãã ïŒãåç¥ã®ãšããã mul
ã¯gemm!
ã ãã§ãªãã gemv
ãštrmm
ãªã©ã«ããªããŸãïŒã
ããã¯åãªãBLASã©ãããŒã§ã¯ãªãããšãä»ãå ããŠãããŸãã stdlibã«ã¯ãä»ã«ãçŽç²ãªJuliaã«ç¹åããã¡ãœããããããŸãã ãŸããããããªãŒããŒããŒãAPIãšããŠäœ¿çšããããšãéèŠã§ããããã±ãŒãžã®äœæè
ã¯ãç¹å¥ãªè¡åã¿ã€ãã«å¯ŸããŠmul!
ãå®çŸ©ã§ããŸãã
ãããç§ã®ã¹ã¿ã³ã¹ã ãšæããŸãã
mul!(C, A, B, a, b)
ã¯ãã§ã«SparseArrays.jlã«ååšãããããä»ãããµããŒãããããšãã§ããŸããApplied
ãããªãããŒããã£ã¹ããè¡ãã®ãæåã§ãã ããã¯Julia2.0ãŸã§åŸ
ããªããã°ãªãããç§ã®ããŒãºã«åã£ããããã¿ã€ããLazyArrays.jlã§éçºããç¶ããŠããŸããããªããã®ææ§ãåé¿ã®é£ããã ãšæããŸãã@dlfivefifty mul!((Y, β), α, A, B)
APIã¯ãã®ããã«çããã mul!(Y, A, B, α, β)
ïŒ Transpose
ãªã©ã®ãããªãã¯ã¹ã©ãããŒãèæ
®ãããšãé£æ床ãé«ããªããŸã
mul!(C, A, B, a, b)
ã¯ãã§ã«SparseArrays.jlã«ååšãããããä»ãããµããŒãããããšãã§ããŸãã
誰ãã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ãåç
§ããŠ
@StefanKarpinskiã®ã¢ãããŒãã«ã€ããŠç§ãæ°ã«å
¥ã£ãŠããããšã®1ã€ã¯ãæéèšç®éãå€æŽããã«ã A
_some_è¡åã¿ã€ãïŒããšãã°ã Adjoint{_,<:SparseMatrixCSC}
ïŒã«å¯ŸããŠmul!((Y, β), α::Diagonal, A, B)
ç¹æ®ãªã¡ãœãããå®è£
ã§ããããšã§ãã ã ïŒããã¯ç§ã®ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠéèŠã§ããïŒãã¡ããããã®æ¹æ³ã䜿çšããã«ã¯ãç¹ã«ç¹æ®ãªã¡ãœããã®ååšãç
§äŒããæ¹æ³ã«ã€ããŠãAPIã§ããã«è°è«ããå¿
èŠããããŸãã ããã§ããAPIãæ¡åŒµããæ©äŒãæã€ããšã¯çŽ æŽãããããšã§ãã
誰ããã¡ãœããã®ãããŸããã«ã€ããŠã®ç§ã®å¿é ãæããã«ããå Žåãç§ã¯ãã¹ãŠã¿ãã«ããšã®ã¢ãããŒãã«ãªããŸãã
ããã¯ãαã®ä»ã®å Žæã倧ããªOæéèšç®éãå€æŽããããã§ãã
ããã¯ç¹ã«ã¹ããŒã¹è¡åã§ããïŒ ç¹ã«å¯è¡åã®å Žåã¯ç¹ã«ããã§ã¯ãããŸããã ãªã³ã¯å
ã®å®è£
ã§ã¯ã α
ãA
ãšB
éã«ããå Žåã瀺ããŠããŸããïŒ
ããã±ãŒãžéçºè ã¯å®è£ ããã ãã§ãããšæããŸã...
ããã¯éåžžã«åçŽåãããŠããŸãã BlockArrays.jlã®PseudoBlockMatrix
ããã«ãã¹ãã©ã€ãè¡åã®ããã«åäœããè¡åããããšããŸãã gemm!
ãå®å
šã«ãµããŒãããã«ã¯ã PseudoBlockMatrix
ãã¹ãŠã®é åãïŒ1ïŒèªäœãïŒ2ïŒ StridedMatrix
ãïŒ3ïŒ Adjoint
èªäœã§ãªãŒããŒã©ã€ãããå¿
èŠããããŸãã ãïŒ4ïŒ Transpose
ã®ããèªäœãïŒ5ïŒ Adjoint
ã®StridedMatrix
ãïŒ6ïŒ Transpose
ã®StridedMatrix
ããããŠããããä»ã®äººã ããã¯ãã§ã«6 ^ 3 = 216ã®ç°ãªãçµã¿åããã§ãã 次ã«ã trmm!
ããµããŒãããå¿
èŠãããã UpperTriangular
ã UnitUpperTriangular
ããããã®é䌎ããããã®è»¢çœ®ãªã©ã§åãããšãè¡ãå¿
èŠããããŸãã 次ã«ã 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ããããLazyArrays.jlã§ããããã£ã¹ãããããããã«ããã€ãã®ããªããã£ãé¢æ°ãå¿ èŠã§ãããïŒ ç§ã®ç解ã§ã¯ãããã¯ããã£ã¹ãããå°çãã解決ããŸããã人ã ãå®è£ ããªããã°ãªããªãèšç®ãã«ãŒãã«ãã®æ°ãæžããããšã¯ãããŸããã
ãããã Broadcasted
ãããªããã£ããããªãã®ãšåãããã«ããããªããã£ããã¯ãããŸããã ããããçŸæç¹ã§ã¯ããã«ãŒãã«ãã®åé¡ã¯è§£æ±ºãããŠããŸããã 次ã®ã¹ãããã¯ã ApplyStyle
æ æ°ãªApplied
ã¿ã€ãã䜿çšããããã«åèšèšããããšã ãšæããŸãã 次ã«ãé åºãéèŠã§ã¯ãªãæ¹æ³ã§ãBLASã®ãããªæäœãèªèããããã®MulAddStyle
ãååšããå¯èœæ§ããããŸãã
materialize!
ãŸãã¯copyto!
ãããªããã£ããšåŒã³ãŸãã å°ãªããšããããã¯ãããŒããã£ã¹ãã¡ã«ããºã ã®æ§æèŠçŽ ã§ãã åæ§ã«ãLazyArrays.jlã¯ãããæç¹ã§ããã®é
延衚çŸãã«ãŒãã®ããé¢æ°ã«ããŸãã¯ccall
ãå€éšã©ã€ãã©ãªã«äžããå¿
èŠããããšæããŸãã ãã®ãããªé¢æ°ã®ååãmul!
ã ãšããããããã¯æªãããšã§ããããïŒ
ããã¯éåžžã«åçŽåãããŠããŸãã BlockArrays.jlã®PseudoBlockMatrixãªã©ãã¹ãã©ã€ãè¡åã®ããã«åäœããè¡åããããšããŸãã gemmãå®å šã«ãµããŒãããããã«ïŒ PseudoBlockMatrixã®ãã¹ãŠã®é åããïŒ1ïŒããèªäœãïŒ2ïŒStridedMatrixãïŒ3ïŒããèªäœã®é䌎ãïŒ4ïŒããèªäœã®è»¢çœ®ãïŒ5ïŒStridedMatrixã®é䌎ãïŒ6ïŒStridedMatrixã®è»¢çœ®ãããã³å Žåã«ãã£ãŠã¯ä»ã®ãã®ã§ãªãŒããŒã©ã€ãããå¿ èŠããããŸãã ã ããã¯ãã§ã«6 ^ 3 = 216ã®ç°ãªãçµã¿åããã§ãã 次ã«ãtrmmããµããŒãããããšæããŸãïŒ ãããŠãUpperTriangularãUnitUpperTriangularããããã®é䌎ããããã®è»¢çœ®ãªã©ã§ãåãããšãããªããã°ãªããŸããã ãããªãgsmmïŒ å¯Ÿç§°ããã³ãšã«ããŒãã§ã
ããããå€ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããããªãã¯ã¹ã ãã§ãªãããããã®ãµããã¥ãŒãåŠçããå¿ èŠããããŸããç¹ã«ããããã¯ãåŠçãããããã¯ãããªãã¯ã¹ã®å Žåã¯ããã§ãã 次ã«ãäžèšã®6ã€ã®çµã¿åãããšãšãã«ããããªãã¯ã¹ã®ãã¥ãŒã®ãã¹ãŠã®ããŒãã¥ã¬ãŒã·ã§ã³ãè¿œå ããå¿ èŠããããŸãã
ããã§ãéåžžã«è€éãªå ±çšäœåã§ããStridedMatrixãå«ããäœåãã®ãªãŒããŒã©ã€ãããããŸãã ããã¯ã³ã³ãã€ã©ã«ãšã£ãŠã¯å€ãããããã䜿çšæéã¯æ°ç§ã§ã¯ãªãæ°åã«ãªããŸãã
ç§ã¯ç¢ºãã«ãçŸåšã®StridedArray
åã®å
±çšäœãäž»èŠãªèšèšäžã®æ¬ é¥ã§ããããšã«åæããŸãã ããæç¹ã§ãããä¿®æ£ããããªãã®è©Šã¿ãæ¯æããŸããã
Strided.jlã§ã¯ãé¢ä¿ãããã¹ãŠã®è¡åãç¬èªã®ã«ã¹ã¿ã å(Abstract)StridedView
ã§ããå Žåã«ã®ã¿ã mul!
å®è£
ããŸããAãBãCã®åã«æ··åãããå Žåã¯åžžã«ãJuliaã«ä»»ããŸãã Base / LinearAlgebraããããåŠçããŸãã ãã¡ãããããã¯@strided
ãã¯ãç°å¢ã§äœ¿çšãããå¯èœãªãã¹ãŠã®Baseã¿ã€ããStridedView
ã¿ã€ãã«å€æããããšããŸãã ããã§ã StridedView
ã¯ããµããã¥ãŒã転眮ãšé䌎ãããã³ç¹å®ã®åœ¢ç¶å€æŽããã¹ãŠåãïŒãã©ã¡ããªãã¯ïŒã¿ã€ãã§è¡šãããšãã§ããŸãã å
šäœãšããŠãå®å
šãªä¹ç®ã³ãŒãã¯çŽ100è¡ã§ãã
https://github.com/Jutho/Strided.jl/blob/master/src/abstractstridedview.jl#L46 -L147
BLASãé©çšãããªãå Žåã®ãã€ãã£ãã®Juliaãã©ãŒã«ããã¯ã¯ããã®ããã±ãŒãžã«ãã£ãŠæäŸãããããäžè¬çãªmapreducedim!
æ©èœã䜿çšããŠå®è£
ããã LinearAlgebra
ãã®ãããå¹ççã§ãã ããããããã¯ãã«ãã¹ã¬ããã§ããããŸãã
挞è¿çãªæéèšç®éã®å¢å ãé¿ããããã«ã
뱉*A*뱉*B*뱉
å°ãªããšãαâ
ãŸãã¯Î±â
ã¯1ã§ãªããã°ãªããªããšæããŸãã
@tkf ããããã®ã¹ã«ã©ãŒä¿æ°ãããã©ã«ãå€one(T)
ããŸãã¯ããã«è¯ãããšã«true
ãšãå Žåãå®æ°äŒæãšã³ã³ãã€ã©ãŒã®æé©åã«ããããã®ä¹ç®ãèªåçã«æé€ããããšæããŸãã ãããããŒãªãã¬ãŒã·ã§ã³ã§ãããšããæãå
åŽã®ã«ãŒãã§ã ãããã£ãŠãæãäžè¬çãªåœ¢åŒãå®çŸ©ããã ãã§ããã®ã§ãã
1
ïŒ true
ïŒã«ãããã¹ãŠã®ä¹ç®ãæé€ããããã«å®æ°äŒæ¬ã«äŸåã§ãããã©ããã¯ããããŸããã ããšãã°ãeltypeã¯Matrix
ãŸãã ãã®å Žåã true * x
ïŒ x::Matrix
ïŒã¯ãããŒãã«å²ãåœãŠãããx
ã³ããŒãäœæããå¿
èŠããããšæããŸãã ãžã¥ãªã¢ã¯ãããæé€ããããã«ããã€ãã®éæ³ãè¡ãããšãã§ããŸããïŒ
@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
ãè¡åã®è¡åã§ããå Žåã«äœããã¹ããã¯æ°åŠçã«ãããŸãã§ãã αâ
ã¯è¡åã§ãã α
äœçœ®ã§éã¹ã«ã©ãŒåŒæ°ããµããŒãããªãå Žåã¯ãåé¡ã«ã¯ãªããŸããã ãã ãã mul!((βâ, Y, βâ), args...)
ã®ã¡ã³ã¿ã«ã¢ãã«ãšããŠY .= βâ*Y*βâ + *(args...)
ãæ瀺ããããšã¯äžå¯èœã§ãã ããã«ã察è§è¡åãαâ
ãŸãã¯Î±â
ã«æž¡ãããšãã§ããã°ãã»ãšãã©ãç¡æãã§èšç®ã§ããå ŽåããããŸãïŒã¢ããªã±ãŒã·ã§ã³ã§ã¯éèŠã§ãïŒã ç§ã¯2ã€ã®ã«ãŒãããããšæããŸãïŒ
ïŒ1ïŒ mul!((βâ, Y, βâ), αâ, A, αâ, B, αâ)
ããã¡ãœããããªãŒããŒããŒãããå ŽåãåŒæ°Î±
ããã³Î²
ã¯Diagonal
åãå
¥ããå¿
èŠããããŸãã ãšã³ããŠãŒã¶ãŒã³ãŒããã¹ã«ã©ãŒå€ãä»ããŠåŒã³åºãããšãã§ããããã«ãåŒã³åºããã¹ãå®çŸ©ããã®ã¯ç°¡åã§ãã ãã ãããããå¹ççã«æ©èœãããã«ã¯ã Diagonal(fill(λ, n))
https://github.com/JuliaLang/julia/pull/30298#discussion_r239845163ã®ãOïŒ1ïŒããŒãžã§ã³ããLinearAlgebraã«å®è£
ããå¿
èŠããããŸãã ã¹ã«ã©ãŒãšå¯Ÿè§Î±
å®è£
ã¯ããã»ã©éãããªãããšã«æ³šæããŠãã ããã å€ãã®å Žåã α
ãšÎ±.diag[i]
亀æããã ãã§ãã ã§ããããããã±ãŒãžã®äœè
ã«ãšã£ãŠã¯ããã»ã©è² æ
ã«ã¯ãªããªããšæããŸãã
A
ãè¡åã®è¡åã§ããã α
ãeltype
ãšããŠæ±ãããã¹ãè¡åã§ããå Žåã 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
ãã€ã³ãããçŸåšã®3åŒæ°mul!
ïŒãã§ã«Number
èŠçŽ ã¿ã€ãããµããŒãããŠããïŒãšã®äºææ§ãç¶æãããšãå€ãã®ããšãå°å
¥ãããããšã«æ³šæããŠãã ãããéè€ã®ã
mul!((βâ, Y, βâ), αâ, A, αâ, B, αâ)
ã«äœãæåŸ
ã§ãããããããŸãã...ã ãããããã¯æ©èœã ãšæããŸãã
ãã³ãã ã€ã³ãã¬ãŒã¹ããã©ãŒãã³ã¹ãåäžãããããã«ãã©ãã§ãBLASé¢æ°ã䜿çšããªããã°ãªããªãã®ã¯æ²ããããšã§ãã
@StefanKarpinskiããªã¢ãŒãžã§ãããæã¡åºãããšãã§ããŸããïŒ
äœäººãã®linalgã®äººãé»è©±ã«åºãªãå Žåãã©ã®ãããªçµæã«ãªããã¯ããããŸããããæè¿ã¯éåžžã¯ãããŸãããã話ãåãããšãã§ããŸãã ççŽã«èšã£ãŠãç§ã¯ãã®è°è«ãããçš®ã®è§£æ±ºã«åããããšããªãã®æéãšåŽåãè²»ãããŸããããããŠãã¹ãŠã®ã¢ã€ãã¢ã¯äœããã®åœ¢ã§çå®ã«æåŠãããããã§ããããã§ç§ã¯ã»ãšãã©ãã®åé¡ããã§ãã¯ã¢ãŠãããŸãããã®ç¹ã 誰ããåé¡ã®èŠçŽãäœæããããŸããŸãªææ¡ãäžååã§ããçç±ã説æã§ããã°ãããã¯çç£çãªããªã¢ãŒãžã®è°è«ã«åœ¹ç«ã¡ãŸãã ããã§ãªããã°ãç§ãã¡ã¯å€ãã®ããšãã§ãããšã¯æããŸããã
ã³ã³ã»ã³ãµã¹ã®æ¬ åŠã¯ããããStdLibã«çµã¿èŸŒãã®ã«é©åãªææã§ã¯ãªãããšãæå³ãããšæããŸãã
ããŠã³ãŠãŒã¶ãŒã䜿çšã§ããææ¡ã®1ã€ãå®è£ ããããã±ãŒãžMatMul.jlã ãã§ã¯ãªãã®ã¯ãªãã§ããïŒ StdLibã«ããããšãå®éã«ããã»ã©éèŠã§ããçç±ãããããŸããã ç§ãç¶æããŠããããã±ãŒãžã§ãããåãã§ãµããŒãããŸãã
ãžã¥ãªã¢ã³ããŒãžã§ã³ã®gemmãèããŠããŸãã ãšgemvïŒ SparseArraysã«ãã§ã«ãããã®ãšäžèŽããŸãã äžèšã®@andreasnoackã«ãããšïŒ
ãã§ã«
mul!(C, A, B, α, β)
èœã¡çããããã©ã«ãå€ã¯Î±
ãβ
ã ãšæããŸããã ãã®ããŒãžã§ã³ã䜿çšããŠããŸãjulia / stdlib / SparseArrays / src / linalg.jl
b8ca1a4ã®32è¡ç®ãã50è¡
..ã
äžéšã®ããã±ãŒãžããã®ãã©ãŒã ã䜿çšããŠãããšæããŸãããé ã®äžã§ã©ãã䜿çšããŠãããèŠããŠããŸããã
ãã®ææ¡ã«ã¯7ã€ã®èŠªæãããã芪æã¯äžãã£ãŠããŸããã§ããã å¯ãªãã¯ãã«/è¡åã«å¯ŸããŠãã®é¢æ°ãå®è£ ããªãã®ã¯ãªãã§ããïŒ ããã¯ãæãäžè¬çãªãŠãŒã¹ã±ãŒã¹ãã«ããŒããåçŽãªãœãªã¥ãŒã·ã§ã³ã§ããããïŒ
OKã ã§ããããã³ã³ã»ã³ãµã¹ããããã©ããã«ã€ããŠã®ã³ã³ã»ã³ãµã¹ãããªãã®ã§ã¯ãªãããšæããŸãïŒsweat_smileïŒ
_I_ã¯ãã»ãšãã©ãã¹ãŠã®äºº[*]ããã®APIãæãã§ãããšèããŠããŸãããããã¯ãé¢æ°åãšçœ²åã®åé¡ã§ãã ãã®APIãæã£ãŠããªãããšãšæ¯èŒãããšã誰ããã©ã®ãªãã·ã§ã³ã«ãæºè¶³ããŠãããšæããŸããïŒããšãã°ã mul!((βâ, Y, βâ), αâ, A, αâ, B, αâ)
ã muladd!(C, A, B, α, β)
ã mul!(C, A, B, α, β)
ïŒã ç¹å®ã®APIããããæã£ãŠããªããããã¯ããã«æªããšãã説åŸåã®ããè°è«ã誰ããã§ããªãéããããªã¢ãŒãžã決å®ãããã®ã¯äœã§ãæºè¶³ããŸãã
@StefanKarpinskiãã ãããã£ã¹ã«ãã·ã§ã³ããŸã ååã«çµ±åãããŠããªããšæãããå Žåã¯ã triage
ã¿ã°ãåé€ããŠãã ããã
[*] OKã @ dlfivefifty ãçŸåšã®3åŒæ°mul!
ããçããããšæããŸãã ããããããã«ã¯3åŒæ°ã®mul!
ã€ã³ã¿ãŒãã§ã€ã¹ãæåããå€æŽããå¿
èŠããããããããã¯ãã®èª¬æã®ç¯å²ãã¯ããã«è¶
ããŠãããšæããŸããïŒããã¯ã5åŒæ°ã®ããªã¢ã³ãã®äœããã®åœ¢åŒãè¿œå ããããšã«ã€ããŠè§£éããŠããŸããïŒã LazyArrays.jlãæçãããŸã§ãååã«ãæ©èœãããã®ãå¿
èŠã ãšæããŸãã
ããŠã³ãŠãŒã¶ãŒã䜿çšã§ããææ¡ã®1ã€ãå®è£ ããããã±ãŒãžMatMul.jlã ãã§ã¯ãªãã®ã¯ãªãã§ããïŒ
@dlfivefiftyããã¯ã€ã³ã¿ãŒãã§ã€ã¹é¢æ°ïŒãªãŒããŒããŒãå¯èœãªAPIïŒã§ãããããLinearAlgebra.jlã«å«ããããšãéèŠã ãšæããŸãã ãŸãã mul!(C::AbstractMatrix, A::AbstractVecOrMat, B::AbstractVecOrMat)
ã¯LinearAlgebra.jlã«å®è£
ãããŠããããã MatMul.muladd!
mul!
ãå®çŸ©ããããšã¯ã§ããŸããã ãã¡ãããããã€ãã®åé¿çããããŸãããç¹ã«ååãšçœ²åã決å®ããå¿
èŠãããã®ã¯ãã®ã¿ãã§ããããšãèãããšãåçŽãªå®è£
ã䜿çšããæ¹ãã¯ããã«åªããŠããŸãã
å¯ãªãã¯ãã«/è¡åã«å¯ŸããŠãã®é¢æ°ãå®è£ ããªãã®ã¯ãªãã§ããïŒ
@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ã®èšèšã¯ãããŸã§è¡ãããŠããŸãããäžè¬çãªæå³ã§ãAPIã®èšèšãå¿ èŠã§ãã ããªãã¯ãããã®ããã€ãã«åãçµãã§ããããšãç¥ã£ãŠããã®ã§ãé©åãªææã«ãã¶ã€ã³ã»ãã·ã§ã³ãè¡ãã®ã¯è¯ãããšã§ãããç§ãã¡ã¯ãŸã ããã«ãããšã¯æããŸããã
BLASãšäžèŽããå Žåã¯ãBLASåãéžæããã®ã劥åœãšæãããŸãã
ããã¯ãäžè¬çãªç·åœ¢ä»£æ°é¢æ°åã«å¯ŸããŠãããŸã§è¡ã£ãŠããããšãšã¯å®å šã«å察ã§ãã
匷ã/匱ãã®èšç»äœÎ² == 0
ã®ææ¡äžè¬çãªããŒãžã§ã³ã§ã¯BLAS.gemm!(α, A, B, β, C)
ïŒ
BLAS
åŒã³åºãã«äžãããšãããã¯lmul!
ãšççŸããŸããã匷ããŒãã®ããã«åäœããŸãã β == 0
å Žåã generic_muladd!
ãã©ãŒã«ããã¯ãã以å€ã«ãããã«å¯Ÿãã解決çãèããããšã¯ã§ããŸããã
匷ã/匱ãβ== 0ã®èšç»ã¯äœã§ãã
https://github.com/JuliaLang/julia/issues/23919#issuecomment -430139849ã§ç§ã®ã³ã¡ã³ãã®åšãã§ç°¡åã«è°è«ãããã ããªã®ã§ãããªã¢ãŒãžã¯ãããããã®è³ªåã«å¯ŸåŠããŸããã§ããã
@Keno APIã®èšèšã¯ãŸã ãããŸãããããã³ã³ãã€ã©ã®ãµããŒããšBLASãžã®éžæãå«ãAPIãã¯ãçªç¶å€ç°ãšããŠå®çŸ©ãããã®ã§ããããããããšãXLAç·åœ¢ä»£æ°ã®ããã«äžå€ã§ãããšæããŸãããã³ã³ãã€ã©ïŒ ã€ãŸãã mul!
ãmuladd!
ã¯ãã®ãããªAPIã®äžéšã«ãªããšæããŸããïŒ
https://github.com/JuliaLang/julia/issues/23919#issuecomment-475534454ã®@andreasnoackã®è³ªåã«å¯ŸããŠ@Kenoã«pingãå®è¡ããŸã
ç³ãèš³ãããŸããããç§ã¯ãã®åé¡ã«æ»ãã€ããã§ããïŒç¹ã«ããªã¢ãŒãžãèŠæ±ããŸããïŒããããªã¢ãŒãžããã®æ±ºå®ã次ã®ã¢ã¯ã·ã§ã³ã«äžãããããã©ããããããŸããã§ããã
BLASãšäžèŽããå Žåã¯ãBLASåãéžæããã®ã劥åœãšæãããŸãã
@andreasnoackãææããããã«ãè¡åãšãã¯ãã«ã®ä¹ç®ãªã©ããµããŒãããå¿
èŠããããããïŒããšãã°ïŒ gemm!
䜿çšããããšã¯ã§ããŸããã ;ããã§ã¯ãããŸããïŒã
å·®ãè¿«ã£ãããŒãºã«å¯Ÿå¿ããAPIãéžæããã ãã§ãã
ã ãããç§ãã¡ã¯ãã®æ¹åã«åŸãããšãã§ãããšæããŸãã @StefanKarpinskiã«ãã£ãŠææ¡ãããã¿ãã«ããŒã¹ã®APIãå¿ããŠã mul!
/ muladd!
/ addmul!
ãããããããã ãéžæããããšãæå³ãããšæããŸãã
å ã®è°è«ã«æ»ããŸãã ããããAPIã«ã€ããŠããè°è«ããªããšããå¶çŽãããã®ã¯ããããšã ãšæããŸãã
mul!
/ muladd!
/ addmul!
ããååãéžã¶æ¹æ³
@chriscoeyå°æ¥ã®APIã«ã€ããŠã¯ä»ã®å Žæã§è°è«ããæ¹ãè¯ããšæããŸãã ãã®åé¡ã¯ãã§ã«éåžžã«é·ããäžæçãªè§£æ±ºçã«çŠç¹ãåœãŠãªãéããé²å±ãéããããšã¯ã§ããŸããã æ°ããå·ïŒãŸãã¯è«è©±ã¹ã¬ããïŒãéãã®ã¯ã©ãã§ããïŒ
ç§ã¯ãä»ãã10æ¥ã®æéã§1åã®æ¿èªæ祚ãææ¡ããŸãã æ¿èªæ祚ãšã¯ã誰ããè°è«ãç¶ããããã奜ãŸãããšèãããã¹ãŠã®ãªãã·ã§ã³ã«æ祚ããããšãæå³ããŸãã ç¶ç¶çãªè°è«ãããä»ã¯èªåã®æãå«ããªååãæã¡ãã人ã¯ã3ã€ãã¹ãŠã«æ祚ããå¿ èŠããããŸãã åºç¯ãªæ¿èªãåãããªãã·ã§ã³ããªãå ŽåããŸãã¯æ祚ã¹ããŒã èªäœãåºç¯ãªæ¿èªãæºãããŠããªãå Žåã¯ãè°è«ãç¶ç¶ããå¿ èŠããããŸãã æ¿èªããããªãã·ã§ã³ãã»ãŒåç¹ã®å Žåã @ tkfã決å®ããŸãïŒPRäœæè ã®ç¹æš©ïŒã
+1ïŒç§ã¯ãã®æ祚ã¹ããŒã ã«åæããæ¿èªç¥šãæããŸããã
-1ïŒç§ã¯ãã®æ祚ã¹ããŒã ã«åæããŸããã ããŸãã«ãå€ãã®ããŸãã¯ããŸãã«ãéèŠãªäººã
ããã®ãªãã·ã§ã³ãéžæããå Žåãæ祚ã¯ç¡å¹ã«ãªããŸãã
å¿ïŒ mul!
ã¯ãç¶ç¶çãªè°è«ãããæãŸããã§ãã
ãã±ããïŒ muladd!
ã¯ãç¶ç¶çãªè°è«ãããæãŸããã§ãã
HoorayïŒç¶ç¶çãªè°è«ãããaddmul!
ãæãŸããã§ãã
ç§ã¯æ«å®çã«ã75ïŒ ã®æ¿èªãš5人ã確å®ã«å®è¶³æ°ãäœæããããšãææ¡ããŸãïŒã€ãŸããæ祚æé å šäœãžã®äžäžèŽãå«ããæ祚ãã人ã®75ïŒ ãããã³å°ãªããšã5人ãåå©ãªãã·ã§ã³ãæ¿èªããŸãããåå ãå°ãªãå Žåã次ã«5/6ãŸãã¯6/8ãå®è¶³æ°ãäœæããŸãããå šäŒäžèŽã®4/4ã¯å€±æãšèŠãªãããå¯èœæ§ããããŸãïŒã
1.3ã®æ©èœåçµã¯8æ15æ¥é ã§ãïŒ https ïŒ
ãŸããååã®æ±ºå®ãšçŽäº€ããβ == 0
https://github.com/JuliaLang/julia/issues/23919#issuecomment-475420149ã®åäœã決å®ããå¿
èŠãããundef
ãåŠçããããã«ããã§äœ¿çšããã¢ãããŒãïŒã ã¬ãã¥ãŒäžã«ä»ã®åé¡ãèŠã€ããå ŽåããããŸãã ã ããã1.3ã«å
¥ãããšãã§ãããã©ããã¯ããããŸãã...ã
ReïŒ Î² == 0
ã @ andreasnoackã®ã³ã¡ã³ãhttps://github.com/JuliaLang/julia/issues/23919#issuecomment-430139849 ïŒç§ã®èŠçŽïŒ β == 0
åŠçã¯BLASã§ããå¿
èŠããããŸã-BLASãå¯èœãªéã掻çšããããã®äºææ§ïŒã¯çã«ããªã£ãŠããŸãã ããäžã®@simonbyrneã®è°è«ä»¥å€ã«å察æèŠãèŠã€ããã®ã¯é£ããã§ãïŒããã¹ãŠã®å®è£
ã«ã¯ãŒãããã§ãã¯ããããã®ãã©ã³ããå¿
èŠã§ããïŒã β == 0
åŠçã®ãããªBLASã«å察ããä»ã®è°è«ã¯ãããŸããïŒ
@simonbyrneã³ã¡ã³ãhttps://github.com/JuliaLang/julia/issues/23919#issuecomment-430375349ã«é¢ããŠã¯ãæ瀺çãªåå²ã¯ã»ãšãã©ã1ã€ã®ç·åœ¢Î² != 0 ? rmul!(C, β) : fill!(C, zero(eltype(C)))
ããã倧ããªåé¡ã§ã¯ãªããšæããŸãã ãŸãã C = Matrix{Any}(undef, 2, 2)
ãªã©ãåŠçããå¿
èŠãããéåžžã«äžè¬çãªå®è£
ã®å Žåãå®è£
ã«ã¯ãšã«ããæ瀺çãªãã¹ããã³ã°ãŒããåŠçãå¿
èŠã§ãïŒç§ã®PR httpsïŒ// githubã®ãã«ããŒé¢æ°_modify!
ã
é«æ§èœã®åŒ±ãé¶ç¹ãæã€ããšã¯å¯èœã§ããïŒ ç§ãã¡ãæããšããæå³ã§ïŒ
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ïŒ
ã®æ¿èªã¯ã©ãŒã©ã ã管çããŠããïŒãæã£ãŠããããšã¯æããã§ããã2çªç®ã®åè£muladd!
ã¯50ïŒ
ãã¯ããã«äžåã£ãŠããŸãã
æ祚ã¹ããŒã ã«å¯Ÿããç°è°ã¯1ã€ããããŸããã§ããã ç§ã¯æ祚ãåŒã³ã mul!
ãåã¡ãååã決å®ããŸããã @tkfã¯ãããé£ã°ã
@chethegaããããšããããã決ããã®ã«ããã¹ããŒã ã§ããïŒ
ãšããã§ãç§ã¯ããã«ãªããŒã¹ãè¡ãããšã¯ã§ããŸããïŒããããããããæ°é±é以å ã«ïŒã®ã§ã誰ãããªããŒã¹ãŸãã¯åå®è£ ããããå Žåã¯ãç§ãåŸ ã£ãŠã¯ãããŸããã
æ®å¿µãªãããNaNã»ãã³ãã£ã¯ã¹ã«ã¯æ祚ã§ããŸããã§ããã æ©èœã®åçµã¯æ¥é±ã§ãããæå³ã®ããæ祚ãè¡ãããã®ååãªæéããããŸããã
ææåã®ãªãåœæ°æ祚ã§ã¹ã¬ããã®ã ãŒãã®ã¹ãããã·ã§ãããåéããããšãææ¡ããŸãã
次ã®ãªãã·ã§ã³ã衚瀺ãããŸãã
mul!
ã1.4ãŸã§é
延ããããšã§ããïŒNaN
ã¯NaN
æå³ããŸãïŒ åŒ±ããŒããžã®ææžåãããã³ãããã¡ã³ãã§1.3ã«ããŒãžããŸãã ïŒç®ïŒ!(alpha === false) && iszero(alpha) && !all(isfinite, C) && throw(ArgumentError())
ãšããŒãžãããã®ãšã©ãŒãã§ãã¯ãå»æ¢ãããŠä»ã®äœããåªå
ãããå¯èœæ§ãããããšãææžåããŸãã ïŒæ··ä¹±ïŒè€æ°ã®ãããããççŸãããªãã·ã§ã³ãèªç±ã«éžæããŠãã ããã@ tkf /ããªã¢ãŒãžã¯ãæ祚ãç¡èŠããå¯èœæ§ããããŸãã
ç·šéïŒçŸåšãïŒtada :(å¿èïŒãšïŒrocket :(å¿èïŒã®ã¿ãççŸããŠããŸãããã©ã¡ããä»ã®ãã¹ãŠãšäºææ§ããããŸãã ããŠã³ã¹ã¬ããã§æ確ã«ãããŠããããã«ãããªã¢ãŒãžã¯ãæ°Ž14æ¥ããæš15æ¥ãŸã§ã®äžç¹å®ã®æ¥ä»ã§ã®æ祚çµæãã«ãŠã³ãããäžç¹å®ã®æ¹æ³ã§ãããèæ ®ã«å ¥ããããšãé¡ã£ãŠããŸãã ããããæ¿èªæ祚ããæå³ããŸããã€ãŸãããæ°ã«å ¥ãã®ãªãã·ã§ã³ã ãã§ãªãã奜ããªãªãã·ã§ã³ããã¹ãŠéžæããŸãã ïŒrocketïŒã¯ïŒthumbsupïŒãïŒheartïŒãïŒeyes ïŒãããã³ïŒconfusedïŒãäžæ¿èªã«ããªãããšãç解ãããŸãã ä»åã®äžè«èª¿æ»ã¯ååãããæ¥ãã§ããããšããè©«ã³ç³ãäžããŸãã
ãMergefor1.3ãã§ã¯ãªããMergefor1.xãã®å Žåã¯ãã¹ããã³ã°ãŒãïŒïŒheart :)ã«æ祚ããŸãã ãã¹ãŠã®ãMergefor1.3ãããMerge1.xãã§ããå Žåããªãã·ã§ã³ã¯æå³ããããŸãããïŒ
@chethegaã«æè¬ããŸãã @tkfç§ã¯æ¬åœã«æ°ããmulãå¿ èŠãšããç«å Žã«ãããŸãïŒ NaNã®æ±ºå®ãããŸãæ°ã«ããã«ã§ããã ãæ©ãïŒããã©ãŒãã³ã¹ãäœäžããªãéãïŒã
LazyArrays.jlããã§ãã¯ããŸãããïŒ åèãŸã§ã«ãããã¯æ¬åœã«çŽ æŽãããèåè¡åä¹ç®ãµããŒããæã£ãŠããŸãã BLAS.gemm!
ãªã©ã¯ãããªãã¯ã¡ãœããã§ãããããå®å
šã«äœ¿çšããããšãã§ããŸãhttps://docs.julialang.org/en/latest/stdlib/LinearAlgebra/#LinearAlgebra.BLAS.gemmïŒ
ç§ã¯å®éã«ãžã§ããªãã¯mulãæ¬åœã«å¿ èŠã§ãïŒ ããŸããŸãªæé©ååé¡ãæãå¹ççã«è¡šçŸããããã«ãããŸããŸãªæ§é åãããã¹ããŒã¹ã§ãã¬ãŒã³ãªå€ãå¯è¡åã䜿çšããŠããããã§ãã ç§ã¯äžè¬æ§ãšã¹ããŒãã®ããã«ããã«ããŸãã
ããã§ããã ãããŠãLazyArrays.jlã§è©±ãåã£ãããšãæãåºããã®ã§ããã¡ããããªãã¯ãã§ã«ãããç¥ã£ãŠããŸãã...
ãASAPãã«é¢ããŠããžã¥ãªã¢ã®4ãæã®ãªãªãŒã¹ãµã€ã¯ã«ã¯ãå°ãªããšãèšèšãšããŠãæ©èœãããªãŒãºããçŽåã®ãããŒãžã©ãã·ã¥ããåé¿ããããã®ãã®ã§ãã ç§ã¯ä»¥åã«åãããšãè©Šããããšãããã®ã§ããããèšãã®ã¯å ¬å¹³ã§ã¯ãªãããšãç¥ã£ãŠããŸã...ãããã誰ãããããæãåºãããããã«èšåããå¿ èŠããããšæããŸãã æããé¢ã¯ããžã¥ãªã¢ã¯éåžžã«ç°¡åã«äœæã§ããããšã§ãã ããŒãžåŸããã«æ¬¡ã®ãªãªãŒã¹ãŸã§äœ¿çšãéå§ã§ããŸãã
ç·šéïŒãªãªãŒã¹->ããŒãž
ããããšãã ç· ãåãã¯æçãªåæ©ä»ãã«ãªããšæããŸãããããåã³å€ããªãã®ãé¿ããããšæããŸãã ã§ããããç· ãåããç®æšã«ããããšææ¡ããããšæããŸãã
ãã®ã¹ã¬ããã«ç©æ¥µçã«ãšãã«ã®ãŒãæ³šå ¥ããŠããã®ã¯çŽ æŽãããããšã§ãïŒ
ç§ã¯å®éã«ãžã§ããªãã¯mulãæ¬åœã«å¿ èŠã§ãïŒ ããŸããŸãªæé©ååé¡ãæãå¹ççã«è¡šçŸããããã«ãããŸããŸãªæ§é åãããã¹ããŒã¹ã§ãã¬ãŒã³ãªå€ãå¯è¡åã䜿çšããŠããããã§ãã ç§ã¯äžè¬æ§ãšã¹ããŒãã®ããã«ããã«ããŸãã
5ã€ã®åŒæ°mul!
ã¯ãããŸããŸãªã¿ã€ããããå Žåã¯ããŸãæ©èœããŸããããããŸãããé¿ããããã«ãçµã¿åãããŠå€ãã®ãªãŒããŒã©ã€ããå¿
èŠã«ãªããŸãã ããã¯ãLazyArrays.jl MemoryLayout
ã·ã¹ãã ã®èåŸã«ããåæ©ã®1ã€ã§ãã BandedMatrices.jlããã³BlockBandedMatrices.jlã§ã¯ããŸãã«ãã®çç±ããããæ§é åãããã¹ããŒã¹ãè¡åã«äœ¿çšãããŸãã ïŒããã§ã¯ã垯è¡åã®ãµããã¥ãŒã§ããã垯BLASã«ãŒãã³ã«ãã£ã¹ããããããŸããïŒ
ãããã§ãç§ã¯LazyArraysãããäžåºŠè©ŠããŠã¿ãŸãã
5åŒæ°ã®mulã¯äžè¬çã«äžæçãªäžæçãªã®ã£ãããšèŠãªãããŠããããã§ãïŒLazyArraysã®ãããªãœãªã¥ãŒã·ã§ã³ã2.0ã§äœ¿çšã§ããããã«ãªããŸã§ïŒã®ã§ãé·æçã«ã¯å¿ ãããçæ³çãŸãã¯å®ç§ãªãœãªã¥ãŒã·ã§ã³ã§ãªããŠããããŒãžããããšãç®æãããšãã§ãããšæããŸãã
@chethegaæ°ããææåã®ãªãæ祚ã®éèšããã€ã«ãŠã³ãããå¿ èŠããããšæããŸããïŒ
@tkf確ãã«ã匷ã/匱ã/ undefã®ãŒãã¯1.xã§ãæå³ããããŸãã
ãã ãã1.4ãŸã§åŸ
ã£ãŠ5åŒæ°ã®mul!
ãååŸãããããã1.3 mul!
ã䜿çšããããšãã人ã¯ããªãå€ããšæããŸãã ç· ãåãããªãã£ãããããå°ãåŸ
ã£ãŠãé©åãªæ祚ãè¡ãæ¹æ³ãèããã®ã«ããå°ãæéãããããŸãïŒæ祚ã«ã¯å°ãªããšã10æ¥ïŒã æãéèŠãªããšã¯ã匱ã/匷ããŒãã®é床ãšåªé
ãã«ã€ããŠç«¶åããå®è£
ãæåã«æ瀺ããŠãã³ãããŒã¯ããããšãªãã«ãæå³ã®ããæ祚ãè¡ãããšã¯ã§ããŸããã å人çã«ã¯ãæåã«iszero(alpha)
ãã§ãã¯ãã次ã«ãããªãã¯ã¹ãã¹ãã£ã³ããŠ!isfinite
å€ãæ¢ãã次ã«è¿œå ã®å²ãåœãŠã䌎ãäœéãã¹ã䜿çšããããšã§ã匱ããŒãã匷ããŒããšã»ãŒåãé床ã§äœæã§ãããšèããŠããŸãã ãããããšã«ãã匷ããŒãã»ãã³ãã£ã¯ã¹ã奜ã¿ãŸãã
@chethegaæ°ããææåã®ãªãæ祚ã®éèšããã€ã«ãŠã³ãããå¿ èŠããããšæããŸããïŒ
ããªã¢ãŒãžã¯ä»é±ã1.3ã¢ã«ãã¡ã®æ±ºå®ïŒé 延/匷ã/匱ã/ããã¯ã¹ãããïŒãè¡ãå¿ èŠããããŸãã 15æ¥æšææ¥ãŸãã¯14æ¥æ°Žææ¥ã¯ãããªã¢ãŒãžãã«ãŠã³ãããããããèæ ®ã«å ¥ããããã®è³¢æãªãªãã·ã§ã³ã ãšæããŸãã ç§ã¯ããããæšææ¥ã«ã¯åå ã§ããªãã®ã§ãä»ã®èª°ããæ°ããå¿ èŠããããŸãã
çŸå®çã«ã¯ãããã§ä¿å®çã«ãªããç· ãåãã«éã«åãããè°è«ãç¶ããŠ1.4ãåŸ ã€ããšã¯åé¡ãããŸããã
äžæ¹ãç§ãã¡ã¯ããã«æ°ä»ããã«ãã§ã«åæã«éããŠãããããããŸããã @ andreasnoackã¯ããŒãä¿æ°ã¯åŒ·ããŒãã§ããã¹ãã ãšããããã€ãã®åŒ·åãªè°è«ãããŸããã 圌ããã¹ãŠã®åŒ±ããŒãæ¯æè ãçŽåŸãããããšãã§ããã®ãããããŸããã ããããæšå¹Žã¯ã5åŒæ°ã®ãã«ããæ¬åœã«æãã§ããŠããã®å°ããªè©³çŽ°ã«ã€ããŠã¯ããŸãæ°ã«ããŠããªã倧å€æ°ã®äººãããå¯èœæ§ããããŸãã ãããããªãã誰ãè°è«ãæ¢ããããªããšããçç±ã ãã§ãæ©èœãããã«é ãããã®ã¯æ®å¿µã ããã
ä»ã®ãšãããšã©ãŒãã¹ããŒããªãã®ã¯ãªãã§ããïŒ
β == 0.0 && any(isnan,C) && throw(ArgumentError("use β = false"))
ä»ã®ãšãããšã©ãŒãã¹ããŒããªãã®ã¯ãªãã§ãã
ãã®ãªãã·ã§ã³ãæ祚ã«è¿œå ããŸããã çŽ æŽããã劥åæ¡ïŒ
æåŸ ãèšå®ããã ãã§ãã1.3ã®æ©èœããªãŒãºã¯3æ¥ä»¥å ã§ãããããåºæ¬çã«ãããéã«åãããã«ããæ¹æ³ã¯ãããŸããã ã¿ã€ãã³ã°ãå®éã«å¶åŸ¡ã§ããã®ã¯ãªãªãŒã¹ãµã€ã¯ã«ã®å¯äžã®éšåã§ãããããæ©èœã®ããªãŒãºãšåå²ã«ã€ããŠã¯ããªãå³æ Œã«åãçµãã§ããŸãã
ãã ããäœæ¥ã¯https://github.com/JuliaLang/julia/pull/29634ã§ãã§ã«è¡ãããŠã
@tkf forïŒ29634ãŸã å®è¡ãããŠããªãäœæ¥ããªã¹ãã§ããŸããïŒæ祚ã«å¿ããŠååãå€æŽãããããŒããåŠçãããããããšãå«ãïŒïŒ ããªããå¿ããã®ã§ãæ®ãã®ToDoãåå²ããŠãè² æ ãäºåºŠãšããããªãããã«ããæ¹æ³ãèŠã€ããããšãã§ãããããããŸããã
ç§ãATMã«ã€ããŠèããããšãã§ããTODOã¯æ¬¡ã®ãšããã§ãã
addmul!
-> mul!
mul!
ãšåŒã°ããªããšæ³å®ããŠã³ãŒãã調æŽããŸãïŒäŸïŒ <strong i="15">@deprecate</strong> mul!(C, A, B, α, β) addmul!(C, A, B, α, β)
ïŒMulAddMul
ãªã©ã®å®è£
æŠç¥ã«ã€ããŠã³ã¢éçºè
ããOKãååŸããŸãã 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ã®ãããªããã€ãã®æ§é åè¡åã®æãå
åŽã®ã«ãŒããæé©åããããã«ãå®éã«ç¹æ®åãå¿
èŠã§ããããšãå¿ããŸããã äžéšã®ç¹æ®åã¯åé€ã§ããŸãããå®éã«ã¯ããå€ãã®äœæ¥ãå¿
èŠã«ãªããŸãïŒé
延ãçºçããŸãïŒã
ãããã£ãŠãç§ã¯å®è¡æã«å€ããã§ãã¯ããããšã«åŸåããŠããŸãããæ°ãå€ãã£ãå Žåã¯ãã€ã§ãããã調æŽã§ããã®ã§ãããã«ãã£ãŠé 延ãçºçããããšã¯ãããŸããã
ãããïŒ
@andreasnoackãããæéå ã«ã¬ãã¥ãŒããŠããŒãžããŠãããŠããããšãïŒ
1.3ã§ããŒãžãããã®ã§ãå®è£ ã«ã€ããŠéåžžã«ç·åŒµããŸããïŒ smile:ã 1.3-rcããªãªãŒã¹ããããšãã«ãããã®äººã ãç·åœ¢ä»£æ°ã³ãŒãããã培åºçã«ãã¹ãã§ããããšãæè¬ããŸãïŒ
å¿é ããå¿ èŠã¯ãããŸããã1.3RC+ PkgEvalsããã°ãåãé€ãã®ã«ååãªæéããããŸãã
æãåèã«ãªãã³ã¡ã³ã
ç§ã¯ãä»ãã10æ¥ã®æéã§1åã®æ¿èªæ祚ãææ¡ããŸãã æ¿èªæ祚ãšã¯ã誰ããè°è«ãç¶ããããã奜ãŸãããšèãããã¹ãŠã®ãªãã·ã§ã³ã«æ祚ããããšãæå³ããŸãã ç¶ç¶çãªè°è«ãããä»ã¯èªåã®æãå«ããªååãæã¡ãã人ã¯ã3ã€ãã¹ãŠã«æ祚ããå¿ èŠããããŸãã åºç¯ãªæ¿èªãåãããªãã·ã§ã³ããªãå ŽåããŸãã¯æ祚ã¹ããŒã èªäœãåºç¯ãªæ¿èªãæºãããŠããªãå Žåã¯ãè°è«ãç¶ç¶ããå¿ èŠããããŸãã æ¿èªããããªãã·ã§ã³ãã»ãŒåç¹ã®å Žåã @ tkfã決å®ããŸãïŒPRäœæè ã®ç¹æš©ïŒã
+1ïŒç§ã¯ãã®æ祚ã¹ããŒã ã«åæããæ¿èªç¥šãæããŸããã
-1ïŒç§ã¯ãã®æ祚ã¹ããŒã ã«åæããŸããã ããŸãã«ãå€ãã®ããŸãã¯ããŸãã«ãéèŠãªäººã ããã®ãªãã·ã§ã³ãéžæããå Žåãæ祚ã¯ç¡å¹ã«ãªããŸãã
å¿ïŒ
mul!
ã¯ãç¶ç¶çãªè°è«ãããæãŸããã§ãããã±ããïŒ
muladd!
ã¯ãç¶ç¶çãªè°è«ãããæãŸããã§ããHoorayïŒç¶ç¶çãªè°è«ããã
addmul!
ãæãŸããã§ããç§ã¯æ«å®çã«ã75ïŒ ã®æ¿èªãš5人ã確å®ã«å®è¶³æ°ãäœæããããšãææ¡ããŸãïŒã€ãŸããæ祚æé å šäœãžã®äžäžèŽãå«ããæ祚ãã人ã®75ïŒ ãããã³å°ãªããšã5人ãåå©ãªãã·ã§ã³ãæ¿èªããŸãããåå ãå°ãªãå Žåã次ã«5/6ãŸãã¯6/8ãå®è¶³æ°ãäœæããŸãããå šäŒäžèŽã®4/4ã¯å€±æãšèŠãªãããå¯èœæ§ããããŸãïŒã