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

рд╕реНрд░реЛрдд рдХреЛрдб
github.com/undertherain/pi рдкрд░ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИрдВ (рдкреЛрд╕реНрдЯ рдХреЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдкрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рднрд░рдирд╛ рд╣реЛрдЧрд╛)ред
рд╕реАрд░рд┐рдпрд▓ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг
рдЪрд▓рд┐рдП рд╕реАрд░рд┐рдпрд▓ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╛рдиреА рдПрдХ рдЬреЛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХреЗрдВрджреНрд░реАрдп рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЗрдХрд╛рдИ рдХреЗ рдПрдХ рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рдо рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдПрдХреАрдХрд░рдг рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд▓реЗрддреЗ рд╣реИрдВ - рдЖрдпрдд рд╡рд┐рдзрд┐ рдФрд░ рдЗрд╕реЗ рд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ (рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╣рдо рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ C \ C ++ surzhik рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ
cntSteps рдЖрдпрддреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЕрднрд┐рдиреНрди рдХреЗ рддрд╣рдд рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЖрдзрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ:
step = 1./static_cast<double>(cntSteps);
рдФрд░ рдкреВрд░реЗ рдХреНрд╖реЗрддреНрд░, рдкреНрд░рддреНрдпреЗрдХ рдЖрдпрдд рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрд┐рдирддреА рдФрд░ рдЖрдзрд╛рд░ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдирд╛ред
for (unsigned long i=0; i<cntSteps; i++) { x = ( i + .5 ) *step; sum = sum + 4.0/(1.+ x*x); }
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдЖрдзрд╛рд░
рдХрджрдо рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдмреЗрд╣рддрд░ "рдХреЛрд╖реНрдардХ рдХреЗ рдмрд╛рд╣рд░", рдпрд╛рдиреА рдЪрдХреНрд░ рдХреЗ рд▓рд┐рдП - рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╣реИред
рдпрд╣рд╛рдБ рдкреВрд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛрдб рд╣реИ:
#include <iostream> #include <iomanip> #include <sys/times.h> #include <cmath> int main(int argc, char** argv) { const unsigned long cntSteps=500000000; /* # of rectangles */ double step; const double PI25DT = 3.141592653589793238462643; //reference Pi value double pi=0; double sum=0.0; double x; std::cout<< "calculating pi on CPU single-threaded\n"; // clock_t clockStart, clockStop; tms tmsStart, tmsStop; clockStart = times(&tmsStart); // step = 1./static_cast<double>(cntSteps); for (unsigned long i=0; i<cntSteps; i++) { x = (i + .5)*step; sum = sum + 4.0/(1.+ x*x); } pi = sum*step; // clockStop = times(&tmsStop); std::cout << "The value of PI is " << pi << " Error is " << fabs(pi - PI25DT) << "\n"; std::cout << "The time to calculate PI was " ; double secs= (clockStop - clockStart)/static_cast<double>(sysconf(_SC_CLK_TCK)); std::cout << secs << " seconds\n"; return 0; }
Http://dumpz.org/195276/ рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВред
рдореВрд▓ рд╕реВрддреНрд░
рд╕рдорд╛рдирд╛рдВрддрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЬреЛ рдЖрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд▓рдн рд╣реИ, рдпрд╛ рддреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдорд▓реНрдЯреА-рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИ (рдПрдХ рдХреЛрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдвреВрдВрдврдирд╛ рдЕрдм рдореБрд╢реНрдХрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ) рдпрд╛ рдПрдХ рд╣реА рдорджрд░рдмреЛрд░реНрдб рдкрд░ рдХрдИ рдкреНрд░реЛрд╕реЗрд╕рд░ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдХ рдПрдХрд▓ рдХреЛрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ - рдЗрд╕ рдореЛрдб рдХреЛ рдЫрджреНрдо рд╕рдорд╛рдирд╛рдВрддрд░ рдпрд╛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХрд░реНрдиреЗрд▓ рд╕реНрд╡рд┐рдЪ (рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓рдЧрднрдЧ рд╕реНрдореГрддрд┐ рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ), рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдордп рдЯреБрдХрдбрд╝рд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдореЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореЗрдореЛрд░реА рд▓реЗрдЯреЗрдВрд╕реА рдХреЛ рдЫрд┐рдкрд╛рдХрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рд╕рд╛рдзрд╛рд░рдг "рд╣реЛрдо" рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдирд╣реАрдВ, рддреЛ рд╡рд┐рд╢реЗрд╖ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдкрд░, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЕрдзрд┐рдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдереНрд░реЗрдбреНрд╕ рдХреА рдПрдХ рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдзреАрдореА рд╣реЛ рдЬрд╛рдПрдЧреАред
рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдХрдИ рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ "рдРрддрд┐рд╣рд╛рд╕рд┐рдХ" рддрд░реАрдХрд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдереНрд░реЗрдб рдореИрдХреЗрдирд┐рдЬрд╝реНрдо рд╣реИ, рдЬреЛ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╣реА-рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдореМрдЬреВрдж рдерд╛, рдЕрдЧрд░ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдПред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдХреЛрд░ рдпрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдзрд╛рдЧреЗ рдПрдХ рд╣реА рдкрддреЗ рдХреА рдЬрдЧрд╣ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЕрдЪрд╛рдирдХ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдзрд╛рдЧреЗ рдПрдХ рд╣реА рдЪрд░ рд▓рд┐рдЦрддреЗ / рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдХреЛрдб рдХреЗ рдХрд░реАрдм рдЖрддреЗ рд╣реИрдВ: рд╕реА рднрд╛рд╖рд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдПрдХ рд╕реНрдЯреНрд░реАрдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреА рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ
рд╕реНрдерд┐рд░ рд╢реВрдиреНрдп * рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ ( рд╢реВрдиреНрдп * ptrArgs ) рдХрд╣рддреЗ рд╣реИрдВ , рддрд░реНрдХ рд╕реЗ рдпрд╣ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдзрд╛рд░рд╛ рдореЗрдВ рдЕрдкрдиреЗ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдлрд╝реАрд▓реНрдб рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрддрд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдЕрднрд┐рдиреНрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реИред рд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдПрдХ рдЪрдХреНрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, sobsno рдФрд░ рдЙрд╕ рд╕реАрдорд╛ рд╕реЗ рдЧрд┐рдирддреА рдЬреЛ рд╣рдо рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЧрдП рдереЗред
for (long long i=args->left; i<args->right; i++) { x = (i + .5)*step; sum = sum + 4.0/(1.+ x*x); }
рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рд░рд╛ рдХреЗ рд▓рд┐рдП рдПрдХреАрдХрд░рдг рдЕрдВрддрд░рд╛рд▓ рд╣рдо рдЗрд╕рдХреА рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдЧреНрд░рд┐рдо рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдЕрдкрдиреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдЧрд┐рдирддрд╛ рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рддред рд╣рдо рдЙрддреНрдкрд╛рджрдХрддрд╛ рдЦреЛ рджреЗрдВрдЧреЗред рдпрд╣ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдХрдИ рдЫреЛрдЯреЗ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдФрд░ рдереНрд░реЗрдб рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╡реИрд╕рд╛ рд╣реА рдЫреЛрдбрд╝ рджреЗрдВред
arrArgsThread[idThread].left = idThread*cntStepsPerThread; arrArgsThread[idThread].right = (idThread+1)*cntStepsPerThread;
рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди POSIX_Create рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ POSIX (рд▓рд┐рдирдХреНрд╕ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ Win32 рдПрдкреАрдЖрдИ рд╕реЗ рдПрдХ рд╕рдорд╛рди рдХреЙрд▓ рд╣реЛрдЧрд╛, рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджрд┐рдЦреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдпрд╣ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЖрдо рдЪрд░
pi + = sum * рдЪрд░рдг рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ
; (рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╣рдо рдПрдХ рдЖрдо рдкрддреЗ рдХреА рдЬрдЧрд╣ рдкрд░ рд╣реИрдВ)ред
рддрд╛рдХрд┐ рдореЗрдореЛрд░реА рдЦрд░рд╛рдм рди рд╣реЛ рдЕрдЧрд░ рдПрдХ рд╕рд╛рде рджреЛ рдереНрд░реЗрдбреНрд╕ рдПрдХ рд╕реЗрд▓ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдзрд╛рдЧрд╛ рд╡реИрд░рд┐рдПрдмрд▓ рдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рддрдерд╛рдХрдерд┐рдд "рдХреНрд░рд┐рдЯрд┐рдХрд▓ рд╕реЗрдХреНрд╢рди" рдмрдирд╛рдПрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рд╡рд┐рд╢реЗрд╖ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╢рдмреНрдж рдЖрдкрд╕реА рдмрд╣рд┐рд╖реНрдХрд╛рд░ рд╕реЗ) - рдпрджрд┐ рдПрдХ рдереНрд░реЗрдб рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рджреВрд╕рд░рд╛ рдереНрд░реЗрдб рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛ (рдореНрдпреВрдЯреЗрдХреНрд╕ рдЦреБрдж рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ) рдЬрдм рддрдХ рдХрд┐ рдкрд╣рд▓рд╛ рдзрд╛рдЧрд╛ рдЗрд╕реЗ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд░рддрд╛ред
pthread_mutex_lock(&mutexReduction); pi += sum*step; pthread_mutex_unlock(&mutexReduction);
рдХреБрд▓ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ:
#include <iostream> #include <iomanip> #include <cmath> #include <cstdlib> #include <pthread.h> #include <sys/times.h> #define cntThreads 4 pthread_mutex_t mutexReduction; double pi=0.; // struct ArgsThread { long long left,right; double step; }; // static void *worker(void *ptrArgs) { ArgsThread * args = reinterpret_cast<ArgsThread *>(ptrArgs); double x; double sum=0.; double step=args->step; for (long long i=args->left; i<args->right; i++) { x = (i + .5)*step; sum = sum + 4.0/(1.+ x*x); } pthread_mutex_lock(&mutexReduction); pi += sum*step; pthread_mutex_unlock(&mutexReduction); return NULL; } int main(int argc, char** argv) { const unsigned long num_steps=500000000; const double PI25DT = 3.141592653589793238462643; pthread_t threads[cntThreads]; ArgsThread arrArgsThread[cntThreads]; std::cout<<"POSIX threads. number of threads = "<<cntThreads<<std::endl; clock_t clockStart, clockStop; tms tmsStart, tmsStop; clockStart = times(&tmsStart); double step = 1./(double)num_steps; long long cntStepsPerThread= num_steps / cntThreads; // for (unsigned int idThread=0; idThread<<cntThreads; idThread++) { arrArgsThread[idThread].left = idThread*cntStepsPerThread; arrArgsThread[idThread].right = (idThread+1)*cntStepsPerThread; arrArgsThread[idThread].step = step; if (pthread_create(&threads[idThread], NULL, worker, &arrArgsThread[idThread]) != 0) { return EXIT_FAILURE; } } // join for (unsigned int idThread=0; idThread<cntThreads; idThread++) { if (pthread_join(threads[idThread], NULL) != 0) { return EXIT_FAILURE; } } //! clockStop = times(&tmsStop); std::cout << "The value of PI is " << pi << " Error is " << fabs(pi - PI25DT) << std::endl; std::cout << "The time to calculate PI was " ; double secs= (clockStop - clockStart)/static_cast<double>(sysconf(_SC_CLK_TCK)); std::cout << secs << " seconds\n" << std::endl; return 0; }
Http://dumpz.org/195404/ рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдореЗрд░реА рдирд╛рд░рдХреАрдп рдкреНрд░рд╛рд░реВрдкрдг рдЕрд╕рдорд╛рди рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдареЛрд╕ рдерд╛ (рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рдЗрддрдирд╛ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдирд╣реАрдВ рд╣реЛрдЧрд╛) рдХрд┐ рдЖрдк рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЪрд░ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо
рдмрдЪрд╛рддреЗ рд╣реИрдВ (рд╕рд░рдгреА рддрддреНрд╡
ArgsThread arrArgsThread ( cntThreads ];) рдФрд░ рдлрд┐рд░, рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж - рдпреЛрдЧ рд╣реБрдЖред
рдпрд╣рд╛рдБ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЗ рдмрд┐рдирд╛ рдХреЛрдб рд╣реИ:
#include <iostream> #include <iomanip> #include <cmath> #include <cstdlib> #include <pthread.h> #include <sys/times.h> #define cntThreads 4 struct ArgsThread { long long left,right; double step; double partialSum; }; static void *worker(void *ptrArgs) { ArgsThread * args = reinterpret_cast<ArgsThread *>(ptrArgs); double x; double sum=0.; double step=args->step; for (long long i=args->left; i<args->right; i++) { x = (i + .5)*step; sum = sum + 4.0/(1.+ x*x); } args->partialSum=sum*step; return NULL; } int main(int argc, char** argv) { const unsigned long num_steps=500000000; const double PI25DT = 3.141592653589793238462643; pthread_t threads[cntThreads]; ArgsThread arrArgsThread[cntThreads]; std::cout<<"POSIX threads. number of threads = "<<cntThreads<<std::endl; clock_t clockStart, clockStop; tms tmsStart, tmsStop; clockStart = times(&tmsStart); double step = 1./(double)num_steps; long long cntStepsPerThread= num_steps / cntThreads; for (unsigned int idThread=0; idThread<cntThreads; idThread++) { arrArgsThread[idThread].left = idThread*cntStepsPerThread; arrArgsThread[idThread].right = (idThread+1)*cntStepsPerThread; arrArgsThread[idThread].step = step; if (pthread_create(&threads[idThread], NULL, worker, &arrArgsThread[idThread]) != 0) { return EXIT_FAILURE; } } double pi=0.; for (unsigned int idThread=0; idThread<cntThreads; idThread++) { if (pthread_join(threads[idThread], NULL) != 0) { return EXIT_FAILURE; } pi +=arrArgsThread[idThread].partialSum; } clockStop = times(&tmsStop); std::cout << "The value of PI is " << pi << " Error is " << fabs(pi - PI25DT) << std::endl; std::cout << "The time to calculate PI was " ; double secs= (clockStop - clockStart)/static_cast<double>(sysconf(_SC_CLK_TCK)); std::cout << secs << " seconds\n" << std::endl; return 0; }
рдФрд░
http://dumpz.org/195415/ рдкрд░ рдПрдХ рдкреНрд░рддрд┐ред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрдб рдмрд▓реНрдХрд┐ рднрд╛рд░реА рдФрд░ рдиреЗрдХреНрд░реЛрдкреНрд▓рд╛рдХреНрдЯрд┐рдХ рдирд┐рдХрд▓рд╛ред рдпрджрд┐ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ :: рдереНрд░реЗрдбреНрд╕ (рд▓реЗрдХрд┐рди рд╣рд░ рдХреЛрдИ рдмреВрд╕реНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛) рдпрд╛ рдирдП C ++ 11 рдореЗрдВ, рдзрд╛рд░рд╛рдПрдВ рдЖрдо рддреМрд░ рдкрд░ рднрд╛рд╖рд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрди рдЧрдИ рд╣реИрдВ (рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдирд┐рдХрд▓рд╛) - рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЕрднреА рднреА рдкреБрд░рд╛рдиреЗ ++ ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдмреЛрдЭрд┐рд▓ рдХреЛрдб рдХреА рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рдмрдиреА рд╣реБрдИ рд╣реИред
OpenMP
рдУрдкрдирдПрдордкреА рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ (C / C ++ / Fortran) рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд▓рдЧрднрдЧ рд╡рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╣рдордиреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдереНрд░реЗрдб API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдерд╛ - рд▓реЗрдХрд┐рди рдпрд╣ рддрдерд╛рдХрдерд┐рдд рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ, рддрдерд╛рдХрдерд┐рдд рдкреНрд░рд╛рдВрдЧрдг рдХреА рдорджрдж рд╕реЗред рдкреНрд░рд╛рдЧрдорд╛, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдерд╛, рд╕рдВрдХрд▓рдХ рдХреЛ "рдЗрд╕ рдХреЛрдб рдХреЛ рд▓реЗрдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ" - рдФрд░ рдХреЙрдкреНрдпреБрд▓реЗрдЯрд░ рдмрд╛рдХреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд▓реВрдк рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:
#pragma omp parallel for private (x), reduction (+:sum) for (int i=0; i<numSteps; i++) { x = (i + .5)*step; sum = sum + 4.0/(1.+ x*x); }
рдЗрд╕ рдкреНрд░рд╛рдЧреНрдорд╛ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд▓реВрдк рдХреЗ рдШреБрдорд╛рд╡реЛрдВ рдХреЛ рд╕рдорд╛рдВрддрд░ рдХрд░рдирд╛, рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдЪрд░ x рдХреЛ рдирд┐рдЬреА рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдлрд┐рд░ рдпреЛрдЧ рдЪрд░ рдХреЛ рдШрдЯрд╛рдХрд░ (рдпрд╛ рдпрд╣ рд░реВрд╕реА рдореЗрдВ рдХреИрд╕реЗ рд╣реИ?) рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВред рдпрд╛рдиреА рдкрд╣рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдПрдБ - рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝реЗрдВред рдЙрд╕реА рдЪреАрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореНрдпреВрдЯреЗрдХ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдерд╛ред OpenMP рднреА рд╕реЗрд╡рд╛ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
#include <iostream> #include <iomanip> #include <sys/times.h> #include <cmath> #include <omp.h> int main(int argc, char** argv) { const unsigned long numSteps=500000000; /* default # of rectangles */ double step; double PI25DT = 3.141592653589793238462643; double pi=0; double sum=0.0; double x; #pragma omp parallel { #pragma omp master { int cntThreads=omp_get_num_threads(); std::cout<<"OpenMP. number of threads = "<<cntThreads<<std::endl; } } clock_t clockStart, clockStop; tms tmsStart, tmsStop; step = 1./static_cast<double>(numSteps); clockStart = times(&tmsStart); #pragma omp parallel for private (x), reduction (+:sum) for (int i=0; i<numSteps; i++) { x = (i + .5)*step; sum = sum + 4.0/(1.+ x*x); } pi = sum*step; clockStop = times(&tmsStop); std::cout << "The value of PI is " << pi << " Error is " << fabs(pi - PI25DT) << std::endl; std::cout << "The time to calculate PI was " ; double secs= (clockStop - clockStart)/static_cast<double>(sysconf(_SC_CLK_TCK)); std::cout << secs << " seconds\n" << std::endl; return 0; }
Http://dumpz.org/195550/ рдХреА рдХреЙрдкреАред
рдЬреА ++ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ -fopenmp рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди, рдПрдХ рдЕрдиреНрдп рд╕рдВрдХрд▓рдХ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореИрдиреБрдЕрд▓ рдХреЛ рджреЗрдЦреЗрдВред
рдкреНрд░рд╢реНрдиреЛрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ, рдЬрд╛рд░реА рд░рдЦрд╛ рдЬрд╛рдирд╛ рд╣реИ!