web-dev-qa-db-ja.com

ジュリアでの並列処理。機能と制限

arXiv論文 で、Juliaの原作者は次のように述べています。

2.14 Parallelism。並列実行は、標準ライブラリのJuliaに実装されたメッセージベースのマルチプロセッシングシステムによって提供されます。言語設計は、対称的なコルーチンを提供することにより、このようなライブラリの実装をサポートします。これは、協調的にスケジュールされたスレッドと考えることもできます。この機能により、ユーザーがコールバックを設定する必要なく、非同期通信をライブラリ内に隠すことができます。 Juliaは現在、制限であるネイティブスレッドをサポートしていませんが、共有メモリの同期使用の複雑さを回避できるという利点があります。

Juliaがネイティブスレッドをサポートしていないというのはどういう意味ですか?ネイティブスレッドとは

Python[〜#〜] r [〜#〜]などの他の解釈言語は、このタイプの並列処理をサポートしていますか?この中でジュリアは一人ですか?

54

「ネイティブスレッド」とは、オペレーティングシステムカーネルによって管理される個別の実行コンテキストであり、共有メモリスペースにアクセスし、個別のコアで同時に実行される可能性があります。これを、複数のコアで同時に実行される可能性があるが、個別のメモリスペースを持つ個別のプロセスと比較してください。プロセスはカーネル経由でのみ相互に通信できるため、プロセスが適切に相互作用することを確認するのは簡単です。スレッドが予測不可能なバグのある方法で相互作用しないようにすることは、スレッドが無制限に同じメモリに読み書きできるため、非常に困難です。

Rの状況はかなり単純です: Rはマルチスレッドではありません 。 Pythonは少し複雑です:Pythonはスレッド化をサポートしていますが、 global interpreter lock(GIL)) のため、実際はありませんPythonコードの同時実行が可能です。他の一般的なオープンソース動的言語は、ネイティブスレッドに関してさまざまな混合状態にあります(Ruby: no/kinda/yes? ; Node.js: no )ですが、一般的には答えは「いいえ」です。完全な同時ネイティブスレッド化はサポートされていないため、Juliaだけではありません。

Juliaに共有メモリの並列処理を追加すると、 予定どおり –ネイティブスレッドを使用するか、共有メモリを使用する複数のプロセスを使用するかにかかわらず、真の同時実行性が実現し、Juliaの同時実行を妨げるGILはなくなります。コード。ただし、これは言語に追加する非常にトリッキーな機能であり、他の非常に人気のある成熟した動的言語ではサポートが存在しないか制限されていることからも明らかです。共有メモリの同時実行モデルを追加することは技術的に困難ですが、実際の問題は、プログラマがハードウェアの同時実行を生産的かつ安全な方法で効果的に使用できるプログラミングモデルを設計することです。この問題は一般に未解決であり、研究と実験の非常に活発な領域です。コピーする「ゴールドスタンダード」はありません。 POSIXスレッドのサポートを追加することもできますが、そのプログラミングモデルは一般に危険であり、正しく効果的に使用するのは非常に難しいと考えられています。 Goには優れた並行性のストーリーがありますが、大規模なデータを同時に操作するためではなく、並行性の高いサーバーを作成するために設計されているため、JuliaにとってGoのモデルを単にコピーするのが良いアイデアであることはまったく明らかではありません。

68
StefanKarpinski