рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ


рдпрджрд┐ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рдмреАрдЬ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЕрдзрд┐рдХ рдереА, рддреЛ рдЕрдм рдЬреВрд▓рд┐рдпрд╛ рдХреА рдЙрд╕рдХреЗ рдорд╢реАрди рдкрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред


рдорд▓реНрдЯреА-рдХреЛрд░ рдпрд╛ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


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


рдЬреВрд▓рд┐рдпрд╛ рдХрд╛ рд╕рдВрджреЗрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдиреНрдп рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ MPI [1] ред рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рд╕рдВрдЪрд╛рд░ рдЖрдорддреМрд░ рдкрд░ "рд╡рди-рд╡реЗ" рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рджреЛ-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпреЗ рдСрдкрд░реЗрд╢рди рдЖрдорддреМрд░ рдкрд░ "рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ" рдФрд░ "рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ" рдХреА рддрд░рд╣ рдирд╣реАрдВ рд▓рдЧрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рд╕реЗ рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ред


рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рджреЛ рдкреНрд░рд╛рдЗрдорд░реА рдкрд░ рдмрдирд╛рдИ рдЧрдИ рд╣реИ: рджреВрд░рд╕реНрде рд▓рд┐рдВрдХ рдФрд░ рджреВрд░рд╕реНрде рдХреЙрд▓ ред рд░рд┐рдореЛрдЯ рд▓рд┐рдВрдХ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд░рд┐рдореЛрдЯ рдХреЙрд▓ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рдЕрдиреБрд░реЛрдз рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдирд┐рд╢реНрдЪрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рдХреБрдЫ рддрд░реНрдХреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рд╕рдВрднрд╡рддрдГ рд╕рдорд╛рди) рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред


рджреВрд░рд╕реНрде рд▓рд┐рдВрдХ рджреЛ рд░реВрдкреЛрдВ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ: рднрд╡рд┐рд╖реНрдп рдФрд░ RemoteChannel ред


рдПрдХ рджреВрд░рд╕реНрде рдХреЙрд▓ Future рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рддреБрд░рдВрдд рдХрд░рддрд╛ рд╣реИ; рд╡рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд┐рд╕рдиреЗ рдХреЙрд▓ рдХреЛ рдЙрд╕рдХреЗ рдЕрдЧрд▓реЗ рдСрдкрд░реЗрд╢рди рддрдХ рдкрд╣реБрдВрдЪрд╛рдпрд╛, рдЬрдмрдХрд┐ рд░рд┐рдореЛрдЯ рдХреЙрд▓ рдХрд╣реАрдВ рдФрд░ рд╣реЛрддрд╛ рд╣реИред рдЖрдк рд▓реМрдЯреЗ Future рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рджреВрд░рд╕реНрде рдХреЙрд▓ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкреВрд░рд╛ рдореВрд▓реНрдп рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


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



рдЪрд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░рддреЗ рд╣реИрдВред julia -pn рдкреЛрд╕реНрдЯрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде julia -pn рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрдерд╛рдиреАрдп рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдПрди рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ n рдорд╢реАрди рдкрд░ рд╕реАрдкреАрдпреВ рдереНрд░реЗрдбреНрд╕ (рддрд╛рд░реНрдХрд┐рдХ рдХреЛрд░) рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ -p рддрд░реНрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рддрд░рдг рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред


рдкреЛрд╕реНрдЯрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ?

рд▓рд┐рдирдХреНрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реЛрд▓ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╕реАрдзрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, inclред рдпрд╣ рд╢реИрдХреНрд╖рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рдЕрдиреБрднрд╡рд╣реАрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╣реИред
рдЯрд░реНрдорд┐рдирд▓ рдЬреВрд▓рд┐рдпрд╛ (REPL) рд╕рд┐рд╕реНрдЯрдо рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:


 julia> pwd() #     "C:\\Users\\User\\AppData\\Local\\Julia-1.1.0" julia> cd("C:/Users/User/Desktop") #   julia> run(`calc`) #     #     Windows. #      Process(`calc`, ProcessExited(0)) 

рдЗрди рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЬреВрд▓рд┐рдпрд╛ рд╕реЗ рдЬреВрд▓рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ рджреВрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдП



Cmd рдХреЛ рдЬреВрд▓рд┐рдпрд╛ / рдмрд┐рди / рд╕реЗ рдЪрд▓рд╛рдиреЗ рдФрд░ рд╡рд╣рд╛рдБ julia -p 2 рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдпрд╛ рд╢реЙрд░реНрдЯрдХрдЯ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рдкреНрд░реЗрдорд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк: рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛, рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдиреЛрдЯрдкреИрдб рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдПрдВ C:\Users\User\AppData\Local\Julia-1.1.0\bin\julia -p 4 ( рдкрддрд╛ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ ) рдФрд░ рдЗрд╕реЗ рд░рди рд░рди .bat рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВред рдпрд╣рд╛рдВ, рдЕрдм рдЖрдкрдХреЗ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ 4 рдХреЛрд░ рдХреЗ рд▓рд┐рдП рдЬреВрд▓рд┐рдпрд╛ рд▓реЙрдиреНрдЪ рд╕рд┐рд╕реНрдЯрдо рдлрд╛рдЗрд▓ рд╣реИред


рдЖрдк рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬреБрдкрд┐рдЯрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ):


 using Distributed addprocs(2) 

 $ ./julia -p 2 julia> r = remotecall(rand, 2, 2, 2) Future(2, 1, 4, nothing) julia> s = @spawnat 2 1 .+ fetch(r) Future(2, 1, 5, nothing) julia> fetch(s) 2├Ч2 Array{Float64,2}: 1.18526 1.50912 1.16296 1.60607 

рд░реАрдореЛрдЯреЗрдХреЙрд▓ рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдорд╡рд░реНрддреА рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдпрд╛ рдЙрдкрд▓рдмреНрдз рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рджреВрд░рд╕реНрде рдХреЙрд▓ рдХреЛ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред


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


рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ getindex(r, 1,1) r[1,1] рдмрд░рд╛рдмрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЙрд▓ рднрд╡рд┐рд╖реНрдп рдХреЗ r рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред


рд░рд┐рдореЛрдЯ рдХреЙрд▓ remotecall рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред @spawn рдореИрдХреНрд░реЛ @spawn рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдирд╣реАрдВ, рдФрд░ рдЪреБрдирддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрд╢рди рдХрд╣рд╛рдВ рдХрд░рдирд╛ рд╣реИ:


 julia> r = @spawn rand(2,2) Future(2, 1, 4, nothing) julia> s = @spawn 1 .+ fetch(r) Future(3, 1, 5, nothing) julia> fetch(s) 2├Ч2 Array{Float64,2}: 1.38854 1.9098 1.20939 1.57158 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдордиреЗ 1 .+ Fetch(r) рдмрдЬрд╛рдп 1 .+ Fetch(r) рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ 1 .+ r рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рдХрд╣рд╛рдБ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ r рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, @spawn рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдорд╛рд░реНрдЯ рд╣реИ, рдЬреЛ рдХрд┐ r рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧреИрд░-рдкрд░рд┐рдЪрд╛рд▓рди рд╣реЛрдЧрд╛ (рдХреЛрдИ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред (рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕реНрдкреЙрди рдмрд┐рд▓реНрдЯ-рдЗрди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред)


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


@async @spawn рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реА рдХрд╛рд░реНрдп рдЪрд▓рд╛рддрд╛ рд╣реИред рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП "рдлрд╝реАрдб" рдХрд╛рд░реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдЕрдЧрд▓реЗ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдлрд┐рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рддрдм рддрдХ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рд╣рдо рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓ рдЬрд╛рддреЗред


рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлреАрдбрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рддрдм рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдореБрдЦреНрдп рдХрд╛рд░реНрдп @sync рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрдд рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИред


V0.7 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдХреЗ рд▓рд┐рдП, рдлреАрдбрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдЧрд▓рд╛рдбреИрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрди рд╕рднреА рдХреЛ рдПрдХ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдирд┐рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдЕрд╡рд░реЛрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ I / O рдХреЗ рд╕рд╛рдеред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреЗрд╡рд▓ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╣реЛрддреА рд╣реИ: рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм remotecall_fetch ред рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд╣реИ, рдФрд░ рдпрд╣ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ, рдпрд╛ рдПрдо: рдПрди рдереНрд░реЗрдбрд┐рдВрдЧ рдореЗрдВ рдПрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рддрдм рд╣рдореЗрдВ nextidx рд▓рд┐рдП рддрд╛рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ / рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ nextidx , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред


рдЖрдкрдХрд╛ рдХреЛрдб рдХрд┐рд╕реА рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреВрд▓рд┐рдпрд╛ рдкреНрд░реЙрдореНрдкреНрдЯ рдкрд░, рдирд┐рдореНрди рдЯрд╛рдЗрдк рдХрд░реЗрдВ:


 julia> function rand2(dims...) return 2*rand(dims...) end julia> rand2(2,2) 2├Ч2 Array{Float64,2}: 0.153756 0.368514 1.15119 0.918912 julia> fetch(@spawn rand2(2,2)) ERROR: RemoteException(2, CapturedException(UndefVarError(Symbol("#rand2")) Stacktrace: [...] 

рдкреНрд░рдХреНрд░рд┐рдпрд╛ 1 рдлрд╝рдВрдХреНрд╢рди rand2 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреА рдереА, рд▓реЗрдХрд┐рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ 2 рдирд╣реАрдВ рдереАред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдЖрдк рдлрд╝рд╛рдЗрд▓реЛрдВ рдпрд╛ рдкреИрдХреЗрдЬреЛрдВ рд╕реЗ рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдб рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рдЪреАрд▓рд╛рдкрди рд╣реЛрдЧрд╛ред рдирд┐рдореНрди рдХреЛрдб рд╡рд╛рд▓реЗ DummyModule.jl рдлрд╝рд╛рдЗрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 module DummyModule export MyType, f mutable struct MyType a::Int end f(x) = x^2+1 println("loaded") end 

рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ MyType рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, DummyModule.jl рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред include ('DummyModule.jl') рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ include ('DummyModule.jl') рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, @everywhere рдореИрдХреНрд░реЛ (рдЬреВрд▓рд┐рдпрд╛ -p 2 рдХреЗ рд╕рд╛рде рдЬреВрд▓рд┐рдпрд╛ рдЪрд▓рд╛рдПрдБ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


 julia> @everywhere include("DummyModule.jl") loaded From worker 3: loaded From worker 2: loaded 

рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдпрд╣ DummyModule рдХреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╕реБрд▓рдн рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдпрд╛ рдЖрдпрд╛рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд┐рд╕реА рдбрдореАрдореЙрдбреНрдпреВрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 julia> using .DummyModule julia> MyType(7) MyType(7) julia> fetch(@spawnat 2 MyType(7)) ERROR: On worker 2: UndefVarError: MyType not defined тЛо julia> fetch(@spawnat 2 DummyModule.MyType(7)) MyType(7) 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, MyType рдХреЛ рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдиреЗ DummyModule рдХреЛ рд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рджрд╛рдпрд░реЗ рдореЗрдВ рди рд╣реЛ:


 julia> put!(RemoteChannel(2), MyType(7)) RemoteChannel{Channel{Any}}(2, 1, 13) 

рдлрд╝рд╛рдЗрд▓ рдХреЛ -L рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдХрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЧрдгрдирд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреНрд░рд╛рдЗрд╡рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 julia -p <n> -L file1.jl -L file2.jl driver.jl 

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдбреНрд░рд╛рдЗрд╡рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реА рдЬреВрд▓рд┐рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ 1 рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рдкреНрд░реЙрдореНрдкреНрдЯ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдЕрдВрдд рдореЗрдВ, рдпрджрд┐ DummyModule.jl рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреИрдХреЗрдЬ рд╣реИ, рддреЛ DummyModule рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ DummyModule.jl рдХреЛ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред


рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХрд╛ рд╢реБрднрд╛рд░рдВрдн рдФрд░ рдкреНрд░рдмрдВрдзрди


рдореВрд▓ рдЬреВрд▓рд┐рдпрд╛ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдореЗрдВ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд░реНрдерди рд╣реИ:


  • рд╕реНрдерд╛рдиреАрдп рдХреНрд▓рд╕реНрдЯрд░ -p рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
  • рдХреНрд▓рд╕реНрдЯрд░ рдорд╢реАрди - themachine-file рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ред рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╢реАрдиреЛрдВ рдкрд░ рдЬреВрд▓рд┐рдпрд╛ рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝ (рд╡рд░реНрддрдорд╛рди рд╣реЛрд╕реНрдЯ рдХреЗ рд╕рдорд╛рди рдкрде рдХреЗ рд╕рд╛рде) рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдмрд┐рдирд╛ ssh рд▓реЙрдЧрд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЛ рдХрд┐рд╕реА рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ, рд╣рдЯрд╛рдиреЗ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ addprocs , rmprocs , рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдФрд░ рдЕрдиреНрдп рдЙрдкрд▓рдмреНрдз рд╣реИрдВред


 julia> using Distributed julia> addprocs(2) 2-element Array{Int64,1}: 2 3 

addprocs рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ Distributed рдореЙрдбреНрдпреВрд▓ рдХреЛ рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ ~/.julia/config/startup.jl рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк. ~/.julia/config/startup.jl рдирд╣реАрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рди рд╣реА рд╡реЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЪрд▓ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╡реИрд╢реНрд╡рд┐рдХ рд░рд╛рдЬреНрдп (рдЬреИрд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░, рдирдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛, рдФрд░ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓) рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдореВрд╣реЛрдВ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ ClusterManager рдХреЛ рд▓рд┐рдЦрдХрд░ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдХреНрд▓рд╕реНрдЯрд░рд╕реНрдЯрд░рдореИрди рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╣реИред


рдбреЗрдЯрд╛ рдХреНрд░рд┐рдпрд╛рдПрдБ


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


fetch рдХреЛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдбреЗрдЯрд╛ рдЖрдВрджреЛрд▓рди рдСрдкрд░реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реАрдзреЗ рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рдЖрд╡рд╛рдЬрд╛рд╣реА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред @spawn (рдФрд░ рдХрдИ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рд░реНрдорд╛рдг) рднреА рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рдЖрдВрджреЛрд▓рди рдСрдкрд░реЗрд╢рди рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╕реНрдХреНрд╡реИрд░рд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


рд░рд╛рд╕реНрддрд╛ рд╕рдордп:


 julia> A = rand(1000,1000); julia> Bref = @spawn A^2; [...] julia> fetch(Bref); 

рд╡рд┐рдзрд┐ рджреЛ:


 julia> Bref = @spawn rand(1000,1000)^2; [...] julia> fetch(Bref); 

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


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдкрд╣рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдП рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╛, рдпрджрд┐ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ A рдорд╣рдВрдЧрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рджреВрд╕рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╛, рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ spawn рдФрд░ fetch(Bref) рдмреАрдЪ рдмрд╣реБрдд рдХрдо рд╕рдорд╛рдирддрд╛ рд╣реИ, рддреЛ fetch(Bref) рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╛ рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ rand(1000, 1000) рдПрдХ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рддреЛ рдлрд┐рд░ рдЗрд╕ рдХрджрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ spawn рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЬреЛрдбрд╝рдирд╛ рд╕рдордЭрджрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред


рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░


remotecall рдорд╛рдзреНрдпрдо рд╕реЗ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЧрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ, рдпрд╛ remotecall рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреВрд░рд╕реНрде рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреНрд▓реЛрдЬрд░, рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Main рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 A = rand(10,10) remotecall_fetch(()->sum(A), 2) 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рджреВрд░рд╕реНрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ sum рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ A рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рд╣реИред рд╡рд░реНрдХрд░ 2 рдореЗрдВ Main рдЦрдВрдб рдореЗрдВ A рдирд╛рдо рдХрд╛ рдПрдХ рдЪрд░ рдирд╣реАрдВ рд╣реИред рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ 2 рдХреЗ рд▓рд┐рдП рдХреНрд▓реЛрдЬрд░ рдлрд╝рдВрдХреНрд╢рди () -> sum(A) рдХреЛ Main.A рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред 2 Main.A рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред remotecall_fetch рдХреЙрд▓ remotecall_fetch рдмрд╛рдж рднреА remotecall_fetch 2 рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ 2 рдкрд░ рдореМрдЬреВрдж рд░рд╣рддрд╛ рд╣реИред



рдПрдореНрдмреЗрдбреЗрдб рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рд░рд┐рдореЛрдЯ рдХреЙрд▓ (рдХреЗрд╡рд▓ рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ) рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд░рддрд╛ рд╣реИ:


  • рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рджреВрд░рд╕реНрде рдХреЙрд▓ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирдП рд╡реИрд╢реНрд╡рд┐рдХ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЧрдВрддрд╡реНрдп рдХрд╛рд░реНрдпрд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
  • рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рджреВрд░рд╕реНрде рдиреЛрдбреНрд╕ рдкрд░ рднреА рд╕реНрдерд┐рд░рд╛рдВрдХ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдЧреНрд▓реЛрдмрд▓реНрд╕ рдХреЛ рдХреЗрд╡рд▓ рджреВрд░рд╕реНрде рдХреЙрд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓рдХреНрд╖рд┐рдд рдХрд░реНрдордЪрд╛рд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдмрдорд┐рдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рддрднреА рдЬрдм рдЙрд╕рдХрд╛ рдореВрд▓реНрдп рдмрджрд▓ рдЧрдпрд╛ рд╣реЛред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрд▓рд╕реНрдЯрд░ рдиреЛрдбреНрд╕ рдХреЗ рдмреАрдЪ рд╡реИрд╢реНрд╡рд┐рдХ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 A = rand(10,10) remotecall_fetch(()->sum(A), 2) # worker 2 A = rand(10,10) remotecall_fetch(()->sum(A), 3) # worker 3 A = nothing 

рдЙрдкрд░реЛрдХреНрдд рдЦрдВрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рддрдереНрдп рдпрд╣ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХрд░реНрдордЪрд╛рд░реА 2 рдкрд░ Main.A рдХрд░реНрдордЪрд╛рд░реА 3 рдкрд░ Main.A рд╕реЗ рднрд┐рдиреНрди рдореВрд▓реНрдп рд╣реИ, рдЬрдмрдХрд┐ рдиреЛрдб 1 рдкрд░ Main.A рдХрд╛ рдореВрд▓реНрдп рд╢реВрдиреНрдп рд╣реИред


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


 julia> A = rand(10,10); julia> remotecall_fetch(()->A, 2); julia> B = rand(10,10); julia> let B = B remotecall_fetch(()->B, 2) end; julia> @fetchfrom 2 InteractiveUtils.varinfo() name size summary тАУтАУтАУтАУтАУтАУтАУтАУтАУ тАУтАУтАУтАУтАУтАУтАУтАУтАУ тАУтАУтАУтАУтАУтАУтАУтАУтАУтАУтАУтАУтАУтАУтАУтАУтАУтАУтАУтАУтАУтАУ A 800 bytes 10├Ч10 Array{Float64,2} Base Module Core Module Main Module 

рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ A рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ 2 рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди B рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд░реВрдк B рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП B рд▓рд┐рдП рдмрдВрдзрди рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ 2 рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред


рд╕рдорд╛рдирд╛рдВрддрд░ рдЫреЛрд░реЛрдВ



рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХрдИ рдЙрдкрдпреЛрдЧреА рд╕рдВрдЧрд╛рдорд┐рдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЖрдВрджреЛрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдореЛрдВрдЯреЗ рдХрд╛рд░реНрд▓реЛ рд╕рд┐рдореБрд▓реЗрд╢рди рд╣реИ, рдЬрд╣рд╛рдВ рдХрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдПрдХ рд╕рд╛рде рд╕реНрд╡рддрдВрддреНрд░ рд╕рд┐рдореБрд▓реЗрд╢рди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░ рд╕рдХрддреА рд╣реИрдВред рд╣рдо рд╕рд┐рдХреНрдХреЛрдВ рдХреЛ рджреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдлреНрд▓рд┐рдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @spawn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ count_heads.jl рдореЗрдВ рдирд┐рдореНрди рдлрд╝рдВрдХреНрд╢рди count_heads.jl :


 function count_heads(n) c::Int = 0 for i = 1:n c += rand(Bool) end c end 

Count_heads рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ n рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмрд┐рдЯреНрд╕ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╣рдо рджреЛ рдорд╢реАрдиреЛрдВ рдкрд░ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:


 julia> @everywhere include_string(Main, $(read("count_heads.jl", String)), "count_heads.jl") julia> a = @spawn count_heads(100000000) Future(2, 1, 6, nothing) julia> b = @spawn count_heads(100000000) Future(3, 1, 7, nothing) julia> fetch(a)+fetch(b) 100001564 

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреИрдЯрд░реНрди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдХрдИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдХрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрдирдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдпреБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрдШ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрдореА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЯреЗрдВрд╕рд░ рд░реИрдВрдХ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ: рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рд╡реЗрдХреНрдЯрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдПрдХ рдкрдВрдХреНрддрд┐ рдпрд╛ рд╕реНрддрдВрдн, рдЖрджрд┐ рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб рдореЗрдВ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: рдкреИрдЯрд░реНрди x = f(x, v [i]) , рдЬрд╣рд╛рдВ x рдмреИрдЯрд░реА рд╣реИ, f рдХрдореА рдХрд╛рд░реНрдп рд╣реИ, рдФрд░ v[i] рдХрдо рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡ рд╣реИрдВред


рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдХрд┐ f рд╕рд╛рд╣рдЪрд░реНрдп рд╣реЛ рддрд╛рдХрд┐ рдпрд╣ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рдХрд┐ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ count_heads рд╕рд╛рде рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдордиреЗ рджреЛ рд╕реНрдкрд╖реНрдЯ spawn рд╕реНрдЯреЗрдЯрдореЗрдВрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬреЛ рджреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрд╛рдорд┐рддрд┐ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд┐рддрд░рд┐рдд рдореЗрдореЛрд░реА рдореЗрдВ рд▓реВрдк рд╕рдВрдЪрд╛рд▓рди рдХреЗ for рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЬреВрд▓рд┐рдпрд╛ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


 nheads = @distributed (+) for i = 1:200000000 Int(rand(Bool)) end 

( (+) ). . .


, for , . , , , . , , . , :


 a = zeros(100000) @distributed for i = 1:100000 a[i] = i end 

, . , . , Shared Arrays , , :


 using SharedArrays a = SharedArray{Float64}(10) @distributed for i = 1:10 a[i] = i end 

┬л┬╗ , :


 a = randn(1000) @distributed (+) for i = 1:100000 f(a[rand(1:end)]) end 

f , . , , . , Future , . Future , fetch , , @sync , @sync distributed for .


, (, , ). , , Julia pmap . , :


 julia> M = Matrix{Float64}[rand(1000,1000) for i = 1:10]; julia> pmap(svdvals, M); 

pmap , . , distributed for , , , . pmap , distributed . distributed for .


(Shared Arrays)



Shared Arrays . DArray , SharedArray . DArray , ; , SharedArray .


SharedArray тАФ , , . Shared Array SharedArrays , . SharedArray ( ) , , . SharedArray , . , Array , SharedArray , sdata . AbstractArray sdata , sdata Array . :


 SharedArray{T,N}(dims::NTuple; init=false, pids=Int[]) 

N - T dims , pids . , , pids ( , ).


init initfn(S :: SharedArray) , . , init , .


:


 julia> using Distributed julia> addprocs(3) 3-element Array{Int64,1}: 2 3 4 julia> @everywhere using SharedArrays julia> S = SharedArray{Int,2}((3,4), init = S -> S[localindices(S)] = myid()) 3├Ч4 SharedArray{Int64,2}: 2 2 3 4 2 3 3 4 2 3 4 4 julia> S[3,2] = 7 7 julia> S 3├Ч4 SharedArray{Int64,2}: 2 2 3 4 2 3 3 4 2 7 4 4 

SharedArrays.localindices . , , :


 julia> S = SharedArray{Int,2}((3,4), init = S -> S[indexpids(S):length(procs(S)):length(S)] = myid()) 3├Ч4 SharedArray{Int64,2}: 2 2 2 2 3 3 3 3 4 4 4 4 

, , . рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


 @sync begin for p in procs(S) @async begin remotecall_wait(fill!, p, S, p) end end end 

. pid , , ( S ), pid .


┬л┬╗:


 q[i,j,t+1] = q[i,j,t] + u[i,j,t] 

, , , , , : q [i,j,t] , q[i,j,t+1] , , , q[i,j,t] , q[i,j,t+1] . . . , (irange, jrange) , :


 julia> @everywhere function myrange(q::SharedArray) idx = indexpids(q) if idx == 0 # This worker is not assigned a piece return 1:0, 1:0 end nchunks = length(procs(q)) splits = [round(Int, s) for s in range(0, stop=size(q,2), length=nchunks+1)] 1:size(q,1), splits[idx]+1:splits[idx+1] end 

:


 julia> @everywhere function advection_chunk!(q, u, irange, jrange, trange) @show (irange, jrange, trange) # display so we can see what's happening for t in trange, j in jrange, i in irange q[i,j,t+1] = q[i,j,t] + u[i,j,t] end q end 

SharedArray


 julia> @everywhere advection_shared_chunk!(q, u) = advection_chunk!(q, u, myrange(q)..., 1:size(q,3)-1) 

, :


 julia> advection_serial!(q, u) = advection_chunk!(q, u, 1:size(q,1), 1:size(q,2), 1:size(q,3)-1); 

@distributed :


 julia> function advection_parallel!(q, u) for t = 1:size(q,3)-1 @sync @distributed for j = 1:size(q,2) for i = 1:size(q,1) q[i,j,t+1]= q[i,j,t] + u[i,j,t] end end end q end; 

, :


 julia> function advection_shared!(q, u) @sync begin for p in procs(q) @async remotecall_wait(advection_shared_chunk!, p, q, u) end end q end; 

SharedArray , ( julia -p 4 ):


 julia> q = SharedArray{Float64,3}((500,500,500)); julia> u = SharedArray{Float64,3}((500,500,500)); 

JIT- @time :


 julia> @time advection_serial!(q, u); (irange,jrange,trange) = (1:500,1:500,1:499) 830.220 milliseconds (216 allocations: 13820 bytes) julia> @time advection_parallel!(q, u); 2.495 seconds (3999 k allocations: 289 MB, 2.09% gc time) julia> @time advection_shared!(q,u); From worker 2: (irange,jrange,trange) = (1:500,1:125,1:499) From worker 4: (irange,jrange,trange) = (1:500,251:375,1:499) From worker 3: (irange,jrange,trange) = (1:500,126:250,1:499) From worker 5: (irange,jrange,trange) = (1:500,376:500,1:499) 238.119 milliseconds (2264 allocations: 169 KB) 

advection_shared! , , .



, . , , .
, , , .


- Julia


, , , .


╧А=3.14159265..., , -.  pi, S=╧Аr2рдЬрд╣рд╛рдБ rтАФ . -  pi, .. [тИТ1,1]2xтИТy, .



( S=╧А, r=1) ( A=4) ╧А/4, , , . ,  pi, . compute_pi (N) ,  pi, N.


 function compute_pi(N::Int) # counts number of points that have radial coordinate < 1, ie in circle n_landed_in_circle = 0 for i = 1:N x = rand() * 2 - 1 # uniformly distributed number on x-axis y = rand() * 2 - 1 # uniformly distributed number on y-axis r2 = x*x + y*y # radius squared, in radial coordinates if r2 < 1.0 n_landed_in_circle += 1 end end return n_landed_in_circle / N * 4.0 end 

, ,  piред : , , 25 .


Julia Pi.jl ( Sublime Text , ):


 C:\Users\User\AppData\Local\Julia-1.1.0\bin\julia -p 4 julia> include("C:/Users/User/Desktop/Pi.jl") 


 using Distributed addprocs(4) 

Jupyter


Pi.jl
 @everywhere function compute_pi(N::Int) n_landed_in_circle = 0 # counts number of points that have radial coordinate < 1, ie in circle for i = 1:N x = rand() * 2 - 1 # uniformly distributed number on x-axis y = rand() * 2 - 1 # uniformly distributed number on y-axis r2 = x*x + y*y # radius squared, in radial coordinates if r2 < 1.0 n_landed_in_circle += 1 end end return n_landed_in_circle / N * 4.0 end function parallel_pi_computation(N::Int; ncores::Int=4) #       sum_of_pis = @distributed (+) for i=1:ncores compute_pi(ceil(Int, N / ncores)) end return sum_of_pis / ncores # average value end # ceil (T, x)     #  T,     x. 

, :


 julia> @time parallel_pi_computation(1000000000, ncores = 1) 6.818123 seconds (1.96 M allocations: 99.838 MiB, 0.42% gc time) 3.141562892 julia> @time parallel_pi_computation(1000000000, ncores = 1) 5.081638 seconds (1.12 k allocations: 62.953 KiB) 3.141657252 julia> @time parallel_pi_computation(1000000000, ncores = 2) 3.504871 seconds (1.84 k allocations: 109.382 KiB) 3.1415942599999997 julia> @time parallel_pi_computation(1000000000, ncores = 4) 3.093918 seconds (1.12 k allocations: 71.938 KiB) 3.1416889400000003 julia> pi ? = 3.1415926535897... 

JIT - тАФ . , Julia . , ( Multi-Threading, Atomic Operations, Channels Coroutines).



, , . MPI.jl MPI ,
DistributedArrays.jl .
GPU, :


  1. ( C) OpenCL.jl CUDAdrv.jl OpenCL CUDA.
  2. ( Julia) CUDAnative.jl CUDA .
  3. , , CuArrays.jl CLArrays.jl
  4. , ArrayFire.jl GPUArrays.jl
  5. -
  6. Kynseed

, , . !


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


All Articles