рд╣реИрд▓реЛ% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо%, рдпрд╣ рд▓реЗрдЦ
scipy.weave рдФрд░
openMP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
рдЕрдЬрдЧрд░ рднрд╛рд╖рд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЧрдгрд┐рддреАрдп рдЧрдгрдирд╛ рдХреА рдЧрддрд┐ рдмрдврд╝рд╛рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИред
рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЛ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, "рдЧрдгрд┐рддреАрдп рдЧрдгрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдЬрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ?", рд▓реЗрдХрд┐рди рд╣рдо "рд╢рд╛рд╢реНрд╡рдд" рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрдВрдЧреЗ, рдФрд░ рди рд╣реА рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрдИ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬреИрд╕реЗ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
рдорд╛рдирд╕ ред
рдЙрдкрдХрд░рдг
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ, рд╣рдорд╛рд░рд╛ рдЙрдкрдХрд░рдг
scipy.weave рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ, рд╕рд╛рде рд╣реА
рдУрдкрдирдПрдордкреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рд╣реИред
рдбрд░рдкреЛрдХ - рд▓рд╛рдЧреВ рдЧрдгрд┐рдд рдФрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯред
рдУрдкрдирдПрдордкреА рд╕реА, рд╕реА ++ рдФрд░ рдлреЛрд░рдЯреНрд░рд╛рди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреБрд▓рд╛ рдорд╛рдирдХ рд╣реИред
рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрдирд╛
рдбреЗрдмрд┐рдпрди-рдЬреИрд╕реЗ рд▓рд┐рдирдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдкрд░, рдЖрдкрдХреЛ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
apt-get python-scipy рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
apt-get install libgomp1
рд╡рд┐рдзрд┐
рдЧрдгрдирд╛ рдХреА рдЧрддрд┐ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реА рдореЗрдВ "рд╕рдВрдХрд░рд╛" (рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдЪрдХреНрд░ рдЬрд┐рд╕рдореЗрдВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ) рдХреЗ "рд╕рдВрдХреАрд░реНрдг" рднрд╛рдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░рдХрд░рдг рдХреЗ рд▓рд┐рдП
рдУрдкрдирдПрдордкреА рдирд┐рд░реНрджреЗрд╢ рдЬреЛрдбрд╝реЗрдВред
рдЙрджрд╛рд╣рд░рдг
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдХреЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ:
- n, n рджреНрд╡рд╛рд░рд╛ рдЖрдХрд╛рд░ n, рдФрд░ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рдЖрдХрд╛рд░ n рдХрд╛ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ;
- рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рд╕реЗ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ (рд╕рд┐рдореНрдкреНрд▓реЗрдХреНрд╕ рд╡рд┐рдзрд┐ рд╕реЗ) рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдкрд╛рдпрдерди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЕрдЬрдЧрд░ рд╕реА рдореЗрдВ, рдЗрд╕ рдХрд╛рд░реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╡рд┐рднрд┐рдиреНрди рддреИрдпрд╛рд░реА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЬреИрд╕реЗ рдХрд┐ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ, рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╣рд▓ рдХрд░рддреА рд╣реИрдВ:
- # рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк, рдЬрд╣рд╛рдВ рдореИрдВ рдкрдВрдХреНрддрд┐ рд╕рдВрдЦреНрдпрд╛ рд╣реИ
- # c рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИ, рд░реИрдВрдбрд░реЛ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡реЗрдХреНрдЯрд░ рд╣реИ
- i рдореЗрдВ xrange ( N ) рдХреЗ рд▓рд┐рдП :
- рдореИрдЯреНрд░рд┐рдХреНрд╕ [ i :: ] - = c * randRow
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ x = y рджреНрд╡рд╛рд░рд╛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ x рдХреА рдкреАрдврд╝реА
- # y рджреНрд╡рд╛рд░рд╛ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ x рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛
- # рдореИрдЯреНрд░рд┐рдХреНрд╕ рддрддреНрд╡ - 0 рд╕реЗ 99 рддрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ред
- рдбреАрдПрдПрдо рд░реИрдВрдбрдореИрдЯ ( рдПрдХреНрд╕, рд╡рд╛рдИ ) :
- randRaw = lambda a : [ randint ( 0 , 100 ) i for xrange ( 0 , рдП )
- randConst = lambda x, y : [ randRaw ( x ) рдореЗрдВ e рдХреЗ рд▓рд┐рдП xrange ( 0 , y ) ]
- рд░рд┐рдЯрд░реНрди рдРрд░реЗ ( рд░реИрдВрдбрдХреЙрд╕реНрдЯ ( x, y ) )
OpenMP рдХреЗ рдмрд┐рдирд╛ Scipy.weave рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди
scipy.weave scipy рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ
рдЕрдЬрдЧрд░ рдХреЛрдб рдХреЗ рдЕрдВрджрд░ C / C ++ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИ:
- # рд╕реА рдХреЛрдб
- рдХреЛрдбрдХ =
- "" "
- int i = 0;
- рдХреЗ рд▓рд┐рдП (i = 0; рдореИрдВ <N * M; i ++) {
- рдореИрдЯреНрд░рд┐рдХреНрд╕ [0, i] = рдореИрдЯреНрд░рд┐рдХреНрд╕ [0, i] - (c * randRow [i% M]);
- }
- " " "
- рдмреБрдирд╛рдИред рдЗрдирд▓рд╛рдЗрди ( рдХреЛрдб рд╕реА, [ 'рдореИрдЯреНрд░рд┐рдХреНрд╕' , 'рд╕реА' , 'рд░реИрдВрдбрд░реЛ' , 'рдПрди' , 'рдПрдо' ] , рдХрдВрдкрд╛рдЗрд▓рд░ = 'рдЬреАрд╕реАрд╕реА' )
рдпрд╛рдиреА рд╕реА рдХреЛрдб рдЦреБрдж рдХреЛ рдПрдХ
рдмрд╣реБрд╕реНрддрд░реАрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░
рдЕрдЬрдЧрд░ рдХреЛрдб рдЪрд░ рд╕реА рд╕реВрдЪреА рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рддрддреНрд╡ рд╕рдорд╛рди рдкрд╛рда рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
рдЦрд╕реНрддрд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реА рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдХреЛрдб рдореЗрдВ рдПрдХ рдЪрдХреНрд░ рд╣реИ, рджреЛ рдирд╣реАрдВред
рд╡реИрд╕реЗ, рдкрд░рд┐рдгрд╛рдореА C рдХреЛрдб / tmp /% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛% / python2x_intermediate / compiler_x рдореЗрдВ рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
OpenMP рдХреЗ рд╕рд╛рде Scipy.weave рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЕрдм, рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЖрдкрдХреЛ
рдУрдкрдирдПрдордкреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░
рдЗрдирд▓рд╛рдЗрди рдХреЙрд▓ рдореЗрдВ рдЧреБрдо рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН:
- # рд╕реА рдФрд░ рдУрдкрдирдПрдордкреА рдХреЛрдб
- codeOpenMP =
- "" "
- int i = 0;
- omp_set_num_threads (2);
- #pragma omp рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рд╛рдЭрд╛ (рдореИрдЯреНрд░рд┐рдХреНрд╕, рд░реИрдВрдбреНрд░реЛрд╡, рд╕реА) рдирд┐рдЬреА (i)
- {
- #pragma рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдирд╛
- рдХреЗ рд▓рд┐рдП (i = 0; рдореИрдВ <N * M; i ++) {
- рдореИрдЯреНрд░рд┐рдХреНрд╕ [0, i] = рдореИрдЯреНрд░рд┐рдХреНрд╕ [0, i] - (c * randRow [i% M]);
- }
- }
- " " "
- ...
- рдмреБрдирд╛рдИ ред рдЗрдирд▓рд╛рдЗрди ( codeOpenMP, [ 'рдореИрдЯреНрд░рд┐рдХреНрд╕' , 'c' , 'randRow' , 'N' , '' ' , )
- extra_compile_args = [ '-O3 -fopenmp' ] ,
- рд╕рдВрдХрд▓рдХ = 'рдЬреАрд╕реАрд╕реА' ,
- рдкреБрд╕реНрддрдХрд╛рд▓рдп = [ 'рдзреВрдордзрд╛рдо' ] ,
- рд╢реАрд░реНрд╖рд▓реЗрдЦ = [ '<omp.h>' ] )
рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб
рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИредрдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛
рдЙрдкрд░реЛрдХреНрдд рд╕реНрд░реЛрдд рдХреЛрдб рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐
scipy.weave рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрддрд┐ рдореЗрдВ рд╡реГрджреНрдзрд┐ рджреЗрддрд╛ рд╣реИ:
рдЖрдХрд╛рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг: 100x100
рд╢реБрджреНрдз рдЕрдЬрдЧрд░: 0.0725984573364
рд╢реБрджреНрдз рд╕реА: 0.303888320923
рд╕реА рдкреНрд▓рд╕ рдУрдкрдирдПрдордкреА: 0.109100341797
рдЯреЗрд╕реНрдЯ - рдареАрдХ рд╣реИ
рдЖрдХрд╛рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг: 1000x1000
рд╢реБрджреНрдз рдЕрдЬрдЧрд░: 1.00839138031
рд╢реБрджреНрдз рд╕реА: 0.506997108459
рд╕реА рдкреНрд▓рд╕ рдУрдкрдирдПрдордкреА: 0.333213806152
рдЯреЗрд╕реНрдЯ - рдареАрдХ рд╣реИ
рдЖрдХрд╛рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг: 2000x2000
рд╢реБрджреНрдз рдЕрдЬрдЧрд░: 3.24151515961
рд╢реБрджреНрдз рд╕реА: 2.10800170898
рд╕реА рдкреНрд▓рд╕ рдУрдкрдирдПрдордкреА: 1.17690563202
рдЯреЗрд╕реНрдЯ - рдареАрдХ рд╣реИ
рдЖрдХрд╛рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг: 3000x3000
рд╢реБрджреНрдз рдЕрдЬрдЧрд░: 5.54490089417
рд╢реБрджреНрдз рд╕реА: 4.61800098419
рд╕реА рдкреНрд▓рд╕ рдУрдкрдирдПрдордкреА: 2.56960391998
рдЯреЗрд╕реНрдЯ - рдареАрдХ рд╣реИ
рд╕рд╛рд╣рд┐рддреНрдп
рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: