Julia: рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рдПрдкреАрдЖрдИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рд╕рд┐рддре░ 2017  ┬╖  208рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: JuliaLang/julia

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рд╡рд┐рд░рд▓ рдореИрдЯрд▓реНрдо рдХреЛрдб рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рд╣реИ:

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

рдореИрдВ рдпрд╣ рдорд╛рди рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп 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! рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж) рдЬреЛ рдХрд┐ рдмрд┐рдЧрдлреНрд▓реЛ рдФрд░ рд╡рд┐рд░рд▓ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЕрдм рд╕реЗ 10 рджрд┐рдиреЛрдВ рдХреА рд╕рдордпрд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рдЕрдиреБрдореЛрджрди рдорддрджрд╛рди рдХрд╛ рдПрдХ рджреМрд░ред рд╕реНрд╡реАрдХреГрддрд┐ рдорддрджрд╛рди рдХрд╛ рдЕрд░реНрде рд╣реИ: рд╕рднреА рд▓реЛрдЧ рдЙрди рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдорддрджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╡реЗ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдорд╛рдирддреЗ рд╣реИрдВред рд▓реЛрдЧ, рдЬреЛ рдирд┐рд░рдВрддрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рдмрдЬрд╛рдп рдЕрдм рдЕрдкрдирд╛ рдХрдо рд╕реЗ рдХрдо рдкрд╕рдВрджреАрджрд╛ рдирд╛рдо рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреЛ рддреАрдиреЛрдВ рдХреЛ рд╡реЛрдЯ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рд╡реНрдпрд╛рдкрдХ рд╕реНрд╡реАрдХреГрддрд┐ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдорддрджрд╛рди рдпреЛрдЬрдирд╛ рд╕реНрд╡рдпрдВ рд╡реНрдпрд╛рдкрдХ рдЕрдиреБрдореЛрджрди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦрдиреА рдЪрд╛рд╣рд┐рдПред рд╕реНрд╡реАрдХреГрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмреАрдЪ рд▓рдЧрднрдЧ рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, @tkf рдХреЛ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рд╣реИ (PR рд▓реЗрдЦрдХ рдХрд╛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░)ред

+1: рдореИрдВ рдЗрд╕ рдорддрджрд╛рди рдпреЛрдЬрдирд╛ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдФрд░ рдЕрдкрдиреЗ рдЕрдиреБрдореЛрджрди рдХреЗ рд╡реЛрдЯ рдбрд╛рд▓реЗ рд╣реИрдВред
-1: рдореИрдВ рдЗрд╕ рдорддрджрд╛рди рдпреЛрдЬрдирд╛ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВред рдпрджрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдпрд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓реЛрдЧ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЛрдЯ рдореВрдХ рд╣реИред

рджрд┐рд▓: mul! рдирд┐рд░рдВрддрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред
рд░реЙрдХреЗрдЯ: muladd! рдирд┐рд░рдВрддрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред
рд╣реБрд░реНрд░реЗ: addmul! рдирд┐рд░рдВрддрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред

рдореИрдВ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ 75% рдЕрдиреБрдореЛрджрди рдФрд░ 5 рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдХреЛрд░рдо (рдпрд╛рдиреА 75% рд▓реЛрдЧреЛрдВ рдХреЛ рд╡реЛрдЯ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдорддрджрд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЕрд╕рд╣рдорддрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рдХрдо рд╕реЗ рдХрдо 5 рд▓реЛрдЧреЛрдВ рдиреЗ рдЬреАрддрдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдордВрдЬреВрд░реА рджреА рд╣реИ; рдпрджрд┐ рднрд╛рдЧреАрджрд╛рд░реА рдХрдо рд╣реИ; , рддреЛ 5/6 рдпрд╛ 6/8 рдХреЛрд░рдо рдмрдирд╛рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рд╕реЗ 4/4 рдХреЛ рдЕрд╕рдлрд▓ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

рд╕рднреА 208 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╕рдВрджрд░реНрднред # 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) рд╣реИ

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

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ "рдЕрдВрддрд┐рдо рд░реВрдк"? рдФрд░ рдпрд╣ mul!(C, A, B) , lmul!(A, B) , рдФрд░ rmul!(A,B) ?

рдореИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрд░реНрдбрд░ рдореЗрдВ A , B , рдФрд░ C рд╣реЛрдиреЗ рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВред

рдХреНрдпрд╛ рдиреЛрдЯреЗрд╢рди 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 рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ?

рдирд╣реАрдВ, рдЬрдм рддрдХ рдпрд╣ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рд╣реИ, рддрдм рддрдХ рдореИрдВ рдкрд╛рдВрдЪ рддрд░реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реВрдВред рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдХреЗрд╡рд▓ рддреАрди рддрд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЖрдкрдХрд╛ рдЕрдиреБрд░реЛрдз рдерд╛)ред

рдЖрдк рдпрд╣рд╛рдБ рдХрд┐рд╕ рд╢реЙрд░реНрдЯрдХрдЯ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд * рдХреЛ mul! рдХрд╛ рд╢реЙрд░реНрдЯрдХрдЯ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде " mul! " mul! рдХреЛ muladd! / addmul! рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпреЛрдВ рди рд╣реЛрдиреЗ рджреЗрдВ?

rmul! рдФрд░ lmul! рд╕рдорд╛рди "рд╢реЙрд░реНрдЯрдХрдЯ" рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ:

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

mul! рдШрдЯ рд░рд╣рд╛ рд╣реИ

рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдЪрд░реНрдЪрд╛ рдПрдХ рдирдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЕрдЧрд░ рд╣рдореЗрдВ рдПрдХ рдирдпрд╛ API рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП mul! рд╣реИ, рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

рдореБрдЦреНрдп рддрд░реНрдХ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ:

  • рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ 5-рддрд░реНрдХ рд░реВрдк рдХреЗрд╡рд▓ "рдЧреБрдгрд╛" рд╕реЗ рдЕрдзрд┐рдХ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИред
  • рдлрд┐рд░ рдЖрдк mul!(C,A,B,1,1) рдпрд╛ mul!(C,A,B,true,true) рдмрдЬрд╛рдп addmul!(C, A, B) рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд * рдХреЛ mul! рдХрд╛ рд╢реЙрд░реНрдЯрдХрдЯ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде " mul! " muladd! / addmul! рд╣реЛ?

рдХреНрдпреЛрдВрдХрд┐ * рдореИрдЯреНрд░рд┐рд╕ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реАрдХрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗред рддреБрд▓рдирд╛ рдореЗрдВ, muladd! рдЙрдкрдпреЛрдЧ рдореЗрдВ рдХрд╣реАрдВ рднреА * рдХрд░реАрдм рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдПрдХ рдореМрдЬреВрджрд╛ рдСрдкрд░реЗрдЯрд░ рднреА рд╣реИ рдЬрдмрдХрд┐ muladd! / addmul! рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рдордд рд╕реЛрдЪреЛ рдХрд┐ rmul! рдФрд░ lmul! рдЗрд╕ рдкреИрдЯрд░реНрди рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЖрдо рддреМрд░ рдкрд░ 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 рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕рдВрдХрд▓рдХ рдмрдЧ рд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реВрдВред

рдареАрдХред рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдХреЗрд╡рд▓ рджреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рддреАрди рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИрдВ ?:

  1. рддреАрди- рдФрд░ рдкрд╛рдВрдЪ-рддрд░реНрдХ mul!
  2. рддреАрди- рдФрд░ рдкрд╛рдВрдЪ-рддрд░реНрдХ muladd!
  3. рддреАрди-рддрд░реНрдХ 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 рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рддрдХ рдХреА рдЖрдо рд╕рд╣рдорддрд┐ рд╣реИ:

  1. рд╣рдореЗрдВ mul!(C, A, B) рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП
  2. рд╣рдореЗрдВ inplace рдХреЗ рд▓рд┐рдП _some_ 5-рддрд░реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, 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 рдХрд╛ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ

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

рдЬрдмрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ

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

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

рдпрджрд┐ 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 рдореЗрдВ рдпрд╛ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбреНрдпреВрд▓ / рдХреЛрдб рдореЗрдВ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ?

29634 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_ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдкрд╕рдВрджреАрджрд╛ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХреНрдпрд╛ рд╣реИ?

  • : +1: mul!
  • : -1: 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! )ред

  • рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рд╣реИ: [AC] * [B╬▒; I comment] рдпрд╛, рдиреАрдЪреЗ рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ, [╬▒A *C] * [B; рдореИрдВ]
  • ~ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рд░рд▓ рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рд▓рд┐рдП 5-arg 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 рдЕрд▓рдЧ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред

рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ ...

  1. рдпрд╣ BLAS-3 рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрдВрдкреЛрдЬреЗрдмрд▓ рд╣реИред рддреЛ, _C = ╬▒AB + ╬▓C_ _C = AB_ (https://github.com/JuliaLang/julia/issues/23919#issuecomment-441246466) https://github.com/JuliaLang/julia/issues/ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╣реИред 23919 # рдЬрд╛рд░реАрдХрд░рдг -441312375, рдЖрджрд┐)

  2. _ " muladd! рдХреЛ рд╡рд░реНрдгрдирд╛рддреНрдордХ рдзреНрд╡рдирд┐ рдХреА рдХрдореА рд╣реИ рдЬрдм рдпрд╣ рдирд╣реАрдВ рд╣реИ: рдПрдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рдирд╛рдо scalemuladd! рдЬреИрд╕реЗ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рднрд╛рдЧ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реЛрдЧрд╛ред" _ --- https://github.com/ рдЬреВрд▓рд┐рдпрд╛рд▓реИрдВрдЧ / рдЬреВрд▓рд┐рдпрд╛ / рдореБрджреНрджреЗ / 23919 # рдЬрд╛рд░реА рдХрд░рдирд╛ -441819470

  3. _ "рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рд╣реИ: [AC] * [B╬▒; I╬▓]" _ --- https://github.com/JuliaLang/julia/issues/23919#issuecomment -441825259

рд╡реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ ...

  1. _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, рдЖрджрд┐)ред

  2. mul! рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ Y = AтВБ AтВВ тЛп AтВЩ X (https://github.com/JuliaLang/julia/issues/23919#issuecomment-402953987 рдЖрджрд┐)

  3. рдЗрдирдкреБрдЯ-рдУрдирд▓реА рдмрдирд╛рдо рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░: рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ C рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд░рддрд╛ рд╣реИ (https://github.com/JuliaLang/julia/issues/239n#issuecomment) -441267056, https://github.com/JuliaLang/julia/issues/23919#issuecomment-441824982)

рдПрдХ рдФрд░ рдХрд╛рд░рдг рд╣реИ рдХрд┐ mul! рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ...:

  1. рд╡рд┐рд░рд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИред рддреЛ рдпрд╣ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИред рдХрд╛рдЙрдВрдЯрд░ рддрд░реНрдХ: рдкрд╛рдВрдЪ-рддрд░реНрдХ mul! рдкреНрд░рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдФрд░ рдХреНрдпреЛрдВ muladd! / addmul! рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ...:

  1. рд╣рдо 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! : 6
  • addmul! : 2
  • muladd! : 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! рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХрд╛ рдкрд╕рдВрджреАрджрд╛ рдХреЙрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреНрдпрд╛ рд╣реИ?

  • : +1: muladd!(C, A, B, ╬▒, ╬▓)
  • : -1: muladd!(A, B, C, ╬▒, ╬▓)
  • : рдореБрд╕реНрдХрд╛рди: muladd!(C, A, B; ╬▒, ╬▓) (рдЬреИрд╕реЗ: +1 :, рд▓реЗрдХрд┐рди рдХреАрд╡рд░реНрдб рддрд░реНрдХ рдХреЗ рд╕рд╛рде)
  • : рдЯрд╛рдбрд╛: muladd!(A, B, C; ╬▒, ╬▓) (рдЬреИрд╕реЗ: -рез :, рд▓реЗрдХрд┐рди рдЦреЛрдЬрд╢рдмреНрдж рддрд░реНрдХ рдХреЗ рд╕рд╛рде)
  • : рднреНрд░рдорд┐рдд: muladd!(A, B, ╬▒, C, ╬▓)
  • : рджрд┐рд▓: рдХреБрдЫ рдФрд░

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдиреНрдп рдХреАрд╡рд░реНрдб рддрд░реНрдХ рдирд╛рдо рд╣реИрдВ, рддреЛ ╬▒ рдФрд░ ╬▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдЙрди рдирд╛рдореЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ рдЬреЛ рдмреЗрд╣рддрд░ рд╣реИрдВред

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдирд╛рдо рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдореЗрдВ рдЗрд╕реЗ mul! рдХреЗ рд▓рд┐рдП рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

_If_ рд╣рдо _C = AB╬▒ + C ,_ рдХреЗ рд▓рд┐рдП mul! рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХрд╛ рдкрд╕рдВрджреАрджрд╛ рдХреЙрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреНрдпрд╛ рд╣реИ?

  • : +1: mul!(C, A, B, ╬▒, ╬▓)
  • : -1: 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 рд╣реЛрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдФрд░ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛? рддреЛ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣рд╛рдБ рдПрдХ рд╣реА рдЦреБрд▓рд╛ рдкреНрд░рд╢реНрди рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рдмрд╛рдПрдБ рдФрд░ / рдпрд╛ рджрд╛рдПрдВ рд╕реНрдХреЗрд▓рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреНрдпреВрдкрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдпрд╣ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдХреЛ рдмрдврд╝рд╛рдирд╛ рдФрд░ рд╕реНрдХреЗрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рд╣реЛрдВрдЧреЗ:

  1. mul!(Y::Matrx, args...) : Y .= *(args...)
  2. mul!((╬▓, Y)::{Number, Matrix}, args...) : Y .= ╬▓*Y + *(args...)
  3. mul!((Y, ╬▓)::{Matrix, Number}, args...) : Y .= Y*╬▓ + *(args...)
  4. mul!((╬▓тВБ, Y, ╬▓тВВ)::{Number, Matrix, Number}, args...) : Y .= ╬▓тВБ*Y*╬▓тВВ + *(args...)

рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЗрд╕реЗ рдЕрдиреНрдп рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдореНрдореЗрд▓рди рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдпрд╣ рдпрд╛ рддреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЪрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрддред

рдпрд╣ рдореЗрд░реЗ " mul!(out, args...) "

рд▓реЗрдХрд┐рди рдореЗрд░реА рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╣рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдЯреБрдкрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдиреЗрд╕реНрдЯреЗрдб рдЯреНрдпреВрдкрд▓реНрд╕ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдлреНрд▓реИрдЯ рдЯреНрдпреВрдкрд▓реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ? рдЕрдЧрд░ рдХреА рддрд░рд╣ рдХреБрдЫ "рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ 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 рд╕реЗ рд╣реИ рддрд╛рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВ):

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

рдПрдХ рдФрд░ рдЪрд┐рдВрддрд╛ рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрдЧрдгрдирд╛ рдЧреНрд░рд╛рдл рдирд┐рд╖реНрдкрд╛рджрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рдж рддрдХ рд╕реАрдорд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░-рдРрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рд╕рдВрдЧрдгрдирд╛ рдХрд░реНрдиреЗрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ _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)

рдХрд┐рд╕ рд╣рдж рддрдХ? рдмреАрдПрд▓рдПрдПрд╕ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдЗрддрдиреА рднрд┐рдиреНрдирддрд╛ рдХреНрдпреЛрдВ рджреЗрдВ?

  1. рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдЗрд░рд╛рджреЗ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдпрджрд┐ рдЗрд░рд╛рджрд╛ рдмрд╛рдИрдВ рдпрд╛ рджрд╛рдИрдВ рдУрд░ рдпрд╛ рджреЛрдиреЛрдВ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╣реИ, рддреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?

  2. рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдп рдХрдорд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдЧреИрд░-рдХрдореНрдпреВрдЯреЗрдЯрд┐рд╡ рддрддреНрд╡ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд╕рд╣реА рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред

рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдЗрди-рдкреНрд▓реЗрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЬреЗрдо рдХреЛ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рддрд╛ рд╣реИ! рдЬреЗрдо рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди! рдЕрдиреНрдпрдерд╛, рдХреНрдпреЛрдВ рди рдХреЗрд╡рд▓ 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! рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░рд╛ рд░реБрдЦ рд╣реИ:

  1. рдЬрдм рд╕реЗ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА SparseArrays.jl рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рд╣рдо mul!(C, A, B, a, b) рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  2. рд╣рдореЗрдВ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдбрд┐рд╕реНрдкреИрдЪ рдХрд░рдирд╛ рдареАрдХ рдирд╣реАрдВ рд╣реИред (BandedMatrices.jl, BlockArrays.jl, LowRankApprox.jl, рдЖрджрд┐ рдХреЗ рдЕрдиреБрд░рдХреНрд╖рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдЕрдиреБрднрд╡ рд╕реЗ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВред)
  3. Trait рдЖрдзрд╛рд░рд┐рдд рдбрд┐рдЬрд╝рд╛рдЗрди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рдореЗрдВ рдЬрд╛рдирд╛ рдФрд░ Applied рдЬреИрд╕реЗ рдкреНрд░рд╕рд╛рд░рдг рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдкрд┐рдд рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬреВрд▓рд┐рдпрд╛ 2.0 рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде LazyArrays.jl рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛ рдЬреЛ рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред

@dlfivefifty рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХреА рдмрд╣реБрд╡рд┐рдХрд▓реНрдкреА рдореЗрдВ рдХрдард┐рдирд╛рдИ mul!((Y, ╬▓), ╬▒, A, B) рдПрдкреАрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд░рд╛рдмрд░ рд╣реИ mul!(Y, A, B, ╬▒, ╬▓) ? рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд░реИрдкрд░ рдХреЛ Transpose рдорд╛рдирдиреЗ рд╕реЗ рдХрдард┐рдирд╛рдИ рдХрд╛ рдкрд░рд┐рдЪрдп рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ 2- рдФрд░ 3-рдЯреБрдкрд▓реНрд╕ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрдард┐рдирд╛рдИ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдмрдврд╝рд╛рдирд╛ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЯреНрдпреВрд▓ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ)ред

  1. рдЬрдм рд╕реЗ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 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

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо ╬▒тВБ рдпрд╛ ╬▒тВВ ╬▒тВБ*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- рд╢рдмреНрджрд╛рд░реНрде рдкрд░ рдПрдХ рд╡реЛрдЯ рдирд╣реАрдВ рдерд╛ред рдлрд╝реАрдЪрд░ рдлрд╝реНрд░реАрдЬрд╝ рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рд░реНрдердХ рд╡реЛрдЯ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдирд╣реАрдВ рд╣реИред

рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЧреИрд░-рдмрд╛рдзреНрдпрдХрд╛рд░реА рдЬрдирдордд рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдЬреЛ рдзрд╛рдЧреЗ рдореЗрдВ рдореВрдб рдХрд╛ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ:

  1. рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ, рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдо рд╕рд╣рдорддрд┐ рдХрд┐рд╕реА рддрд░рд╣ рд╕рдордп рд╕реАрдорд╛ рд╕реЗ рдкрд╣рд▓реЗ рдкрд╣реБрдВрдЪ рдЬрд╛рддреА рд╣реИ, рдпрд╛ рдореБрдЦреНрдп рд▓реЛрдЧ рд╣рдореЗрдВ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди, рдпрд╛ рдХреБрдЫ рдФрд░ рджреЗрддреЗ рд╣реИрдВред : рдЯрд╛рдбрд╛: (рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реИ рдХрд┐ 5-arg mul! 1.4 рддрдХ рджреЗрд░реА рд╣реЛ рдЬрд╛рддреА рд╣реИред)
  2. рдмреИрдХрд╕реНрдЯреЙрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд NaN- рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдорд░реНрдЬ рдХрд░реЗрдВред рдЬреИрд╕реЗ рд╣реА рд╣рдо рдЖрдо рд╕рд╣рдорддрд┐ рдкрд░ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рд╣рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд NaN рд╡реНрдпрд╡рд╣рд╛рд░ (рдордЬрдмреВрдд рдмрдирд╛рдо рдХрдордЬреЛрд░ рд╢реВрдиреНрдп) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдФрд░ / рдпрд╛ рдбреЙрдХреНрд╕ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдкрд░рд┐рднрд╛рд╖рд┐рдд NaN- рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдмреИрдХрд╕реНрдЯреЙрдк рдЕрдирд┐рд╢реНрдЪрд┐рддрдХрд╛рд▓ рддрдХ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЬ рдорддрджрд╛рди рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред (рдЬреЛ рднреА рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╣реИ рдЙрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ; рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреЗрдЦрднрд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред :рдердореНрд╕ рдЕрдк:
  3. рдЬреЗрдо рдХрд╛ рдорддрд▓рдм рдЬреЗрдо! рдордЬрдмреВрдд рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрд┐рдд рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдХреЗ рд╕рд╛рде 1.3 рдХреЗ рд▓рд┐рдП рдорд░реНрдЬ рдХрд░реЗрдВред :рджрд┐рд▓:
  4. NaN рдЕрд░реНрде NaN ! рдХрдордЬреЛрд░ рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрд┐рдд рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдХреЗ рд╕рд╛рде 1.3 рдХреЗ рд▓рд┐рдП рд╡рд┐рд▓рдпред :рдЖрдВрдЦреЗрдВ:
  5. 1.3 рдЪрдЯреНрдЯрд╛рди рд╕реЗ рдЯрдХрд░рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдмрд╕ рдХреБрдЫ рднреА рдХрд░реЛред : рд░реЙрдХреЗрдЯ:
  6. рдЬрдирдордд рдХреЛ рдЦрд╛рд░рд┐рдЬ рдХрд░реЗрдВред :рдирд╛рдХрд╛рдордпрд╛рдмреА:
  7. рдореЗрдВ рд▓рд┐рдЦрдирд╛
  8. рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд downthread : рд╡реИрдХрд▓реНрдкрд┐рдХ backstop рд╡реНрдпрд╡рд╕реНрдерд╛ред рдЬрд▓реНрджреА рд╕реЗ рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рдФрд░ рдХрдордЬреЛрд░ / рдордЬрдмреВрдд рд╢реВрдиреНрдп рд╡рд┐рдЪрд▓рди рдХреЛ 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! рдирд╛рдо рдмрджрд▓реЗрдВ

    • рдФрд░ рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдирдП API рдХреЛ 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 рдЖрд░рд╕реА + рдкреАрдХреЗрдПрд╡рд▓ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп рд╣реЛрдЧрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