рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░!
рдЖрдЬ рд╣рдо C ++ рдореЗрдВ рдореЗрдореЛрд░реА рдФрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЕрдзреНрдпрдпрди рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╕рд╛рдордЧреНрд░реА рдереЛрдбрд╝реА рдЕрдХрд╛рджрдорд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ
рдЧреИрд▓реЛрд╡рд┐рдЯреНрдЬрд╝ рдФрд░
рд╡рд┐рд▓рд┐рдпрдореНрд╕ рдХреА рдкреБрд╕реНрддрдХреЛрдВ рдХреЗ рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рд░реБрдЪрд┐ рд╣реЛрдЧреАред
рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ!
рд╕реНрдирд╛рддрдХ рд╡рд┐рджреНрдпрд╛рд▓рдп рдореЗрдВ, рдореИрдВ рд╡рд┐рддрд░рд┐рдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд▓рдЧрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП, рд╕рд╛рдл рдФрд░ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдХрд╛рдо рдореЗрдВ рд░рд┐рдореЛрдЯ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЕрдореВрд░реНрдд рдЕрддреНрдпрдВрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдмрддрд╛рдПрдВ рдХрд┐ рдореИрдВрдиреЗ C ++ рдореЗрдВ рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рд░рд┐рдореЛрдЯ рдкреЙрдЗрдВрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреИрд╕реЗ рд▓рд┐рдЦреЗ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рдирд┐рдпрдорд┐рдд C ++ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ; рдпрд╣ рджреВрд░рд╕реНрде рд▓рд┐рдВрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдпрд╣ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдЕрдореВрд░реНрддрддрд╛ рдЗрд╕ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░рдг рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЕрдкрдирд╛ рдкреЙрдЗрдВрдЯрд░ (рдЕрдм рддрдХ) рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрдХреЗрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдЕрдореВрд░реНрддрддрд╛рдУрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкрд╛рдардХреЛрдВ рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рджреЗрдЧрд╛ред
рдирд┐рдореНрди рд╕реНрддрд░ рдХреЗ рдПрдкреАрдЖрдИ
рд╡рд┐рддрд░рд┐рдд рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдиреЗ рдЕрдХреНрд╕рд░ C API рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЗрдореЛрд░реА рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдкрдврд╝рд╛ рдФрд░ рд▓рд┐рдЦрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рддрд░рдлрд╝рд╛ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП
MPI API рд╣реИред рдпрд╣ рдПрдкреАрдЖрдИ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рддрд░рд┐рдд рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕реНрдерд┐рдд рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдХреА рдореЗрдореЛрд░реА рд╕реЗ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреА рдкрд╣реБрдВрдЪ рдЦреЛрд▓рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИред
void remote_read(void* dst, int target_node, int offset, int size); void remote_write(void* src, int target_node, int offset, int size);
рд▓рдХреНрд╖реНрдп рдиреЛрдб рдХреЗ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдореЗрдореЛрд░реА рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рд╕рдВрдХреЗрддрд┐рдд
рдСрдлрд╕реЗрдЯ рдкрд░,
remote_read
рдЗрд╕рдореЗрдВ рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕
remote_read
рд╣реИ, рдФрд░
remote_write
рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦрддрд╛ рд╣реИред
рдпреЗ рдПрдкреАрдЖрдИ рдорд╣рд╛рди рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╣рдореЗрдВ рдЙрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрджрд┐рдордпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИрдВред рд╡реЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рднреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реНрддрд░ рдкрд░ рдкреЗрд╢ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ: рд░рд┐рдореЛрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ (рдЖрд░рдбреАрдПрдордП)ред рдЖрдзреБрдирд┐рдХ рд╕реБрдкрд░ рдХрдВрдкреНрдпреВрдЯрд░ рдиреЗрдЯрд╡рд░реНрдХ, рдЬреИрд╕реЗ
рдХреНрд░реЗ рдореЗрд╖ рдФрд░
рдореЗрд▓рд╛рдиреЙрдХреНрд╕ рдИрдбреАрдЖрд░ , рд╣рдореЗрдВ рдпрд╣ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдореЗрдВ рджреЗрд░реА 1-2 ╬╝s рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдЧреАред рдпрд╣ рд╕рдВрдХреЗрддрдХ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб (рдПрдирдЖрдИрд╕реА) рд░реИрдо рдХреЛ рд╕реАрдзреЗ рдкрдврд╝ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ, рдмрд┐рдирд╛ рд░рд┐рдореЛрдЯ рд╕реАрдкреАрдпреВ рдХреЗ рдЬрд╛рдЧрдиреЗ рдФрд░ рдЖрдкрдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдРрд╕реЗ рдПрдкреАрдЖрдИ рдЗрддрдиреЗ рдЕрдЪреНрдЫреЗ рдирд╣реАрдВ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд░рд▓ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЧрд▓рддреА рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдорд┐рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдЦрд░реНрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрд▓рдЧ рдирд╛рдо рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдмрдбрд╝рд╛ рд╕рдиреНрдирд┐рд╣рд┐рдд рдмрдлрд░ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЖрдк рдПрдХ рдЕрдиреНрдп рдареЛрд╕ рдорджрдж рд╕реЗ рд╡рдВрдЪрд┐рдд рд╣реИрдВ: рдЬрдм рдХрдВрдкрд╛рдЗрд▓рд░ рд╢рдкрде рд▓реЗрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЧрд▓рдд рд╕реНрдерд╛рди рдкрд░ рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЖрдкрдХрд╛ рдХреЛрдб рдмрд╕ рдЧрд▓рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╕рдмрд╕реЗ рд░рд╣рд╕реНрдпрдордп рдФрд░ рднрдпрд╛рд╡рд╣ рдкреНрд░рдХреГрддрд┐ рдХреА рд╣реЛрдВрдЧреАред рд╕реНрдерд┐рддрд┐ рдФрд░ рднреА рдЬрдЯрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
рдпреЗ рдПрдкреАрдЖрдИ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИрдВ, рдФрд░ рдЬрдм рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рджреЛ рдпрд╛ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЧрд▓рддреА рд╕реЗ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИред
рд╣рдЯрд╛рдП рдЧрдП рдмрд┐рдВрджреБ
рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЯреВрд▓ рдмрдирд╛рддреЗ рд╕рдордп рдкреЙрдЗрдВрдЯрд░реНрд╕ рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╕реНрддрд░ рд╣реИред рд╕реАрдзреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрднреА-рдХрднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛрдб рдХреЗ рдореВрд▓рднреВрдд рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рд╣реИрдВред рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реА ++ рд▓рд┐рдВрдХ рдЕрдХреНрд╕рд░ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рдПрдХ рдПрдкреАрдЖрдИ рд╣реЛрдЧрд╛, рддреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╕реНрдерд╛рди рджреЛ "рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ" рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: (1)
рд░реИрдВрдХ рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдИрдбреА рдФрд░ (2) рдЗрд╕ рд░реИрдВрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХрд┐рдП рдЧрдП рджреВрд░рд╕реНрде рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рдЭрд╛ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЧрдП рдСрдлрд╕реЗрдЯред ред рдЖрдк рд╡рд╣рд╛рдБ рдирд╣реАрдВ рд░реБрдХ рд╕рдХрддреЗ рдФрд░ рдПрдХ рдкреВрд░реНрдг рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
template <typename T> struct remote_ptr { size_t rank_; size_t offset_; };
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рджреВрд░рд╕реНрде рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдпрд╣ рдПрдкреАрдЖрдИ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛ред
template <typename T> T rget(const remote_ptr<T> src) { T rv; remote_read(&rv, src.rank_, src.offset_, sizeof(T)); return rv; } template <typename T> void rput(remote_ptr<T> dst, const T& src) { remote_write(&src, dst.rank_, dst.offset_, sizeof(T)); }
рдмреНрд▓реЙрдХ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдмрд╣реБрдд рд╕рдорд╛рди рджрд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВред рдЕрдм, рдорд╛рди рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
remote_ptr<int> ptr = ...; int rval = rget(ptr); rval++; rput(ptr, rval);
рдпрд╣ рдореВрд▓ рдПрдкреАрдЖрдИ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ рд╣рдо рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рд▓рд┐рдЦрдирд╛ рдпрд╛ рдкрдврд╝рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд▓рд┐рдЦрдирд╛ рд╣реИред
рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рдд
рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рдд рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрдХрдиреАрдХ рд╣реИ рдЬреЛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ; рдЕрдЧрд░ рд╣рдо рд╕реНрдореГрддрд┐ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╡рддрдГ рд╣рдо рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмрдбрд╝реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред
рдбрд┐рд▓реАрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рдорддрд▓рдм рд╕реЗ рдмрдврд╝рд╛рдирд╛ рдпрд╛ рдШрдЯрд╛рдирд╛ рдХреНрдпрд╛ рд╣реИ? рд╣рдЯрд╛рдП рдЧрдП рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЛ рд╕рд╛рдзрд╛рд░рдг рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рд╣реИ: рдкреА + 1 рдмрд╕ рдореВрд▓ рд░реИрдВрдХ рдХреЗ рд╕рд╛рдЭрд╛ рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рдкреА рдХреЗ рдмрд╛рдж рдЕрдЧрд▓реЗ
sizeof(T)
-рд▓реЙрдиреНрдЧ рдореЗрдореЛрд░реА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдпрджреНрдпрдкрд┐ рдпрд╣ рджреВрд░рд╕реНрде рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдЕрдВрдХрдЧрдгрд┐рдд рдХреА рдПрдХрдорд╛рддреНрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рджреВрд░рд╕реНрде рд╕рдВрдХреЗрдд
рдпреВрдкреАрд╕реА ++ ,
рдбреАрдПрдПрд╕рдПрдЪ рдФрд░ рдмреАрд╕реАрдПрд▓ рдЬреИрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐,
рдпреВрдирд┐рдлрд╛рдЗрдб рдкреИрд░реЗрд▓рд▓ рд╕реА (рдпреВрдкреАрд╕реА) рднрд╛рд╖рд╛, рдЬрд┐рд╕рдиреЗ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ (рдПрдЪрдкреАрд╕реА) рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЗ рд╕рдореБрджрд╛рдп рдореЗрдВ рдПрдХ рд╕рдореГрджреНрдз рд╡рд┐рд░рд╛рд╕рдд рдЫреЛрдбрд╝ рджреА рд╣реИ, рдореЗрдВ рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рдд [1] рдХреА рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдкрд░рд┐рднрд╛рд╖рд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред
рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рд░рд▓ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╕реВрдЪрдХ рдСрдлрд╕реЗрдЯ рдХреЛ рдмрджрд▓рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред
template <typename T> remote_ptr<T> remote_ptr<T>::operator+(std::ptrdiff_t diff) { size_t new_offset = offset_ + sizeof(T)*diff; return remote_ptr<T>{rank_, new_offset}; }
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рддрд░рд┐рдд рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рд╕рд░рдгрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдпрд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ SPMD рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЙрд╕ рдПрд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдкрд░ рд░рд╛рдЗрдЯ рдпрд╛ рд░реАрдб рдСрдкрд░реЗрд╢рди рдХрд░реЗрдЧреА, рдЬрд┐рд╕рдореЗрдВ рд░рд┐рдореЛрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ [2]ред
void write_array(remote_ptr<int> ptr, size_t len) { if (my_rank() < len) { rput(ptr + my_rank(), my_rank()); } }
рдЕрдиреНрдп рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреА рдЖрд╕рд╛рди рд╣реИ, рд╕рд╛рдзрд╛рд░рдг рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рдд рдореЗрдВ рдХрд┐рдП рдЧрдП рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреВрд░реНрдг рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ред
Nullptr рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ
рдирд┐рдпрдорд┐рдд рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП,
nullptr
рд╡реИрд▓реНрдпреВ
NULL
, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдЖрдорддреМрд░ рдкрд░
#define
рдХреЛ 0x0 рддрдХ рдХрдо рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрдореЛрд░реА рдореЗрдВ рдЗрд╕ рд╕реЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рджреВрд░рд╕реНрде рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рдо рдпрд╛ рддреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реВрдЪрдХ рдорд╛рди рдХреЛ
nullptr
рд░реВрдк рдореЗрдВ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рд╕реНрдерд╛рди рдХреЛ рдЕрдкреНрд░рдпреБрдХреНрдд рдореЗрдореЛрд░реА рдореЗрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдмреВрд▓рд┐рдпрди рд╕рджрд╕реНрдп рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╕реВрдЪрдХ рд╢реВрдиреНрдп рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЕрдкреНрд░рдпреБрдХреНрдд рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд╛рди рдмрдирд╛рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдпрд╣ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВрдЧреЗ рдХрд┐ рдЬрдм рдХреЗрд╡рд▓ рдПрдХ рдмреВрд▓рд┐рдпрди рдорд╛рди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд░рд┐рдореЛрдЯ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЖрдХрд╛рд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдВрдХрд▓рдХ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рджреЛрдЧреБрдирд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕рдВрд░реЗрдЦрдг рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП 128 рд╕реЗ 256 рдмрд┐рдЯ рддрдХ рдмрдврд╝ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИред рдореЗрд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ, рдореИрдВрдиреЗ рдорд╛рди 0
nullptr
рд░реВрдк рдореЗрдВ
{0, 0}
, рдХреЛ 0 рдХреА рд░реИрдВрдХ рдХреЗ рд╕рд╛рде 0 рдХреА рдПрдХ рдСрдлрд╕реЗрдЯ
nullptr
ред
nullptr
рд▓рд┐рдП рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЪреБрдирдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдмрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдЫ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдореЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рдпреВрдкреАрд╕реА, рд╕рдВрдХреАрд░реНрдг рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ 64 рдмрд┐рдЯреНрд╕ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдирд┐рдордп рдХреЗ рд╕рд╛рде рдкрд░рдорд╛рдгреБ рддреБрд▓рдирд╛рддреНрдордХ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╕рдВрдХреАрд░реНрдг рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рд╕рдордЭреМрддрд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ: рдпрд╛ рддреЛ рдСрдлрд╕реЗрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдпрд╛ рд░реИрдВрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ 32 рдмрд┐рдЯреНрд╕ рдпрд╛ рдЙрд╕рд╕реЗ рдХрдо рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрд╣ рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╣рдЯрд╛рдП рдЧрдП рд▓рд┐рдВрдХ
рдкрд╛рдпрдерди рдЬреИрд╕реА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдмреНрд░реИрдХреЗрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ
__setitem__
рдФрд░
__getitem__
рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдкрдврд╝рддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред C ++ рдореЗрдВ,
operator[]
рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рдХрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ рдХрд┐рд╕
рд╢реНрд░реЗрдгреА рдХреА рд╣реИ рдФрд░ рдХреНрдпрд╛ рд▓реМрдЯрд╛ рдореВрд▓реНрдп рддреБрд░рдВрдд рдкрдврд╝рдиреЗ рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрдПрдЧрд╛ред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, C ++ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдирд┐рд╣рд┐рдд рдореЗрдореЛрд░реА рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рддреА рд╣реИрдВ, рдЬрд┐рд╕реЗ рд▓рд┐рдЦрд╛ рдпрд╛ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
operator[]
std::vector
рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
std::vector
рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред
T& operator[](size_t idx) { return data_[idx]; }
рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЯрд╛рдЗрдк
T&
рдХреА рдПрдХ рдЗрдХрд╛рдИ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдХрдЪреНрдЪрд╛ рд╕реА ++ рд▓рд┐рдВрдХ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЯрд╛рдЗрдк
T
рдХреА рдЗрдХрд╛рдИ рдирд╣реАрдВ, рдЬреЛ рдХреЗрд╡рд▓ рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдПрдХ рдХрдЪреНрдЪреЗ C ++ рд▓рд┐рдВрдХ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рджреВрд╕рд░реЗ рдиреЛрдб рдкрд░ рд╕реНрдерд┐рдд рдореЗрдореЛрд░реА рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдЪ рд╣реИ, рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╕реНрдЯрдо рд╕рдВрджрд░реНрдн рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рд▓рд┐рдВрдХ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЖрд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ: рдЗрд╕реЗ рдЯрд╛рдЗрдк
T
рдореВрд▓реНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕реЗ рдЯрд╛рдЗрдк
T
рдореВрд▓реНрдп рдкрд░ рднреА рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
T
рдЗрд╕рд▓рд┐рдП, рдПрдХ рджреВрд░рд╕реНрде рд╕рдВрджрд░реНрдн рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдСрдкрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдореВрд▓реНрдп рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рднреА рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдореВрд▓реНрдп рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реИред
template <typename T> struct remote_ref { remote_ptr<T> ptr_; operator T() const { return rget(ptr_); } remote_ref& operator=(const T& value) { rput(ptr_, value); return *this; } };
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЕрдкрдиреЗ рд░рд┐рдореЛрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдирдИ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдореГрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЗрд╕реЗ рд╕рд╛рдзрд╛рд░рдг рдмрд┐рдВрджреБрдУрдВ рдХреА рддрд░рд╣ рд╣реА рдбреАрд░реЗрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
template <typename T> remote_ref<T> remote_ptr<T>::operator*() { return remote_ref<T>{*this}; } template <typename T> remote_ref<T> remote_ptr<T>::operator[](ptrdiff_t idx) { return remote_ref<T>{*this + idx}; }
рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рдордиреЗ рдкреВрд░реА рддрд╕реНрд╡реАрд░ рджрд┐рдЦрд╛ рджреА рд╣реИ рдХрд┐ рдЖрдк рд░рд┐рдореЛрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рд░рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
void write_array(remote_ptr<int> ptr, size_t len) { if (my_rank() < len) { ptr[my_rank()] = my_rank(); } }
рдмреЗрд╢рдХ, рд╣рдорд╛рд░рд╛ рдирдпрд╛ рдкреЙрдЗрдВрдЯрд░ рдПрдкреАрдЖрдИ рд╣рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреЗрдбрд╝ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдореА рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рд░реЛрд╣ [3]ред рд╣рдорд╛рд░реЗ рджреВрд░рд╕реНрде рдкреЙрдЗрдВрдЯрд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕реА рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рд╕реНрд╡рдЪреНрдЫ рд╣реИрдВред
рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЧрдд (рдпрд╛ рдЗрд╕рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ!)
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЕрдореВрд░реНрдд рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреНрдпрд╛ рд▓рд╛рдЧрдд рдЖрдПрдЧреА? рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдбреЗрд░реЗрдлреЗрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдордзреНрдпрд╡рд░реНрддреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдлрд┐рд░ рд╣рдо рд░реВрдкрд╛рдВрддрд░рдг рдСрдкрд░реЗрдЯрд░ рдпрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдордзреНрдпрд╡рд░реНрддреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЦрд░реНрдЪ рд╣реЛрдЧрд╛?
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдкреЙрдЗрдВрдЯрд░ рдФрд░ рд░реЗрдлрд░реЗрдВрд╕ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд░рдирдЯрд╛рдЗрдо рдХреЗ рджреМрд░рд╛рди рдЗрд╕ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рдЖрдзреБрдирд┐рдХ C ++ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрди рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдФрд░ рдореЗрдердб рдХреЙрд▓ рдХреЛ рдЖрдХреНрд░рд╛рдордХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВред рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдЕрдореВрд░реНрддрддрд╛ рдХреА рдХреАрдордд рдХреНрдпрд╛ рд╣реЛрдЧреА, рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрд╕реЗрдВрдмрд▓реА рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдПрдЧреА рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдХреМрди рд╕реА рд╡рд╕реНрддреБрдПрдВ рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдореМрдЬреВрдж рд╣реЛрдВрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рдкреЗрдбрд╝-рдЖрдзрд╛рд░рд┐рдд рдХрдЯреМрддреА рдХреЗ рд╕рд╛рде рджреВрд░рджрд░рд╛рдЬ рдХреЗ
remote_read
рдФрд░
remote_write
рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдзреБрдирд┐рдХ рд╕рдВрдХрд▓рдХ рдкреЗрдбрд╝-рдЖрдзрд╛рд░рд┐рдд рдХрдЯреМрддреА рдХреЛ рдХрдИ
remote_read
рдФрд░
remote_write
[4] рд╕реЗ рдХрдо рдХрд░рддреЗ рд╣реИрдВред рдХреЛрдИ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рдХрд╣рд▓рд╛рддреА рд╣реИ, рдХреЛрдИ рд╕рдВрджрд░реНрдн рд╡рд╕реНрддреБ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред
рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛
рдЕрдиреБрднрд╡реА C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдорд╛рдирдХ C ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд▓рд╛рдпрдмреНрд░реЗрд░реА рдмрддрд╛рддрд╛ рд╣реИ: STL рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ
рдХрд╕реНрдЯрдо C ++ рдПрд▓реЛрдХреЗрдЯрд░реНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдореЗрдореЛрд░реА рдХреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдмрд╕ рдПрдХ "рджреВрд░рд╕реНрде рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛" рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрд╕рдЯреАрдПрд▓ рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреВрд░рд╕реНрде рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдирд╣реАрдВред рд╕рдВрднрд╡рддрдГ, рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, C ++ рдорд╛рдирдХ рдХреЛ рдЕрдм рдХрд╕реНрдЯрдо рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ C ++ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк GCC рд╕реЗ libstdc ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд╕реНрдЯрдо рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп C ++ рд▓рд┐рдВрдХ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рджреВрд░рд╕реНрде рдореЗрдореЛрд░реА рдореЗрдВ STL рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдХреБрдЫ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдПрдЬреЗрдВрд╕реА , рдЬреЛ рдХрд╕реНрдЯрдо рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдореЗрдВ рдПрд╕рдЯреАрдПрд▓ рд╕реЗ рдХреБрдЫ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЛ рджреВрд░рд╕реНрде рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛, рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рд▓рд┐рдВрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдЪрдирд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдорд┐рд▓рддреА рд╣реИ, рдФрд░, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡реНрдпрд╛рдкрдХ рд╕рдВрджрд░реНрдн
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдХрдИ рд╡реНрдпрд╛рдкрдХ рдФрд░ рдЕрднреА рддрдХ рд╣рд▓ рдирд╣реАрдВ рдХреА рдЧрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рд╣реИред
- рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди ред рдЕрдм рдЬрдм рд╣рдо рджреВрд░рд╕реНрде рдореЗрдореЛрд░реА рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдРрд╕реА рджреВрд░рд╕реНрде рдореЗрдореЛрд░реА рдХреЛ рдХреИрд╕реЗ рдЖрд░рдХреНрд╖рд┐рдд рдпрд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВрдЧреЗ?
- рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди ред рдРрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреА рджреВрд░рд╕реНрде рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЬреЛ рдЗрдВрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИрдВ? рдХреНрдпрд╛ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪреНрдЫ рд╕рдорд░реНрдерди рд╕рдВрднрд╡ рд╣реИ? рдХреНрдпрд╛ рд╕реАрд░реАрдЬрд╝ рдкрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
- рд╡рд┐рддрд░рд┐рдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рдирд╛ ред рдЕрдм рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдпреЗ рд╕рд╛рд░ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдирдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдбреЗрдЯрд╛ рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╕рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?
рдиреЛрдЯ
[рез] рдпреВрдкреАрд╕реА рдореЗрдВ, рдкреЙрдЗрдВрдЯрд░реНрд╕ рдореЗрдВ рдПрдХ рдЪрд░рдг рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдмрдврд╝рд╛рдХрд░ рдХреНрдпрд╛ рд░реИрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪрд░рдгреЛрдВ рдХреЗ рдХрд╛рд░рдг, рд╡рд┐рддрд░рд┐рдд рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдХреЗрдд рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрдирдореЗрдВ рд╡рд┐рддрд░рдг рдкреИрдЯрд░реНрди рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЬрд╛рджреБрдИ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рдпреВрдкреАрд╕реА рдЗрдХреНрдХреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╣рд▓реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░рд┐рдореЛрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦрдирд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
[реи] HPC рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдкреНрд▓рд┐рдХреЗрд╢рди
SPMD рдХреА рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдЗрд╕ рдирд╛рдо рдХрд╛ рдЕрд░реНрде рд╣реИ "рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо, рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ред" SPMD API рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╡реИрд░рд┐рдПрдмрд▓
my_rank()
рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд░реИрдВрдХ рдпрд╛ рдЖрдИрдбреА рдмрддрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╣ рдлрд┐рд░ рдореБрдЦреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рд╢рд╛рдЦрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
[рей] рдпрд╣рд╛рдБ рджреВрд░рд╕реНрде рд╕реВрдЪрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП SPMD рд╢реИрд▓реА рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдкреЗрдбрд╝ рдХреА рдХрдореА рд▓рд┐рдЦреА рдЧрдИ рд╣реИред рдХреЛрдб рдХреЛ рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА
рдПрдВрдбреНрд░рдпреВ рдмреЗрд▓реНрдЯ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
template <typename T> T parallel_sum(remote_ptr<T> a, size_t len) { size_t k = len; do { k = (k + 1) / 2; if (my_rank() < k && my_rank() + k < len) { a[my_rank()] += a[my_rank() + k]; } len = k; barrier(); } while (k > 1); return a[0]; }
[рек] рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХрд╛ рд╕рдВрдХрд▓рд┐рдд рдкрд░рд┐рдгрд╛рдо
рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред