рдпрд╣ рдкреЛрд╕реНрдЯ рд╡рд┐рд╖рдп рдкрд░ рдкрд╣рд▓реЗ рдкреЛрд╕реНрдЯ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИред
рдпрд╣ рдкреЛрд╕реНрдЯ "рдЬрд╛рд╡рд╛ рдлреЙрд░ рд╣рд╛рдИ рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ" рд▓реЗрдЦ рд╕реЗ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрджреНрдзрд░рдг рд╣реИ, рдЬреЛ рдЯреЙрдореНрд╕реНрдХ рдкреЙрд▓рд┐рдЯреЗрдХреНрдирд┐рдХ рдпреВрдирд┐рд╡рд░реНрд╕рд┐рдЯреА рд╕рдореНрдореЗрд▓рди рдореЗрдВ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╡реИрдХреНрдЯрд░ рдХрд╛ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕рдВрдЧрдд рддрддреНрд╡реЛрдВ рдХреЗ рд╕рднреА рдЙрддреНрдкрд╛рджреЛрдВ рдХрд╛ рдпреЛрдЧ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦреЗ рдЧрдП рдереЗ - рд╕реА рдореЗрдВ (рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ :-)) рдФрд░ рдЬрд╛рд╡рд╛ рдореЗрдВред
рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдЯреЙрдореНрд╕реНрдХ рдкреЙрд▓рд┐рдЯреЗрдХреНрдирд┐рдХ рдпреВрдирд┐рд╡рд░реНрд╕рд┐рдЯреА рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд SKIF-Polytech рд╕реБрдкрд░рдХрдВрдкреНрдпреВрдЯрд░ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдЗрд╕рдореЗрдВ 2 рдЗрдВрдЯреЗрд▓ Xeon 5150 2.66 Ghz рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ 24 GB рд░реИрдо рдХреЗ рд╕рд╛рде 24 рдиреЛрдбреНрд╕ рд╢рд╛рдорд┐рд▓ рдереЗ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ Linux рдХреЗ SuSE Enterprise рд╕рдВрд╕реНрдХрд░рдг 3.3 рдкрд░ рдЪрд▓ рд░рд╣реЗ рдереЗред
рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдпрд╛рдо рдХреЗ рджреЛ рд╡реИрдХреНрдЯрд░ 99999999 рдкреВрд░реНрдгрд╛рдВрдХ рддрддреНрд╡реЛрдВ рдХреЛ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, 99999999 рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрддреНрд╡реЛрдВ рдХреЗ рджреЛ рд╡реИрдХреНрдЯрд░ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдереЗред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рджреЛ рдмрд╛рд░ (2 рд╕реЗ 40 рддрдХ) рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо 21 рдмрд╛рд░ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдереЗред
рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо:
* рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ;
* рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ (рднрд╛рд╖рд╛рдУрдВ рдХреА рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдЗрд╕рд▓рд┐рдП, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рд┐рджреНрдзрд╛рдВрдд
рд╕реА рдФрд░ рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдордкреАрдЖрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рджреЛ рдЕрдВрддрд░ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
1) рд╕рдВрджреЗрд╢ рдЕрдЧреНрд░реЗрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, рд╕реА рдореЗрдВ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЬрд╛рд╡рд╛ рдореЗрдВ, рдпрд╣ рдПрдХ-рдЖрдпрд╛рдореА рд╕рд░рдгреА рд╣реИ;
2) рддрд░реНрдХреЛрдВ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдХреНрд░рдоред
рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
1) рдПрди рддрддреНрд╡реЛрдВ рдХреЗ рджреЛ рд╡реИрдХреНрдЯрд░ рдмрдирд╛рдПрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ;
2) рд╡реИрдХреНрдЯрд░ рдХреЛ рдХрдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ рдЬреЛ рдиреЛрдбреНрд╕ рдХреЛ рднреЗрдЬреЗ рдЬрд╛рдПрдВрдЧреЗ;
3) рдХрдгреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рднреЗрдЬреЗрдВ;
4) рдиреЛрдбреНрд╕ рдкрд░ рдХрдг рд▓реЗ рд▓реЛ;
5) рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП;
6) рд╡рд╛рдкрд╕ рднреЗрдЬреЗрдВ;
7) рд╕рдВрдХреНрд╖реЗрдк рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ;
8) рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓реЗ рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред
рдЕрдВрдХ рдкрд░:
1) рдПрди рддрддреНрд╡реЛрдВ рдХреЗ рджреЛ рд╡реИрдХреНрдЯрд░ рдмрдирд╛рдПрдБ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ
рд╕реА рдХреЗ рд▓рд┐рдП, рдПрд░реЗрд╕ рдХреЛ рдореЗрдореЛрд░реА рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рдореЙрд▓реЛрдХ (рдПрди * рдЖрдХрд╛рд░реЛрдлрд╝ (рдбрдмрд▓)) рдФрд░ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реИрдВрдб () рд▓реВрдк рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ред рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЗрд╡рд▓ рд╡реЗрдХреНрдЯрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ (рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ) рдФрд░, рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╡реЗрдХреНрдЯрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдЖрд░рдореНрдн рдХрд░реЗрдВред
2) рд╡реИрдХреНрдЯрд░ рдХреЛ рдХрдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ рдЬреЛ рдиреЛрдбреНрд╕ рдХреЛ рднреЗрдЬреЗ рдЬрд╛рдПрдВрдЧреЗ
рд╕реА рдФрд░ рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
n = рдХреБрд▓ / рд╕рдВрдЦреНрдпрд╛ + 1, рдЬрд╣рд╛рдВ
N рдкреНрд░рддрд┐ рдиреЛрдб рдХрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ,
рдХреБрд▓ - рд╡реЗрдХреНрдЯрд░ рд▓рдВрдмрд╛рдИ,
numprocs - рдкреВрд▓ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (MPI_COMM_Size)ред
3) рдХрдгреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рднреЗрдЬреЗрдВ;
рд╣рдо MPI рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - MPI_Bcast, рдЬреЛ рдкреВрд▓ рдореЗрдВ рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рднреЗрдЬрддрд╛ рд╣реИред рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВ ред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рд░рдгрд┐рдпрд╛рдБ рднреЗрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
MPI.COMM_WORLD.Bcast(d, 1, 0,MPI.DOUBLE, 0);
MPI.COMM_WORLD.Send(a,0,a.length,MPI.DOUBLE,dest,0);
MPI.COMM_WORLD.Send(b,0,b.length,MPI.DOUBLE,dest,0);
рдЬрд╣рд╛рдВ d рд╕рд░рдгрд┐рдпреЛрдВ рд╕реЗ рдЯреБрдХрдбрд╝реЗ рдХреА рд▓рдВрдмрд╛рдИ рд╣реИ,
a рдкрд╣рд▓рд╛ рд╡реЗрдХреНрдЯрд░ рд╣реИ
b рджреВрд╕рд░рд╛ рд╡реЗрдХреНрдЯрд░ рд╣реИред
4) рдиреЛрдбреНрд╕ рдкрд░ рдХрдгреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ
MPI.COMM_WORLD.Recv(a,0,d[0],MPI.DOUBLE,0,0);
MPI.COMM_WORLD.Recv(b,0,d[0],MPI.DOUBLE,0,0);
рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВред
5) рдЧрдгрдирд╛ рдХрд░реЗрдВ
for (int i=0; i<d[0];i++){
sum[0]+=a[i]*b[i];
}
6) рд╡рд╛рдкрд╕ рднреЗрдЬреЗрдВ; 7) рд╕рдВрдХреНрд╖реЗрдк рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ;
рдФрд░ рдпрд╣рд╛рдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рд╣реИ - рд╣рдо рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдХрдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛ - рдкрд░рд┐рдгрд╛рдо рдПрдХрддреНрд░ рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ-рдЖрдпрд╛рдореА рд╕рд░рдгреА рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧрд╛ (рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рд░рд▓ рдЪрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!) рдкрд░рд┐рдгрд╛рдоред
MPI.COMM_WORLD.Reduce(sum,0,result,0,1,MPI.DOUBLE,MPI.SUM,0);
8) рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓реЗ рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ
рдЗрд╕рдХреЗ рд▓рд┐рдП рджреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рджреЛрдиреЛрдВ рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд░рдг - MPI.WIME (рджреАрд╡рд╛рд░ рд╕рдордп)ред рд╣рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд╣рд▓реЗ рдПрдХ рдХреЛ рдмреБрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдХреБрд▓ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп (рдЧрдгрдирд╛ рдирд╣реАрдВ!) рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЬрд╛рд╡рд╛ рдХреА рд╕рднреА рдХрдорд┐рдпреЛрдВ рдФрд░ рд╕реА рдФрд░ рдЬрд╛рд╡рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЗ рдмреАрдЪ рдордЬрдмреВрдд рдЕрдВрддрд░ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреА рдкрд╕рдВрдж рдкрд░ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЧрд╣рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рдж рд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╢реЛрдзрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдореВрд╣ рдиреЗ рдЦреБрдж рдХреЛ рдкрд╛рдпрд╛ред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдФрд░ рд▓реЛрд╣реЗ рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рд╣реИ (рдЗрд╕рд▓рд┐рдП, рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдЕрдиреБрдХреВрд▓рди), рдЬрдмрдХрд┐ рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкрд░ рдПрдХ рдмрдбрд╝реА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИ, рдЬреЛ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрд╛рд╣рд░ рди рдЬрд╛рдиреЗ рджреЗрдВред - рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рдорд▓реЛрдВ рдХреА рдШрдЯрдирд╛ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо "рд▓реАрдХ" рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреАрдВрдЪреЗрдВред рдЧрдВрднреАрд░ рд╢реЛрдз рдореЗрдВ рдпрд╣ рдПрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИред
рджреВрд╕рд░реА рдУрд░, рдЬрд╛рд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рдЙрдЪрд┐рдд рд╣реИред рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬрд╝реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ, рдЬрд╛рд╡рд╛ рдореЗрдВ рдРрд╕реЗ рдлрд╛рдпрджреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛, рдЕрд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдЙрдкрдХрд░рдг, "рдирдВрдмрд░ рдХреЛрд▓реНрд╣реВ" рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдкреНрд░рд╡реЗрд╢ рд╕реАрдорд╛, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЬрдЯрд┐рд▓ рдФрд░ рдЕрд╕реНрдкрд╖реНрдЯ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ред рд╕рдВрдХреЗрдд рдпрд╛ рдореИрдиреБрдЕрд▓ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди - рдпрд╣ рд╕рдм рдЕрдиреБрд╕рдВрдзрд╛рди рдЯреАрдо рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд╡рд╛ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рддрд░реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ Atelier, рд╕реА рдореЗрдВ рдПрдХ рд╕рдХреНрд╖рдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реЗ рдмрдирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛
рд╕реА рдХрд╛рд░реНрдпрдХреНрд░рдо
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <signal.h>
#define MYTAG 1
int myid, j;
char processor_name[MPI_MAX_PROCESSOR_NAME];
double startwtime = 0.0, endwtime;
int main(int argc,char *argv[])
{
int total, n, numprocs, i, dest;
double *a, *b, sum, result;
int namelen;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Get_processor_name(processor_name,&namelen);
if (myid == 0) {
total = atoi(argv[1]);
}
printf("Process %d of %d is on %s\n",
myid, numprocs, processor_name);
startwtime = MPI_Wtime();
n = total / numprocs + 1;
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
a = malloc(n*sizeof(double));
b = malloc(n*sizeof(double));
if ((a == NULL) || (b == NULL)) {
fprintf(stderr,"Error allocating vectors (not enough memory?)\n");
exit(1);
}
if (myid == 0) {
for (dest=1; dest < numprocs; dest++) {
for (i=0; i < n; i++) {
a[i] = 4294967296;//rand();
b[i] = 4294967296;//rand();
}
MPI_Send(a, n, MPI_INT, dest, MYTAG, MPI_COMM_WORLD);
MPI_Send(b, n, MPI_INT, dest, MYTAG, MPI_COMM_WORLD);
}
n = total - n*(numprocs-1);
for (i=0; i < n; i++) {
a[i] = rand();
b[i] = rand();
}
} else {
MPI_Recv(a, n, MPI_INT, 0, MYTAG, MPI_COMM_WORLD, &status);
MPI_Recv(b, n, MPI_INT, 0, MYTAG, MPI_COMM_WORLD, &status);
}
printf("Process %d on node %s starting calc at %f sec\n",
myid, processor_name, MPI_Wtime()-startwtime);
sum = 0.0;
for (i=0; i<n; i++)
sum += a[i]*b[i];
printf("Process %d on node %s ending calc at %f sec\n",
myid, processor_name, MPI_Wtime()-startwtime);
MPI_Reduce(&sum, &result, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
if (myid == 0) {
endwtime = MPI_Wtime();
printf("Answer is %f\n", result);
printf("wall clock time = %f\n", endwtime-startwtime);
fflush(stdout);
}
MPI_Finalize();
return 0;
}
рдЬрд╛рд╡рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо
import mpi.*;
import java.util.*;
public class scalar {
public static void main(String args[]){
MPI.Init(args);
double[] result = new double[1];
int me = MPI.COMM_WORLD.Rank();
int size = MPI.COMM_WORLD.Size();
double startwtime=0.0;
double endwtime=0.0;
int total = 99999999;
int[] d = new int[1];
d[0] = total/size+1;
double[] a = new double[d[0]];
double[] b = new double[d[0]];
Random r = new Random();
MPI.COMM_WORLD.Bcast(d, 1, 0,MPI.INT, 0);
if (me == 0){
startwtime = MPI.Wtime();
for (int dest=1; dest<size;dest++){
for (int i=0; i<d[0]; i++){
a[i] = r.nextDouble();
b[i] = r.nextDouble();
}
MPI.COMM_WORLD.Send(a,0,a.length,MPI.INT,dest,0);
MPI.COMM_WORLD.Send(b,0,b.length,MPI.INT,dest,0);
}
d[0] = total - d[0]*(size-1);
for (int i=0; i<d[0];i++){
a[i] = r.nextDouble();
b[i] = r.nextDouble();
}
} else {
MPI.COMM_WORLD.Recv(a,0,d[0],MPI.INT,0,0);
MPI.COMM_WORLD.Recv(b,0,d[0],MPI.INT,0,0);
}
int[] sum = new int[1];
for (int i=0; i<d[0];i++){
sum[0]+=a[i]*b[i];
}
MPI.COMM_WORLD.Reduce(sum,0,result,0,1,MPI.INT,MPI.SUM,0);
if (me == 0){
System.out.println("answer is"+result[0]+" time of calcs is equal to "+(MPI.Wtime()-startwtime));
}
MPI.Finalize();
}
}