рдмреЗрдХрд╛рд░ MPI рдореЗрдВ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рд╕рдВрджреЗрд╢ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░ рджрд┐рдпрд╛: рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд╢ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЬреЛ рдереЛрдбрд╝реЗ "рд╡рд┐рд╖рдп рдореЗрдВ" рд╣реИрдВ

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



рд╣рдорд╛рд░рд╛ "рджрд┐рдпрд╛:"


рддреЛ, рд╣рдорд╛рд░реЗ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рддрдиреА рдмрд╛рд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреЛ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рд╡рд┐рд▓рдВрдмрд┐рдд рдкреЙрдЗрдВрдЯ-рдЯреВ-рдкреЙрдЗрдВрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдмреНрд▓реЙрдХ-рдЯреВ-рдкреЙрдЗрдВрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬрд╝ рд╣реИред рд╣рдо рдЖрдпрд╛рдо 64, 256, 1024, 4096, 8192, 16384, 65536, 262144, 1048576, 4194304, 16777216, 33554432 рддрддреНрд╡реЛрдВ рдХреЗ рдЗрдирдкреБрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдкрди рдХрд░реЗрдВрдЧреЗред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рдЪрд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рдФрд░ рдпрд╣рд╛рдБ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ:



рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рд╣рдореЗрдВ рддреАрди рд╡реИрдХреНрдЯрд░ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП: Y1, Y2 рдФрд░ Y3, рдЬреЛ рд╢реВрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХрддреНрд░ рдХрд░реЗрдЧрд╛ред рдореИрдВ 16 рдЬреАрдмреА рд░реИрдо рдХреЗ рд╕рд╛рде рдЗрдВрдЯреЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЗрд╕ рдкреВрд░реА рдЪреАрдЬ рдХрд╛ рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░реВрдВрдЧрд╛ред рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо Microsoft рд╕рдВрд╕реНрдХрд░рдг 9.0.1 (рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдпрд╣ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ), Visual Studio рд╕рд╛рдореБрджрд╛рдпрд┐рдХ 2017 рдФрд░ рдлрд╝реЛрд░реНрдЯрди рд╕реЗ MPI рдорд╛рдирдХ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

materiel


рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдПрдордкреАрдЖрдИ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЖрдк рд╣рдореЗрд╢рд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрд╡рд▓реЛрдХрди рджреВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рд╡рд┐рдирд┐рдордп рдЕрд╡рд░реБрджреНрдз


рдкреЙрдЗрдВрдЯ-рдЯреВ-рдкреЙрдЗрдВрдЯ рдореИрд╕реЗрдЬрд┐рдВрдЧ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

MPI_Send - рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЙрдкрдХрд░рдг, рдЕрд░реНрдерд╛рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдм рддрдХ рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рднреЗрдЬреЗ рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдЗрд╕рдХреА рдореЗрдореЛрд░реА рд╕реЗ рдПрдордкреАрдЖрдИ рдЖрдВрддрд░рд┐рдХ рд╕рд┐рд╕реНрдЯрдо рдмрдлрд░ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдЧреЗ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреА рд╣реИ;
MPI_Recv - рдЕрд╡рд░реБрджреНрдз рд╕рдВрджреЗрд╢ рд░рд┐рд╕реЗрдкреНрд╢рди рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдм рддрдХ рдЕрд╡рд░реБрджреНрдз рд╣реЛрддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рднреЗрдЬрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рддрдХ рдпрд╣ рдбреЗрдЯрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдордкреАрдЖрдИ рд╡рд╛рддрд╛рд╡рд░рдг рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрдлрд░ рдХреЛ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рд╡рд┐рдирд┐рдордп рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░ рджрд┐рдпрд╛


рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рдмрд┐рдВрджреБ-рд╕реЗ-рдмрд┐рдВрджреБ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

