Lapack: рд╕рднреА рдПрдХрд▓ рд╕рдЯреАрдХ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╕рдЯреАрдХрддрд╛ рдХрд╛ рдиреБрдХрд╕рд╛рди, рдирд┐рд╣рд┐рдд рдФрд░ рд╕реНрдкрд╖реНрдЯ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 19 рдЬреБрд▓ре░ 2021  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Reference-LAPACK/lapack

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░,

рд▓реИрдкреИрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ ssyevd рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдареЛрдХрд░ рдЦрд╛рдИред
рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд▓реИрдкреИрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЪрд▓рддрд╛ рд╣реИ:

рд▓реИрдкреИрдХ рдорд╛рдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдХрдИ рд░реВрдЯреАрди рдЬреИрд╕реЗ ssyevd рдЖрдкрдХреЛ рджреЛ рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
рдПрдХ рдмрд╛рд░ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрд╕реЗ рдХрд┐рддрдиреА рд╕реНрдХреНрд░реИрдЪ рдореЗрдореЛрд░реА рдЪрд╛рд╣рд┐рдП,
рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЖрд╡рд╢реНрдпрдХ рд╕реНрдХреНрд░реИрдЪ рдореЗрдореЛрд░реА рд╕реЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд░реВрдЯреАрди рдХреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд▓реЗрдВ
рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВред

рдпрджрд┐ рдЖрдк рдЗрд╕ рдкрд╣рд▓реА рдХреЙрд▓ рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╕реНрдореГрддрд┐ рдЖрдХрд╛рд░ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
Ssyevd рдЬреИрд╕реЗ рд░реВрдЯреАрди рдХреЗ рд▓рд┐рдП, рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд▓реИрдкреИрдХ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рднреА,
рд╕реНрдореГрддрд┐ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдПрдХ рд╕реВрдЪрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдлреНрд▓реЛрдЯ рдорд╛рди рдкрд░ рд╡рд╛рдкрд╕ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреЛ рд╕реНрдореГрддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддрд╛ рд╣реИ:

calculate memory       ->    store value in reference   ->  retrieve the value for use (allocation)
    int64                            float                              int64

рдпрд╣ int64 рдПрдХ ilp64 рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ int32 рд╣реЛрдЧрд╛ред
рддреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдореГрддрд┐ рдореВрд▓реНрдп рдХрд╛ рдПрдХ рдордзреНрдпрд╕реНрде рдЫреЛрдЯрд╛ рд╣реИ
63 рдмрд┐рдЯ рд╕реЗ 24 рдмрд┐рдЯ !!!
(рдпрд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ, рдЖрдИрдИрдИрдИ 754 рдлреНрд▓реЛрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рд╕рдмрд╕реЗ рдмрд╛рд╣рд░реА рд╕реЗрдЯ рдмрд┐рдЯреНрд╕ рдХреЗ рдмреАрдЪ 24 рдмрд┐рдЯ рддрдХ)
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ 32 рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ 31 рдмрд┐рдЯреНрд╕ рд╕реЗ 24 рдмрд┐рдЯреНрд╕ рддрдХ рдЫреЛрдЯрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд╕реНрдореГрддрд┐ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЧрдгрдирд╛ рдХреЛ рдЕрддреАрдд рдХреА рддрд░рд╣ 'рд╣рд╛рде рд╕реЗ' рдХрд╣рддреЗ рд╣реИрдВ
рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рджреЗрдЦрдиреЗ рдХрд╛ рдореМрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдВ рдЧрд▓рдд рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЖрдк рд╢реЙрд░реНрдЯрд┐рдВрдЧ рдХреЛ рд░реЛрдХ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ
рдПрдХ рдлреНрд▓реЛрдЯ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдПред рдпрджрд┐ рдЖрдк рдЖрдзреБрдирд┐рдХ рд▓реИрдкреИрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
рдЖрдкрдХреЛ рдкрддрд╛ рднреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджрд┐рдирдЪрд░реНрдпрд╛ рдзреНрдпрд╛рди рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬреНрдЮрд╛рдкрд┐рдд рдХрд░рддреА рд╣реИ
рд╕рднреА рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣реА!

рдпрд╣ рд▓реИрдкреИрдХ рдореЗрдВ рд╕рднреА рдПрдХрд▓ рд╕рдЯреАрдХ рд░реВрдЯреАрди (рдПрд╕/рд╕реА) рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ
рдПрдХ рдордзреНрдпрд╕реНрде рдХрджрдо рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдореГрддрд┐ рдЖрд╡рд╢реНрдпрдХрддрд╛ред
рдбрдмрд▓ рдкреНрд░реЗрд╕рд┐рдЬрди рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдбрдмрд▓ рд╕рдЯреАрдХ рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛,
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдордзреНрдпрд╕реНрде рдорд╛рди рдХреЛ 53 рдмрд┐рдЯреНрд╕ рддрдХ рдмрдврд╝рд╛рдирд╛, рдЬреЛ рдЕрднреА рднреА 64 рдмрд┐рдЯреНрд╕ рдХреЗ рдХрд░реАрдм рдирд╣реАрдВ рд╣реИ
рдХреЛрдИ 64 рдмрд┐рдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдорд╛рди рд▓реЗрдЧрд╛ред

рд╕рдорд╛рдзрд╛рди, рдЪрд╛рд░ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЗ:

  1. рдпрджрд┐ рдЖрдк рдПрдХрд▓ рдпрд╛ рдЬрдЯрд┐рд▓ рд▓реИрдкреИрдХ рд░реВрдЯреАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕реА рд▓реИрдкреИрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ
  2. рдпрджрд┐ рдЖрдк рдЯреВ-рдХреЙрд▓ рд▓реИрдкреИрдХ рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореЗрдореЛрд░реА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдбрдмрд▓ (!) рд░реВрдЯреАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
  3. рд▓реИрдкреИрдХ рд░реВрдЯреАрди рдХреЗ рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдореЗрдореЛрд░реА рдХреА рдЧрдгрдирд╛ рд╕реНрд╡рдпрдВ рдХрд░реЗрдВ
  4. рдлреНрд▓реЛрдЯ/рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕ рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреЗрд╡рд▓ рдЫреЛрдЯреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЖрдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░рдг рддрдХ рдЗрд╕рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
int64 рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде openBLAS рдирд┐рд░реНрдорд╛рдг ssyevd рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рдЗрдирдкреБрдЯ рдкрд░ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ

рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдЯреВ-рдХреЙрд▓ рдкрджреНрдзрддрд┐ рдХреЗ рд╕рд╛рде, рдпрд╣ рдмрдЧ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рджреЛрд╖ рд╣реИред
рд▓реИрдкреИрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕реЗ рдХрд╛рдлреА рдЧрдВрднреАрд░ рдмрдЧ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рд╛рджрд░,

рдСрдХреНрд╕реАрдбрд┐рд╕рд░

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

рдПрд▓рд╡рд░реНрдХ рдХреЛ рдЗрди/рдЖрдЙрдЯ рдореЗрдВ рдмрджрд▓рдирд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИред рддрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ LAPACK рд╕рдВрд╕реНрдХрд░рдг <= 3.10 (рдХрд╣рдирд╛) рдпрд╛> 3.10 рдерд╛, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ lwork рдХрд╣рд╛рдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬрд╣рд╛рдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ рдХреЙрдиреНрд╕ рд╡реИрд▓реНрдпреВ рдореЗрдВ рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВ - рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рд░ рд░рд╣реЗрдЧрд╛ - рдЗрд╕рд▓рд┐рдП LAPACK рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдорд╛рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣рд╛рдирд┐рдХрд╛рд░рдХ (рдпреВрдмреА) рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдЧреНрдорд╛ рдореЗрдВ:

    const magma_int_t ineg_one = -1;
    ...
            magma_int_t query_magma, query_lapack;
            magma_zgesdd( *jobz, M, N,
                          unused, lda, runused,
                          unused, ldu,
                          unused, ldv,
                          dummy, ineg_one,  // overwriting ineg_one would break MAGMA
                          #ifdef COMPLEX
                          runused,
                          #endif
                          iunused, &info );
            assert( info == 0 );
            query_magma = (magma_int_t) MAGMA_Z_REAL( dummy[0] );

