並行コンピューティング技法 ―実践マルチコア/マルチスレッドプログラミング
目次
はじめに
Juliaの特徴に、分散・並列処理がしやすいという特徴があります。
Juliaでは言語の並行・並列処理として、
1 非同期タスク、コルーチン (並行処理)
2 マルチスレッド
3 分散処理 (並列処理)
4 GPU計算
の4つの方法をサポートしていますが、
今回の記事では、3の分散、並列処理の概要を
下記の記事を元に紹介したいと思います。
1.の並行処理に関しては、下記を参照ください。
Juliaにおける分散、並列プログラミングは、Distributedモジュールを使って実装されており、
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
を
現在のワーカプロセスの数を確認したい場合は、nworkers
を使います。
また、上記の方法ではメインのコンピュータ上でワーカプロセスが立ち上がりますが、
下記のように、ClusterMangerを設定することで、
他のコンピュータ上でワーカプロセスを立ち上げて、管理することが可能です。
ある関数を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) |
参考資料
並行コンピューティング技法 ―実践マルチコア/マルチスレッドプログラミング
MyEnigma Supporters
もしこの記事が参考になり、
ブログをサポートしたいと思われた方は、
こちらからよろしくお願いします。