рдЕрдЬрдЧрд░, scipy.weave рдФрд░ OpenMP - рдУрд╡рд░рдХреНрд▓реЙрдХрд┐рдВрдЧ рдХреЛрдб

рд╣реИрд▓реЛ% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо%, рдпрд╣ рд▓реЗрдЦ scipy.weave рдФрд░ openMP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдЬрдЧрд░ рднрд╛рд╖рд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЧрдгрд┐рддреАрдп рдЧрдгрдирд╛ рдХреА рдЧрддрд┐ рдмрдврд╝рд╛рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИред

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

рдЙрдкрдХрд░рдг


рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ, рд╣рдорд╛рд░рд╛ рдЙрдкрдХрд░рдг scipy.weave рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ, рд╕рд╛рде рд╣реА рдУрдкрдирдПрдордкреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рд╣реИред
рдбрд░рдкреЛрдХ - рд▓рд╛рдЧреВ рдЧрдгрд┐рдд рдФрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯред рдУрдкрдирдПрдордкреА рд╕реА, рд╕реА ++ рдФрд░ рдлреЛрд░рдЯреНрд░рд╛рди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреБрд▓рд╛ рдорд╛рдирдХ рд╣реИред

рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрдирд╛


рдбреЗрдмрд┐рдпрди-рдЬреИрд╕реЗ рд▓рд┐рдирдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдкрд░, рдЖрдкрдХреЛ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
  apt-get python-scipy рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
 apt-get install libgomp1 

рд╡рд┐рдзрд┐


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

рдЙрджрд╛рд╣рд░рдг


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдХреЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ:

рдкрд╛рдпрдерди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЕрдЬрдЧрд░ рд╕реА рдореЗрдВ, рдЗрд╕ рдХрд╛рд░реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╡рд┐рднрд┐рдиреНрди рддреИрдпрд╛рд░реА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЬреИрд╕реЗ рдХрд┐ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ, рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╣рд▓ рдХрд░рддреА рд╣реИрдВ:
  1. # рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк, рдЬрд╣рд╛рдВ рдореИрдВ рдкрдВрдХреНрддрд┐ рд╕рдВрдЦреНрдпрд╛ рд╣реИ
  2. # c рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИ, рд░реИрдВрдбрд░реЛ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡реЗрдХреНрдЯрд░ рд╣реИ
  3. i рдореЗрдВ xrange ( N ) рдХреЗ рд▓рд┐рдП :
  4. рдореИрдЯреНрд░рд┐рдХреНрд╕ [ i :: ] - = c * randRow
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ x = y рджреНрд╡рд╛рд░рд╛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ x рдХреА рдкреАрдврд╝реА
  1. # y рджреНрд╡рд╛рд░рд╛ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ x рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛
  2. # рдореИрдЯреНрд░рд┐рдХреНрд╕ рддрддреНрд╡ - 0 рд╕реЗ 99 рддрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ред
  3. рдбреАрдПрдПрдо рд░реИрдВрдбрдореИрдЯ ( рдПрдХреНрд╕, рд╡рд╛рдИ ) :
  4. randRaw = lambda a : [ randint ( 0 , 100 ) i for xrange ( 0 , рдП )
  5. randConst = lambda x, y : [ randRaw ( x ) рдореЗрдВ e рдХреЗ рд▓рд┐рдП xrange ( 0 , y ) ]
  6. рд░рд┐рдЯрд░реНрди рдРрд░реЗ ( рд░реИрдВрдбрдХреЙрд╕реНрдЯ ( x, y ) )

OpenMP рдХреЗ рдмрд┐рдирд╛ Scipy.weave рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди


scipy.weave scipy рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрдЬрдЧрд░ рдХреЛрдб рдХреЗ рдЕрдВрджрд░ C / C ++ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИ:
  1. # рд╕реА рдХреЛрдб
  2. рдХреЛрдбрдХ =
  3. "" "
  4. int i = 0;
  5. рдХреЗ рд▓рд┐рдП (i = 0; рдореИрдВ <N * M; i ++) {
  6. рдореИрдЯреНрд░рд┐рдХреНрд╕ [0, i] = рдореИрдЯреНрд░рд┐рдХреНрд╕ [0, i] - (c * randRow [i% M]);
  7. }
  8. " " "
  9. рдмреБрдирд╛рдИред рдЗрдирд▓рд╛рдЗрди ( рдХреЛрдб рд╕реА, [ 'рдореИрдЯреНрд░рд┐рдХреНрд╕' , 'рд╕реА' , 'рд░реИрдВрдбрд░реЛ' , 'рдПрди' , 'рдПрдо' ] , рдХрдВрдкрд╛рдЗрд▓рд░ = 'рдЬреАрд╕реАрд╕реА' )

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

рд╡реИрд╕реЗ, рдкрд░рд┐рдгрд╛рдореА C рдХреЛрдб / tmp /% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛% / python2x_intermediate / compiler_x рдореЗрдВ рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

OpenMP рдХреЗ рд╕рд╛рде Scipy.weave рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЕрдм, рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЖрдкрдХреЛ рдУрдкрдирдПрдордкреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЗрдирд▓рд╛рдЗрди рдХреЙрд▓ рдореЗрдВ рдЧреБрдо рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН:
  1. # рд╕реА рдФрд░ рдУрдкрдирдПрдордкреА рдХреЛрдб
  2. codeOpenMP =
  3. "" "
  4. int i = 0;
  5. omp_set_num_threads (2);
  6. #pragma omp рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рд╛рдЭрд╛ (рдореИрдЯреНрд░рд┐рдХреНрд╕, рд░реИрдВрдбреНрд░реЛрд╡, рд╕реА) рдирд┐рдЬреА (i)
  7. {
  8. #pragma рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдирд╛
  9. рдХреЗ рд▓рд┐рдП (i = 0; рдореИрдВ <N * M; i ++) {
  10. рдореИрдЯреНрд░рд┐рдХреНрд╕ [0, i] = рдореИрдЯреНрд░рд┐рдХреНрд╕ [0, i] - (c * randRow [i% M]);
  11. }
  12. }
  13. " " "
  14. ...
  15. рдмреБрдирд╛рдИ ред рдЗрдирд▓рд╛рдЗрди ( codeOpenMP, [ 'рдореИрдЯреНрд░рд┐рдХреНрд╕' , 'c' , 'randRow' , 'N' , '' ' , )
  16. extra_compile_args = [ '-O3 -fopenmp' ] ,
  17. рд╕рдВрдХрд▓рдХ = 'рдЬреАрд╕реАрд╕реА' ,
  18. рдкреБрд╕реНрддрдХрд╛рд▓рдп = [ 'рдзреВрдордзрд╛рдо' ] ,
  19. рд╢реАрд░реНрд╖рд▓реЗрдЦ = [ '<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
	 рдЯреЗрд╕реНрдЯ - рдареАрдХ рд╣реИ

рд╕рд╛рд╣рд┐рддреНрдп


рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

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


All Articles