рд╕рдорд╛рдзрд╛рди рдЬреЛ рдореИрдВрдиреЗ рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдореИрдЧреНрдорд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╣ рдХреЗрд╡рд▓ sgesdd, рдЖрджрд┐ рдореЗрдВ рд╣реИ, рдХрд╛рдо рдореЗрдВ рд▓реМрдЯрд╛рдП рдЧрдП lwork рдХреЛ рдереЛрдбрд╝рд╛ рдКрдкрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рд▓рд┐рдП рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рди рд╣рдореЗрд╢рд╛> = рдЗрдЪреНрдЫрд┐рдд рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИред https://bitbucket.org/icl/magma/src/master/control/magma_zauxiliary.cpp рджреЗрдЦреЗрдВ рдФрд░ рдХрд░реЗрдВред (рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдПрдХрд▓-рд╕рдЯреАрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рд▓реАрдЬрд╝ рджреЗрдЦреЗрдВред) рдореВрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ

    WORK( 1 ) = MAXWRK

рд╕рд╛рде

    WORK( 1 ) = lapack_roundup_lwork( MAXWRK )

рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди lapack_roundup_lwork рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдКрдкрд░ рдЙрдард╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ magma_*make_lwork рдХрд░рддрд╛ рд╣реИред рдореИрдЧреНрдорд╛ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХрд▓-рд╕рдЯреАрдХ рдИрдкреАрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд▓реЗрдХрд┐рди рдЧрдгрдирд╛ рдХреЛ рдбрдмрд▓ рдореЗрдВ рдХрд░рддреЗ рд╣реБрдП, (1 + рдИрдкреАрдПрд╕) рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдЧреЛрд▓ рдХрд┐рдпрд╛ред рддрдм рдореМрдЬреВрджрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЕрдзрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ lwork> 2^54 рдХреЗ рд▓рд┐рдП рдкрд╛рдпрд╛, рдЗрд╕реЗ LAPACK рдкрд░рд┐рднрд╛рд╖рд╛ slamch ("eps") = 5.96e- рдХреЗ рдмрдЬрд╛рдп epsilon = 1.19e-07 (рдЙрд░реНрдл ulp) рдХреА рд╕реА/рд╕реА ++/рдлреЛрд░рдЯреНрд░рд╛рди рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред 08 (рдЙрд░реНрдл рдпреВрдирд┐рдЯ рд░рд╛рдЙрдВрдбрдСрдлрд╝, рдпреВ)ред рдпрджрд┐ ulp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрдгрдирд╛ рдПрдХрд▓ рдореЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рд╕рдордп рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛ рд╣реЛрдЧрд╛ (рдХрд╛рд░реНрдп рд╕рд░рдгреА рд╕реВрдЪрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдХрд╛рд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП), рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЖрдХрд╛рд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ рдХреЛ рдЗрди/рдЖрдЙрдЯ рдЪрд░ рдореЗрдВ рдмрджрд▓рдиреЗ рдФрд░ рд╕рдЯреАрдХ рдорд╛рди рдХреЛ рд╡рд╛рдкрд╕ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдХреНрдпрд╛ рд░реЛрдХрддрд╛ рд╣реИ? рдПрдХ "рдЖрдзреБрдирд┐рдХ" рдХреЙрд▓рд░ рддрдм рдкрд╣рд▓реЗ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд░реНрдХ рдРрд░реЗ рд╕рджрд╕реНрдп рдХрд╛ рд╕рд╣рд╛рд░рд╛ рддрднреА рд▓реЗрдЧрд╛ рдЬрдм lwork рдЕрднреА рднреА -1 рдерд╛, рдПрдХ "рдкреБрд░рд╛рдиреЗ" рдХреЙрд▓рд░ рдХреЛ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╢рд╛рдпрдж рдЖрд╡рд╢реНрдпрдХ LWORK рд╡рд╛рдкрд╕ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдорд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдерд╛ рдФрд░ ilp64 рдиреЗ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ред рдореИрдВ рдЙрди рджрд┐рдиреЛрдВ рдХрд╛ рд╕рдкрдирд╛ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рджреЛ рдХреЙрд▓ рдпреЛрдЬрдирд╛ рдХреЗ рдмрдЬрд╛рдп рд░рдирдЯрд╛рдЗрдо рдкрд░ рдПрдирдмреА рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рджреЛ рдЪрд░реНрдЪрд╛ рд╕реВрддреНрд░ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ:
https://icl.cs.utk.edu/lapack-forum/viewtopic.php?t=1418
http://icl.cs.utk.edu/lapack-forum/archives/lapack/msg00827.html

рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдореБрджреНрджрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдУ (рдПрди ^ 2) рд╡рд░реНрдХрд╕реНрдкреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП O(n*nb) рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдпрд╣ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реИред

рд╣рд╛рдБ, рдпрд╣ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рджреЛрд╖ рд╣реИред

@ рдорд╛рд░реНрдЯрд┐рди-рдПрдлрдЖрд░рдмреАрдЬреА: рд╕реА _рд╡рд░реНрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХреИрд╕реЗ рд╣реЛрдЧрд╛? рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рд╡рд╣рд╛рдВ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ LWORK рд╣реИред LWORK рдХреЛ INPUT/OUTPUT рдореЗрдВ рдмрджрд▓рдиреЗ рд╕реЗ рдПрдХ рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рдЖрдпрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ? рджреЗрдЦреЛ:
https://github.com/Reference-LAPACK/lapack/blob/aa631b4b4bd13f6ae2dbab9ae9da209e1e05b0fc/LAPACKE/src/lapacke_dgeqrf_work.c#L35

рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╣рдо LAPACK_dgeqrf__workspace_query() рдЬреИрд╕реЗ рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдЖрд╡рдВрдЯрди рд╕рдмрд░реВрдЯреАрди рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред

рд╡реЗрд▓рдк, рдореЗрд░реА рдЪрд╛рд▓рд╛рдХ рдпреЛрдЬрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдЬрдм рд╢рд╛рдВрдд рд╣реЛ ...
рд▓реЗрдХрд┐рди рдпреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдПрдХ рдХрд╛рдо рдХрд╛ рдЖрдХрд╛рд░ рдПрдХ рд▓реИрдкреИрдХ_рдЗрдВрдЯ рд╕реЗ рдмрд╣ рд░рд╣рд╛ рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ "рдХреЗрд╡рд▓" рд╕реАрдорд┐рдд рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рдХрд╛рд░рдг рдПрдХ рдЧрд▓рдд рдмрдпрд╛рдиреА рд╣реИ - рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдмрд╛рдж рдХреА рдХреАрдордд рдкрд░ рдмрд╛рдж рдХреА рдЙрдореНрдореАрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдЖрдХрд╛рд░ рдХреЛ рдЧреЛрд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдпрд╛ рдирд╣реАрдВ "рдХреБрдЫ" рдЕрдкреНрд░рдпреБрдХреНрдд рд╕реНрдореГрддрд┐?

рд╣рд╛рдБ, рдпрд╣ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рджреЛрд╖ рд╣реИред

рдореИрдВ рдпрд╣рд╛рдВ 2 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЦрд╛рдорд┐рдпрд╛рдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ:

  1. LAPACK рдкрд░: рд░реВрдЯреАрди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдп рдЖрдХрд╛рд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред
  2. LAPACKE рдкрд░: рджрд┐рдирдЪрд░реНрдпрд╛ LAPACK рд╕реЗ рджреЛрд╖ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░рддреА рд╣реИред

@ рдорд╛рд░реНрдЯрд┐рди-рдПрдлрдЖрд░рдмреАрдЬреА рдХрд╛ рд╡рд┐рдЪрд╛рд░ (1) рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред рдирдпрд╛ рдлреЛрд░рдЯреНрд░рд╛рди рдХреЛрдб рдХрд╛рдо (1) рдХреЗ рдмрдЬрд╛рдп LWORK рдХреЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ (рдЕрд░реНрдз-) рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ssyevd.f , рд╣рдо рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

  ELSE IF( LQUERY ) THEN
     RETURN
  END IF

рджреНрд╡рд╛рд░рд╛

  ELSE IF( LQUERY ) THEN
     LWORK = LOPT
     RETURN
  END IF

LAPACKE_dgeqrf__work_query() рдЬреЛрдбрд╝рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ @langou рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ, рд╣рд▓ рдХрд░рддрд╛ рд╣реИ (2), рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рд╕рдВрд╢реЛрдзрди рд╕реЗ рдЬреБрдбрд╝реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рдо рд╣реИрдВред

