рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рд╡рд┐рд░рд▓ рдореИрдЯрд▓реНрдо рдХреЛрдб рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рд╣реИ:
рдореИрдВ рдпрд╣ рдорд╛рди рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп A_mul_B*!(╬▒,A,B,╬▓,C) = ╬▒AB + ╬▓C
рд╡рд┐рдзрд┐рдпрд╛рдБ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдШрдиреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП C
(BLAS gemm
API) рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░реЗрдВред рдХреНрдпрд╛ рдпреЗ рдЕрдм рднреА рдПрдХ рдорд╛рдорд▓рд╛ рд╣реИ? (рдпрд╣ рджреЛрдиреЛрдВ рдПрдкреАрдЖрдИ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд A_mul_B*!(C,A,B)
рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд░рдЦреЗрдВ, рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ A_mul_B*!(C,A,B) = A_mul_B*!(1,A,B,0,C)
рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред)
рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рднреА рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП gemm
API рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдпрд╣ рдЕрдиреНрдпрддреНрд░ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ gemm
рдПрдЯ рдЕрд▓ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред рд╡рд┐рд░рд▓ рдорд╛рдорд▓рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рд╣реИред рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрд╢реЛрдзрди рд╢реБрджреНрдз рдЬреВрд▓рд┐рдпрд╛ рдЬреЗрдиреЗрд░рд┐рдХ рдореИрдЯреНрдорд▓ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ , рдЬреЛ ╬▒
рдФрд░ ╬▓
рддрд░реНрдХреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ рдЬреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд░рдгреА / рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХреНрд╕рдкрд░реНрдо рдХрд╛ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ ( _generic_matmatmult!
рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж) рдЬреЛ рдХрд┐ рдмрд┐рдЧрдлреНрд▓реЛ рдФрд░ рд╡рд┐рд░рд▓ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╕рдВрджрд░реНрднред # 9930, # 20053, # 23552ред рд╢реНрд░реЗрд╖реНрда!
рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдПрдкреАрдЖрдИ рд░рд┐рд╡рд╛рдореНрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ gemm
-рд╕реНрдЯрд╛рдЗрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА # 9930 рдХреЗ рд╕рдорд╛рди рд╣реИред
рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ, рдХреНрдпрд╛ _generic_matmatmul!
gemm
API рд╣реЛрдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рд╣реЛрдЧрд╛? рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ, рдФрд░ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ additive / nonbreaking рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдкрджреНрдзрддрд┐ рдХреЛ рдХреЗрд╡рд▓ ╬▒=1
рдФрд░ ╬▓=0
рд╣реЛрдиреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рдкреАрдЖрд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВ рд╢рд╛рдпрдж рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдорд╛рди рд╣реА рдЬрд╛рдКрдВрдЧрд╛ (рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдореИрдВрдиреЗ рд╕рднреА рдкрд╛рд░рдЧрдорди рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА, рдореИрдВ рдпрд╣рд╛рдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛)ред
рд╣рд╛рдБред рд╡рд╣ рдПрдХ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рд╣реЛрдЧреАред рд╣рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЗ рдЖрджреЗрд╢ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдмреАрдПрд▓рдПрдПрд╕ рдЖрджреЗрд╢ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдерд╛ рд▓реЗрдХрд┐рди рд╣рдо рдкрд╣рд▓реЗ рдЖрдЙрдЯрдкреБрдЯ рддрд░реНрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рдлреА рд╕реБрд╕рдВрдЧрдд рдереЗ рдЬреЛ рд╡рд░реНрддрдорд╛рди рддреАрди-рддрд░реНрдХ A_mul_B!
ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рдмрддрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рддреАрди-рддрд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг ╬▒=1
рдФрд░ ╬▓=0
рд╕рд╛рде рдкрд╛рдБрдЪ-рддрд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рддрд░реНрдХ рдЕрдВрддрд┐рдо рд╣реИрдВред рдмреЗрд╢рдХ, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╣рд╛рдБ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╛рдорд╛рдиреНрдп gemm
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдЪрдп рдХреНрдпреЛрдВ рдирд╣реАрдВ?
рд╣рд╛рдБред рд╡рд╣ рдПрдХ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рд╣реЛрдЧреАред рд╣рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЗ рдЖрджреЗрд╢ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ BLAS рдЖрджреЗрд╢ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рддрд░реНрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рдлреА рд╕реБрд╕рдВрдЧрдд рд╣реИрдВ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рддреАрди-рддрд░реНрдХ A_mul_B рдХреЗ рд▓рд┐рдП рднреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рдмрддрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рддреАрди-рддрд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг ╬▒ = 1 рдФрд░ default = 0 рдХреЗ рд╕рд╛рде рдкрд╛рдВрдЪ-рддрд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рддрд░реНрдХ рдЕрдВрддрд┐рдо рд╣реИрдВред рдмреЗрд╢рдХ, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╣рд╛рдБ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдмрдврд╝рд┐рдпрд╛ рд╣реИред рд╣рдо # 9930 рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реНрдХ рдХреНрд░рдо рдФрд░ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рдкрд╛рдБрдЪ-рддрд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд░реНрддрдорд╛рди Ax_mul_Bx!(╬▒,A,B,╬▓,C)
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд░рдЦреВрдБрдЧрд╛ред
рдХреНрдпреЛрдВ рди рдХреЗрд╡рд▓ рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ рдЬреЗрдордо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдЪрдп рджрд┐рдпрд╛ рдЬрд╛рдП?
рдХреНрдпрд╛ рдЖрдк рдЙрдкрд░реЛрдХреНрдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ _generic_matmatmul!
рд╕реЗ gemm!
рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ?
рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдПрдХрд▓ рд╡рд┐рдзрд┐ mul(C,A,B,╬▒=1,╬▓=0)
рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд╕рд╛рде рд╣реА рд╕рд╛рде рдкреНрд░реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд▓рд╕реА рд╕реНрдерд╛рдирд╛рдВрддрд░рдг / рдЖрд╕рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде, рд▓реЗрдХрд┐рди рд╡рд╣ рдПрдХ рдЕрдиреНрдп рдкреАрдЖрд░ рд╣реЛрдЧрд╛ред
рдХреНрдпреЛрдВ рди рдХреЗрд╡рд▓ рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ рдЬреЗрдордо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдЪрдп рджрд┐рдпрд╛ рдЬрд╛рдП?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ gemm
рдПрдХ рдорд┐рдереНрдпрд╛ рдирд╛рдо рд╣реИред BLAS рдореЗрдВ, ge
рд╣рд┐рд╕реНрд╕рд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ , рдЕрд░реНрдерд╛рдд рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд░рдЪрдирд╛ рдирд╣реАрдВ рд╣реИ, рдкрд╣рд▓реЗ m
рдЧреБрдгрд╛ рд╣реИ рдФрд░ рд╕реВрдЪреА m
рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ ред рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ, ge
(рд╕рд╛рдорд╛рдиреНрдп) рднрд╛рдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдВрддрд┐рдо m
(рдореИрдЯреНрд░рд┐рдХреНрд╕) рд╣реИ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ mul!
рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред
SparseArrays.jl рд╕реЗ рдиреЛрдЯреЗрд╢рди mul!(╬▒, A, B, ╬▓, C)
рд╣реИ
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ "рдЕрдВрддрд┐рдо рд░реВрдк"? рдФрд░ рдпрд╣ mul!(C, A, B)
, lmul!(A, B)
, рдФрд░ rmul!(A,B)
?
рдореИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрд░реНрдбрд░ рдореЗрдВ A
, B
, рдФрд░ C
рд╣реЛрдиреЗ рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВред
рдХреНрдпрд╛ рдиреЛрдЯреЗрд╢рди
mul!(╬▒, A, B, ╬▓, C)
SparseArrays.jl рд╕реЗ "рдЕрдВрддрд┐рдо" рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ?
рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдБ рдирд╣реАрдВред рдореВрд▓ рд░реВрдк рд╕реЗ, рдореБрдЭреЗ BLAS рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рдЖрдпрд╛ (рдФрд░ рдпрд╣ рдЖрджреЗрд╢ рднреА рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдЕрдм рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рддрд░реНрдХреЛрдВ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЪреМрдереЗ рдФрд░ рдкрд╛рдВрдЪрд╡реЗрдВ рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рддреЛ рдмрд╕ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрд░реНрде рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реНрдХ рдЪрд╛рд╣реЗрдВрдЧреЗ
function mul!(C, A, B, ╬▒=1, ╬▓=0)
...
end
рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╡реИрдХрд▓реНрдкрд┐рдХ рдЦреЛрдЬрд╢рдмреНрдж рддрд░реНрдХ рд╣реЛрдВрдЧреЗ
function mul!(C, A, B; ╬▒=1, ╬▓=0)
...
end
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдпреВрдирд┐рдХреЛрдб рд╕реЗ рдмрд╣реБрдд рдЦреБрд╢ рд╣реИрдВред
рдореИрдВ рдпреВрдирд┐рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЦреБрд╢ рд╣реВрдВ рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рд╣рдо рд╣рдореЗрд╢рд╛ рдПрдХ рдЖрд╕реНрдХреА рд╡рд┐рдХрд▓реНрдк рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдпрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдирд╛рдо ╬▒
рдФрд░ ╬▓
рднреА рд╕реБрдкрд░ рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк BLAS рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕реНрдерд┐рддреАрдп рддрд░реНрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рдирд╛рдордХрд░рдг рдХрдИ BLAS рд░реВрдЯреАрдиреЛрдВ рдХреЗ рд▓рд┐рдП muladd!(A, B, C, ╬▒=1, ╬▓=1)
рдореИрдк рд╣реЛрдЧрд╛ рдЬреЛ рдЧреБрдгрд╛ рдФрд░ рдЬреЛрдбрд╝ рдХрд░рддреЗ рд╣реИрдВ ред ( gemm
рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА axpy
рдЬрдм A
рдПрдХ рдЕрджрд┐рд╢ рд░рд╛рд╢рд┐ рд╣реИред)
mul!
рдлрд╝рдВрдХреНрд╢рди рддрдм рддрдХ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ 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!
рдХрд╣рдиреЗ рдХреЗ рдкреАрдЫреЗ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБ рддрд░реНрдХ рдХреЗ рдмрдЬрд╛рдп рдЬреЛрдбрд╝ рддрд░реНрдХ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдХреЛрдИ рдХрднреА рдмрд╣реБ рддрд░реНрдХ рд╡рд┐рддрд░реНрдХ рдХрд░реЗрдЧрд╛?
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЧреИрд░-рдкреНрд░рдердо рддрддреНрд╡реЛрдВ рдХреЛ рдореНрдпреВрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ lmul!
рдФрд░ ldiv!
, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ "muladd" рдХреНрд░рдо рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЕрд░реНрдерд╛рдд muladd!(A,B,C)
)ред рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ ╬▒
рдФрд░ ╬▓
рдЬрд╛рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдЖрджреЗрд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреАрд╡рд░реНрдб рддрд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛?
рдХреНрдпрд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рд╕реНрдХреЗрд▓рд░реНрд╕ ╬▒ рдФрд░ ╬▓ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдкреНрд░реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЫреЛрдбрд╝ рджреЗрдВ? рдЕрдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╢рдХреНрдХрд░ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИред
рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА ╬▒
, ╬▓
рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде mul!(C, A, B, ╬▒, ╬▓)
рдкрд░ рдмрд╕ рдЧрдПред рд╣рдо рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ https://github.com/JuliaLang/julia/blob/b8ca1a499ff4044b9cb1ba3881d8c6fb1f3c0bb/stdlib/SparseArrays/src/linalg.jl#L32#5032/L32b рдкрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдкреИрдХреЗрдЬ рднреА рдЗрд╕ рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рдХреМрди рд╕рд╛ рд╣реИред
рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
╬▒
,╬▓
рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рдеmul!(C, A, B, ╬▒, ╬▓)
рдкрд░ рдмрд╕ рдЧрдПред
SparseArrays рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣реАрдВ рднреА рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред
рдХреБрдЫ рдорд╛рдпрдиреЛрдВ рдореЗрдВ muladd!
рдирд╛рдо рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЧреБрдгрд╛ рд╣реИ рдЗрд╕рдХреЗ рдмрд╛рдж рдЬреЛрдбрд╝ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, ╬▒ рдФрд░ ╬▓ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди, muladd!(C, A, B, ╬▒=1, ╬▓=0)
(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ ╬▓ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╢реВрдиреНрдп рд╣реИ, рдПрдХ рдирд╣реАрдВ), рдЗрд╕реЗ mul!(C, A, B)
ред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ mul!
рдпрд╛ muladd!
рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдмрдирд╛рдо рд╕рдВрдЧрддрддрд╛ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ SparseArrays рдореЗрдВ рдореМрдЬреВрджрд╛ рдкрджреНрдзрддрд┐ рдХрд╛ рдорд╛рдорд▓рд╛ mul!
рд▓рд┐рдП рдмрд╣рд╕ рдХрд░реЗрдЧрд╛ред рдореИрдВ рдЦреБрдж рдХреЛ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдСрд╕реНрдХрд░ рд╡рд╛рдЗрд▓реНрдб рдЙрджреНрдзрд░рдг рдХреЗ рдмрд╛рд╡рдЬреВрдж рд╕рдВрдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдмрд╣рд╕ рдХрд░рдиреЗ рдХреЗ рдЙрддреНрд╕реБрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд╛рддрд╛ рд╣реВрдВ, "рд╕рдВрдЧрддрд┐ рдЕрдХрд▓реНрдкрдиреАрдп рдХрд╛ рдЕрдВрддрд┐рдо рдЖрд╢реНрд░рдп рд╣реИред"
рдХреБрдЫ рдорд╛рдпрдиреЛрдВ рдореЗрдВ
muladd!
рдирд╛рдо рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЧреБрдгрд╛ рд╣реИ рдЗрд╕рдХреЗ рдмрд╛рдж рдЬреЛрдбрд╝ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, ╬▒ рдФрд░ ╬▓ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди,muladd!(C, A, B, ╬▒=1, ╬▓=0)
(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ ╬▓ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╢реВрдиреНрдп рд╣реИ, рдПрдХ рдирд╣реАрдВ), рдЗрд╕реЗmul!(C, A, B)
ред
рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЕрдкрд╡рд╛рдж рд╣реИ рдЬрдм C
рдореЗрдВ Inf рдпрд╛ NaN рд╣реЛрддреЗ рд╣реИрдВ: рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ ╬▓==0
, рдкрд░рд┐рдгрд╛рдо рдЕрднреА рднреА NaN рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ BLAS рдФрд░ рд╣рдорд╛рд░реЗ рд╡рд┐рд░рд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ ╬▓==0
рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╢реВрдиреНрдп рд╕реЗ рдмрджрд▓реЗрдВред
рдЖрдк рдЗрд╕ рдмрд╛рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ ╬▒=true, ╬▓=false
true
рдФрд░ false
рдХреНрд░рдорд╢рдГ "рдордЬрдмреВрдд" 1 рдФрд░ 0 рд╣реИрдВ, рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдХрд┐ true*x
рд╣рдореЗрд╢рд╛ x
рдФрд░ false*x
рд╣рдореЗрд╢рд╛ zero(x)
ред
lmul!
рднреА рд╡рд╣ рдЕрд╕рд╛рдзрд╛рд░рдг рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: https://github.com/JuliaLang/julia/issues/28972
true
рдФрд░false
рдХреНрд░рдорд╢рдГ "рдордЬрдмреВрдд" 1 рдФрд░ 0 рд╣реИрдВ, рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдХрд┐true*x
рд╣рдореЗрд╢рд╛x
рдФрд░false*x
рд╣рдореЗрд╢рд╛zero(x)
ред
рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ !:
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
рдХреЙрд▓ рдмрдЪрд╛рддреЗ рд╣реИрдВред
FYI рдХрд░реЗрдВ, рдореИрдВрдиреЗ # 29634 рдореЗрдВ matmul.jl
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдореИрдВ рдирд╛рдо рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рддрдп рд╣реЛрдиреЗ рддрдХ рдЗрд╕реЗ рдЦрддреНрдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ :)
muladd!
рдХрд╛ рдПрдХ рдлрд╛рдпрджрд╛ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдЯрд░реНрдирд░реА muladd!(A, B, C)
(рдпрд╛ muladd!(C, A, B)
?) рдбрд┐рдлрд╝реЙрд▓реНрдЯ ╬▒ = ╬▓ = true
(рдореВрд▓ рд╕реБрдЭрд╛рд╡ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) //github.com/JuliaLang/julia/issues/23919#issuecomment-402953987)ред рд╡рд┐рдзрд┐ muladd!(A, B, C)
muladd
Number
s рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдирд╛рдо рд╣реИ рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА muladd
рдЬрд╛рдирддреЗ рд╣реИрдВред
@andreasnoack рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА рдкреВрд░реНрд╡ рдЪрд░реНрдЪрд╛ рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдФрд░ рдХреАрд╡рд░реНрдб рдХреЗ рддрд░реНрдХ рдкрд░ muladd!
рдирд╛рдо рдХреЗ рд▓рд┐рдП рдЖрдкрддреНрддрд┐ рд╣реИ? (5-рдПрд░реА mul!
SparseArrays
рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд┐рдЫрдбрд╝реЗ-рд╕рдВрдЧрдд рдЖрд╡рд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдХрдард┐рди рдирд╣реАрдВ рд╣реИред)
рджреЛрдиреЛрдВ mul!
рдФрд░ muladd!
рддрдм рдмреЗрдорд╛рдиреА рд▓рдЧрддреЗ рд╣реИрдВ рдЬрдм рдкреВрд░реНрд╡ рд╕рд┐рд░реНрдл ╬▒
рдФрд░ ╬▓
рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, add
рднрд╛рдЧ рдХреЛ BLAS рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╣рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдЧрд░ рд╣рдо muladd!
рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЬреЗрдиреЗрд░рд┐рдХ рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдиреНрдпрдерд╛ рдореИрдВ рдЕрддрд┐рд░реЗрдХ рд╕реЗ рдмрдЪрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреА рдордЬрдмреВрдд рд╢реВрдиреНрдп рд╕рдВрдкрддреНрддрд┐ рд░рдЦрдиреЗ рдХреЗ false
рдХреА рдЪрд░реНрдЪрд╛ рд╕реЗ рдЕрд▓рдЧ mul!
ред IMO IM рдХрд╛ рдХреЛрдИ рднреА рд╢реВрдиреНрдп рдорд╛рди рдордЬрдмреВрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ BLAS рдореЗрдВ рд╣реИ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдкрд╛рдВрдЪ рддрд░реНрдХ mul!
рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╣реИред рдпрд╛рдиреА рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ mul!
рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рди рдХрд┐ ╬▓
ред рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред рдЬреИрд╕реЗ mul!(Matrix{Float64}, Matrix{Float64}, Matrix{Float64}, 1.0, 0.0)
~ ~ BLAS рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗред
рд╣рдо рдпрд╣ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ BLAS рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди _requiring_ рдордЬрдмреВрдд рд╢реВрдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╢реВрдиреНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдЦрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЕрдЧрд░ рд╣рдо
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 рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд▓рдкреЗрдЯ рд╕рдХрддрд╛ рд╣реВрдВред рдПрдХ рд╕реНрдерд┐рд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рдПрдкреАрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдВрдЪ-рддрд░реНрдХ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рдХреНрд╖реНрдп рд╣реИред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ:
рджреЛрдиреЛрдВ
mul!
рдФрд░muladd!
рдмреЗрдорд╛рдиреА рд▓рдЧрддреЗ рд╣реИрдВ, рдЬрдм рдкреВрд░реНрд╡ рдХреЗрд╡рд▓╬▒
рдФрд░╬▓
рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рд╣реИред
рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ *
mul!
рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рд╕рд░рдгреА рдХреЗ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди" рдХреЗ рд╕рд╛рде рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Base
рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдРрд╕реЗ "рд╢реЙрд░реНрдЯрдХрдЯ" рдЙрджрд╛рд╣рд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рджреЛрдиреЛрдВ mul!
рдФрд░ muladd!
рднрд▓реЗ рд╣реА mul!
muladd!
рдХрд╛ рдПрдХ рд╢реЙрд░реНрдЯрдХрдЯ рд╣реЛред
рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдордЬрдмреВрдд рд╢реВрдиреНрдп рдХреА рд╕рдВрдкрддреНрддрд┐ рд░рдЦрдиреЗ рдХреЗ
false
рдХреА рдЪрд░реНрдЪрд╛ рд╕реЗ рдЕрд▓рдЧmul!
рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рдмрд╣реБ-рдкреНрд░рдердо рдХреЗ рдкрд╛рдБрдЪ-рддрд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдирд╛рдо рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдЪрдирд╛рддреНрдордХ рд╣реЛрдЧрд╛ (рдкрд╣рд▓реЗ mul!
рдмрдирд╛рдо muladd!
)ред
рдореИрдВрдиреЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрдм рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреВрдЫрд╛, рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдФрд░ рдирдВрдмрд░реЛрдВ рдкрд░ рдЙрджрд╛рд░рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП muladd
рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рд╡рд┐рд╕реНрдордпрдмреЛрдзрдХ рдЪрд┐рд╣реНрди рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдЦреНрдпрд╛ рд╕рдВрд╕реНрдХрд░рдг muladd
рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЬреЛ рдкреВрдЫрд╛ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ред
рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
mul!(y, A, x, 1, 1)
mul!(y, B, x, 1, 1)
рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЕрднреА рднреА muladd!
рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдЗрддрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдХрд┐ 1, 1
рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИ?
рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $
*
mul!
+3 +3 рдХреЗ рд╕рд╛рде рдЕрдкреНрд╡рд╛рдЗрдВрдЯ рдХрд┐рдП рдЧрдП рдЖрдЙрдЯрдкреБрдЯ рдПрд░реЗ рдХреЗ "рдбрд┐рдлреЙрд▓реНрдЯ рд╡реИрд▓реНрдпреВ" рдХреЗ рд╕рд╛рде рднреА рд▓рд╛рдЧреВ рдХрд░ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐Base
рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдРрд╕реЗ "рд╢реЙрд░реНрдЯрдХрдЯ" рдЙрджрд╛рд╣рд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ?
рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рд╡рд┐рд╕реНрддреГрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЖрдк рдпрд╣рд╛рдБ рдХрд┐рд╕ рд╢реЙрд░реНрдЯрдХрдЯ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЕрднреА рднреА
muladd!
ред рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдЗрддрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдХрд┐1, 1
рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ muladd!
рднреА рдЕрдзрд┐рдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд░рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╢рд╛рдпрдж рдпрд╣ addmul!
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред
рдореБрдЭреЗ muladd!
рдирд╛рдо рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдореИрдВ рддреЛ рдмрд╕ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рдЗрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рджреВрд╕рд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдмрд╣рд┐рд╖реНрдХрд╛рд░ рдХрд░рддреЗ mul!
рдХреЗ рдкрдХреНрд╖ рдореЗрдВ muladd!
/ addmul!
рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдЗрддрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдХрд┐ 1, 1 рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ?
рдирд╣реАрдВ, рдЬрдм рддрдХ рдпрд╣ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рд╣реИ, рддрдм рддрдХ рдореИрдВ рдкрд╛рдВрдЪ рддрд░реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реВрдВред рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдХреЗрд╡рд▓ рддреАрди рддрд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЖрдкрдХрд╛ рдЕрдиреБрд░реЛрдз рдерд╛)ред
рдЖрдк рдпрд╣рд╛рдБ рдХрд┐рд╕ рд╢реЙрд░реНрдЯрдХрдЯ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд *
рдХреЛ mul!
рдХрд╛ рд╢реЙрд░реНрдЯрдХрдЯ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде " mul!
" mul!
рдХреЛ 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!
рдЗрд╕ рдкреИрдЯрд░реНрди рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЖрдо рддреМрд░ рдкрд░ mul!
рддрд░реАрдХреЛрдВ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореВрд▓реНрдп рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реИрдВред
рд╕рд╛рдЗрдорди рдКрдкрд░ рджрд┐рдП рдЧрдП рдкреЛрд╕реНрдЯ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд╛рдн рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рджреЗрддрд╛ рд╣реИред рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд▓рд╛рдн рдмрдбрд╝реЗ рд╣реИрдВ рдпрд╛ рддреЛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ mul!
)ред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╣рдо рдЕрд╕рд╣рдордд рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
рдЬрдм рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдирд╛рдо рдмрджрд▓рдиреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд╣реАрдВ рд╣реИ? рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ LazyArrays.jl (рдФрд░ рдЕрдиреНрдп рдкреИрдХреЗрдЬ?) рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЖрдБрдЦ рдмрдВрдж рдХрд░рдХреЗ рд╕реЗрдореЗрд╕реНрдЯрд░ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдпрд╣ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рддрд░рд╣ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд╣реАрдВ рд╣реИред
mul!
LinearAlgebra
рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЗрд╕реЗ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ рдЬрдм рд╣рдордиреЗ A_mul_B!
mul!
рдпрд╛ рдХрдо рд╕реЗ рдХрдо 0.7 рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╕рдордп рд╣реЛрддрд╛ред
рдХреИрд╕реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ mul!
рдХреЗ рд▓рд┐рдП рдЕрдм рдХреЗ рд▓рд┐рдП рдФрд░ рдирд╛рдо рдХреЛ рдмрджрд▓ LinearAlgebra v2.0
рдЬрдм рд╣рдо stdlibs рдЕрд▓рдЧ рд╕реЗ рдЕрджреНрдпрддрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
LazyArrays.jl mul!
рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЗрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рд▓рдЪреАрд▓рд╛ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдЬрдм рдЖрдк StridedArray
s рдХреЗ рд╕рд╛рде рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрд▓реЛрдиреЗрд╕ рдмрдЧ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ)ред рдпрд╣ рдлреЙрд░реНрдо рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд┐рд░реНрдорд╛рдг рджреЗрддрд╛ рд╣реИ
y .= Mul(A, x)
рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╣реИред 5 рддрд░реНрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ
y .= a .* Mul(A, x) .+ b .* y
рдореИрдВ mul!
рдирд┐рдХрд╛рд▓рдиреЗ рдФрд░ LinearArgeays.jl рдореЗрдВ LinearAlgebra.jl рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдард┐рди рдорд╛рдорд▓рд╛ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
LowRankApprox.jl mul!
рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдмрджрд▓рдХрд░ LazyArrays.jl рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕рдВрдХрд▓рдХ рдмрдЧ рд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реВрдВред
рдареАрдХред рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдХреЗрд╡рд▓ рджреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рддреАрди рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИрдВ ?:
mul!
muladd!
mul!
рдФрд░ рдкрд╛рдБрдЪ-рддрд░реНрдХ muladd!
( muladd!
addmul!
рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╣рдо 1 рдФрд░ 3 рдХреА рддреБрд▓рдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореЗрд░реА рд╕рдордЭ рдЕрдм рдпрд╣ рд╣реИ рдХрд┐ @andreasnoack 1 рдФрд░ 2 рдХреА рддреБрд▓рдирд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ 2 рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рддреАрди-рддрд░реНрдХ mul!
рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рд╣реИ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред "рдПрдкреАрдЖрдИ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд╣реАрдВ рд╣реИ" рд╕реЗ рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдкрд╛рдВрдЪ-рддрд░реНрдХ 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-arg mul!
рдФрд░ addmul!
рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ 5-arg 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!
рдЕрд▓рдЧ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рд╣реЛрдЧрд╛ред
FYI рдХрд░реЗрдВ рдореИрдВрдиреЗ LearArrays рдореЗрдВ 5-рджрд▓реАрд▓ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП LinearAlgebra рдХреЗ _generic_matmatmul!
рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рд╣реИ: https://github.com/JuliaArrays/LazyArrays.jl-blob/8a50250fc6cf340275808822777cf2c2=2
рдпрд╣рд╛рдБ рдпрд╣ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
materialize!(MulAdd(╬▒, A, b, ╬▓, c))
рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб ( tiled_blasmul!
) LinearAlgebra рдореЗрдВ рд╡рд╛рдкрд╕ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред
рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЬрд┐рди рдЪреАрдЬреЛрдВ рдкрд░ рдореИрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡реЗ рдПрдХ рдПрдХреАрдХреГрдд рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рдПрдкреАрдЖрдИ рд╕реЗ рдЗрди-рдкреНрд▓реЗрд╕ рдореЙрд▓ + рдРрдб рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗ
Strered.jl рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдЕрдм 5 рддрд░реНрдХ mul!(C,A,B,╬▒,╬▓)
рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬрдм рд╕рдВрднрд╡ рд╣реЛ рддреЛ BLAS рдХреЛ
@ рдЬреВрдереЛ рдмрдврд╝рд┐рдпрд╛ рдкреИрдХреЗрдЬ! рдЖрдЧреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХреЛрдИ рд░реЛрдбрдореИрдк рд╣реИ? рдХреНрдпрд╛ рдпреЛрдЬрдирд╛ рдХреЛ рдЕрдВрддрддрдГ LinAAlgebra рдХреЗ рд╕рд╛рде рд╡рд┐рд▓рдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдпрд╣ рдореЗрд░рд╛ рдЙрджреНрджреЗрд╢реНрдп рдХрднреА рдирд╣реАрдВ рдерд╛ рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдЗрд╕рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░рддрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп mapreduce
рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ @generated
рдлрд╝рдВрдХреНрд╢рдВрд╕ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрднреА рдПрдХ рд╣реИ) рдХрд╛ рдореЗрд░рд╛ рдЙрджрд╛рд░ рдЙрдкрдпреЛрдЧ рдЖрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдореЗрд░рд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реЛрдбрдореИрдк: рдпрд╣ рдЙрдЪреНрдЪ-рд╕реНрддрд░ рдХреЗ рдкреИрдХреЗрдЬ, рдЕрд░реНрдерд╛рдд рдЯреЗрдирд╕реЛрд░рдкрд░реЗрд╢рдВрд╕ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг, рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдореИрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмреБрдирд┐рдпрд╛рджреА рд░реЗрдЦреАрдп рдмреАрдЬрдЧрдгрд┐рдд рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рд╕рдорд░реНрдерди рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ (рдЬреИрд╕реЗ norm
рдХреЛ StridedView
рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ norm
рдЬреВрд▓рд┐рдпрд╛ рдмреЗрд╕ рдореЗрдВ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ)ред рдФрд░ рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдордп рд╣реИ рдФрд░ рдЬреАрдкреАрдпреВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реАрдЦреЛ, рддреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп mapreducekernel
GPUArray
s рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рддрдХ рдХреА рдЖрдо рд╕рд╣рдорддрд┐ рд╣реИ:
mul!(C, A, B)
рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПC = ╬▒AB + ╬▓C
рдореИрдВ рдкрд╣рд▓реЗ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ 5-рддрд░реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд API рдкрд░ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬреИрд╕реЗ 3- рдФрд░ 4-рддрд░реНрдХ addmul!
)ред рд▓реЗрдХрд┐рди рдпрд╣ "рдлреАрдЪрд░" рд╣реИ рдЬреЛ рд╣рдореЗрдВ _not_ рд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИ mul!
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рддрд╛рдХрд┐ рдорд┐рд╢реНрд░рдг рди рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛред
@andreasnoack рдХреНрдпрд╛ рдЖрдкрдХреА рдЪрд┐рдВрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ / рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди @simonbyrne рдХреА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдКрдкрд░ рд╣реИ https://github.com/JuliaLang/julia/issues/23919#issuecomment -431046516? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрджрд╛рд╡рдирддрд┐ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
FYI рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдЕрднреА # 29634 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ LinearAlgebra
рдкрд░рд┐рдЪрд┐рдд рд╣реИ рддреЛ рдореИрдВ рдЗрд╕рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ mul!
рд╕рдм рдХреБрдЫ рдирд╛рдо рджреЗрдирд╛ рд╕рд░рд▓ рдФрд░ рдмреЗрд╣рддрд░ рд╣реИред рдпрд╣ рдбрд┐рдкреНрд░реИрд╢рди рд╕реЗ рднреА рдмрдЪрддрд╛ рд╣реИред рдЕрдЧрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ muladd
рдмреЗрд╣рддрд░ рд╣реИред
mul!
API рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╕рдордп рд╢рд╛рдпрдж рдХреБрдЫ рдФрд░ рдмрд╛рддреЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВ:
рдЬрдм scale!
рдЪрд▓реЗ рдЧрдП рдФрд░ 0.6 -> 0.7 рд╕рдВрдХреНрд░рдордг рдореЗрдВ рдЕрд╡рд╢реЛрд╖рд┐рдд рд╣реЛ рдЧрдП, рддреЛ рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рджреБрдЦ рд╣реБрдЖ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдХреЗрд▓рд░ рдЧреБрдгрд╛ (рд╡реЗрдХреНрдЯрд░ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреА рдПрдХ рд╕рдВрдкрддреНрддрд┐) рдмрд╣реБрдд рдЕрд▓рдЧ рдереА, рдлрд┐рд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛ (рдмреАрдЬрдЧрдгрд┐рдд рдХреА рд╕рдВрдкрддреНрддрд┐) )ред рдлрд┐рд░ рднреА, рдореИрдВрдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ mul!
рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЧрд▓реЗ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ rmul!(vector,scalar)
рдФрд░ lmul!(scalar,vector)
рдХреА рдХреНрд╖рдорддрд╛ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╕реНрдХреЗрд▓рд░ рдЧреБрдгрди рд╕рд░рд╛рд╣рдиреАрдп рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рд╣рд░ рд░реЛрдЬ рд╕рдВрдпреБрдХреНрдд рд░рд╛рд╖реНрдЯреНрд░ рдХреЗ рдЬреВрд▓рд┐рдпрди рдирд╛рдо рд╕реЗ рджреЛ рдФрд░ рдкрд░реЗрд╢рд╛рди рд╣реВрдВ рдЬреИрд╕реЗ рдХрд┐ рд╡реЗрдХреНрдЯрд░ рдЕрдВрддрд░рд┐рдХреНрд╖ рд╕рдВрдЪрд╛рд▓рди: axpy!
рдФрд░ рдЗрд╕рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг axpby!
ред рдХреНрдпрд╛ рдЗрдиреНрд╣реЗрдВ рднреА 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 рдХрд╛ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдЧреНрд░рд╛рдл рджреЗрдЦреЗрдВред рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдпрд╛ рд╕рдорд╛рд░реЛрд╣ рд╢реБрд░реВ рдХрд░рдирд╛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди 5-рддрд░реНрдХ mul!
рдШрдЯрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
@ рдЬреВрдереЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ acp(b)y!
рд╕реЗ add!
рдХрд╛ рдирд╛рдо рд▓реЗрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛрдЧрд╛ред
# 23919 (рдЯрд┐рдкреНрдкрдгреА) рдХреЗ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЛ рджреЗрдЦреЗрдВред рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдпрд╛ рд╕рдорд╛рд░реЛрд╣ рд╢реБрд░реВ рдХрд░рдирд╛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред
рд╣рд╛рдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрдврд╝рд╛ рд╣реИ рдФрд░ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдкрд╛рдВрдЪ-рддрд░реНрдХ mul!
рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рдерд╛ред рддреЛ, _technically_ рдХреЛ рдкрджрд╛рд╡рдирддрд┐ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред Https://github.com/JuliaLang/julia/issues/23919#issuecomment -430975159 рдХрд╛ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдЧреНрд░рд╛рдл рджреЗрдЦреЗрдВ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рд╡реИрд╕реЗ рднреА рдПрдХ рдбрд┐рдкреНрд░реЗрд╕реЗрд╢рди рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА # 29634 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред)
рдпрд╣рд╛рдБ, рдореИрдВ рдпрд╣ рдорд╛рди рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдХрд╛рд░рдг рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреА рдШреЛрд╖рдгрд╛ (рдЬреИрд╕реЗ, mul!(C, A, B)
) рдЕрдиреНрдп рд╣рд╕реНрддрд╛рдХреНрд╖рд░ (рдЬреИрд╕реЗ, mul!(C, A, B, ╬▒, ╬▓)
) рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдпрд╣ _not_ рдорд╛рдорд▓рд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рдФрд░ рдЗрд╕рдХреА рд╕реНрдЯрдбреАрд▓рд┐рдм рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЗрдВрдЯрд░реНрдирд▓ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд░рд╣реА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ Pkg.add
рдХрд╛ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ
рдЬрдмрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ
рдпрджрд┐ Pkg.add
рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрдиреНрдп рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ API рд╣реИрдВ, рддреЛ Pkg.jl рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рдХрд╛рд░рдг рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреВрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: Pkg.add(...; mode = :develop)
рд░рди Pkg.develop(...)
; Context!
рд▓рд┐рдП рд╕рднреА рдХреАрд╡рд░реНрдб рддрд░реНрдХ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ (рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд░рд╛рджрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)ред
рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░реА рдЫрд╛рдк рд╣реИред рдХреНрдпрд╛ рдЖрдк mul!(C, A, B, ╬▒, ╬▓)
рдХреЛ mul!(C, A, B)
рд░реВрдк рдореЗрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдорд╛рдирддреЗ рд╣реИрдВ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдЬреЛ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ (рдЕрднреА рднреА) рдпрд╣ рдирд╣реАрдВ рд╕реЛрдЪрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдФрд░ рдХрд╛рд░реНрдп рд╣реИред рдЗрд╕рд▓рд┐рдП рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рд╕рдВрджрд░реНрднред рдпрд╣ рдкрд╛рдБрдЪ-рддрд░реНрдХ mul!
рдХреЗ рдЕрдкрд╡реНрдпрдп рдХреА рдЪрд░реНрдЪрд╛ рд╕реЗ рдЕрд▓рдЧ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдо рдПрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкрд╛рдВрдЪ рддрд░реНрдХ mul!
рдХреЛ рд╣рдЯрд╛рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдмреЗрд╢рдХ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рддреАрди-рддрд░реНрдХ mul!
рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕реЗ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
рдпрд╣ рдкрд╛рдБрдЪ-рддрд░реНрдХ
mul!
рдХреЗ рдЕрдкрд╡реНрдпрдп рдХреА рдЪрд░реНрдЪрд╛ рд╕реЗ рдЕрд▓рдЧ рд╣реИред
рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдВрддрд┐рдо рдкреИрд░рд╛ рдореЗрд░реА рд╡реНрдпрд╛рдЦреНрдпрд╛ https://github.com/JuliaLang/julia/issues/23919#issuecomment -+рекрей,режреп,релреи,резренреп рд╣реИ рдХрд┐ рдЖрдк рд╕реНрд╡реАрдХрд╛рд░ рд▓рд╛рдн рд╕реВрдЪреАрдмрджреНрдз @simonbyrne рдерд╛ https://github.com/JuliaLang/julia/issues / 23919 # рдПрдХ рдирдпрд╛ рдкрд╛рдВрдЪ-рддрд░реНрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП -430809383 # _public API_ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ "рдирд╛рдордХрд░рдг" рдФрд░ "рдкрджрдпрд╛рддреНрд░рд╛" рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ) рд░рдЦрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡реЗ рдХрдо рдореВрд▓реНрдпрд╡рд╛рди рдереЗред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рдкрд╛рдВрдЪ-рддрд░реНрдХ mul!
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реБрдЖ рд╣реИ рдпрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ "рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп" рдХрд░рдиреЗ рдХреЗ рдФрдЪрд┐рддреНрдп рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк рдпрд╣ рддрд░реНрдХ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЧрдгрдирд╛ _C = AB_ рдФрд░ _C = ╬▒AB + _C_ рд╕рдорд╛рди рд╣реИрдВ рддрд╛рдХрд┐ рдПрдХ рд╣реА рдирд╛рдо рджреЛрдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХреЗ? рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рддреАрди-рддрд░реНрдХ mul!
рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпреЛрдВ mul!(y, AтВБ, AтВВ, ..., AтВЩ, x)
_y = AтВБ AтВВ тВВ AтВЩ AтВЩ x_ https://github.com/JuniaLang/julia / рдореБрджреНрджреЗ / реирей реп рез
рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЗрд╕реЗ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП?
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдХрд╣рд╛ рдерд╛, рдореИрдВ рдкрд╛рдБрдЪ-рддрд░реНрдХ mul!
рд╕рд╣рдордд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реВрдБ _if_ рд╣рдореЗрдВ рдПрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рдирд╛ рдерд╛ред рдпрд╣ рдХреЛрдб рдореЗрд░реЗ PR # 29634 рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред
рдХреНрдпрд╛ рдЖрдк рддрд░реНрдХ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдЧрдгрдирд╛ C = AB рдФрд░ C = ╬▒AB + ╬▓C рд╕рдорд╛рди рд╣реИрдВ рддрд╛рдХрд┐ рдПрдХ рд╣реА рдирд╛рдо рджреЛрдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХреЗ?
рд╣рд╛рдВ, рдЪреВрдВрдХрд┐ рдкреВрд░реНрд╡ рдХреЗрд╡рд▓ ╬▓=0
рд╕рд╛рде рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рд╣реИред рдпрд╣ рдирд┐рд╖реНрдкрдХреНрд╖ рдмрд╣рд╕ рдХрд░рдиреЗ рдХрд┐ muladd!
/ addmul!
рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдирд╛рдо рд╣реИ C = ╬▒AB + ╬▓C
рд▓реЗрдХрд┐рди рд╣реЛ рд░рд╣реА рд╡рд╣рд╛рдБ рдпрд╛ рддреЛ рдПрдХ рдФрд░ рдЖрд╡реНрдпреВрд╣ рдЧреБрдгрди рд╕рдорд╛рд░реЛрд╣ (рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд╛рдПрдЧрд╛ muladd!
/ addmul!
) рдпрд╛ mul!
рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдм рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдпрджрд┐ рдпрд╣ рд╡рд╕рдВрдд рдореЗрдВ рдЖрдпрд╛ рд╣реЛрддрд╛ рддреЛ рдмрджрд▓рд╛рд╡ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ред
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рддреАрди-рддрд░реНрдХ рд╡рд╛рд▓реЗ рдореБрд▓ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ! "
рдЬреВрд▓рд┐рдпрд╛ ╬▒
рдФрд░ ╬▓
рддрд░реНрдХреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЗрди-рдкреНрд▓реЗрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдЖ, рд▓реЗрдХрд┐рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рдкрд░рдВрдкрд░рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ BLAS-3 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рд╡рд╣рд╛рдБ рд╕рд╛рдорд╛рдиреНрдп рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рдлрд╝рдВрдХреНрд╢рди C = ╬▒AB + ╬▓C
ред
mul!
рдирд╛рдордХрд░рдг
рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХрд╛ рдорддрд▓рдм stdlib рдореЗрдВ рдпрд╛ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбреНрдпреВрд▓ / рдХреЛрдб рдореЗрдВ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ? рдпрджрд┐ рдЖрдк рдкреВрд░реНрд╡ рдХрд╛ рдорддрд▓рдм рд╣реИ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рдпрд╛ рд╣реИ (LinearAlgebra рдФрд░ SparseArrays рдХреЗ рд▓рд┐рдП) # 29634 рдореЗрдВ рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм рдмрд╛рдж рдореЗрдВ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдЙрдмрд▓рддрд╛ рд╣реИред
рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рдкрд░рдВрдкрд░рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ BLAS-3 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ
рд▓реЗрдХрд┐рди рдЬреВрд▓рд┐рдпрд╛ рдкрд╣рд▓реЗ рд╣реА BLAS рдХреЗ рдирд╛рдордХрд░рдг рд╕рдореНрдореЗрд▓рди рд╕реЗ рд╡рд┐рджрд╛ рд╣реЛ рдЧрдИред рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рдирд╛рдо рд░рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛?
рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХрд╛ рдорддрд▓рдм stdlib рдореЗрдВ рдпрд╛ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбреНрдпреВрд▓ / рдХреЛрдб рдореЗрдВ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ?
mul!
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдпрд╣ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди addmul!
рдЬреЛрдбрд╝рддрд╛ рд╣реИредрд▓реЗрдХрд┐рди рдЬреВрд▓рд┐рдпрд╛ рдкрд╣рд▓реЗ рд╣реА BLAS рдХреЗ рдирд╛рдордХрд░рдг рд╕рдореНрдореЗрд▓рди рд╕реЗ рд╡рд┐рджрд╛ рд╣реЛ рдЧрдИред
рдореИрдВ рдирд╛рдордХрд░рдг рдХреА рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХрдо рд╕реЗ рдХрдо рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдлреЛрд░рдЯреНрд░рд╛рди 77 рдХреА рдХреБрдЫ рд╕реАрдорд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдФрд░ рдкреНрд░реЗрд╖рдг рджреЛрдиреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред рдореИрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред BLAS-3 рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рдлрд╝рдВрдХреНрд╢рди C = ╬▒AB + ╬▓C
рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ, рдпрд╣ mul!
(fka A_mul_B!
) рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рдирд╛рдо рд░рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛?
рдпрд╣ рд╣реЛрдЧрд╛, рдФрд░ рдореИрдВрдиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдХрдИ рдмрд╛рд░ред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рдХрд╛рд░реНрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
29634
mul!
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдпрд╣ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рдиaddmul!
рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдореЗрд░реЗ рдХрд╣рдиреЗ рдХрд╛ рдорддрд▓рдм рдпрд╣ рдерд╛ рдХрд┐ рдкрд╛рдВрдЪ-рддрд░реНрдХ mul!
рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ addmul!
рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рдХрд╛рд░реНрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рдХреБрдЫ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ _C = ╬▒AB + bothC_ рдФрд░ _Y = AтВВ AтЛп тЛп AтВЩ X_ _C = AB_ рдХреЗ рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ рдорд╛рдиреНрдп рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╣реИрдВред рдЬрдм рддрдХ _C = ╬▒AB + _C_ рдЕрджреНрд╡рд┐рддреАрдп рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рддрд░реНрдХ рдкрд░реНрдпрд╛рдкреНрдд рдордЬрдмреВрдд рд╣реИред рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рднреА рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк BLAS API рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬреВрд▓рд┐рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдЬреНрдЮрд╛рди рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, _C = AB_ рдФрд░ _C = ╬▒AB + areC_ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реИрдВ рдХрд┐ C
рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдкреВрд░реНрд╡ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдмрд╛рдж рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдВрддрд░ рдПрдХ рджреГрд╢реНрдп рдХреНрдпреВ рдХреЗ рдпреЛрдЧреНрдп рд╣реИред рдпрджрд┐ рдореБрдЭреЗ mul!(some_func(...), ...)
рдФрд░ mul!
рдХрд╛ рдкрд╛рдВрдЪ-рддрд░реНрдХ рд░реВрдк рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЧрд┐рдирдирд╛ рд╣реЛрдЧрд╛ (рдЬреЛ рдХрд┐ рдХрдард┐рди рд╣реИ рдЬрдм рд╡реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдХреЛрд╖реНрдардХ рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рд╣реИ) рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ some_func
рдХреБрдЫ рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рд╕рд┐рд░реНрдл рдПрдХ рдЖрд╡рдВрдЯрдиред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ addmul!
рддреЛ рдореИрдВ рддреБрд░рдВрдд рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ some_func
mul!(some_func(...), ...)
рдХреЗрд╡рд▓ рдЖрд╡рдВрдЯрди рдХрд░рддрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рдХреБрдЫ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ C = ╬▒AB + bothC рдФрд░ Y = AтВВ AтЛп тВЩ A C X рджреЛрдиреЛрдВ рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ C = AB рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╣реИрдВред рдЬрдм рддрдХ C = ╬▒AB + isC рдЕрджреНрд╡рд┐рддреАрдп рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рддрд░реНрдХ рдкрд░реНрдпрд╛рдкреНрдд рдордЬрдмреВрдд рд╣реИред
рдпрд╣ рдЕрджреНрд╡рд┐рддреАрдп рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╣реИ рдЬрд┐рд╕реЗ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд▓рд╛рдЧрдд рдкрд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдпрд╣ рдЕрдиреНрдп рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧреА рдЖрджрд┐рдо рдмрдирд╛рддрд╛ рд╣реИред рдХрдИ рдореМрдХреЛрдВ рдкрд░ рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рд╕рдВрдмрдВрдзреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдмреАрдЯрд╛ рд░рдЦрдирд╛ рдЪрд╛рд╣рд╛ рд╣реИ, рдФрд░ рд╣рдореЗрд╢рд╛ BLAS.gemm!
рд╡рд╛рдкрд╕ рдЧрд┐рд░рдирд╛ рдкрдбрд╝рд╛ред рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдЬреИрд╕реЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡реИрд╕реЗ рднреА рдордзреНрдпрд╡рд░реНрддреА рдЕрд╕реНрдерд╛рдпреА рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╢реЙрдЯ рдореЗрдВ рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрди-рдкреНрд▓реЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдмрд╣реБрдд рдХрдо рдЙрдкрдпреЛрдЧреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рдПрдХ рдЖрджрд┐рдо рдСрдкрд░реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдо рддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИрдВред
рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рднреА рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк BLAS API рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬреВрд▓рд┐рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдЬреНрдЮрд╛рди рд╣реИред
рдЬрдм рддрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реНрдХ ╬▒=1
рдФрд░ ╬▓=0
рдЕрднреА рднреА рд╣реИрдВ, рддреАрди arg mul!
рдХреЛрдИ рднреА рдЬреВрд▓рд┐рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 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/Juliaang/julia/issues/23919#issuecomment -431046516 рд╕реНрдерд┐рдд рд╣реИред рддрд░реНрдХред
рд╣рдордиреЗ рдЕрднреА рддрдХ рдирд╛рдо рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ (рдпрд╛рдиреА, mul!
vs addmul!
muladd!
) рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрдВрджреНрд░реАрдп рд╡рд┐рд╖рдп рд╣реИ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдпрд╣реА рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рд╣реИ)ред
рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рд╡рд╛рдж рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ? рд╡реЛрдЯрд┐рдВрдЧ? рдЯреНрд░рд╛рдЗрдПрдЬ?
рдореБрдЦреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдХреНрдпрд╛ рдХреБрдЫ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдореБрд▓? (C, A, B; ╬▒ = true, proposal = 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
рдореЗрдВ рдХрд╣рддрд╛ рд╣реВрдВред
рдореИрдВ muladd!
рд╕реЗ mul!
рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрд▓рдЧ рд░рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ рдХрднреА рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ C
( mul!
) рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ( muladd!
)ред
mul!
, рдШрдиреЗ рд▓рд┐рдиреЗрдЧрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реЛрдЧрд╛ ~ (рдПрдХ рдирдпрд╛ рддрд░реНрдХ рдирд╣реАрдВ)рддреЛ рдореИрдВ рдЗрд╕реЗ mul!
рдХрд╣рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд░рд╣реВрдБрдЧрд╛ред
- рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рд╣реИ: [AC] * [B╬▒; I╬▓]
... рдЕрдЧрд░ eltype рдореЗрдВ рдХрдореНрдпреВрдЯреЗрдЯрд┐рд╡ рдЧреБрдгрд╛ рд╣реИ
... рдЕрдЧрд░ eltype рдХрдореНрдпреВрдЯреЗрдЯрд┐рд╡ рд╣реИред
@Andreasnoack рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд░реНрдЪрд╛ рд╕реЗ 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!
рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдврд╝рд┐рдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдлрдВрдХреНрд╢рди-рдЖрдзрд╛рд░рд┐рдд рдПрдкреАрдЖрдИ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рддрд╛рдХрд┐ рдкреИрдХреЗрдЬ рд▓реЗрдЦрдХ рдЕрдкрдиреЗ рд╡рд┐рд╢реЗрд╖ рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдУрд╡рд░рд▓реЛрдб рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХреЗрдВред рддрдм рдЬреВрд▓рд┐рдпрд╛ рд╕рдореБрджрд╛рдп рдЗрд╕реЗ рдмреБрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд░реНрдХрд░рд╛ рдХрд╛ рдкреНрд░рдпреЛрдЧ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдХреЗрд╡рд▓ рдЕрдЧрд░ рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореВрд▓реНрдп
╬▓=true
, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдпрд╣ рдлрд┐рд░ рд╕реЗ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рддреЛ рдЗрд╕реЗmul!
рди рдХрд╣рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдЬрд╣рд╛рдБ рдХреЛрдИ рдЕрдиреНрдп рдореВрд▓реНрдп рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореВрд▓реНрдп╬▓=false
рднреА рдЖрдкрдХреЛ рдХреБрдЫ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рджреЗрддрд╛ рд╣реИ? рдФрд░ рдЖрдкmuladd(x,y,z) = x*y + z
рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реБрдП, рддрд░реНрдХреЛрдВ рдХрд╛ рдЖрджреЗрд╢ рдХреИрд╕реЗ рджреЗрдВрдЧреЗ? рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛрдЧреА, рдирд╣реАрдВ?
рдпрдХреАрди рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рдХреБрдЫ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдСрдкрд░реЗрд╢рди рдХреА "рд╣рдбреНрдбрд┐рдпреЛрдВ" рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧреБрдгрд╛ рдФрд░ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рднреА рд╕рд╛рде рдареАрдХ рд╣реЛрдЧрд╛ muladd!(A, B, C, ╬▒=true, ╬▓=false)
рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдореЗрд▓ рдХрд░рдиреЗ рдХреЗ muladd
ред рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рдирд╛ рдХрд╣реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреА рдЗрдЪреНрдЫрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ muladd
рдиреЗ рдкрд╣рд▓реЗ additive рд╣рд┐рд╕реНрд╕рд╛ рд▓рд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЬрд╣рд╛рдЬ рдЙрд╕ рдПрдХ рдкрд░ рд░рд╡рд╛рдирд╛ рд╣реЛ рдЧрдпрд╛ред
рдФрд░
muladd(x,y,z) = x*y + z
рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдХреИрд╕реЗ рддрд░реНрдХреЛрдВ рдХрд╛ рдЖрджреЗрд╢ рджреЗрдВрдЧреЗ? рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛрдЧреА, рдирд╣реАрдВ?
рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ addmul!
muladd!
рд╕реЗ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рддрд░реНрдХреЛрдВ рдХрд╛ рдХреНрд░рдо рд╕реНрдХреЗрд▓рд░ muladd
ред (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ muladd!
mul!
рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ)
FWIW рдпрд╣рд╛рдБ рдЕрдм рддрдХ рдХреЗ рддрд░реНрдХреЛрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рд╣реИред (рдореИрдВрдиреЗ рддрдЯрд╕реНрде рд░рд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдорд░реНрдердХ muladd!
/ addmul!
рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВ ...)
рдореБрдЦреНрдп рдЕрд╕рд╣рдорддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдирд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП _C = AB_ рдФрд░ _C = ╬▒AB + _C рдЕрд▓рдЧ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред
рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ ...
рдпрд╣ BLAS-3 рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрдВрдкреЛрдЬреЗрдмрд▓ рд╣реИред рддреЛ, _C = ╬▒AB + ╬▓C_ _C = AB_ (https://github.com/JuliaLang/julia/issues/23919#issuecomment-441246466) https://github.com/JuliaLang/julia/issues/ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╣реИред 23919 # рдЬрд╛рд░реАрдХрд░рдг -441312375, рдЖрджрд┐)
_ " muladd!
рдХреЛ рд╡рд░реНрдгрдирд╛рддреНрдордХ рдзреНрд╡рдирд┐ рдХреА рдХрдореА рд╣реИ рдЬрдм рдпрд╣ рдирд╣реАрдВ рд╣реИ: рдПрдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рдирд╛рдо scalemuladd!
рдЬреИрд╕реЗ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рднрд╛рдЧ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реЛрдЧрд╛ред" _ --- https://github.com/ рдЬреВрд▓рд┐рдпрд╛рд▓реИрдВрдЧ / рдЬреВрд▓рд┐рдпрд╛ / рдореБрджреНрджреЗ / 23919 # рдЬрд╛рд░реА рдХрд░рдирд╛ -441819470
_ "рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рд╣реИ: [AC] * [B╬▒; I╬▓]" _ --- https://github.com/JuliaLang/julia/issues/23919#issuecomment -441825259
рд╡реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ ...
_C = ╬▒AB + ╬▓C_ рдЧреБрдгрд╛ (https://github.com/JuliaLang/julia/issues/23919#issuecomment-430809383, https://github.JuliaLang/julia/issues/23919#issuecomment-427075792) рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред https://github.com/JuliaLang/julia/issues/23919#issuecomment-441813176, рдЖрджрд┐)ред
mul!
рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ Y = AтВБ AтВВ тЛп AтВЩ X
(https://github.com/JuliaLang/julia/issues/23919#issuecomment-402953987 рдЖрджрд┐)
рдЗрдирдкреБрдЯ-рдУрдирд▓реА рдмрдирд╛рдо рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░: рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ C
рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд░рддрд╛ рд╣реИ (https://github.com/JuliaLang/julia/issues/239n#issuecomment) -441267056, https://github.com/JuliaLang/julia/issues/23919#issuecomment-441824982)
рдПрдХ рдФрд░ рдХрд╛рд░рдг рд╣реИ рдХрд┐ mul!
рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ...:
mul!
рдкреНрд░рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИредрдФрд░ рдХреНрдпреЛрдВ muladd!
/ addmul!
рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ...:
mul!
рдФрд░ muladd!
/ addmul!
рдЕрд▓рдЧ-рдЕрд▓рдЧ (https://github.com/JuliaLang/julia/issues) рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рддреАрди- рдпрд╛ рдЪрд╛рд░-рддрд░реНрдХ "рдЖрд╕рд╛рди рдХрд╛рд░реНрдп" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред / 23919 # рдЬрд╛рд░реАрдХрд░рдг -402953987, https://github.com/JuliaLang/julia/issues/23919#issuecomment-431046516, рдЖрджрд┐)ред рдХрд╛рдЙрдВрдЯрд░ рддрд░реНрдХ: mul!(y, A, x)
(https://github.com/JuliaLang/julia/issues/23919#issuecomment-4306493434, рдЖрджрд┐) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ mul!(y, A, x, 1, 1)
рд▓рд┐рдЦрдирд╛ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИредрдЙрджреНрджреЗрд╢реНрдп рд╕рд╛рд░рд╛рдВрд╢ @tkf рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
рдореИрдВ рднреА рдореБрд▓реНрд▓рд╛рдж рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓рд╛рдж! (рдП, рдмреА, рд╕реА, ╬▒ = рд╕рдЪ, false = рдЧрд▓рдд) рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ mulladd!
рдирд╛рдордХ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ ╬▓=true
ред рдлрд┐рд░ рднреА, рдореИрдВ рдмрд╣рд╕ рдХреЗ рдЗрд╕ рдЖрджреЗрд╢ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд▓рдЧрддрд╛ рд╣реИ muladd
, рдмрд╣реБрдд рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рднреНрд░рд╛рдордХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ mul!(C,A,B)
рд╢рд╛рдпрдж рдореИрдВ рдЧрд▓рдд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧреЛрдВ / рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ / рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдХреЛрдб (рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЗрд╡рд▓ рдЧреБрдгрдХ рдСрдкрд░реЗрдЯрд░ *
рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ) рдХреЛ mul!
ред ╬▓C
рдХреЛ рдорд┐рд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛, ╬▓=1
( true
)) рдпрд╛ рдЕрдиреНрдпрдерд╛, рдирд┐рдореНрди рд╕реНрддрд░ рдХреЗ рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдПрдЧреА, рдЬреЛ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рдХреЗ рд▓рд┐рдП BLAS API рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ рдпрд╣ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рд▓реЛрдЧ mul!
рддрд╣рдд рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐ gemm
, gemv
рд▓рд┐рдП рд╕реНрдерд╛рдкрд┐рдд рдЬреВрд▓рд┐рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, ... рдПрдХ рдирдпрд╛ рдирд╛рдо рдЬреЛрдбрд╝рдирд╛ (рдЬреЛ рднреНрд░рд╛рдордХ рд╣реИ) рд╡рд┐рдкрд░реАрдд рддрд░реНрдХ рдЖрджреЗрд╢) рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ; рдореИрдВ рд▓рд╛рдн рджреЗрдЦрдиреЗ рдореЗрдВ рдЕрд╕рдлрд▓ рд╣реВрдВ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рд▓реЛрдЧ
mul!
рддрд╣рдд рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐gemm
,gemv
рд▓рд┐рдП рд╕реНрдерд╛рдкрд┐рдд рдЬреВрд▓рд┐рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, ... рдПрдХ рдирдпрд╛ рдирд╛рдо рдЬреЛрдбрд╝рдирд╛ (рдЬреЛ рднреНрд░рд╛рдордХ рд╣реИ) рд╡рд┐рдкрд░реАрдд рддрд░реНрдХ рдЖрджреЗрд╢) рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ; рдореИрдВ рд▓рд╛рдн рджреЗрдЦрдиреЗ рдореЗрдВ рдЕрд╕рдлрд▓ рд╣реВрдВ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЦреЛрдЬрд╢реАрд▓рддрд╛ рдХреЛрдИ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ muladd!
mul!
рдбреЙрдХрд┐рдВрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреЛ рд▓реЛрдЧ рдмреАрдПрд▓рдПрдПрд╕ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдХреБрд╢рд▓ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдкрддрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдкреАрдЖрдИ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдХрд╣рд╛рдВ, рд╕рд╣реА?
рд╕реНрдерд┐рддрд┐ рд╕рдВрдмрдВрдзреА рдмрдирд╛рдо рдХреАрд╡рд░реНрдб рджрд▓реАрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдпрд╣ рдЕрднреА рддрдХ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ C = ╬▒AB + ╬▓C
╬▒
рд╕рд╛рде рдПрдХ рд╡рд┐рдХрд░реНрдг рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрдХреЗрд▓рд░ ╬▒
рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╣рдо ╬▒
рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рднреЗрдЬ рд╕рдХреЗрдВ рдЬреЛ рдХрд┐ рдХреАрд╡рд░реНрдб рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрднрд╡ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧреИрд░-рд╕рдВрдпреБрдХреНрддрд╛рдХреНрд╖рд░ рдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдЖрдк muladd!(╬▒', B', A', ╬▓', C')
(рдХрд╛рд▓реНрдкрдирд┐рдХ рддрд░реНрдХ рдЖрджреЗрд╢) рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ C = AB╬▒ + C╬▓
рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдЖрдк рдЖрд▓рд╕реА рд░реИрдкрд░реЛрдВ рдкрд░ Adjoint(╬▒)
рдФрд░ Adjoint(╬▓)
рдкреНрд░реЗрд╖рдг рдХрд░ рд╕рдХреЗрдВред (рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рдЧреИрд░-рдХрдореНрдпреВрдЯреЗрдЯрд┐рд╡ рдирдВрдмрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡рддрдГ рдмрд╣реБрдд рдХрд╛рд▓реНрдкрдирд┐рдХ рд╣реИред)
рдореИрдВ @ рдЬреВрдереЛ рдХреА рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣
рдХреАрд╡рд░реНрдб рддрд░реНрдХ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрд░реНрдХ рд╣реИ, рдЬреЛ https://andithub.com/JuliaLang/julia/issues/23919#issuecomment -365762889 рд╕реЗ рдкрд╣рд▓реЗ @andreasnoack рдиреЗ рдХрд╣рд╛:
рдЬрдм рддрдХ рдЖрдк BLAS рдирд╣реАрдВ рдЬрд╛рдирддреЗ рддрдм рддрдХ
╬▒
рдФрд░╬▓
рднреА рд╕реБрдкрд░ рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реИрдВ
@tkf, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐, рдореЗрд░реЗ рддрд░реНрдХ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдпрд╣ рд╣реИ: рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХреА рд╕рдВрдЦреНрдпрд╛ ╬▓ != 0
рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛ ╬▓ == 0
, рдФрд░ рдЬреЛ рд▓реЛрдЧ рдЬрд░реВрд░рдд рд╣реИ рдпрд╣ рд╣реИрд░рд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЗрд╕ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд▓рдЧрддрд╛ рд╣реИ mul!
рддрд╣рдд рд╡реНрдпрд╡рд╣рд╛рд░ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдПрдХ рдирдП рдирд╛рдо рдХреЗ рддрд╣рдд рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рд▓рд╛рдн рдирд╣реАрдВ рджреЗрдЦрддрд╛, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рддрд░реНрдХ рдХреНрд░рдо рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рдЧрдпрд╛ рд╣реИ ( muladd!
рдХрдо рд╕реЗ рдХрдо)ред рдпрджрд┐ рдЗрд╕реЗ рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдмрдирд╛рдиреА рд╣реИ, рддреЛ рдореИрдВ addmul!
рд▓рд┐рдП рдЖрдкрдХреЗ рддрд░реНрдХ рдХреЗ рдкреНрд░рддрд┐ рднреА рд╕рд╣рд╛рдиреБрднреВрддрд┐ рд░рдЦрддрд╛ рд╣реВрдВред
рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ
mul!
рддрд╣рдд рдЗрд╕ рдереЛрдбрд╝реЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреЗрдЦрдХрд░ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред
рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдПрдХ рдирдП рдирд╛рдо рдХреЗ рддрд╣рдд рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рд▓рд╛рдн рдирд╣реАрдВ рджреЗрдЦрддрд╛,
рдЬрдм рддрдХ рдЖрдк рдХреБрдЫ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд▓рд╛рдн рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рд▓рд╛рдн рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред
рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рддрд░реНрдХ рдЖрджреЗрд╢ рдЧрдбрд╝рдмрдбрд╝ рд╣реБрдЖ рд╣реИ (
muladd!
рдХрдо рд╕реЗ рдХрдо)
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдиреБрдХрд╕рд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдиреЗрдВрдЧреЗ рдФрд░ рдореБрдЭреЗ рдпрд╣ рдмрд╛рдд рдорд┐рд▓реЗрдЧреАред рдпрд╣ рд╕рд┐рд░реНрдл рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ muladd!
/ addmul!
рд▓рд┐рдП рдЕрдиреНрдп рд▓рд╛рдн рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдиреБрдХрд╕рд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдиреЗрдВрдЧреЗ рдФрд░ рдореБрдЭреЗ рдпрд╣ рдмрд╛рдд рдорд┐рд▓реЗрдЧреАред рдпрд╣ рд╕рд┐рд░реНрдл рдореИрдВ muladd рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд▓рд╛рдн рд▓рдЧрддрд╛ рд╣реИ! / Addmul рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдиреБрдХрд╕рд╛рди рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рд╛рде рдХрд┐ mul!
рд╣рдореЗрд╢рд╛ рдЧреБрдгрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрдИ BLAS рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдПрдХрд▓ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ ╬▒ рдФрд░ ╬▓ рддрдХ рдкреВрд░реНрдг рдкрд╣реБрдВрдЪ рди рджреЗрдХрд░ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдФрд░ рдЕрдм muladd!
, рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реЛрдВрдЧреЗ, рдЕрдиреБрд░реЛрдзрд┐рдд рдСрдкрд░реЗрд╢рди рдореЗрдВ рдмрд╕ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЕрдВрддрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдкрдХрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬреЛ BLAS API рдореЗрдВ рдПрдХ рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рдПрдХ рдЧрд▓рддреА рдереА рдЬреЛ рдмреАрдПрд▓рдПрдПрд╕ рдПрдкреАрдЖрдИ (рдЗрд╕рд▓рд┐рдП рдЙрд╕ @tkf рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж) рдХреА рдкреВрд░реА рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреБрд░рд╛рдиреЗ рднрдпрд╛рдирдХ рдлреЛрд░рдЯреНрд░рд╛рди рдирд╛рдордХрд░рдг рд╕рдореНрдореЗрд▓рди рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рдереЗ рдХрд┐ рд╡реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рдереЗред рд▓реЗрдХрд┐рди рдЗрд╕реА рддрд░рд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдпрд╣ рдкрд░рд┐рд╡рд╛рд░ (рдпрд╛рдиреА ╬▒ рдФрд░ under рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рдЪрд╛рд▓рд┐рдд рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХрд╛ 2-рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░рд┐рд╡рд╛рд░ рдПрдХрд▓ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдХреЗ рддрд╣рдд рдПрдХ рд╕рд╛рде рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдмреАрдПрд▓рдПрдПрд╕ рдореЗрдВ рд╣реИрдВред
рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╛рдиреНрдп рдХрд╛рдЙрдВрдЯрд░ рддрд░реНрдХ рд╣реИ рдХрд┐ C
рдореЗрдВ рдореВрд▓ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХреЗрдЧрд╛ рдпрд╛ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рддрдереНрдп рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рдиреЗ рд╢реВрдиреНрдп рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ false
рд╕рд╛рде рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рд╣реИ, рддрдм рднреА рдЬрдм рдЕрдиреНрдп рдХрд╛рд░рдХ NaN
, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рднреА рдзреНрдпрд╛рди рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЗрд╕ рддрдереНрдп рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдВрдкреНрд░реЗрд╖рд┐рдд / рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣ рдХреБрдЫ рд╕рдордп рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрдврд╝рд╛ рд╣реИ), рдФрд░ рдореИрдВрдиреЗ рднреА рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛ рд╣реИред (рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ KrylovKit.jl рдореЗрдВ, рдореБрдЭреЗ рдПрдХ fill!
рдкрджреНрдзрддрд┐ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдПрдХ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╡реЗрдХреНрдЯрд░-рдЬреИрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд▓реЗрдХрд┐рди рдЕрдм рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп rmul!(x,false)
рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрд╕ fill!
рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред
рдпрд╣ рд╕рд┐рд░реНрдл рдореИрдВ muladd рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд▓рд╛рдн рд▓рдЧрддрд╛ рд╣реИ! / Addmul рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред
рддреЛ рдореБрдЭреЗ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХреЛ рдЙрд▓рдЯ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рд╣реЛрдиреЗ рдХреЗ рдЕрдиреНрдп рд▓рд╛рдн рдХреНрдпрд╛ рд╣реИрдВ? рдореИрдВрдиреЗ рдЖрдкрдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдХреЗрд╡рд▓ C
рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдмрд╛рдд рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд┐рд╕ рдкрд░ рдореИрдВрдиреЗ рдЕрднреА рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИред
рдореИрдВрдиреЗ рдЖрдЬ рд╕реБрдмрд╣ рдЕрдкрдиреА рдкрддреНрдиреА рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд┐рдпрд╛ рдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рд╕рдореБрджрд╛рдп рдореЗрдВ рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рдирд╛рдордХрд░рдг рдХреЛ рд▓реЗрдХрд░ рджреЛ рдорд╣реАрдиреЗ рдХреА рд▓рдВрдмреА рдмрд╛рддрдЪреАрдд рд╣реБрдИ рд╣реИред рдЙрд╕рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдЗрд╕реЗ "рдлреНрд░реЗрдб" рдХрд╣рд╛ рдЬрд╛рдП! - рдирд╣реАрдВ рдирд╣реАрдВ, рдХреЛрдИ рдЧрд╣рд░рд╛ рдЕрд░реНрде рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд╛рдо рд╣реИред рдмрд╕ рдЙрд╕реЗ рд╡рд╣рд╛рдБ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░ рджрд┐рдпрд╛ред
рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдПрдХ рд╡рд┐рд╕реНрдордпрд╛рджрд┐рдмреЛрдзрдХ рдЪрд┐рд╣реНрди рд╢рд╛рдорд┐рд▓ рд╣реИ! ЁЯШД
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЗрд╡рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреВрдВ рдХрд┐ рдореЗрд░реА рдЪрд┐рдВрддрд╛ рд▓рдЧрднрдЧ рдХреЗрд╡рд▓ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рд╕реЗ рдЖ рд░рд╣реА рд╣реИ, рди рдХрд┐ рд▓реЗрдЦрдиреАрдпрддрд╛ рдпрд╛ рдЦреЛрдЬ рдХреА рдХреНрд╖рдорддрд╛ рд╕реЗред рдЖрдк рдПрдХ рдмрд╛рд░ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдХрдИ рдмрд╛рд░ рдкрдврд╝рддреЗ рд╣реИрдВред
рдирдИ рд╡рд┐рдзрд┐ рд╣реЛрдиреЗ рдХреЗ рдпреЗ рдЕрдиреНрдп рд▓рд╛рдн рдХреНрдпрд╛ рд╣реИрдВ?
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдмрдирд╛рдо рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рддрд░реНрдХ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ _C = ╬▒AB + isC_ _C = AB_ рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдзрд╛рд░рдг рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рднрд┐рдиреНрди рд╣реИрдВ рдХрд┐ рдкреВрд░реНрд╡ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрд╛рдж рдХреЗ рд╕рдЦреНрдд "рд╕реБрдкрд░рд╕реЗрдЯ" рдХреЛрдб рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рджреГрд╢реНрдп рд╕рдВрдХреЗрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдо рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ (рдпрд╛ рдереЛрдбрд╝реЗ рдЕрдирдлрд╝реЛрдХрд╕реНрдб рдПрдбрд╡рд╛рдВрд╕реНрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд░) рдХреЛ рд╕реНрдХрд┐рдорд┐рдВрдЧ рдХреЛрдб рдФрд░ рдпрд╣ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ mul!
рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ weirder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдореИрдВрдиреЗ рдлрд┐рд░ рд╕реЗ рдкреЛрд▓ рдХреА рдЬрд╛рдБрдЪ mul!
рд╕реЗ muladd!
рдЪрд▓реЗ рдЧрдП? рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рджреЗрдЦрд╛ рдерд╛, mul!
рдЬреАрдд рд░рд╣рд╛ рдерд╛ред рдЪрд▓рд┐рдП рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╡реЗ рдпрд╣рд╛рдБ рдЪрд▓реЗ рдЬрд╛рдПрдБ: рд╣рдБрд╕рддреЗ рд╣реБрдП:
mul!
: 6addmul!
: 2muladd!
: 8рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ, рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ mul!
рдпрд╛ muladd!
рдЕрдиреНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ addmul!
рдЕрд▓реНрдкрд╕рдВрдЦреНрдпрдХ рд╣реИ: sob :)
рдРрд╕рд╛ рдорд╣рд╕реВрд╕ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдлрдВрд╕ рдЧрдП рд╣реИрдВред рд╣рдо рдХреИрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ?
рдмрд╕ рдЗрд╕реЗ 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)
, рдФрд░ рдореИрдВ рдПрдХ рдРрд╕рд╛ PR рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ axpy!
рдФрд░ axpby!
рд╕рд╛рде add!
, рдХрд┐ add!(y, x, ╬▒=true, ╬▓=true)
рдпрд╛ add!(x, y, ╬▒=true, ╬▓=true)
(рдЬрд╣рд╛рдВ, рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, y
рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИ)ред рдпрд╛ рдХреБрдЫ рдФрд░?
рдпрджрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ muladd!(A,B,C)
рдЙрд╕ рдХрдиреНрд╡реЗрдВрд╢рди рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рддрд░реНрдХ рдкрд╣рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ ред
рдХреНрдпрд╛ рд╣рдо
mul!
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ
@ рдЬреЗрдЬреЗрдм рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ "рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛" рддрд░реНрдХ рдкрд░ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИред рдлрд┐рд░ рднреА, рдпрд╣ рдХрд┐рд╕реА рдХреЛ рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ (рдорддрджрд╛рди рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░реЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ)ред
рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рджреВрд╕рд░реЗ PR рдореЗрдВ
muladd!
рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреЛ рддреЛрдбрд╝рдирд╛ рдмреБрд░рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЕрдЧрд░ рд╣рдо mul!
рддреЛ рдпрд╣ mul!
рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ LinearAlgebra API рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЯрдХреНрдХрд░ рджреЗ рд╕рдХрддрд╛ рд╣реИ)ред
рдореИрдВ рдПрдХ рдРрд╕рд╛ рдкреАрдЖрд░ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ
axpy!
рдФрд░axpby!
рдкрд░ рдПрдХ рдЕрдзрд┐рдХ рдЬреВрд▓рд┐рдпрди рдирд╛рдо рдХреЗ рд╕рд╛рдеadd!
,add!(y, x, ╬▒=true, ╬▓=true)
рдпрд╛add!(x, y, ╬▒=true, ╬▓=true)
@ рдЬреВрдереЛ рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛! рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдордиреЗ рдмрд╣реБ-рдРрдб-рдПрдкреАрдЖрдИ рдПрдкреАрдЖрдИ рдХреЗ рдХреЙрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рддреЛ рддрд░реНрдХ рдХрд╛ рдХреНрд░рдо рдЪреБрдирдирд╛ рд╕реАрдзрд╛ рд╣реЛрдЧрд╛ред
muladd!(A,B,C)
рдХрдиреНрд╡реЗрдВрд╢рди рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрдЧрд╛ рдЬреЛ рдХрд┐ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рддрд░реНрдХ рдкрд╣рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ ред
@simonbyrne рд▓реЗрдХрд┐рди (рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА https://github.com/JuliaLang/julia/issues/23919#issuecomment-426881998 рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛), lmul!
рдФрд░ ldiv!
рдореЗ рдмрджрд▓реЗрдВ рдЧреИрд░ рдкрд╣рд▓рд╛ рддрд░реНрдХред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдкрд╕рдВрдж рд╕реЗ muladd!(A,B,C,╬▒,╬▓)
рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕реЗ рдЗрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
(рд▓реЗрдХрд┐рди рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЕрдЧрд░ рд╣рдо "рдкрд╛рдареНрдп рдХреНрд░рдо" рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рддреЛ 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 рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рджрд┐рд╢рд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ? рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рдХрдИ рдЕрдиреНрдп рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рдПрдХ рднреА рдЙрджрд╛рд╣рд░рдг рд╣рд▓ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рд╕рд╛рд╡рдзрд╛рди рдбрд┐рдЬрд╛рдЗрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛ред
рддреЛ рдореИрдВрдиреЗ рдЕрдлрд╡рд╛рд╣ рд╕реБрдиреА рд╣реИ рдХрд┐ рдЕрдЧрд▓реЗ рд╣рдлреНрддреЗ 1.1 рдХреА рд╕реБрд╡рд┐рдзрд╛ рдлреНрд░реАрдЬ рд╣реЛ рдЧрдИ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЧрд▓реА рдЫреЛрдЯреА рд░рд┐рд▓реАрдЬ "рдХреЗрд╡рд▓" рдЪрд╛рд░ рдорд╣реАрдиреЗ рджреВрд░ рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ 1.1 рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ...
рд╡реИрд╕реЗ рднреА, рд╣рдореЗрдВ PR рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рд╕рд┐рдЧреНрдиреЗрдЪрд░ (рддрд░реНрдХреЛрдВ рдФрд░ рдХреАрд╡рд░реНрдб рдХрд╛ рдХреНрд░рдо рдпрд╛ рдирд╣реАрдВ) рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рддреЛ рдЪрд▓реЛ рдлрд┐рд░ рд╕реЗ рд╡реЛрдЯ рдХрд░реЗрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрддреНрддреЗрдЬрдХ рд╣реИ)ред
_If_ рд╣рдо _C = AB╬▒ + C ,_ рдХреЗ рд▓рд┐рдП muladd!
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХрд╛ рдкрд╕рдВрджреАрджрд╛ рдХреЙрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреНрдпрд╛ рд╣реИ?
muladd!(C, A, B, ╬▒, ╬▓)
muladd!(A, B, C, ╬▒, ╬▓)
muladd!(C, A, B; ╬▒, ╬▓)
(рдЬреИрд╕реЗ: +1 :, рд▓реЗрдХрд┐рди рдХреАрд╡рд░реНрдб рддрд░реНрдХ рдХреЗ рд╕рд╛рде)muladd!(A, B, C; ╬▒, ╬▓)
(рдЬреИрд╕реЗ: -рез :, рд▓реЗрдХрд┐рди рдЦреЛрдЬрд╢рдмреНрдж рддрд░реНрдХ рдХреЗ рд╕рд╛рде)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
рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрди рд╡реИрд░рд┐рдПрдВрдЯреНрд╕ рдкрд░ рдПрдХ рд╣реА рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдкреНрд░рддрд┐рдмрдВрдз рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдмрдбрд╝реА рдЪрд┐рдВрддрд╛ рдХреА рдмрд╛рдд рд╣реИ: рдпрд╣ рдХрдо рд╕реЗ рдХрдо mul!(Y, A, B, C, D)
A*B*C*D
Y
рдЬрдЧрд╣ рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдзрд╛рд░рдгрд╛ рдмрд╣реБрдд рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдЯрдХрд░рд╛рддреА рд╣реИ mul!(Y, A, B, ╬▒, ╬▓)
рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ ╬▒*A*B + ╬▓*C
ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ A*B*C*D
рдХреЛ Y
рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХрд░рдирд╛ рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ, рдЬреЛ рдордзреНрдпрд╡рд░реНрддреА рдЖрд╡рдВрдЯрди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рдФрд░ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдЕрд░реНрде рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред ред
рдорди рдореЗрдВ mul!
рдЕрдиреНрдп рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреЗ рд╕рд╛рде, рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИ:
mul!(Y, ╬▒, A, B) # Y .= ╬▒*A*B
рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдореЙрдбрд▓ рдореЗрдВ рдпрд╣ рдлрд┐рдЯ mul!(out, args...)
рдореЗрдВ рдЬрд╣рд╛рдВ рдХреА рдЧрдгрдирд╛ рдФрд░ рд▓рд┐рдЦрдиреЗ out
рдЧреБрдгрд╛ рдХрд░рдХреЗ args
рдПрдХ рд╕рд╛рдеред рдпрд╣ ╬▒
рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд╖рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдмрдЬрд╛рдп рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рдмрдирд╛рдиреЗ рдХреЗ - рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдФрд░ рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЧреБрдгрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЬрдм ╬▒
рдПрдХ рдЕрджрд┐рд╢ рд░рд╛рд╢рд┐ рдФрд░ A
, B
рдФрд░ Y
matrices рд╣реЛрдВ, рддреЛ рд╣рдо рдЗрд╕ рд╕реБрдкрд░ рдХреЛ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП BLAS рдХреЛ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рдПрдХ рдЧреИрд░-рдХрдореНрдпреВрдЯреЗрдЯрд┐рд╡ рдХреНрд╖реЗрддреНрд░ (рдЬреИрд╕реЗ quaternions) рдореЗрдВ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ ╬▒
рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд┐рд╕ рдкрд░ рд╣реЛрддреА рд╣реИ: 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 рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╣реИ рдХрд┐ рдЖрдЗрдП рд╣рдо рдЪреАрдЬреЛрдВ рдХреЗ _lot_ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд┐рд╕реЗ рд╣рдо BLAS рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЧрдВрджрд╛ рдХреЗ рднреА рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рд╢рд╛рдЦрд╛рдУрдВред
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд API рдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ @StefanKarpinski рдХрд╛ рд╕реБрдЭрд╛рд╡ рдкрд╕рдВрдж рдХрд░рддрд╛
@affine! Y = ╬▓тВБ*Y*╬▓тВВ + ╬▒тВБ*A*B*╬▒тВВ
рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рддрдм рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ @StefanKarpinski рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред
рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдФрд░ рдЖрдЧреЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐, рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдИ рдЬреВрд▓рд┐рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдПрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ BLAS рд╕реЗ рдирд╣реАрдВ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред MatrixChainMultiply.jl рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕рдВрдЧрдгрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбреАрдПрд╕рдПрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реА рд╣реИрдВ рдФрд░ рдбрд┐рдлреЗрдХ рдПрдХреНтАНрдкрд╛рдЗрди рдСрдкрд░реЗрдЯрд░ рднрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдмрд╛рдд рдХрд░ рд░рд╣реА рд╣реИред рдпрджрд┐ рд╣рдо рдмреЗрд╕ рдореЗрдВ рдПрдХ рдЕрдореВрд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрдкрдиреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
@dlfivefifty рдиреЗ рдкрд╣рд▓реЗ рдЖрд▓рд╕реА рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рдореЗрдВ рджреЗрдЦрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдореВрд░реНрдд рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡-рд╡рд╛рд░ рд╕рдВрдЪрд╛рд▓рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд╛рд░рдг рдХрд╛ рдЖрд▓рд╕реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдерд╛ред рд╣рдореЗрдВ рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд░реИрдЦрд┐рдХ рдмреАрдЬреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣рдореЗрдВ рдПрдХ рдЬреВрд▓рд┐рдпрд╛ BLAS рд╕реЗ рдордХреНрдЦреА рдкрд░ рдирдП BLAS рдЧреБрдард▓реА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдпрд╛ рдПрдХ GPU / TPU рдкрд░ рд╕рдореАрдХрд░рдгреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдореЗрдВ рд╕рднреА рдЧрдгрдирд╛рдПрдБ рддрддреНрд╡-рд╡рд╛рд░ рдФрд░ рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдмрд▓рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рджреЛрдиреЛрдВ рдХрд╛ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХрд╛ рд╡рд░реНрдгрди рдореЗрдЯреНрд░рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдиреЗ рдФрд░ рдирдП рдбрд┐рдЬрд╝рд╛рдЗрдиреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдореБрдЭреЗ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рд┐рд░реНрдл рдЯрд┐рдкреНрдкрдгреА рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдирд╛ A*B*C
рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрд╕реНрдерд╛рдпреА рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдирд╛
A*B*C
рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдБрдХрд┐, mul!
рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рдРрд░реЗ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдПрдкреАрдЖрдИ mul!(Y, A, B, C...)
рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдпрд╣рд╛рдВ рд╕рд╛рдорд╛рдиреНрдп рд▓рдХреНрд╖реНрдп рдерд╛ред
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд API рдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ @StefanKarpinski рдХрд╛ рд╕реБрдЭрд╛рд╡ рдкрд╕рдВрдж рдХрд░рддрд╛
@ рдХреНрд░рд┐рд╕рдЯреНрд░реИрдХреИрд╕ : рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдЕрдВрджрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬреЗрдВ рдФрд░ рдмрд╛рд╣рд░реА рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рддрд▓рд╛рд╢ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП - рдЖрд▓рд╕реНрдп, рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕ рд▓реЗрдЦрди рдХреЛ рд▓рд┐рдЦрдирд╛ рдФрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдкрд╛рд╕ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдРрд╕реЗ рдмреАрдЬреАрдп рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЬрд╛рдирддреЗ рд╣реИрдВред 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...)
"
рд▓реЗрдХрд┐рди рдореЗрд░реА рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╣рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдЯреБрдкрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдиреЗрд╕реНрдЯреЗрдб рдЯреНрдпреВрдкрд▓реНрд╕ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдлреНрд▓реИрдЯ рдЯреНрдпреВрдкрд▓реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ? рдЕрдЧрд░ рдХреА рддрд░рд╣ рдХреБрдЫ "рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ Tuple{Tuple{A1,B1},C1,D1}
рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ Tuple{Tuple{A2,B2},C2,D2}
iff Tuple{A1,B1,C1,D1}
рдЕрдзрд┐рдХ рд╣реИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ Tuple{A2,B2,C2,D2}
рд░рдЦрддреА рд╣реИ"ред рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЕрдзрд┐рднрд╛рд░ рдПрдкреАрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдЬрдЯрд┐рд▓ рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдкреБрдирд░реНрд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджрд┐рд╢ рдкреНрд░рдХрд╛рд░ рдкрд░ рдкреНрд░реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣ PR # 29634 рд╕реЗ рд╣реИ рддрд╛рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВ):
рдПрдХ рдФрд░ рдЪрд┐рдВрддрд╛ рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрдЧрдгрдирд╛ рдЧреНрд░рд╛рдл рдирд┐рд╖реНрдкрд╛рджрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рдж рддрдХ рд╕реАрдорд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░-рдРрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рд╕рдВрдЧрдгрдирд╛ рдХрд░реНрдиреЗрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ _C = AB╬▒_ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, _╬▒AB_ (https://github.com/JuliaLang/julia/pull/29634#issuecomment-44310363667) рджреЗрдЦреЗрдВред рдЧреИрд░-рд╕рдВрдпреБрдХреНрддрд╛рдХреНрд╖рд░реА рдХреЗ рд▓рд┐рдП _╬▒utAB╬▒тВВ_ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рддреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рд░рдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрд╛ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдпрд╣ рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рддрдВрддреНрд░ рд╕реЗ рдЕрд▓рдЧ рдПрдХ рд╕рдВрдЧрдгрдирд╛ рдЧреНрд░рд╛рдл рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рд╣рд░реА рдкреИрдХреЗрдЬ (рдЬреИрд╕реЗ, LazyArrays.jl, MappedArrays.jl) рдореЗрдВ рдЗрд╕рдХрд╛ рдмреЗрд╣рддрд░ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдо рдХрд┐рд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░рдгрдиреАрддрд┐ рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЛ рдХрд╡рд░ рдХрд░рддреА рд╣реИ, рддреЛ рдореБрдЦреНрдп рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ mul!
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ muladd!
рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рдФрд░ рдХрд╛рд░рдг рд╣реИ; рднрд╡рд┐рд╖реНрдп рдХреЗ рдХреЙрд▓рд┐рдВрдЧ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд╛рди рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ред
рдореБрдЭреЗ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рд┐рд░реНрдл рдЯрд┐рдкреНрдкрдгреА рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк рдЕрд╕реНрдерд╛рдпреА рдХреЗ рдмрд┐рдирд╛ рдП рдмреА рд╕реА рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрд╕реНрдерд╛рдпреА рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдкреНрд░рдорд╛рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рджрд╕рд┐рдпреЛрдВ рдХреА рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдВрдХреБрдЪрди, рдкреВрд░реА рдЪреАрдЬ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдХреБрд╢рд▓ рддрд░реАрдХрд╛ рд╣рдореЗрд╢рд╛ рдпреБрдЧреНрдордХ рд╕рдВрдХреБрдЪрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдХрдИ рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝реАрджрд╛рд░ рддрд░реАрдХреЗ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдСрд░реНрдбрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рд╕рдорд╕реНрдпрд╛ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ mul!(Y,X1,X2,X3...)
рдЗрддрдиреА рдЙрдкрдпреЛрдЧреА рдЖрджрд┐рдо рдирд╣реАрдВ рд╣реИред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ mul!
рд╣реИ, рдпрд╣ рдПрдХ рдЖрджрд┐рдо рд╕рдВрдЪрд╛рд▓рди рд╣реИ рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдкрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рднрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдСрдкрд░реЗрд╢рди рдХреЛ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрдгрдирд╛ рдЧреНрд░рд╛рдл рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрдВрдд рдореЗрдВ mul!
рдЬреИрд╕реЗ рдЖрджрд┐рдо рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдХрд┐ рдЖрджрд┐рдо рдЧреИрд░-рдХрдореНрдпреВрдЯреЗрдЯрд┐рд╡ рдЬреИрд╕реЗ @StefanKarpinski рдЙрд▓реНрд▓реЗрдЦреЛрдВ рдЬреИрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЬрдм рддрдХ рдХреЛрдИ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди / рдЯреЗрдВрд╕рд░ рд╕рдВрдХреБрдЪрди рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдЖрджрд┐рдо рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реЛрдЪ рдЗрддрдиреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рддрд░рд╣ рдлрд╝реНрдпреВрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рдпрджреЗрдордВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдзрд╛рд░ рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрд▓рд╕реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ / рдЕрднрд┐рдХрд▓рди рдЧреНрд░рд╛рдл рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ mul!
рдЗрд╕рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИред
@tkf :
рд▓реЗрдХрд┐рди рдореЗрд░реА рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╣рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдЯреБрдкрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдиреЗрд╕реНрдЯреЗрдб рдЯреНрдпреВрдкрд▓реНрд╕ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдлреНрд▓реИрдЯ рдЯреНрдпреВрдкрд▓реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ?
рд╣рд╛рдБ, рд╣рдо рдЙрд╕ рдореЛрд░реНрдЪреЗ рдкрд░ рдЕрдЪреНрдЫреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдШреЛрдВрд╕рд▓рд╛ рдХрд╣рд╛рдБ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЛ рдЧреБрджрдЧреБрджреА рд╕реЗ рдЧреБрдЬрд╛рд░рдирд╛ рдмрд╕ рдЙрддрдиреА рд╣реА рдХреБрд╢рд▓ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдЙрди рд╕рднреА рдХреЛ рддрддреНрдХрд╛рд▓ рддрд░реНрдХ рджреЗрдирд╛ - рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ _C = AB╬▒_ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, _╬▒AB_
рдореБрдЭреЗ рднреНрд░рдо рд╣реИ ... рдЖрдк mul!(C, A, B, ╬▒)
рдФрд░ mul!(C, ╬▒, A, B)
рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк mul!(C, ╬▒тВБ, A, ╬▒тВВ, B, ╬▒тВГ)
рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдм рддрдХ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдмрд╕реЗ рд▓рдЪреАрд▓реА рдЬреЗрдиреЗрд░рд┐рдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рдПрдкреАрдЖрдИ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред
рдПрдХ рдФрд░ рдЪрд┐рдВрддрд╛ рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрдЧрдгрдирд╛ рдЧреНрд░рд╛рдл рдирд┐рд╖реНрдкрд╛рджрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рдж рддрдХ рд╕реАрдорд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░-рдРрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рд╕рдВрдЧрдгрдирд╛ рдХрд░реНрдиреЗрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рддрдВрддреНрд░ рд╕реЗ рдЕрд▓рдЧ рдПрдХ рд╕рдВрдЧрдгрдирд╛ рдЧреНрд░рд╛рдл рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИ - рдЬрд┐рд╕реЗ рдмрд╛рд╣рд░реА рдкреИрдХреЗрдЬ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рдПрдкреАрдЖрдИ рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмреАрдПрд▓рдПрдПрд╕ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЬреЛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред
@Jutho
рдЗрд╕рд▓рд┐рдП рдХрдИ рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝реАрджрд╛рд░ рддрд░реАрдХреЗ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдСрд░реНрдбрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рд╕рдорд╕реНрдпрд╛ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐
mul!(Y,X1,X2,X3...)
рдЗрддрдиреА рдЙрдкрдпреЛрдЧреА рдЖрджрд┐рдо рдирд╣реАрдВ рд╣реИред
mul!
рд╕рдВрдЪрд╛рд▓рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЧреБрдгрди рдХреЗ рдХреНрд░рдо рдХреЛ рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬреЛ рдПрдХ рдЙрдкрдпреЛрдЧреА рд╕рдВрдкрддреНрддрд┐ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдереА, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ *
рдСрдкрд░реЗрд╢рди рдкрд╛рд░реНрд╕ рдХреЛ n-ary рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдФрд░ рдпрд╣реА рддрд░реНрдХ mul!
рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ , рдЖрдк рд╕рдВрднрд╡рддрдГ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рджреЗрдЦрднрд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рдХрд┐ рдЖрдк mul!
рд▓рд┐рдП рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдмрд╣рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдШреЛрдВрд╕рд▓рд╛ рдХрд╣рд╛рдБ рдЖрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЛ рдЧреБрджрдЧреБрджреА рд╕реЗ рдЧреБрдЬрд╛рд░рдирд╛ рдЙрддрдирд╛ рд╣реА рдХреБрд╢рд▓ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдЙрди рд╕рднреА рдХреЛ рддрддреНрдХрд╛рд▓ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ред
рдореИрдВ рджрдХреНрд╖рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рдерд╛, рдмрд▓реНрдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рдЪрд▓рд┐рдд рдФрд░ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХрд╛ рддрд░реАрдХрд╛ рднреА рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд▓рд┐рдирд┐рдпрд░рдПрд▓реНрдЬреЗрдмреНрд░рд╛ рдХреБрдЫ рдирд╛рдЬреБрдХ рд╣реИ (рдЬреЛ рдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреА рдореЗрд░реА рд╕рдордЭ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; рдХрднреА-рдХрднреА рдпрд╣ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░рддрд╛ рд╣реИ)ред рдореИрдВ рдиреЗрд╕реНрдЯреЗрдб рдЯрдкрд▓ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рд╡рд┐рдзрд┐ рдХрд╛ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╕рднреА рдкреЙрдЬрд┐рдЯрд┐рд╡ рддрд░реНрдХреЛрдВ рдХреЗ рдЯрдкрд▓ рдЯрд╛рдЗрдк рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдлреНрд▓реИрдЯ рдЯрдкрд▓ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рддрд░реНрдХ рдореЗрдВ рдПрдХ рдЯрдкрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдЯрдкрд▓ рд╣реИред
рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ _C = AB╬▒_ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, _╬▒AB_
рдореБрдЭреЗ рднреНрд░рдо рд╣реИ ... рдЖрдк
mul!(C, A, B, ╬▒)
рдФрд░mul!(C, ╬▒, A, B)
рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдореЗрд░реЗ рдХрд╣рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ "рд╣рдо рдХреЗрд╡рд▓ _C = AB╬▒_ рдХреЛ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ _C = AB_ рдХреЗ
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рддрдВрддреНрд░ рд╕реЗ рдЕрд▓рдЧ рдПрдХ рд╕рдВрдЧрдгрдирд╛ рдЧреНрд░рд╛рдл рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИ - рдЬрд┐рд╕реЗ рдмрд╛рд╣рд░реА рдкреИрдХреЗрдЬ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдмрд┐рд▓рдХреБрд▓ рдореЗрд░реА рдмрд╛рддред рдореИрдВ рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ (рдмреЗрд╢рдХ, рдпрд╣ рдкреВрд░рд╛ рдЙрджреНрджреЗрд╢реНрдп рдирд╣реАрдВ рд╣реИ)ред рдмрд╛рд╣рд░реА рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рд╕реНрдерд╛рди рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡реЗрд░рдЧ mul!
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд░реНрддрдорд╛рди mul!
рд▓рд┐рдП рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдбрд┐рд╕реНрдкреИрдЪ рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рдЯреВрдЯрд╛ рд╣реБрдЖ" рд╣реИ: SubArray
рдФрд░ Adjoint
рдЬреИрд╕реЗ рдХрдВрдкреЛрдЬреЗрдмрд▓ рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдУрд╡рд░рдмреНрд░рд┐рдЬ рдореЗрдВ рдПрдХ рдЬреБрдЭрд╛рд░реВ рд╡реГрджреНрдзрд┐ рд╣реИред
рд╕рдорд╛рдзрд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдФрд░ LazyArrays.jl рдХреЗ рдкрд╛рд╕ mul!
рд▓рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкреНрд░рдорд╛рдг рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ рдПрдкреАрдЖрдИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЕрдзрд┐рдХ рдЪрд░реНрдЪрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдореВрд╣ рдХреА рд╢рд░реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рдЯреБрдкрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИ: рдХреНрдпрд╛ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рд╣реИ? рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдк LazyArrays.jl рд╕рдорд╛рдзрд╛рди рдкрд░ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВред
рдореБрд▓! рдСрдкрд░реЗрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЧреБрдгрди рдХреЗ рдХреНрд░рдо рдХреЛ рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬреЛ рдПрдХ рдЙрдкрдпреЛрдЧреА рд╕рдВрдкрддреНрддрд┐ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдереА, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ * рдСрдкрд░реЗрд╢рди рдкрд╛рд░реНрд╕ рдХреЛ рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ n-ary рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдФрд░ рдпрд╣реА рддрд░реНрдХ mul рдкрд░ рдФрд░ рднреА рдЕрдзрд┐рдХ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ! рдпрджрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдВрднрд╡рддрдГ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рджреЗрдЦрднрд╛рд▓ рдХрд░реЗрдВрдЧреЗред
рд╡рд╣ *
n
рдкрд░реНрд╕ @tensoropt
рдореИрдХреНрд░реЛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TensorOperations.jl рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдХреБрдЪрди рдЖрджреЗрд╢ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдХрд┐ рдореБрдЭреЗ n
mul!
рд╕рдВрд╕реНрдХрд░рдг рдорд┐рд▓рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдо рдмрд┐рдВрджреБ рд╣реИ, рджрдХреНрд╖рддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдкрд░рд┐рдгрд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡-рдЖрд╡рдВрдЯрд┐рдд рдЬрдЧрд╣ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ, рдпрджрд┐ рд╕рднреА рдордзреНрдпрд╡рд░реНрддреА рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдЕрднреА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ рдФрд░ рдлрд┐рд░ gc'edред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, TensorOperations.jl рдореЗрдВ, рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдмрдбрд╝реЗ рдЕрд╕реНрдерд╛рдпреА рд▓реЛрдЧреЛрдВ рдХрд╛ рдЖрд╡рдВрдЯрди рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд╣рд╛рдВ рдЬреВрд▓рд┐рдпрд╛ рдХрд╛ gc рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреЛ рдЕрдХреНрд╕рд░ 50% рдХреЗ gc рд╕рдордп рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рдгреА рд╣реЛрддрд╛ рд╣реИ)ред
рдЗрд╕рд▓рд┐рдП, рдореИрдВ mul!
рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЖрджрд┐рдо рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░реВрдВрдЧрд╛ , рдЬреИрд╕рд╛ рдХрд┐ mul!
рд░реИрдкрд░ рдХреА рдХрдореА рд╣реИред рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЖрджрд┐рдо рдСрдкрд░реЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдХрд╛ рдкреНрд░рдорд╛рдг рд╣реИред
рдореИрдВ рддреБрдкрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдирд╛рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рд╕рдВрднрд╛рд╡рд┐рдд рднреНрд░рдо рдХреЛ рджреВрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ
рдХреЗрд╕ 4 рд╕реЗ рдХреЗрд╕ 2 рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди ╬▓тВБ = 1
рдФрд░ ╬▓тВВ = 1
(рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ true
) рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░, рдпрджрд┐ рди рддреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдЕрдЪрд╛рдирдХ ╬▓тВБ = ╬▓тВВ = 0
( false
) рд╣реИред рдЬрд╝рд░реВрд░, рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк mul!(Y, args...)
рд▓рд┐рдЦрддреЗ рд╣реИрдВ, mul!((Y,), args...)
ред рдЕрдВрдд рдореЗрдВ, рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рдмрд╛рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рдЗрд╕рд▓рд┐рдП рд╕рд╛рд░рд╛рдВрд╢ рдореЗрдВ, рдирд╣реАрдВ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдорд╛рди рд╣реИ рдЬрд┐рд╕реЗ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕рдВрднрд╡рддрдГ рдЕрдиреНрдп рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рднреА рдЗрд╕рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрд┐рд╕ рдЪреАрдЬ рдХрд╛ рдореИрдВ рд╡рд┐рд░реЛрдз рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ рдпрд╣ рдЪрд╛рд╣рддреА рд╣реИ рдХрд┐ рдореИрдЯреНрд░рд┐рдХ рдХреА рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЧреБрдгрди рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬреЛ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рддрд░реНрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рдЗрд╕рдХрд╛ рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред
@dlfivefifty : рд▓реЗрдХрд┐рди рдпрд╣ рдПрдкреАрдЖрдИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЕрдзрд┐рдХ рдЪрд░реНрдЪрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдореВрд╣ рдХреА рд╢рд░реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рдЯреБрдкрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИ: рдХреНрдпрд╛ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рд╣реИ? рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдк LazyArrays.jl рд╕рдорд╛рдзрд╛рди рдкрд░ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣рд╛рдБ рдкреВрд░реНрдг рдЖрд▓рд╕реА рдПрд░реЗрдЬрд╝ рдирд╣реАрдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА LazyArrays рд╣реИред рдЗрд╕ рдмреАрдЪ, рд╣рдореЗрдВ Y
рд╕реНрдХреЗрд▓рд┐рдВрдЧ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Tuples рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЙрд╕ рдЫреЛрдЯреА рдорд╛рддреНрд░рд╛ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓, рд╣рд▓реНрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЕрдиреНрдп рд╕реБрдЭрд╛рд╡ рд╣реИ? рд╣рдорд╛рд░реЗ рдкрд╛рд╕ lscale
рдФрд░ / рдпрд╛ rscale
╬▓тВБ
рдФрд░ ╬▓тВВ
рд▓рд┐рдП рдХреАрд╡рд░реНрдб рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реИ рдФрд░ рд╣рдо рдХреНрд╖рдорддрд╛ рдЦреЛ рджреЗрдВрдЧреЗ рдЙрд╕ рдкрд░ рдкреНрд░реЗрд╖рдг, рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫрд╛ рд╣реИред
@ рдЬреВрдереЛ : рдЗрд╕рд▓рд┐рдП, рдореИрдВ
mul!
рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЖрджрд┐рдо рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░реВрдВрдЧрд╛ , рдЬреИрд╕рд╛ рдХрд┐mul!
рд░реИрдкрд░ рдХреА рдХрдореА рд╣реИред
рдореИрдВ 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)
рдХрд┐рд╕ рд╣рдж рддрдХ? рдмреАрдПрд▓рдПрдПрд╕ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдЗрддрдиреА рднрд┐рдиреНрдирддрд╛ рдХреНрдпреЛрдВ рджреЗрдВ?
рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдЗрд░рд╛рджреЗ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдпрджрд┐ рдЗрд░рд╛рджрд╛ рдмрд╛рдИрдВ рдпрд╛ рджрд╛рдИрдВ рдУрд░ рдпрд╛ рджреЛрдиреЛрдВ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╣реИ, рддреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдп рдХрдорд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдЧреИрд░-рдХрдореНрдпреВрдЯреЗрдЯрд┐рд╡ рддрддреНрд╡ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд╕рд╣реА рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред
рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдЗрди-рдкреНрд▓реЗрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЬреЗрдо рдХреЛ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рддрд╛ рд╣реИ! рдЬреЗрдо рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди! рдЕрдиреНрдпрдерд╛, рдХреНрдпреЛрдВ рди рдХреЗрд╡рд▓ 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)))
рд▓рд┐рдЦрдиреЗ рджреЗрддрд╛ рд╣реИ, рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЬреЛрдбрд╝ рдФрд░ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рдХреА рд╡рд░реНрддрдиреА рдХрд╛ рдХреБрдЫ рддрд░реАрдХрд╛ рджреЛрдиреЛрдВ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рдФрд░ рд╣рдореЗрдВ BLAS рдХреЛ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗред рдпрджрд┐ рд╣рдо рд╕рднреА рдЗрд╕ рдкрд░ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рд▓реЛрдЧреЛрдВ рдХреЛ gemm!
рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдиреЗ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рд╣рд╛рдБ, рдпрд╣ рд╢рд╛рдпрдж рд╕рдЪ рд╣реИ; рдореИрдВрдиреЗ рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдХрд┐ рд╕реНрдХреЗрд▓рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдкреАрдЫреЗ рдЫреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдЖрд╕рд╛рдиреА рд╕реЗ рдЪреВрдХ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреБрдЫ @eval
metaprogramming рдХреЗ рд╕рд╛рде рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рднреА 32 рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрддрдирд╛ рд╣реА рдЕрдЪреНрдЫрд╛ рд╣реИред (рдзреНрдпрд╛рди рджреЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, mul
рди рдХреЗрд╡рд▓ gemm!
рдмрд▓реНрдХрд┐ gemv
рдФрд░ trmm
рдФрд░ ...) рднреА рд╣реИред
рдореБрдЭреЗ рдЬреЛрдбрд╝рдиреЗ рджреЗрдВ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ BLAS рдЖрд╡рд░рдг рдирд╣реАрдВ рд╣реИред Stdlib рдореЗрдВ рдЕрдиреНрдп рд╢реБрджреНрдз-рдЬреВрд▓рд┐рдпрд╛ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЕрддрд┐рднрд╛рд░рд┐рдд рдПрдкреАрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдкреИрдХреЗрдЬ рд▓реЗрдЦрдХ рдЕрдкрдиреЗ рд╡рд┐рд╢реЗрд╖ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП mul!
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░рд╛ рд░реБрдЦ рд╣реИ:
mul!(C, A, B, a, b)
рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВApplied
рдЬреИрд╕реЗ рдкреНрд░рд╕рд╛рд░рдг рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдкрд┐рдд рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬреВрд▓рд┐рдпрд╛ 2.0 рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде LazyArrays.jl рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛ рдЬреЛ рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред@dlfivefifty рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХреА рдмрд╣реБрд╡рд┐рдХрд▓реНрдкреА рдореЗрдВ рдХрдард┐рдирд╛рдИ mul!((Y, ╬▓), ╬▒, A, B)
рдПрдкреАрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд░рд╛рдмрд░ рд╣реИ mul!(Y, A, B, ╬▒, ╬▓)
? рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд░реИрдкрд░ рдХреЛ Transpose
рдорд╛рдирдиреЗ рд╕реЗ рдХрдард┐рдирд╛рдИ рдХрд╛ рдкрд░рд┐рдЪрдп рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ 2- рдФрд░ 3-рдЯреБрдкрд▓реНрд╕ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрдард┐рдирд╛рдИ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдмрдврд╝рд╛рдирд╛ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЯреНрдпреВрд▓ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ)ред
- рдЬрдм рд╕реЗ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА SparseArrays.jl рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рд╣рдо
mul!(C, A, B, a, b)
рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ mul!(C, A, B, a, b)
рдХрд╛ рдЕрд░реНрде C .= b*C + a*A*B
mul!(C, A, B, a, b)
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд┐рдирд╛ рдпрд╣ рд╕реЛрдЪреЗ рдХрд┐ рдЗрд╕ рдкрд░ рджреЛрдЧреБрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рддреЛ mul!
рдХреА рдпрдерд╛-рд╕реНрдерд╛рди рд╕рдВрд╕реНрдХрд░рдг рд╣реИ *
рддреЛ рдореИрдВ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ mul!(out, args...)
рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдорддрд▓рдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ out .= *(args...)
ред рд╕рдЪ рдХрд╣реВрдБ рддреЛ, рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рд╕реЛрдЪрд╛ рдЧрдпрд╛, рдЕрд╕рдВрдЧрдд рдПрдкреАрдЖрдИ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рдореМрдЬреВрдж рд╣реИред mul!
рдлрд╝рдВрдХреНрд╢рди SparseArrays
_and_ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЧреИрд░-рдХрд▓реНрдкрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рд▓реБрднрд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕рдВрднрд╡ рдХрд╛рд░рдг рд╣реИ рдЬреЛ рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди wasn 'рдЯреА рдкрдмреНрд▓рд┐рдХ! рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдо рдЙрд╕ рдЧрд▓рддреА рдХреЛ рдкреВрд░реНрд╡рд╡рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп mul!
рдХреА рдЙрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред
рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рд╣рд┐рддрдзрд╛рд░рдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд╛рд╣рд░ рд▓рдХреНрд╖рдг рдФрд░ / рдпрд╛ рдЖрд▓рд╕реНрдп рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЪреАрдЬреЗрдВ рд╣рдЯрд╛рдирд╛ рд╣рдореЗрд╢рд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рд╣рд┐рддрдзрд╛рд░рдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд╛рд╣рд░ рд▓рдХреНрд╖рдг рдФрд░ / рдпрд╛ рдЖрд▓рд╕реНрдп рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЪреАрдЬреЗрдВ рд╣рдЯрд╛рдирд╛ рд╣рдореЗрд╢рд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ рд╣реИред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдереЛрдбрд╝рд╛ рддрдВрдЧ рдЖ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рд╕рд╣реА рд╣реИред рдпрджрд┐ рдЖрдк рдЖрд╢реНрд╡рд╕реНрдд рд╣реИрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╕реБрдЭрд╛рд╡ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдХреЗрд▓реЗрдмрд▓ рд╣реИ рдФрд░ рдлрд┐рд░ рднреА рдкреИрдХреЗрдЬ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рдХрд╛рд░ (рдЬреИрд╕реЗ @tkf рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд) рдХреЗ рд▓рд┐рдП рдЙрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░ рд╕рдХреЗрдВ, рддреЛ рдпрд╣ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ред рдЖрдЧреЗред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЬ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдХреЗрд╡рд▓ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
mul!((╬▓тВБ, Y::MyVecOrMat, ╬▓тВВ), ╬▒тВБ, A::MyMat, ╬▒тВВ, B:: MyVecOrMat, ╬▒тВГ)
рдФрд░ рд╢рд╛рдпрдж, рдЬреИрд╕реЗ,
mul!((╬▓тВБ, Y::MyVecOrMat, ╬▓тВВ), ╬▒тВБ, A::Adjoint{<:MyMat}, ╬▒тВВ, B:: MyVecOrMat, ╬▒тВГ)
...
рдЬрдмрдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рдмреЗрд╕ (рдпрд╛ рдмрд▓реНрдХрд┐, рд░реИрдЦрд┐рдХрдЕрд▓рдмреНрд░реЗ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп) рд╕рднреА рдЪреВрдХ рдореВрд▓реНрдпреЛрдВ рдЖрджрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрддрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЬ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдХреЗрд╡рд▓ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
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}
) рдХреЗ рд▓рд┐рдП mul!((Y, ╬▓), ╬▒::Diagonal, A, B)
рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ред (рдпрд╣ рдореЗрд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред) рдмреЗрд╢рдХ, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдореЗрдВ рдЖрдЧреЗ рдХреА рдЪрд░реНрдЪрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдлрд┐рд░ рднреА, рдПрдкреАрдЖрдИ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд╣рд╛рди рд╣реИред
рдпрджрд┐ рдХреЛрдИ рд╡рд┐рдзрд┐ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдЪрд┐рдВрддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рддреЛ рдореИрдВ рд╕рдореВрд╣-рджрд░-рдЪрд░рдг рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рд░рд╣реВрдВрдЧрд╛ред
рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ╬▒ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╕реНрдерд╛рди рдмрдбрд╝реЗ рдУ рд╕рдордп рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдпрд╣ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рд░рд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ? рдореИрдВ рдХрд╛рдлреА рддрд░реНрдХ рдирд╣реАрдВ рджреЗрддрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдШрдиреЗ рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдЖрдк рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ ╬▒
A
рдФрд░ B
?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЬ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдХреЗрд╡рд▓ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ...
рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ рдЬреЛ рдПрдХ рд╕реНрдЯреНрд░реЗрдВрдбреЗрдб рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдмреНрд▓реЙрдХрдЕрд░реНрд╕реЗрдЬ.рдЬреНрд▓ рд╕реЗ PseudoBlockMatrix
ред рдкреВрд░реА рддрд░рд╣ рд╕реЗ gemm!
рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ PseudoBlockMatrix
рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рдордЪрдп рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (1) рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рде, (2) StridedMatrix
, (3) Adjoint
рд╕реНрд╡рдпрдВ рдХреЗ , (4) Transpose
s, (5) Adjoint
рдХрд╛ StridedMatrix
, (6) Transpose
s рдХрд╛ StridedMatrix
, рдФрд░ рд╕рдВрднрд╡рддрдГ рдЕрдиреНрдпред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 6 ^ 3 = 216 рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдпреЛрдЬрди рд╣реИред рдлрд┐рд░ рдЖрдк trmm!
рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ UpperTriangular
, UnitUpperTriangular
, рдЙрдирдХреЗ рдкрд╛рд╕, рдЙрдирдХреЗ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рддрдм gsmm!
Symmetric
рдФрд░ Hermitian
ред
рд▓реЗрдХрд┐рди рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╣рдо рд╕рд┐рд░реНрдл рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рднреА, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмреНрд▓реЙрдХ рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рд╣рдо рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЕрдм рд╣рдореЗрдВ рдКрдкрд░ рджрд┐рдП рдЧрдП 6 рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рдо рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдЬрд╛рд░реЛрдВ рдУрд╡рд░рд░рд╛рдЗрдб рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ StridedMatrix
, рдЬреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рд╣реИред рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ, using
рд╕рдордп рд╕реЗрдХрдВрдб рдХреЗ рдмрдЬрд╛рдп рдорд┐рдирдЯреЛрдВ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдХреЛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ mul!
, рдФрд░ mul!
рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ
рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдореЗрдВ @StefanKarpinski рдХреЗ рд╕рд╛рде рд╕рд╣рдордд рд░реАрдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдкреАрдЫрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдХрд┐рд╕реА рдЪреАрдЬ рдкрд░ рдЦрд░реНрдЪ рдХрд░рдирд╛ рдХрд┐рд╕реА рдХреЗ рд╕рдордп рдХрд╛ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реИред
@ рдбреЙрд▓рд┐рд╡реЗрдлрд┐рдлреНрдЯреА , рдореИрдВ рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╕реНрдХреЗрд▓рд░ рдХреЗ рддрд░реНрдХ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рд╕рднреА рдЬрдЯрд┐рд▓рддрд╛рдПрдВ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ mul!(C,A,B)
рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд░рд╣реЗрдЧреАред
рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ╬▒ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╕реНрдерд╛рди рдмрдбрд╝реЗ рдУ рд╕рдордп рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдпрд╣ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рд░рд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ? рдореИрдВ рдХрд╛рдлреА рддрд░реНрдХ рдирд╣реАрдВ рджреЗрддрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдШрдиреЗ рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдЖрдк рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ
╬▒
A
рдФрд░B
?
@ рдЬреВрдереЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдЖрдк рдЖрдВрддрд░рд┐рдХ рд╕рдмрд╕реЗ рдкрд╛рд╢ рд╕реНрдерд┐рддрд┐ рдореЗрдВ ╬▒
рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрддреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк ╬▒тВБ*A*B*╬▒тВГ
рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди A*╬▒тВВ*B
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо ╬▒тВБ
рдпрд╛ ╬▒тВВ
╬▒тВБ*A*╬▒тВВ*B*╬▒тВГ
рд╣реЛрдиреЗ рдХреЗ 1
рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝рддреА рд╣реБрдИ рд╡рд┐рд╖рдорддрд╛ рд╕рдордп рдХреА рдЬрдЯрд┐рд▓рддрд╛ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред
@dlfivefifty рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ LazyArrays.jl рдХреЛ рдкреНрд░реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЖрджрд┐рдо рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ "рдкреНрд░реЗрд╖рдг рдирд░рдХ" рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЧрдгрдирд╛ "рдЧреБрдард▓реА" рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЛрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдореА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдирд╣реАрдВ, рд╡рд╣рд╛рдБ рдХреЛрдИ "рдЖрджрд┐рдо" рдирд╣реАрдВ рд╣реИ рдЙрд╕реА рддрд░рд╣ Broadcasted
рдореЗрдВ "рдЖрджрд┐рдо" рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╣рд╛рдБ рдлрд┐рд▓рд╣рд╛рд▓ рдпрд╣ "рдХрд░реНрдиреЗрд▓" рд╕рд╡рд╛рд▓ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓рд╛ рдХрджрдо рдПрдХ рдЖрд▓рд╕реА Applied
рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде ApplyStyle
ред рддрдм BLAS рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП MulAddStyle
рд╣реЛ рд╕рдХрддреЗ рдереЗ, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред
рдореИрдВ materialize!
рдпрд╛ copyto!
рдПрдХ рдЖрджрд┐рдо рдХрд╣реВрдВрдЧрд╛ред рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдкреНрд░рд╕рд╛рд░рдг рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рд╣реИред рдЗрд╕реА рддрд░рд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ LazyArrays.jl рдХреЛ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЫреЛрд░реЛрдВ рдпрд╛ ccall
s рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЖрд▓рд╕реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛? рдЕрдЧрд░ рдРрд╕реЗ рдлрдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо mul!
рд╣реЛ рддреЛ рдмреБрд░рд╛ рд╣реЛрдЧрд╛?
рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ рдЬреЛ рдПрдХ рдмреНрд▓реЙрдХ рдХрд┐рдП рдЧрдП рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдмреНрд▓реЙрдХрдСрд░реЗрд╕.рдЬреЗрдПрд▓ рд╕реЗ PseudoBlockMatrixред рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░рддреНрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП! рд╣рдореЗрдВ (1) рд╕реНрд╡рдпрдВ, (2) рд╕реНрдЯреНрд░реИрдбрдордореИрдЯреНрд░рд┐рдХреНрд╕, (3) рд╕реНрд╡рдпрдВ рдХреЗ, (4) рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ, (5) рд╕реНрдЯреНрд░реИрдбрдордореЗрдЯреНрд░рд┐рдХреНрд╕, (6) рд╕реНрдЯреНрд░реИрдбрдордореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ, рдФрд░ рд╕рдВрднрд╡рддрдГ рджреВрд╕рд░реЛрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде PseudoBlockMatrix рдХреЗ рд╣рд░ рдХреНрд░рдорд╛рдВрдХ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред ред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 6 ^ 3 = 216 рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдпреЛрдЬрди рд╣реИред рддрдм рдЖрдк рдЯреНрд░рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ! рдФрд░ рдЖрдкрдХреЛ рдЕрдкрд░рдЯреНрд░реИрдВрдЧреБрд▓рд░, рдпреВрдирд┐рдЯрдЕрдкрдкрд░ рдЯреНрд░рд╛рдЗрдВрдЧреБрд▓рд░, рдЙрдирдХреЗ рдПрдбрдЬреЙрдЗрдВрдЯреНрд╕, рдЙрдирдХреЗ рдЯреНрд░рд╛рдВрдЬрд╝реЛрдЬрд╝ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред рдлрд┐рд░ gsmm! рд╕рдордорд┐рдд рдФрд░ рд╣рд░реНрдорд┐рдЯрд┐рдпрди рдХреЗ рд╕рд╛рдеред
рд▓реЗрдХрд┐рди рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╣рдо рд╕рд┐рд░реНрдл рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рднреА, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмреНрд▓реЙрдХ рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рд╣рдо рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЕрдм рд╣рдореЗрдВ рдКрдкрд░ рджрд┐рдП рдЧрдП 6 рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рдо рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдЬрд╛рд░реЛрдВ рдУрд╡рд░рд░рд╛рдЗрдб рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕реНрдЯреНрд░реЗрдбрдореИрдЯрд┐рдХреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рд╣реИред рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕реЗрдХрдВрдб рдХреЗ рдмрдЬрд╛рдп рдорд┐рдирдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред
рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди StridedArray
рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдШ рдПрдХ рдкреНрд░рдореБрдЦ рдбрд┐рдЬрд╛рдЗрди рджреЛрд╖ рд╣реИред рдореИрдВрдиреЗ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдЖрдкрдХреЗ рдкреНрд░рдпрд╛рд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ред
рдЬрдм рдореИрдВ рд╕рднреА рдореИрддреНрд░рд┐рдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ, рддрдм рдХреЗрд╡рд▓ mul!
рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдкрд░, рдореИрдВ рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ (Abstract)StridedView
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВ, рдЬрдм рднреА рдП, рдмреА рдФрд░ рд╕реА рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХреБрдЫ рдорд┐рд▓рд╛рд╡рдЯ рд╣реЛрддреА рд╣реИ, рдореИрдВ рдЬреВрд▓рд┐рдпрд╛ рдЖрдзрд╛рд░ / рд░реЗрдЦреАрдпрдПрдмреНрд▓реЗрдЬ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдпрд╣ @strided
рдореИрдХреНрд░реЛ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рдЬреЛ рд╕рднреА рд╕рдВрднрд╡ рдмреЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ StridedView
рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ, StridedView
рд╕рдм, рд╕рдорд╛рди (рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ) рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░, рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рд╕рд╣рд╛рдпрдХ, рдФрд░ рдХреБрдЫ рдлреЗрд░рдмрджрд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдкреВрд░реНрдг рдЧреБрдгрди рдХреЛрдб рд▓рдЧрднрдЧ 100 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ:
https://github.com/Jutho/Strided.jl/blob/master/src/abbridstridedview.jl#L46 -L147
рдореВрд▓ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ BLAS рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЙрд╕ рдкреИрдХреЗрдЬ рджреНрд╡рд╛рд░рд╛ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдП рдЧрдП рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп mapreducedim!
рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ LinearAlgebra
рдореЗрдВ рдПрдХ рд╕реЗ рдХрдо рдХреБрд╢рд▓ рдирд╣реАрдВ рд╣реИ; рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдмрд╣реБрдЖрдпрд╛рдореА рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо
╬▒тВБ
рдпрд╛╬▒тВВ
╬▒тВБ*A*╬▒тВВ*B*╬▒тВГ
рдореЗрдВ рд╡рд┐рд╖рдорддрд╛рдкреВрд░реНрдг рд╕рдордп рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдмрдврд╝рд╛рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП 1 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
@tkf , рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпреЗ рд╕реНрдХреЗрд▓рд░ рдЧреБрдгрд╛рдВрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди one(T)
, рдпрд╛ рдмреЗрд╣рддрд░ рдЕрднреА рддрдХ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ true
, рдирд┐рд░рдВрддрд░ рдкреНрд░рдЪрд╛рд░ рдФрд░ рд╕рдВрдХрд▓рдХ рдЕрдиреБрдХреВрд▓рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рдЧреБрдгрди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдВрдЧреЗред рдЖрдВрддрд░рд┐рдХ рд╕рдмрд╕реЗ рдкрд╛рд╢ рдореЗрдВ рдЬрдм рдпрд╣ рдПрдХ рд╕реЗрд╢рди рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрднреА рднреА рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо 1
( true
) рджреНрд╡рд╛рд░рд╛ рд╕рднреА рдЧреБрдгрд╛рдУрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдкреНрд░рд╕рд╛рд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, eltype Matrix
рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ true * x
(рдЬрд╣рд╛рдВ x::Matrix
) рдХреЛ x
рдвреЗрд░-рдЖрд╡рдВрдЯрд┐рдд рдкреНрд░рддрд┐ рдмрдирд╛рдирд╛ рд╣реИред рдХреНрдпрд╛ рдЬреВрд▓рд┐рдпрд╛ рдЙрд╕реЗ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЬрд╛рджреВ рдХрд░ рд╕рдХрддреА рд╣реИ?
@ рдЬреВрдереЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдордзреНрдпрд╡рд░реНрддреА рдЧреБрдгрд╛ рдХреЛ рдЦрддреНрдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА:
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
рд╕рд┐рдВрдЧрд▓рдЯрди рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕рд┐рд░реНрдл *(::One, x::Any) = x
рдФрд░ *(x::Any, ::One) = x
рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдм рдХрднреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рддрдм рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди, рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо ╬▒тВВ
, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ 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]
рд╕реНрд╡реИрдк рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдкреИрдХреЗрдЬ рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмреЛрдЭ рд╣реИред
рдпрд╣ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдЖрдк mul!(Y, ╬▒ * I, A, B)
рддрдм рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм A
рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕-рдСрдл-рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ рдФрд░ ╬▒
рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ рдЬрд┐рд╕реЗ eltype
рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП A
ред
(реи) рд╢рд╛рдпрдж рдЙрдкрд░реЛрдХреНрдд рдорд╛рд░реНрдЧ (рез) рдЕрднреА рднреА рдЬрдЯрд┐рд▓ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдЕрдм рдХреЗ рдмрдЬрд╛рдп 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!
ред
... рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рд╕рдордп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ "triage рдХрд╣рддреЗ рд╣реИрдВ ..." рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ?
рд╕рд╛рде рд╣реА, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ рдХрд┐ рдЗрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рд▓рд┐рдЦрд╛ рдФрд░ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдпрд╣ рддрдереНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЗрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ mul!
рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдкрд░ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдкреНрд░реЗрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рдж рдХреБрдЫ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рд╕рдлрд╛рдИ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдпрд╣
mul!
рд╡рд┐рдзрд┐ рд╣реИ
рдЕрдЧрд░ рд╣рдо mul!(C, A, B, ╬▒, ╬▓)
рддреЛ рдЗрд╕реЗ mul!((╬▓тВБ, Y, ╬▓тВВ), ╬▒тВБ, A, ╬▒тВВ, B, ╬▒тВГ)
рдФрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рддрд╛ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред (рд╢рд╛рдпрдж рдпрд╣ рдПрдХ "рд╡рд┐рд╢реЗрд╖рддрд╛" рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕ рдЪрд░реНрдЪрд╛ рд╕реЗ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдореБрдХреНрдд рд╣реИрдВ: рдореБрд╕реНрдХрд╛рди :)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ Number
_and_ рдХреЛ рд╡рд░реНрддрдорд╛рди 3-arg mul!
(рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреИрд░- Number
рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдкреЗрд╢ рдХрд░реЗрдЧрд╛ рджреЛрд╣рд░рд╛рд╡ рдХрд╛ред
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдк mul!((╬▓тВБ, Y, ╬▓тВВ), ╬▒тВБ, A, ╬▒тВВ, B, ╬▒тВГ)
рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ ... рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред
рдЯрдХреНрдХрд░ред рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рдЬрдЧрд╣ BLAS рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрдЭреЗ рджреБрдЦреА рдХрд░рддрд╛ рд╣реИред
@StefanKarpinski рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдпрд╛рддреНрд░рд╛ рдореЗрдВ рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ?
рд╣рдо рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЙрд▓ рдкрд░ рдХреБрдЫ рд▓реАрдирд┐рдЧ рд▓реЛрдЧреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЬреЛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЖрдо рддреМрд░ рдкрд░ рдЗрди рджрд┐рдиреЛрдВ рдирд╣реАрдВ рд╣реИрдВред рдлреНрд░реИрдВрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдФрд░ рд╣рд░ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрднреА рдмрд╣реБрдд рдХреБрдЫ рджреЗрдЦрдирд╛ рд╣реИ рдЗрд╕ рдмрд┐рдВрджреБред рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдкрд░реНрдпрд╛рдкреНрдд рдХреНрдпреЛрдВ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рдЙрддреНрдкрд╛рджрдХ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдЕрдиреНрдпрдерд╛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рдмрд╣реБрдд рдХреБрдЫ рдХрд░ рдкрд╛рдПрдВрдЧреЗред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рдХреА рдХрдореА рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдЯреИрдбрд▓рд┐рдм рдореЗрдВ рдЗрд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рд╕рдордп рдирд╣реАрдВ рд╣реИред
рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╕рд┐рд░реНрдл рдПрдХ рдкреИрдХреЗрдЬ MatMul.jl рдЬреЛ рдЙрди рд╕реБрдЭрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ StdLib рдореЗрдВ рд╣реЛрдирд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВ рд╣реИред рдореИрдВ рдЙрди рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рдЦреБрд╢реА рд╕реЗ рд╕рдорд░реНрдерди рдХрд░реВрдВрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реВрдВред
рдореИрдВ рдордгрд┐ рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рдЕрдЪреНрдЫрд╛ рдЬреВрд▓рд┐рдпрди рд╕рдВрд╕реНрдХрд░рдг рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ! рдФрд░ рд░рддреНрди! SparseArrays рдореЗрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ, рдЙрд╕рдХрд╛ рдорд┐рд▓рд╛рди рдХрд░рдирд╛ред рдкреНрд░рддрд┐ @andreasnoack рдКрдкрд░:
рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
╬▒
,╬▓
рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рдеmul!(C, A, B, ╬▒, ╬▓)
рдкрд░ рдмрд╕ рдЧрдПред рд╣рдо рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВрдЬреВрд▓рд┐рдпрд╛ / stdlib / SparseArrays / src / linalg.jl
рдмреА 32 рдП 4 рдореЗрдВ 32 рд╕реЗ 50 рддрдХ
...
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдкреИрдХреЗрдЬ рднреА рдЗрд╕ рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рдХреМрди рд╕рд╛ рд╣реИред
рдЙрд╕ рд╕реБрдЭрд╛рд╡ рдореЗрдВ 7 рдЕрдВрдЧреВрдареЗ рдереЗ рдФрд░ рдХреЛрдИ рдЕрдВрдЧреВрдареЗ рдиреАрдЪреЗ рдирд╣реАрдВ рдерд╛ред рд╣рдо рдШрдиреЗ рд╡реИрдХреНрдЯрд░ / рдореЗрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ? рдпрд╣ рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ рдЬреЛ рд╕рдмрд╕реЗ рдЖрдо рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ?
рдареАрдХред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдо рд╕рд╣рдорддрд┐ рдирд╣реАрдВ рд╣реИ рддреЛ рднреА рдЖрдо рд╕рд╣рдорддрд┐ рдирд╣реАрдВ рд╣реИ: рдкрд╕реАрдирд╛_рд╕рд╛рдордиреЗ:
_I_ рдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рд╣рд░ рдХреЛрдИ [*] рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рдмрд╛рдд рд╣реИред _Not_ рдХреЗ рдкрд╛рд╕ рдЗрд╕ API рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рд╣рд░ рдХреЛрдИ рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд▓реНрдк рд╕реЗ рдЦреБрд╢ рд╣реИ ( mul!((╬▓тВБ, Y, ╬▓тВВ), ╬▒тВБ, A, ╬▒тВВ, B, ╬▒тВГ)
, muladd!(C, A, B, ╬▒, ╬▓)
, рдФрд░ mul!(C, A, B, ╬▒, ╬▓)
)ред рдЬрдм рддрдХ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдпрд╣ рддрд░реНрдХ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдПрдкреАрдЖрдИ _not_ рдХреЗ рд╣реЛрдиреЗ рд╕реЗ рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реИ, рдореИрдВ рдЬреЛ рдХреБрдЫ рднреА рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдЦреБрд╢ рд░рд╣реВрдВрдЧрд╛ред
@StefanKarpinski рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪрд░реНрдЪрд╛ рдЕрднреА рддрдХ рд╕рдореЗрдХрд┐рдд рдирд╣реАрдВ рд╣реБрдИ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ triage
рдЯреИрдЧ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред
[*] рдареАрдХ рд╣реИ, @dlfivefifty , рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╡рд░реНрддрдорд╛рди 3-arg mul!
рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕рдВрджрд┐рдЧреНрдз рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реИрдЪ рд╕реЗ 3-arg mul!
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ (рдЬреЛ, рдореИрдВ _adding_ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ 5-arg рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рдХреБрдЫ рд░реВрдк рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ LazyArrays.jl рдкрд░рд┐рдкрдХреНрд╡ рд╣реЛрдиреЗ рддрдХ "рдкрд░реНрдпрд╛рдкреНрдд" рдХрд╛рдо рдХрд░реЗред
рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╕рд┐рд░реНрдл рдПрдХ рдкреИрдХреЗрдЬ MatMul.jl рдЬреЛ рдЙрди рд╕реБрдЭрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ?
@dlfivefifty рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ LinearAlgebra.jl рдореЗрдВ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд╝рдВрдХреНрд╢рди (рдЕрдзрд┐рднрд╛рд░ рдПрдкреАрдЖрдИ) рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдХреНрдпреЛрдВрдХрд┐ 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 рдкрд░ рдореЗрд░рд╛ рд╕рд╛рд░рд╛рдВрд╢ рд╣реИред (рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рднреА рджреЗрдЦреЗрдВ)
рдЯреНрд░рд╛рдЗрдПрдЬ рд╕реЗ: рдЬреЗрдиреЗрд░рд┐рдХ рдЯреЗрдВрд╕рд░ рдХреЙрдиреНрдЯреНрд░рд┐рдмреНрдпреВрд╢рди API рдХреА рд▓реЙрдиреНрдЧ рдЯрд░реНрдо рдкреНрд▓рд╛рдирд┐рдВрдЧ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдкреЛрд░реНрдЯ рдФрд░ BLAS рд╕реЗрд▓реЗрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореАрдбрд┐рдпрдо рдЯрд░реНрдо рдХреЗ рд▓рд┐рдП, рдЬреЛ рднреА API рдЖрдкрдХреА рддрддреНрдХрд╛рд▓ рдЬрд░реВрд░рдд рдХрд╛ рдкрддрд╛ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рдЪреБрдиреЗрдВред рдпрджрд┐ рдпрд╣ BLAS рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ BLAS рдирд╛рдо рдЪреБрдирдирд╛ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред
@ рдХреЗрдиреЛ , рдХреЛрдИ рднреА рдЬрд╛рдирдХрд╛рд░реА рдЬреЛ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдЯреЗрдВрд╕рд░ рд╕рдВрдХреБрдЪрди рдПрдкреАрдЖрдИ рдФрд░ рд╕рдВрдХрд▓рдХ рд╕рдорд░реНрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореЗрд░реЗ рдкрд╛рд╕ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ (рдЕрднреА рддрдХ) рдирд╣реАрдВред
рдХреЛрдИ рднреА рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдмрд╕ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдЪрд┐рдд рдЬрдВрдХреНрд╢рди рдкрд░ рдПрдХ рдбрд┐рдЬрд╛рдЗрди рд╕рддреНрд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рдЕрднреА рддрдХ рд╡рд╣рд╛рдВ рд╣реИрдВред
рдпрджрд┐ рдпрд╣ BLAS рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ BLAS рдирд╛рдо рдЪреБрдирдирд╛ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред
рдЬреЗрдиреЗрд░рд┐рдХ рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрдм рддрдХ рдЬреЛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рдкрд░реАрдд рд╣реИред
рдХреНрдпрд╛ рдордЬрдмреВрдд / рдХрдордЬреЛрд░ рдХреЗ рд▓рд┐рдП рдпреЛрдЬрдирд╛ рд╣реИ ╬▓ == 0
рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ BLAS.gemm!(╬▒, A, B, ╬▓, C)
?
рдЕрдЧрд░ рд╣рдо BLAS
рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдПрдХ рдордЬрдмреВрдд рд╢реВрдиреНрдп рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛, рднрд▓реЗ рд╣реА рдпрд╣ рдЕрдм lmul!
рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реЛред рдореИрдВ generic_muladd!
╬▓ == 0
рд╡рд╛рдкрд╕ рдЧрд┐рд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ред
рдордЬрдмреВрдд / рдХрдордЬреЛрд░ 0 == 0 рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдпреЛрдЬрдирд╛ рд╣реИ
рдпрд╣ рдХреЗрд╡рд▓ https://github.com/JuliaLang/julia/issues/23919#issuecomment -430139849 рдореЗрдВ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереА, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдЙрд╕ рдкреНрд░рд╢реНрди рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ред
@Keno рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЕрднреА рддрдХ рдХреЛрдИ API рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ "рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдорд░реНрдерди рдФрд░ BLAS рдХреЗ рд▓рд┐рдП рдЪрдпрди рд╕рд╣рд┐рдд API" рдХреЛ рдореНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдпрд╣ XLA рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рдХреА рддрд░рд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ? Ie рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ mul!
рдФрд░ / рдпрд╛ muladd!
рдРрд╕реЗ API рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдВрдЧреЗ?
@andreasnoack 'рдХреЗ рд▓рд┐рдП рдкрд┐рдВрдЧ @Keno рдореЗрдВ рд╕рд╡рд╛рд▓ рд╣реИ https://github.com/JuliaLang/julia/issues/23919#issuecomment -+рекрен,релрел,рейрек,рекрелрек
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░рд╛ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХрд╛ рдерд╛ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдореИрдВрдиреЗ рдЯреНрд░рд╛рдЗрдПрдЬ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдерд╛) рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдЯреНрд░рд╛рдЗрдПрдЬ рд╕реЗ рдЖрдЧреЗ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреНрдпрд╛ рд╣реЛрдЧреАред
рдпрджрд┐ рдпрд╣ BLAS рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ BLAS рдирд╛рдо рдЪреБрдирдирд╛ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ @andreasnoack рдиреЗ рдмрддрд╛рдпрд╛, рд╣рдо gemm!
( gemm!
рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдореИрдЯреНрд░рд┐рдХреНрд╕-рд╡реЗрдХреНрдЯрд░ рдЧреБрдгрди рдЖрджрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рдЯреНрд░рд╛рдЗрдПрдЬ рдирд┐рд░реНрдгрдп рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреЛ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ "рдпрджрд┐ рдпрд╣ BLAS рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ" рдпрд╣ рдирд╣реАрдВ рд╣реИ)ред
рдЬреЛ рднреА рдПрдкреАрдЖрдИ рдЖрдкрдХреА рддрддреНрдХрд╛рд▓ рдЬрд░реВрд░рдд рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдмрд╕ рдЙрд╕реЗ рдЪреБрдиреЗрдВред
рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рджрд┐рд╢рд╛ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ @StefanKarpinski рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдЯрдкрд▓-рдЖрдзрд╛рд░рд┐рдд рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдиреЗ рдХрд╛ mul!
muladd!
addmul!
muladd!
mul!
ред
рд╣рдо рдореВрд▓ рдЪрд░реНрдЪрд╛ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдзрд╛ рд╣реИред
рдХреЛрдИ рднреА рд╡рд┐рдЪрд╛рд░ mul!
/ muladd!
/ addmul!
рдХреИрд╕реЗ рдЪреБрдирд╛ рдЬрд╛рдП?
@chriscoey рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреЗ рдПрдкреАрдЖрдИ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдпрд╣ рдореБрджреНрджрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реБрдкрд░ рд▓рдВрдмрд╛ рд╣реИ рдФрд░ рд╣рдо рддрдм рддрдХ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдордзреНрдпрд╛рд╡рдзрд┐ рд╕рдорд╛рдзрд╛рди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗред рдХреИрд╕реЗ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ (рдпрд╛ рдкреНрд░рд╡рдЪрди рдзрд╛рдЧрд╛) рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ?
рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЕрдм рд╕реЗ 10 рджрд┐рдиреЛрдВ рдХреА рд╕рдордпрд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рдЕрдиреБрдореЛрджрди рдорддрджрд╛рди рдХрд╛ рдПрдХ рджреМрд░ред рд╕реНрд╡реАрдХреГрддрд┐ рдорддрджрд╛рди рдХрд╛ рдЕрд░реНрде рд╣реИ: рд╕рднреА рд▓реЛрдЧ рдЙрди рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдорддрджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╡реЗ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдорд╛рдирддреЗ рд╣реИрдВред рд▓реЛрдЧ, рдЬреЛ рдирд┐рд░рдВрддрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рдмрдЬрд╛рдп рдЕрдм рдЕрдкрдирд╛ рдХрдо рд╕реЗ рдХрдо рдкрд╕рдВрджреАрджрд╛ рдирд╛рдо рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреЛ рддреАрдиреЛрдВ рдХреЛ рд╡реЛрдЯ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рд╡реНрдпрд╛рдкрдХ рд╕реНрд╡реАрдХреГрддрд┐ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдорддрджрд╛рди рдпреЛрдЬрдирд╛ рд╕реНрд╡рдпрдВ рд╡реНрдпрд╛рдкрдХ рдЕрдиреБрдореЛрджрди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦрдиреА рдЪрд╛рд╣рд┐рдПред рд╕реНрд╡реАрдХреГрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмреАрдЪ рд▓рдЧрднрдЧ рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, @tkf рдХреЛ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рд╣реИ (PR рд▓реЗрдЦрдХ рдХрд╛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░)ред
+1: рдореИрдВ рдЗрд╕ рдорддрджрд╛рди рдпреЛрдЬрдирд╛ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдФрд░ рдЕрдкрдиреЗ рдЕрдиреБрдореЛрджрди рдХреЗ рд╡реЛрдЯ рдбрд╛рд▓реЗ рд╣реИрдВред
-1: рдореИрдВ рдЗрд╕ рдорддрджрд╛рди рдпреЛрдЬрдирд╛ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВред рдпрджрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдпрд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓реЛрдЧ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЛрдЯ рдореВрдХ рд╣реИред
рджрд┐рд▓: mul!
рдирд┐рд░рдВрддрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред
рд░реЙрдХреЗрдЯ: muladd!
рдирд┐рд░рдВрддрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред
рд╣реБрд░реНрд░реЗ: addmul!
рдирд┐рд░рдВрддрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред
рдореИрдВ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ 75% рдЕрдиреБрдореЛрджрди рдФрд░ 5 рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдХреЛрд░рдо (рдпрд╛рдиреА 75% рд▓реЛрдЧреЛрдВ рдХреЛ рд╡реЛрдЯ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдорддрджрд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЕрд╕рд╣рдорддрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рдХрдо рд╕реЗ рдХрдо 5 рд▓реЛрдЧреЛрдВ рдиреЗ рдЬреАрддрдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдордВрдЬреВрд░реА рджреА рд╣реИ; рдпрджрд┐ рднрд╛рдЧреАрджрд╛рд░реА рдХрдо рд╣реИ; , рддреЛ 5/6 рдпрд╛ 6/8 рдХреЛрд░рдо рдмрдирд╛рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рд╕реЗ 4/4 рдХреЛ рдЕрд╕рдлрд▓ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
1.3 рдХреЗ рд▓рд┐рдП рдлрд╝реАрдЪрд░ рдлреНрд░реАрдЬ 15 рдЕрдЧрд╕реНрдд рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реИ: https://discourse.julialang.org/t/release-1-3-branch-date-approaching-aug-15/27233?u=chriscoeyред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рддрдм рддрдХ рд╡рд┐рд▓рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ it рдЙрди рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдорддрджрд╛рди рдХрд┐рдпрд╛ рд╣реИ!
рд╣рдореЗрдВ рдЕрднреА рднреА ╬▓ == 0
https://github.com/JuliaLang/julia/issues/23919#issuecomment -475420149 рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рддрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдирд╛рдо рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реЗ рдкреАрдЖрд░ рдореЗрдВ рдорд░реНрдЬ рд╕рдВрдШрд░реНрд╖ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ рдФрд░ рдкреАрдЖрд░ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдкрд░ рдХреБрдЫ рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╡рд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ рдЬреЛ рдЧрдВрддрд╡реНрдп рд╕рд░рдгреА рдореЗрдВ undef
s рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред рд╣рдо рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рджреМрд░рд╛рди рдЕрдиреНрдп рдореБрджреНрджреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ 1.3 рдореЗрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ ...ред
рдкреБрди :: ╬▓ == 0
, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @andreasnoack рдХреА рдЯрд┐рдкреНрдкрдгреА https://github.com/JuliaLang/julia/issues/23919#issuecomment -430139849 (рдореЗрд░рд╛ рд╕рд╛рд░рд╛рдВрд╢: ╬▓ == 0
-рд╣рдВрдбрд▓рд┐рдВрдЧ BLAS рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ BLAS рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрдЧрдд) рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП @simonbyrne рдХреЗ рддрд░реНрдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ ("рд╣рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╢реВрдиреНрдп рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдЦрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА")ред рдХреНрдпрд╛ 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 рдореЗрдВ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди _modify!
: // github .com / JuliaLang / рдЬреВрд▓рд┐рдпрд╛ / рдкреБрд▓ / 29,634 / рдлрд╝рд╛рдЗрд▓реЗрдВ # 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 рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ A
рдФрд░ B
рдореЗрдВ NaN рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди C
?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ NaN- рдЕрд╡рдЧрдд _C = ╬▒ * A * B + 0 * C_ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ BLAS.gemm!
рдЖрджрд┐ [1] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣реА @andreasnoack рдХрд╛ рддрд░реНрдХ рд╣реИред
[рез] рдЖрдкрдХреЛ isnan.(C)
рдХрд╣реАрдВ рдмрдЪрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ " C
"
@ рдЪреЗрддрд╣реЗрдЧрд╛ рдХреЛ рд╡реЛрдЯ рджрд┐рдП 10 рджрд┐рди рд╕реЗ рдЬреНрдпрд╛рджрд╛ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ
@chriscoey рдЖрдк рд╕рд╣реА рд╣реИрдВ, рдорддрджрд╛рди рдмрдВрдж рд╣реИред
рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмреБрд░рд╛ рд╣реВрдВ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдорддрджрд╛рди рдХрд┐рдпрд╛ рдерд╛ (рдпрд╣ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рддрдиреЗ рд▓реЛрдЧ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреЗ рд╡реЛрдЯ рдбрд╛рд▓рддреЗ рд╣реИрдВ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдореИрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдкрд░ рдирдЬрд░ рд░рдЦрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдХрд┐ mul!
рдХрд╛ рднрд╛рд░реА рд╕рдорд░реНрдерди рд╣реИ (рд╢рд╛рдпрдж 75% рдЕрдиреБрдореЛрджрди рдХреЛрд░рдо рдХрд╛ рдкреНрд░рдмрдВрдзрди), рдФрд░ рджреВрд╕рд░рд╛ рджрд╛рд╡реЗрджрд╛рд░ muladd!
50% рд╕реЗ рдХрд╛рдлреА рдиреАрдЪреЗ рд╣реИред
рдорддрджрд╛рди рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рднреА рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рдереАред рдореИрдВ рд╡реЛрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, mul!
рдЬреАрддрд╛ рд╣реИ, рдФрд░ рдирд╛рдо рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред @tkf рдЗрд╕реЗ рдЙрдбрд╝рд╛рдиреЗ рдкрд░ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ :)
@ рдЪреЗрддреЗрдЧрд╛ рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рдпреЛрдЬрдирд╛ рдереА!
BTW, рдореИрдВ рддреБрд░рдВрдд рд░рд┐рдмрд╛рд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ (рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдХреБрдЫ рд╣рдлреНрддреЛрдВ рдХреЗ рднреАрддрд░) рддреЛ рдЕрдЧрд░ рдХреЛрдИ рд░рд┐рдмреЗрд╕ рдпрд╛ рд░реАрдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рдореЗрд░рд╛ рдЗрдВрддрдЬрд╛рд░ рди рдХрд░реЗрдВред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ NaN- рд╢рдмреНрджрд╛рд░реНрде рдкрд░ рдПрдХ рд╡реЛрдЯ рдирд╣реАрдВ рдерд╛ред рдлрд╝реАрдЪрд░ рдлрд╝реНрд░реАрдЬрд╝ рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рд░реНрдердХ рд╡реЛрдЯ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдирд╣реАрдВ рд╣реИред
рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЧреИрд░-рдмрд╛рдзреНрдпрдХрд╛рд░реА рдЬрдирдордд рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдЬреЛ рдзрд╛рдЧреЗ рдореЗрдВ рдореВрдб рдХрд╛ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИред
рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ:
mul!
1.4 рддрдХ рджреЗрд░реА рд╣реЛ рдЬрд╛рддреА рд╣реИред)NaN
рдЕрд░реНрде NaN
! рдХрдордЬреЛрд░ рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрд┐рдд рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдХреЗ рд╕рд╛рде 1.3 рдХреЗ рд▓рд┐рдП рд╡рд┐рд▓рдпред :рдЖрдВрдЦреЗрдВ:!(alpha === false) && iszero(alpha) && !all(isfinite, C) && throw(ArgumentError())
рд╕рд╛рде рд╡рд┐рд▓рдп рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдХреБрдЫ рдФрд░ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╕реЗрд╡рд╛рдирд┐рд╡реГрддреНрдд рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред : рднреНрд░рдорд┐рдд:рд╕рдВрднрд╡рддрдГ рдХрдИ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ, рдФрд░ @tkf / triage рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдорддрджрд╛рди рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓: рдЯрд╛рдбрд╛: (рдзреИрд░реНрдп) рдФрд░: рд░реЙрдХреЗрдЯ: (рдЕрдзреАрд░рддрд╛) рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдЕрдиреНрдп рд╕рднреА рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ 14 рд╡реЗрдВ рдФрд░ рдереВ 15 рд╡реЗрдВ рдХреЗ рдмреАрдЪ рдЯреНрд░рд╛рдЗрдПрдЬ рдХреБрдЫ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рддрд╛рд░реАрдЦ рдореЗрдВ рдЪреБрдирд╛рд╡ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕реЗ рдХреБрдЫ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдЧрд╛ред рдпрд╣ рдлрд┐рд░ рд╕реЗ "рдЕрдиреБрдореЛрджрди рд╡реЛрдЯрд┐рдВрдЧ" рдХреЗ рд░реВрдк рдореЗрдВ рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ, рдЕрд░реНрдерд╛рдд рдЙрди рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдкрд╕рдВрдж рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рдЖрдкрдХрд╛ рдкрд╕рдВрджреАрджрд╛; рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐: рд░реЙрдХреЗрдЯ: рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: рдЕрдВрдЧреВрдареЗ :,: рджрд┐рд▓ :,: рдЖрдБрдЦреЗрдВ: рдФрд░: рднреНрд░рдорд┐рдд:ред рдореИрдВ рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдорддрджрд╛рди рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рднреАрдбрд╝ рд╡рд╛рд▓рд╛ рд╣реИред
рдореИрдВ рдордЬрдмреВрдд рд╢реВрдиреНрдп (: рджрд┐рд▓ :) рдХреЗ рд▓рд┐рдП рдорддрджрд╛рди рдХрд░реВрдВрдЧрд╛, рдЕрдЧрд░ рдпрд╣ "рдорд░реНрдЬ 1.x" рдХреЗ рдмрдЬрд╛рдп "рдорд░реНрдЬ рдлреЙрд░ 1.3" рдерд╛ред рдпрджрд┐ рд╡рд┐рдХрд▓реНрдк "1.3 рдХреЗ рд▓рд┐рдП рдорд░реНрдЬ" "1.x рдорд░реНрдЬ" рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдПрдЧрд╛?
рдзрдиреНрдпрд╡рд╛рдж @ рдЪрдЪреЗрддрд╛ @tkf рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирдП рдореВрд▓ рдХреА рдЬрд░реВрд░рдд рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реВрдБ! ASN NaN рдирд┐рд░реНрдгрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ (рдЬрдм рддрдХ рдкреНрд░рджрд░реНрд╢рди рд╕рдордЭреМрддрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдХреНрдпрд╛ рдЖрдкрдиреЗ LazyArrays.jl рдХреА рдЬрд╛рдВрдЪ рдХреА? FYI рдХрд░реЗрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдлреНрдпреВрдЬреНрдб рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рд╕рдорд░реНрдерди рд╣реИред рдЖрдк рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ https://docs.julialang.org/en/latest/stdlib/LinearAlgebra/#LinearAlgebra/BLAS.gemm! рдХреЗ рдмрд╛рдж рд╕реЗ BLAS.gemm!
рдЖрджрд┐ рдХрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдореВрд▓ рдХреА рдЬрд░реВрд░рдд рд╣реИ! рдЪреВрдВрдХрд┐ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдХреВрд▓рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдмрд╕реЗ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрд░рдЪрд┐рдд рдФрд░ рд╡рд┐рд░рд▓ рдФрд░ рд╕рд╛рджреЗ рдкреБрд░рд╛рдиреЗ рдШрдиреЗ рдореИрдЯреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдпрд╣рд╛рдБ рдХреА рдЙрджрд╛рд░рддрд╛ рдФрд░ рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рд╣реВрдБред
рд╕рдордЭрд╛ред рдФрд░ рдореБрдЭреЗ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдпрд╛рдж рд╣реИ рдХрд┐ рд╣рдордиреЗ LazyArrays.jl рдореЗрдВ рдЪреАрдЬреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ, рддреЛ рдмреЗрд╢рдХ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ рдЬрд╛рдирддреЗ рдереЗ ...
"рдПрдПрд╕рдПрдкреА" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рдЪрд╛рд░ рдорд╣реАрдиреЗ рдХрд╛ рд░рд┐рд▓реАрдЬ рдЪрдХреНрд░ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ, рдлреАрдЪрд░ рдлреНрд░реАрдЬ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ "рдорд░реНрдЬ рд░рд╢" рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХрд╣рдирд╛ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рднреА рдпрд╣реА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ ... рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдПрдХ рдЕрдиреБрд╕реНрдорд╛рд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрдЬреНрдЬреНрд╡рд▓ рдкрдХреНрд╖ рдЬреВрд▓рд┐рдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░ рдЖрд╕рд╛рди рд╣реИред рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬрд╝ рддрдХ рдЗрд╕реЗ рдорд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рдареАрдХ рдмрд╛рдж рдЖрдк рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд░рд┐рд▓реАрдЬрд╝ -> рдорд░реНрдЬ рдХрд░реЗрдВ
рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдорджрджрдЧрд╛рд░ рдкреНрд░реЗрд░рдХ рд╣реЛрдиреЗ рдХреА рд╕рдордп рд╕реАрдорд╛ рд▓рдЧрддреА рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдмрд╛рд╕реА рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдПрдХ рд▓рдХреНрд╖реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордп рд╕реАрдорд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред
рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдКрд░реНрдЬрд╛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ!
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдореВрд▓ рдХреА рдЬрд░реВрд░рдд рд╣реИ! рдЪреВрдВрдХрд┐ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдХреВрд▓рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдмрд╕реЗ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрд░рдЪрд┐рдд рдФрд░ рд╡рд┐рд░рд▓ рдФрд░ рд╕рд╛рджреЗ рдкреБрд░рд╛рдиреЗ рдШрдиреЗ рдореИрдЯреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдпрд╣рд╛рдБ рдХреА рдЙрджрд╛рд░рддрд╛ рдФрд░ рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рд╣реВрдБред
5-рддрд░реНрдХ mul!
рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╣реЛрдиреЗ рдкрд░ рдЖрдк рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ: рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЬреБрдЭрд╛рд░реВрдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ LazyArrays.jl MemoryLayout
рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдкреАрдЫреЗ рдХреА рдкреНрд░реЗрд░рдгрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрд╣ BandedMatrices.jl рдФрд░ BlockBandedMatrices.jl рдореЗрдВ рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ "рд╕рдВрд░рдЪрд┐рдд рдФрд░ рд╡рд┐рд░рд▓" рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмреИрдВрдбреЗрдб рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рдЙрдк-рджреГрд╢реНрдп рдмреИрдВрдбреЗрдб рдмреАрдПрд▓рдПрдПрд╕ рд░реВрдЯреАрдиреЛрдВ рдХреЛ рднреЗрдЬрддреЗ рд╣реИрдВред)
рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдлрд┐рд░ рд╕реЗ LazyArrays рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
рдЪреВрдВрдХрд┐ 5-arg mul рдХреЛ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕реНрдЯреЙрдкрдЧреИрдк рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ 2.0 рдореЗрдВ LazyArrays рдЬреИрд╕реЗ рдХреБрдЫ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рдпрд╛ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
@ рдЪреЗрддрд╣реЗрдЧрд╛ рдЬрдм рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдирдП рдиреЙрдирдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╡реЛрдЯ рдХреЗ рд▓рд┐рдП
@tkf рдЬрд╝рд░реВрд░, рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдордЬрд╝рдмреВрдд / рдХрдордЬрд╝реЛрд░ / рдЕрд╢рдХреНрдд рд╢реВрдиреНрдп 1.x рдХреЗ рд▓рд┐рдП рднреА рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕реЗ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рд╣реИрдВ рдЬреЛ рдЕрдм mul!
1.3 mul!
рдорд┐рд▓реЗрдЧрд╛ред рдпрджрд┐ рдХреЛрдИ рд╕рдордп рд╕реАрдорд╛ рдирд╣реАрдВ рдереА, рддреЛ рдореИрдВ рдХреБрдЫ рдФрд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░реВрдБрдЧрд╛ рдФрд░ рдЙрдЪрд┐рдд рдорддрджрд╛рди (рдХрдо рд╕реЗ рдХрдо 10 рджрд┐рди рдорддрджрд╛рди рдХреЗ рд▓рд┐рдП) рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рд╕рдордп рд▓реВрдВрдЧрд╛ред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рд╣рдо рдХрдордЬреЛрд░ / рдордЬрдмреВрдд рд╢реВрдиреНрдп рдХреА рдЧрддрд┐ рдФрд░ рд╢рд╛рди рдкрд░ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддреБрддрд┐рдХрд░рдг рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рд╛рд░реНрдердХ рд╡реЛрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдХрдордЬреЛрд░ рд╢реВрдиреНрдп рд▓рдЧрднрдЧ iszero(alpha)
рдЬрд┐рддрдиреА рддреЗрдЬреА рд╕реЗ рдордЬрдмреВрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдкрд╣рд▓реЗ !isfinite
рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕реНрдХреИрди рдХрд░рдирд╛, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд╡рдВрдЯрди рдХреЗ рд╕рд╛рде рдзреАрдореА рдЧрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛; рд▓реЗрдХрд┐рди рдореИрдВ рд╡реИрд╕реЗ рднреА рдордЬрдмреВрдд рд╢реВрдиреНрдп рд╢рдмреНрджрд╛рд░реНрде рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
@ рдЪреЗрддрд╣реЗрдЧрд╛ рдЬрдм рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдирдП рдиреЙрдирдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╡реЛрдЯ рдХреЗ рд▓рд┐рдП
рдЯреНрд░рд╛рдЗрдПрдЬ рдХреЛ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ 1.3 рдЕрд▓реНрдлрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрдгрдп (рджреЗрд░реА / рдордЬрдмреВрдд / рдХрдордЬреЛрд░ / рдмреИрдХрд╕реНрдЯреЙрдк) рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреБрд░реБрд╡рд╛рд░ 15 рд╡реАрдВ рдпрд╛ рдмреБрдзрд╡рд╛рд░ 14 рд╡реАрдВ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдЗрдПрдЬ рдХреЗ рд╕рдордЭрджрд╛рд░ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВред рдореИрдВ рд╢рд╛рдпрдж рдЧреБрд░реБрд╡рд╛рд░ рдХреЛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛ рдкрд╛рдКрдВрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рдФрд░ рдХреЛ рдЧрд┐рдирдирд╛ рд╣реЛрдЧрд╛ред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣рд╛рдВ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реЛрдирд╛ рдареАрдХ рд╣реИ, рдФрд░ рд╕рдордп рд╕реАрдорд╛ рдпрд╛рдж рдЖрддреА рд╣реИ, рдФрд░ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ рдФрд░ 1.4 рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред
рджреВрд╕рд░реА рдУрд░, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ:
рдЕрднреА рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдлреЗрдВрдХреЗрдВ:
╬▓ == 0.0 && any(isnan,C) && throw(ArgumentError("use ╬▓ = false"))
рдЕрднреА рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛
рдореИрдВрдиреЗ рдЙрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдкреЛрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ред рдорд╣рд╛рди рд╕рдордЭреМрддрд╛ рд╡рд┐рдЪрд╛рд░!
рдмрд╕ рдЙрдореНрдореАрджреЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: 1.3 рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛ рдлреНрд░реАрдЬ рддреАрди рджрд┐рдиреЛрдВ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореВрд▓ рд░реВрдк рд╕реЗ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рд╕рдордп рдореЗрдВ рдмрдирд╛ рд╕рдХреЗред рд╣рдо рдлрд╝реАрдЪрд░ рдлрд╝реНрд░реАрдЬрд╝ рдФрд░ рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдЦреНрдд рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд░рд┐рд▓реАрдЬрд╝ рдЪрдХреНрд░ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордп рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХрд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА https://github.com/JuliaLang/julia/pull/29634 рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмрд╕ рдЬрд░реВрд░рдд рд╣реИ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдФрд░ рд╡рд┐рджреНрд░реЛрд╣ рдХреАред
# 29634 рдХреЗ рд▓рд┐рдП @tkf рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдХрд╛рд░реНрдп рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдмрд╛рдХреА рд╣реИ (рд╡реЛрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╢реВрдиреНрдп рдХрд╛ рдирд╛рдордХрд░рдг рдФрд░ рд╕рдВрднрд╛рд▓рдирд╛)? рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╡реНрдпрд╕реНрдд рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рд╣рдо рдХрд┐рд╕реА рднреА рд╢реЗрд╖ рдЯреЛрдб рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдмреЛрдЭ рдлрд┐рд░ рд╕реЗ рдЖрдк рдкрд░ рди рдкрдбрд╝реЗред
рдПрдЯреАрдПрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ:
addmul!
-> mul!
рдирд╛рдо рдмрджрд▓реЗрдВmul!
API <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 -443333999914рдореЗрд░рд╛ рдкреАрдЖрд░ ╬▓ = 0
рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ BLAS рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рддреЛ рдЕрдиреНрдп рд╣реИрдВрдбрд▓рд┐рдВрдЧ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХрдирд╛, рднреА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдореЗрд░рд╛ рдкреАрдЖрд░
╬▓ = 0
рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ BLAS рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░реА рд╕реНрдореГрддрд┐ рдмрд╛рд╕реА рдереА; рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реБрд╕рдВрдЧрдд рдирд╣реАрдВ рдерд╛ рдФрд░ NaN _sometimes_ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░рддрд╛ рдерд╛ред рддреЛ рдЕрддрд┐рд░рд┐рдХреНрдд TODO ╬▓ = 0.0
рдЕрдиреБрд░реВрдк рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рд╣реИред
MulAddMul
рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛, рд╣реИ рдирд╛?
рд╣рд╛рдВ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╡рд░рдг рд╣реИред рдореЗрд░реА рдЪрд┐рдВрддрд╛рдПрдВ рдереАрдВ (1) рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдмреАрдЯрд╛ = 0 рдЖрджрд┐ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рд╣реИ) рдФрд░ (2) рдпрд╣ рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред
рд╡реЗ рд╡реИрдз рдЪрд┐рдВрддрд╛рдПрдВ рд╣реИрдВред рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░реЗрдЦреАрдп рдмреАрдЬрдЧрдгрд┐рдд рдХреЛрдб рдореЗрдВ рдПрдХ рдЯрди рдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдБ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдЪрд╛рд╣рд┐рдПред рдореЗрд░реА рд╕реЛрдЪ рдЖрдо рддреМрд░ рдкрд░ рдпрд╣ рд░рд╣реА рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЫреЛрдЯреЗ рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореБрдлрд╝реНрдд рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдХрд╣рд╛, рдпрд╣ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрдХрд▓рди рд╕рдордп рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИ) рдФрд░ рд▓реЛрдЧ рдЫреЛрдЯреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рдХреЗ рд▓рд┐рдП StaticArrays
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреЗрд╣рддрд░ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдХреЗрд╡рд▓ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдореВрд▓реНрдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдУрд░ рдЭреБрдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд╣рдореЗрд╢рд╛ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╣рдо рдЕрдкрдирд╛ рджрд┐рдорд╛рдЧ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕ рджреЗрд░реА рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирдирд╛ рдЪрд╛рд╣рд┐рдПред
FYI рдХрд░реЗрдВ рдирд░рдо рд╢реВрдиреНрдп рдореЗрдВ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ:
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#issuecomomment -440510551 рдЬреИрд╕реЗ рдХреБрдЫ рд╕рдВрд░рдЪрд┐рдд рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдЗрдирд░-рдореЛрд╕реНрдЯ рд▓реВрдк рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдзрд┐рдХ рдХрд╛рдо рд╣реИ (рдЗрд╕рд▓рд┐рдП рджреЗрд░реА)ред
рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдХреЗрд╡рд▓ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдореВрд▓реНрдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдУрд░ рдЭреБрдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд╣рдореЗрд╢рд╛ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╣рдо рдЕрдкрдирд╛ рджрд┐рдорд╛рдЧ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕ рджреЗрд░реА рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирдирд╛ рдЪрд╛рд╣рд┐рдПред
рдорд╣рд╛рди!
Https://github.com/JuliaLang/julia/pull/29634 рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд
@andreasnoack рдЗрд╕ рд╕рдордп рдХреА рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рд╡рд┐рд▓рдп рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!
рдЕрдм рдЬрдм рдЗрд╕реЗ рез.рей рдХреЗ рд▓рд┐рдП рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдореБрдЭреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ: рдореБрд╕реНрдХрд╛рди:ред рдореИрдВ рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдЧрд░ 1.3-рдЖрд░рд╕реА рдирд┐рдХрд▓рддрд╛ рд╣реИ рддреЛ рдпрд╣рд╛рдВ рдХреЗ рд▓реЛрдЧ рдЕрдкрдиреЗ рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рдХреЛрдб рдХрд╛ рдЕрдзрд┐рдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!
рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдХреАрдбрд╝реЗ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП 1.3 рдЖрд░рд╕реА + рдкреАрдХреЗрдПрд╡рд▓ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп рд╣реЛрдЧрд╛ред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЕрдм рд╕реЗ 10 рджрд┐рдиреЛрдВ рдХреА рд╕рдордпрд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рдЕрдиреБрдореЛрджрди рдорддрджрд╛рди рдХрд╛ рдПрдХ рджреМрд░ред рд╕реНрд╡реАрдХреГрддрд┐ рдорддрджрд╛рди рдХрд╛ рдЕрд░реНрде рд╣реИ: рд╕рднреА рд▓реЛрдЧ рдЙрди рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдорддрджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╡реЗ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдорд╛рдирддреЗ рд╣реИрдВред рд▓реЛрдЧ, рдЬреЛ рдирд┐рд░рдВрддрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рдмрдЬрд╛рдп рдЕрдм рдЕрдкрдирд╛ рдХрдо рд╕реЗ рдХрдо рдкрд╕рдВрджреАрджрд╛ рдирд╛рдо рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреЛ рддреАрдиреЛрдВ рдХреЛ рд╡реЛрдЯ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рд╡реНрдпрд╛рдкрдХ рд╕реНрд╡реАрдХреГрддрд┐ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдорддрджрд╛рди рдпреЛрдЬрдирд╛ рд╕реНрд╡рдпрдВ рд╡реНрдпрд╛рдкрдХ рдЕрдиреБрдореЛрджрди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦрдиреА рдЪрд╛рд╣рд┐рдПред рд╕реНрд╡реАрдХреГрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмреАрдЪ рд▓рдЧрднрдЧ рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, @tkf рдХреЛ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рд╣реИ (PR рд▓реЗрдЦрдХ рдХрд╛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░)ред
+1: рдореИрдВ рдЗрд╕ рдорддрджрд╛рди рдпреЛрдЬрдирд╛ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдФрд░ рдЕрдкрдиреЗ рдЕрдиреБрдореЛрджрди рдХреЗ рд╡реЛрдЯ рдбрд╛рд▓реЗ рд╣реИрдВред
-1: рдореИрдВ рдЗрд╕ рдорддрджрд╛рди рдпреЛрдЬрдирд╛ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВред рдпрджрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдпрд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓реЛрдЧ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЛрдЯ рдореВрдХ рд╣реИред
рджрд┐рд▓:
mul!
рдирд┐рд░рдВрддрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИредрд░реЙрдХреЗрдЯ:
muladd!
рдирд┐рд░рдВрддрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИредрд╣реБрд░реНрд░реЗ:
addmul!
рдирд┐рд░рдВрддрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИредрдореИрдВ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ 75% рдЕрдиреБрдореЛрджрди рдФрд░ 5 рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдХреЛрд░рдо (рдпрд╛рдиреА 75% рд▓реЛрдЧреЛрдВ рдХреЛ рд╡реЛрдЯ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдорддрджрд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЕрд╕рд╣рдорддрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рдХрдо рд╕реЗ рдХрдо 5 рд▓реЛрдЧреЛрдВ рдиреЗ рдЬреАрддрдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдордВрдЬреВрд░реА рджреА рд╣реИ; рдпрджрд┐ рднрд╛рдЧреАрджрд╛рд░реА рдХрдо рд╣реИ; , рддреЛ 5/6 рдпрд╛ 6/8 рдХреЛрд░рдо рдмрдирд╛рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рд╕реЗ 4/4 рдХреЛ рдЕрд╕рдлрд▓ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред