MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

Juliaにおける分散・並列処理入門


並行コンピューティング技法 ―実践マルチコア/マルチスレッドプログラミング

目次

はじめに

Juliaの特徴に、分散・並列処理がしやすいという特徴があります。

julialang.org

 

Juliaでは言語の並行・並列処理として、

  • 1 非同期タスク、コルーチン (並行処理)

  • 2 マルチスレッド

  • 3 分散処理 (並列処理)

  • 4 GPU計算

の4つの方法をサポートしていますが、

docs.julialang.org

今回の記事では、3の分散、並列処理の概要を

下記の記事を元に紹介したいと思います。

docs.julialang.org

 

1.の並行処理に関しては、下記を参照ください。

myenigma.hatenablog.com

 

Juliaにおける分散、並列プログラミングは、Distributedモジュールを使って実装されており、

docs.julialang.org

2つの要素で構成されます。

  • Remote references: あるプロセスに存在するオブジェクトを、他のプロセスから利用するようにするためのオブジェクト

  • Remote call: あるプロセスが、別のプロセス(同じプロセスでも良い)にある関数を実行するようにリクエストすること

Remote referencesはFutureとRemoteChannelという形で、実現されます。

Remote Callの結果は、Futureとして返ってきます。

Remote Callをした方は、即座にFutureが返ってくるので、

別の作業をすることができます。

 

Remote Callの結果が返ってくるまで待つ場合はwait(future)とし、

データを取得したい場合はfetch(future)で取得できます。

一度、fetchするとその値はキャッシュされるため、

二回目からは処理は行われず、同じ値が返ってきます。

 

Juliaでは、並列処理に利用されるプロセスをワーカーといい、

julia -p nで指定したn個分、ワーカプロセスが作成されます。

(またこのように-pをしているすると、そのJuliaのセッションでは

暗黙のうちにDistributedモジュールがロードされます)

後述する@spawnatなどである関数を並列実行した場合は、

基本的にこのワーカプロセスで処理が実行されます。

 

Juliaのプロセス起動時にワーカプロセスを起動するのではなく、

Juliaのコード内でワーカプロセスを追加する場合は、addprocs

docs.julialang.org

現在のワーカプロセスの数を確認したい場合は、nworkersを使います。

docs.julialang.org

 

また、上記の方法ではメインのコンピュータ上でワーカプロセスが立ち上がりますが、

下記のように、ClusterMangerを設定することで、

他のコンピュータ上でワーカプロセスを立ち上げて、管理することが可能です。

docs.julialang.org

 

ある関数をRemote callしたい場合には、

処理を実施するワーカプロセスにも、その関数の定義を知らせる必要がありますが、

そのときには、@everywhereマクロを使います。

include文の前に@everywhereマクロをつけると、

そのincludeファイル内のすべてのコードが

すべてのワーカプロセスで共有されます。

 

並行、並列処理のマクロまとめ

下記は、Juliaにおける並行・並列処理のマクロをまとめたものです。

マクロ 機能 リンク
@async 処理を並行実行 Tasks · The Julia Language
@spawnat 指定されたプロセスで処理を並列。自動的にプロセスを決めてほしい場合は@spawnat :anyを使う Distributed Computing · The Julia Language
@sync @async, @spawn, @spawnat, @distributedなどで実行されてた並行・並列処理をすべて待つ Tasks · The Julia Language

並行・並列処理の比較

下記は、並行処理と並列処理のやりたいことを実現する

関数やマクロを比較したものです。

やりたいこと 並行処理 並列処理
非同期実行 task = @async do_something() future = @spawn do_something()
処理終了の確認 istaskdone(task) | isready(future)
データの取得 fetch(task) fetch(task)
コレクションlに対する関数fの利用 asyncmap(f, l) pmap(f, l)
処理の中止 schedule(task, InterruptException(), error=true) (安全ではないらしい) Stop/terminate a (sub)task started with @async - General Usage - JuliaLang interrupt(future.where)

参考資料

qiita.com

stackoverflow.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com


並行コンピューティング技法 ―実践マルチコア/マルチスレッドプログラミング

 

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com