MPI_Send_init - рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рддрд╛рд╡рд░рдг рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣реЛрдЧрд╛ рдФрд░ рдХреЛрдИ рддрд╛рд▓реЗ рдирд╣реАрдВ;
MPI_Recv_init - рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рд░ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП;
MPI_Start - рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдпрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ a.k.a рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рднреА рдЪрд▓рддрд╛ рд╣реИред рдмрд┐рдирд╛ рдЕрд╡рд░реЛрдз рдХреЗ;
MPI_Wait - рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪреЗрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИ (рдпрджрд┐ рдбреЗрдЯрд╛ "рднреЗрдЬрд╛ рдирд╣реАрдВ рдЧрдпрд╛" рдпрд╛ "рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖ")ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреА рд╣реИ рдЬреЛ рдЕрднреА рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреА рд╣реИ - рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЙрд╕ рдЬрдЧрд╣ рдХреЗ рд╕рд╛рдордиреЗ MPI_Wait рдбрд╛рд▓реЗрдВ рдЬрд╣рд╛рдВ рдЙрд╕реЗ рдЗрд╕ рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЗрд╕реЗ рдбрд╛рд▓реЗрдВ рднрд▓реЗ рд╣реА рдбреЗрдЯрд╛ рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░ рдХрд╛ рдЦрддрд░рд╛ рд╣реЛ)ред рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдиреЗ рдкреГрд╖реНрдарднреВрдорд┐ рдбреЗрдЯрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг рд╢реБрд░реВ рдХрд┐рдпрд╛, рдФрд░ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрд╕рдиреЗ рддреБрд░рдВрдд рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдмрджрд▓рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ - рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЙрд╕ рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рдордиреЗ MPI_Wit рдбрд╛рд▓реЗрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рдЗрд╕реЗ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ рднрд▓реЗ рд╣реА рдмрд╕ рдбреЗрдЯрд╛ рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░ рдХрд╛ рдЦрддрд░рд╛ рд╣реИ)ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╢рдмреНрджрд╛рд░реНрде рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рд╡рд┐рдирд┐рдордп рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд╛ рдХреНрд░рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

  1. MPI_Send_init / MPI_Recv_init - рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдпрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рддрд╛рд╡рд░рдг рддреИрдпрд╛рд░ рдХрд░рдирд╛
  2. MPI_Start - рдкреНрд░рд╛рдкреНрдд / рд╕рдВрдЪрд╛рд░рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░реЗрдВ
  3. MPI_Wait - рд╣рдо рд╕рдВрдЪрд╛рд░рд┐рдд рдпрд╛ рдбреЗрдЯрд╛ рдбреЗрдЯрд╛ рдХреЗ рдиреБрдХрд╕рд╛рди ("рдЕрдВрдбрд░рд╕реЗрдВрдбрд┐рдВрдЧ" рдФрд░ "рдЕрдВрдбрд░рдкреЛрд░реНрдЯрд┐рдВрдЧ" рд╕рд╣рд┐рдд) рдХреЗ рдЬреЛрдЦрд┐рдо рдХреЛ рдмреБрд▓рд╛рддреЗ рд╣реИрдВ

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ MPI_Startall , MPI_Waitall рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЙрдирдХрд╛ рдЕрд░реНрде рдореВрд▓ рд░реВрдк рд╕реЗ рдХреНрд░рдорд╢рдГ MPI_Start рдФрд░ MPI_Wait рдХреЗ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ рд╡реЗ рдХрдИ рдкреИрдХреЗрдЬреЛрдВ рдФрд░ / рдпрд╛ рдкреНрд░рд╕рд╛рд░рдгреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рд╛рд░рдВрдн рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдирд╣реАрдВ рд╣реИ, рд╕рдВрдЪрд╛рд▓рди рдХреА рдкреВрд░реНрдгрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдХрдИ рдФрд░ рдХрд╛рд░реНрдп рд╣реИрдВред

рдЕрдВрддрд░-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛


рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЪрд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреНрд░рд╛рдл рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд┐рд╕реА рдХреЛ рд╕рднреА рд╡реЗрдХреНрдЯрд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдкрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдБ рдореБрдЭреЗ рдХреНрдпрд╛ рдорд┐рд▓рд╛ рд╣реИ:



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

рдЦреИрд░, рд╣рдордиреЗ рдЖрдЦрд┐рд░ рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рдХрдм рджрд┐рдпрд╛:

  1. рд╣рдо рдХрд┐рд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
  2. рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдХрд┐рди рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ?
  3. рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд░реЗрдВрдЧреЗ?

рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ ...

рд╣рдорд╛рд░рд╛ "рд╕рдорд╛рдзрд╛рди:"


рдЖрдЧреЗ, рдореИрдВ рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рджреЛ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдХреЛрдб рдкреНрд░рд╕реНрддреБрдд рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ рдХреБрдЫ рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреВрдВрдЧрд╛ред

рдореИрдВрдиреЗ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╡реЗрдХреНрдЯрд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ (рдРрдб, рд╕рдм, рдореНрдпреВ, рдбрд┐рд╡) рдореЗрдВ рдирд┐рдХрд╛рд▓рд╛ред рд╕рднреА рдЗрдирдкреБрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдЙрди рдлрд╝рд╛рд░реНрдореБрд▓реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЖрд░рдореНрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рд▓рдЧрднрдЧ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рдЪреВрдВрдХрд┐ рд╢реВрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдиреНрдп рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕рдмрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд░рдирдЯрд╛рдЗрдо рдХреЗ рдмрд░рд╛рдмрд░ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рд╕рдордп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ: рдЕрдВрдХрдЧрдгрд┐рддреАрдп / рдореИрд╕реЗрдЬрд┐рдВрдЧ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ)ред рд╣рдо MPI_WIME рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдорд╛рдкреЗрдВрдЧреЗ, рдФрд░ рд╕рд╛рде рд╣реА рдореИрдВрдиреЗ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдХрд┐ рдореИрдВрдиреЗ MPI_Wtick (рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдореЗрд░реА рдЖрддреНрдорд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдШрдбрд╝рд┐рдпреЛрдВ рдХрд╛ рдХреНрдпрд╛ рд╕рдВрдХрд▓реНрдк рд▓рд┐рдпрд╛ рд╣реИ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╡реЗ рдореЗрд░реЗ рдЖрдХреНрд░рд╛рдордХ рдЯреАрдПрд╕рд╕реА рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдВрдЧреЗ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдорд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рддреИрдпрд╛рд░ рд╣реВрдВред рд╕рдордп рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╕рдорд╛рд░реЛрд╣ рдХреЛ MPI_WIME рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛)ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЙрди рд╕рднреА рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦреЗрдВрдЧреЗ рдЬреЛ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦреЗ рдереЗ рдФрд░ рдЧреНрд░рд╛рдл рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдо рдЕрдВрдд рдореЗрдВ рдЗрди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗ (рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдбрд┐рдмрдЧ рднреА)ред



рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдХрд┐рд╕реЗ рдкрд░рд╡рд╛рд╣ рд╣реИ:

рдмреНрд▓реЙрдХрд┐рдВрдЧ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рд╡рд╛рд▓рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо
#include "pch.h" #include <iostream> #include <iomanip> #include <fstream> #include <mpi.h> using namespace std; void add(double *A, double *B, double *C, int n); void sub(double *A, double *B, double *C, int n); void mul(double *A, double *B, double *C, int n); void div(double *A, double *B, double *C, int n); int main(int argc, char **argv) { if (argc < 2) { return 1; } int n = atoi(argv[1]); int rank; double start_time, end_time; MPI_Status status; double *A = new double[n]; double *B = new double[n]; double *C = new double[n]; double *D = new double[n]; double *E = new double[n]; double *G = new double[n]; double *T0 = new double[n]; double *T1 = new double[n]; double *T2 = new double[n]; for (int i = 0; i < n; i++) { A[i] = double (2 * i + 1); B[i] = double(2 * i); C[i] = double(0.003 * (i + 1)); D[i] = A[i] * 0.001; E[i] = B[i]; G[i] = C[i]; } cout.setf(ios::fixed); cout << fixed << setprecision(9); MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (rank == 0) { start_time = MPI_Wtime(); sub(A, B, T0, n); MPI_Send(T0, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD); MPI_Send(T0, n, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD); div(T0, G, T1, n); MPI_Recv(T2, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD, &status); add(T1, T2, T0, n); mul(T0, T1, T2, n); MPI_Recv(T0, n, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD, &status); MPI_Send(T2, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD); add(T0, T2, T1, n); MPI_Recv(T0, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD, &status); MPI_Recv(T2, n, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD, &status); end_time = MPI_Wtime(); cout << "Clock resolution: " << MPI_Wtick() << " secs" << endl; cout << "Thread " << rank << " execution time: " << end_time - start_time << endl; } if (rank == 1) { add(C, C, T0, n); MPI_Recv(T1, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status); MPI_Send(T0, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD); mul(T1, G, T2, n); add(T2, C, T0, n); MPI_Recv(T1, n, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD, &status); MPI_Send(T0, n, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD); sub(T1, T0, T2, n); MPI_Recv(T0, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status); add(T0, T2, T1, n); MPI_Send(T1, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD); } if (rank == 2) { mul(C, C, T0, n); MPI_Recv(T1, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status); MPI_Recv(T2, n, MPI_DOUBLE, 3, 0, MPI_COMM_WORLD, &status); MPI_Send(T0, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD); MPI_Send(T0, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD); add(T1, T2, T0, n); mul(T0, G, T1, n); MPI_Recv(T2, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD, &status); mul(T1, T2, T0, n); MPI_Recv(T1, n, MPI_DOUBLE, 3, 0, MPI_COMM_WORLD, &status); mul(T0, T1, T2, n); MPI_Send(T2, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD); } if (rank == 3) { mul(E, D, T0, n); MPI_Send(T0, n, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD); sub(T0, B, T1, n); mul(T1, T1, T2, n); sub(T1, G, T0, n); mul(T0, T2, T1, n); MPI_Send(T1, n, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD); } MPI_Finalize(); delete[] A; delete[] B; delete[] C; delete[] D; delete[] E; delete[] G; delete[] T0; delete[] T1; delete[] T2; return 0; } void add(double *A, double *B, double *C, int n) { for (size_t i = 0; i < n; i++) { C[i] = A[i] + B[i]; } } void sub(double *A, double *B, double *C, int n) { for (size_t i = 0; i < n; i++) { C[i] = A[i] - B[i]; } } void mul(double *A, double *B, double *C, int n) { for (size_t i = 0; i < n; i++) { C[i] = A[i] * B[i]; } } void div(double *A, double *B, double *C, int n) { for (size_t i = 0; i < n; i++) { C[i] = A[i] / B[i]; } } 

рдЖрд╕реНрдердЧрд┐рдд рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдбреЗрдЯрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо
 #include "pch.h" #include <iostream> #include <iomanip> #include <fstream> #include <mpi.h> using namespace std; void add(double *A, double *B, double *C, int n); void sub(double *A, double *B, double *C, int n); void mul(double *A, double *B, double *C, int n); void div(double *A, double *B, double *C, int n); int main(int argc, char **argv) { if (argc < 2) { return 1; } int n = atoi(argv[1]); int rank; double start_time, end_time; MPI_Request request[7]; MPI_Status statuses[4]; double *A = new double[n]; double *B = new double[n]; double *C = new double[n]; double *D = new double[n]; double *E = new double[n]; double *G = new double[n]; double *T0 = new double[n]; double *T1 = new double[n]; double *T2 = new double[n]; for (int i = 0; i < n; i++) { A[i] = double(2 * i + 1); B[i] = double(2 * i); C[i] = double(0.003 * (i + 1)); D[i] = A[i] * 0.001; E[i] = B[i]; G[i] = C[i]; } cout.setf(ios::fixed); cout << fixed << setprecision(9); MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (rank == 0) { start_time = MPI_Wtime(); MPI_Send_init(T0, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD, &request[0]);// MPI_Send_init(T0, n, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD, &request[1]);// MPI_Recv_init(T2, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD, &request[2]);// MPI_Recv_init(T0, n, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD, &request[3]);// MPI_Send_init(T2, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD, &request[4]);// MPI_Recv_init(T0, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD, &request[5]);// MPI_Recv_init(T2, n, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD, &request[6]);// MPI_Start(&request[2]); sub(A, B, T0, n); MPI_Startall(2, &request[0]); div(T0, G, T1, n); MPI_Waitall(3, &request[0], statuses); add(T1, T2, T0, n); mul(T0, T1, T2, n); MPI_Startall(2, &request[3]); MPI_Wait(&request[3], &statuses[0]); add(T0, T2, T1, n); MPI_Startall(2, &request[5]); MPI_Wait(&request[4], &statuses[0]); MPI_Waitall(2, &request[5], statuses); end_time = MPI_Wtime(); cout << "Clock resolution: " << MPI_Wtick() << " secs" << endl; cout << "Thread " << rank << " execution time: " << end_time - start_time << endl; } if (rank == 1) { MPI_Recv_init(T1, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &request[0]);// MPI_Send_init(T0, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &request[1]);// MPI_Recv_init(T1, n, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD, &request[2]);// MPI_Send_init(T0, n, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD, &request[3]);// MPI_Recv_init(T0, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &request[4]);// MPI_Send_init(T1, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &request[5]);// MPI_Start(&request[0]); add(C, C, T0, n); MPI_Start(&request[1]); MPI_Wait(&request[0], &statuses[0]); mul(T1, G, T2, n); MPI_Start(&request[2]); MPI_Wait(&request[1], &statuses[0]); add(T2, C, T0, n); MPI_Start(&request[3]); MPI_Wait(&request[2], &statuses[0]); sub(T1, T0, T2, n); MPI_Wait(&request[3], &statuses[0]); MPI_Start(&request[4]); MPI_Wait(&request[4], &statuses[0]); add(T0, T2, T1, n); MPI_Start(&request[5]); MPI_Wait(&request[5], &statuses[0]); } if (rank == 2) { MPI_Recv_init(T1, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &request[0]);// MPI_Recv_init(T2, n, MPI_DOUBLE, 3, 0, MPI_COMM_WORLD, &request[1]);// MPI_Send_init(T0, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD, &request[2]);// MPI_Send_init(T0, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &request[3]);// MPI_Recv_init(T2, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD, &request[4]);// MPI_Recv_init(T1, n, MPI_DOUBLE, 3, 0, MPI_COMM_WORLD, &request[5]);// MPI_Send_init(T2, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &request[6]);// MPI_Startall(2, &request[0]); mul(C, C, T0, n); MPI_Startall(2, &request[2]); MPI_Waitall(4, &request[0], statuses); add(T1, T2, T0, n); MPI_Start(&request[4]); mul(T0, G, T1, n); MPI_Wait(&request[4], &statuses[0]); mul(T1, T2, T0, n); MPI_Start(&request[5]); MPI_Wait(&request[5], &statuses[0]); mul(T0, T1, T2, n); MPI_Start(&request[6]); MPI_Wait(&request[6], &statuses[0]); } if (rank == 3) { MPI_Send_init(T0, n, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD, &request[0]); MPI_Send_init(T1, n, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD, &request[1]); mul(E, D, T0, n); MPI_Start(&request[0]); sub(T0, B, T1, n); mul(T1, T1, T2, n); MPI_Wait(&request[0], &statuses[0]); sub(T1, G, T0, n); mul(T0, T2, T1, n); MPI_Start(&request[1]); MPI_Wait(&request[1], &statuses[0]); } MPI_Finalize(); delete[] A; delete[] B; delete[] C; delete[] D; delete[] E; delete[] G; delete[] T0; delete[] T1; delete[] T2; return 0; } void add(double *A, double *B, double *C, int n) { for (size_t i = 0; i < n; i++) { C[i] = A[i] + B[i]; } } void sub(double *A, double *B, double *C, int n) { for (size_t i = 0; i < n; i++) { C[i] = A[i] - B[i]; } } void mul(double *A, double *B, double *C, int n) { for (size_t i = 0; i < n; i++) { C[i] = A[i] * B[i]; } } void div(double *A, double *B, double *C, int n) { for (size_t i = 0; i < n; i++) { C[i] = A[i] / B[i]; } } 



рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг


рдЖрдЗрдП рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдВрддрд┐рдо рд╕реНрддрдВрдн рдореЗрдВ рд╣рдо рддреНрд╡рд░рдг рдЧреБрдгрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: K accele = T exред neblokред / рдЯреА рдмреНрд▓реЙрдХред



рдпрджрд┐ рдЖрдк рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рдВрд╕рд╛рдзрд┐рдд рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде, рддреНрд╡рд░рдг рдЧреБрдгрд╛рдВрдХ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:



рдЖрдЗрдП рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реИ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдЫреЛрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрдХреНрдЯрд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рдордп рдХреЛ рдорд╛рдкреЗрдЧрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдо рдХрд░реЗрдЧрд╛ред



рдпрд╣рд╛рдБ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реА:

рд╕рдордп рдХрд╛ рдорд╛рдкрди
 #include "pch.h" #include <iostream> #include <iomanip> #include <Windows.h> #include <fstream> using namespace std; void add(double *A, double *B, double *C, int n); void sub(double *A, double *B, double *C, int n); void mul(double *A, double *B, double *C, int n); void div(double *A, double *B, double *C, int n); int main() { struct res { double add; double sub; double mul; double div; }; int i, j, k, n, loop; LARGE_INTEGER start_time, end_time, freq; ofstream fout("test_measuring.txt"); int N[12] = { 64, 256, 1024, 4096, 8192, 16384, 65536, 262144, 1048576, 4194304, 16777216, 33554432 }; SetConsoleOutputCP(1251); cout << "   loop: "; cin >> loop; fout << setiosflags(ios::fixed) << setiosflags(ios::right) << setprecision(9); fout << " : " << loop << endl; fout << setw(10) << "\n " << setw(30) << ".   (c)" << setw(30) << ".   (c)" << setw(30) << ".  (c)" << setw(30) << ".   (c)" << endl; QueryPerformanceFrequency(&freq); cout << "\n : " << freq.QuadPart << " " << endl; for (k = 0; k < sizeof(N) / sizeof(int); k++) { res output = {}; n = N[k]; double *A = new double[n]; double *B = new double[n]; double *C = new double[n]; for (i = 0; i < n; i++) { A[i] = 2.0 * i; B[i] = 2.0 * i + 1; C[i] = 0; } for (j = 0; j < loop; j++) { QueryPerformanceCounter(&start_time); add(A, B, C, n); QueryPerformanceCounter(&end_time); output.add += double(end_time.QuadPart - start_time.QuadPart) / double(freq.QuadPart); QueryPerformanceCounter(&start_time); sub(A, B, C, n); QueryPerformanceCounter(&end_time); output.sub += double(end_time.QuadPart - start_time.QuadPart) / double(freq.QuadPart); QueryPerformanceCounter(&start_time); mul(A, B, C, n); QueryPerformanceCounter(&end_time); output.mul += double(end_time.QuadPart - start_time.QuadPart) / double(freq.QuadPart); QueryPerformanceCounter(&start_time); div(A, B, C, n); QueryPerformanceCounter(&end_time); output.div += double(end_time.QuadPart - start_time.QuadPart) / double(freq.QuadPart); } fout << setw(10) << n << setw(30) << output.add / loop << setw(30) << output.sub / loop << setw(30) << output.mul / loop << setw(30) << output.div / loop << endl; delete[] A; delete[] B; delete[] C; } fout.close(); cout << endl; system("pause"); return 0; } void add(double *A, double *B, double *C, int n) { for (size_t i = 0; i < n; i++) { C[i] = A[i] + B[i]; } } void sub(double *A, double *B, double *C, int n) { for (size_t i = 0; i < n; i++) { C[i] = A[i] - B[i]; } } void mul(double *A, double *B, double *C, int n) { for (size_t i = 0; i < n; i++) { C[i] = A[i] * B[i]; } } void div(double *A, double *B, double *C, int n) { for (size_t i = 0; i < n; i++) { C[i] = A[i] / B[i]; } } 



рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░, рдпрд╣ рдЖрдкрдХреЛ рдорд╛рдк рдЪрдХреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ, рдореИрдВрдиреЗ 10,000 рдЪрдХреНрд░реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдФрд╕рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:



рд╕рдордп рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп QueryPerformanceCounter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЗрд╕ FAQ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рдордп рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рд╢реНрди рд╕реНрд╡рдпрдВ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдВред рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдЯреАрдПрд╕рд╕реА рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ (рд▓реЗрдХрд┐рди рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рд░рд┐рдЯрд░реНрди, рдорджрдж рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдХрд╛рдЙрдВрдЯрд░ рдХреА рдЯрд┐рдХ рдХреА рд╡рд░реНрддрдорд╛рди рд╕рдВрдЦреНрдпрд╛ред рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдХрд╛рдЙрдВрдЯрд░ рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ 32 рдПрдирдПрд╕ рдХреЗ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдорд╛рдк рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ (рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛ рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рджреЗрдЦреЗрдВ)ред рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ QueryPerformanceCounter рдХреА рджреЛ рдХреЙрд▓реЛрдВ рдХреЗ рдмреАрдЪ 0 рдЯрд┐рдХ рдпрд╛ 1 рдЯрд┐рдХ рдЧреБрдЬрд░рддреА рд╣реИрдВред рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ 10,000 рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рдПрдХ рддрд┐рд╣рд╛рдИ 1 рдЯрд┐рдХ рд╣реИрдВред рддреЛ 64, 256 рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ 1024 рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреБрдЫ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИред рдЕрдм, рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЦреЛрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреБрд▓ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рд╛рдордирд╛ рд╣реЛрддрд╛ рд╣реИ, рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ рд╣рдо рдЕрдЧрд▓реЗ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдм рдХреБрдЫ "рдлреИрд▓" рдХрд░реЗрдВрдЧреЗ:



рдЕрдВрдд рдореЗрдВ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрдХреНрдЯрд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рдордп рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХрд┐рддрдирд╛ рд╣реИ, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЗрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдкрд░ рдХрд┐рддрдирд╛ рд╕рдордп рд╡реНрдпрддреАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдФрд░ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рд╕рдордп рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдХрдо рдХрд░ рджреЗрдВрдЧреЗред рддрд╛рд▓рд┐рдХрд╛:



рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдЧреНрд░рд╛рдл рдмрдирд╛рддреЗ рд╣реИрдВ: рдкрд╣рд▓рд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрд╡рд░реБрджреНрдз рддрдмрд╛рджрд▓реЛрдВ рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рд╕рдордп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди, рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ, рджреВрд╕рд░рд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рджреМрд░рд╛рди рд╕реНрдердЧрд┐рдд рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рд╕рдордп рдореЗрдВ, рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдФрд░ рддреАрд╕рд░рд╛ рд╕рдордп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдХреНрд░рд┐рдпрд╛рдУрдВ рдкрд░ рдЦрд░реНрдЪ:



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

рдкрд░рд┐рдгрд╛рдо


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪреЗрдВрдЧреЗ рдХрд┐ рдЖрд╕реНрдердЧрд┐рдд рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗрд╡рд▓ рдЕрд╡рд░реБрджреНрдз рд╡рд┐рдирд┐рдордп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рддреЗрдЬреА рд╕реЗ рд╣реЛрдЧрд╛ред рдФрд░ рдпрджрд┐ рдЖрдк рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рдЕрдирдВрдд рддрдХ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдмрд╕ рдмрд╣реБрдд рд▓рдВрдмреА рд╕рд░рдгрд┐рдпрд╛рдВ рд▓реЗрддреЗ рд╣реИрдВ), рддреЛ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╕рдордп 100% рдЧрдгрдирд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рддреНрд╡рд░рдг рдЧреБрдгрд╛рдВрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ 1 рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдЧрд╛ред

Source: https://habr.com/ru/post/hi427219/


All Articles