рдПрд▓рд╡рд░реНрдХ рдХреЛ рдЗрди/рдЖрдЙрдЯ рдореЗрдВ рдмрджрд▓рдирд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИред рддрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ LAPACK рд╕рдВрд╕реНрдХрд░рдг <= 3.10 (рдХрд╣рдирд╛) рдпрд╛> 3.10 рдерд╛, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ lwork рдХрд╣рд╛рдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬрд╣рд╛рдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ рдХреЙрдиреНрд╕ рд╡реИрд▓реНрдпреВ рдореЗрдВ рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВ - рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рд░ рд░рд╣реЗрдЧрд╛ - рдЗрд╕рд▓рд┐рдП LAPACK рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдорд╛рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣рд╛рдирд┐рдХрд╛рд░рдХ (рдпреВрдмреА) рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдЧреНрдорд╛ рдореЗрдВ:

    const magma_int_t ineg_one = -1;
    ...
            magma_int_t query_magma, query_lapack;
            magma_zgesdd( *jobz, M, N,
                          unused, lda, runused,
                          unused, ldu,
                          unused, ldv,
                          dummy, ineg_one,  // overwriting ineg_one would break MAGMA
                          #ifdef COMPLEX
                          runused,
                          #endif
                          iunused, &info );
            assert( info == 0 );
            query_magma = (magma_int_t) MAGMA_Z_REAL( dummy[0] );

рд╕рдорд╛рдзрд╛рди рдЬреЛ рдореИрдВрдиреЗ рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдореИрдЧреНрдорд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╣ рдХреЗрд╡рд▓ sgesdd, рдЖрджрд┐ рдореЗрдВ рд╣реИ, рдХрд╛рдо рдореЗрдВ рд▓реМрдЯрд╛рдП рдЧрдП lwork рдХреЛ рдереЛрдбрд╝рд╛ рдКрдкрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рд▓рд┐рдП рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рди рд╣рдореЗрд╢рд╛> = рдЗрдЪреНрдЫрд┐рдд рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИред https://bitbucket.org/icl/magma/src/master/control/magma_zauxiliary.cpp рджреЗрдЦреЗрдВ рдФрд░ рдХрд░реЗрдВред (рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдПрдХрд▓-рд╕рдЯреАрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рд▓реАрдЬрд╝ рджреЗрдЦреЗрдВред) рдореВрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ

    WORK( 1 ) = MAXWRK

рд╕рд╛рде

    WORK( 1 ) = lapack_roundup_lwork( MAXWRK )

рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди lapack_roundup_lwork рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдКрдкрд░ рдЙрдард╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ magma_*make_lwork рдХрд░рддрд╛ рд╣реИред рдореИрдЧреНрдорд╛ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХрд▓-рд╕рдЯреАрдХ рдИрдкреАрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд▓реЗрдХрд┐рди рдЧрдгрдирд╛ рдХреЛ рдбрдмрд▓ рдореЗрдВ рдХрд░рддреЗ рд╣реБрдП, (1 + рдИрдкреАрдПрд╕) рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдЧреЛрд▓ рдХрд┐рдпрд╛ред рддрдм рдореМрдЬреВрджрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЕрдзрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ lwork> 2^54 рдХреЗ рд▓рд┐рдП рдкрд╛рдпрд╛, рдЗрд╕реЗ LAPACK рдкрд░рд┐рднрд╛рд╖рд╛ slamch ("eps") = 5.96e- рдХреЗ рдмрдЬрд╛рдп epsilon = 1.19e-07 (рдЙрд░реНрдл ulp) рдХреА рд╕реА/рд╕реА ++/рдлреЛрд░рдЯреНрд░рд╛рди рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред 08 (рдЙрд░реНрдл рдпреВрдирд┐рдЯ рд░рд╛рдЙрдВрдбрдСрдлрд╝, рдпреВ)ред рдпрджрд┐ ulp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрдгрдирд╛ рдПрдХрд▓ рдореЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

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

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

nboelter picture nboelter  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

christoph-conrads picture christoph-conrads  ┬╖  26рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hokb picture hokb  ┬╖  16рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Dichloromethane picture Dichloromethane  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

epsilon-0 picture epsilon-0  ┬╖  41рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