web-dev-qa-db-ja.com

OCamlの並列化能力の状態はどうですか?

プロジェクトにOCamlを使用することに興味がありますが、その並列化機能がどこにあるのかわかりません。 OCamlにメッセージパッシング機能はありますか? OCamlは複数のCPUを効率的に使用できますか?

私がこの主題について読んだもののほとんどは2002年から2006年に書かれたものであり、最近は何も見ていません。

ありがとう!

40
Andrew Spott

この2009年号Camlウィークリーニュース ( "CWN"、 caml list )からの興味深いメッセージのダイジェストは次のことを示しています。

  • スレッドとOcamlの公式パーティライン は変更されていません。注目すべき引用:

    (...)一般に、標準ライブラリ全体はスレッドセーフではありません。おそらくそれはスレッドライブラリのドキュメントに記載されているはずですが、標準ライブラリモジュールごとにドキュメント化する意味はあまりありません。 --X。リロイ

    (Ocamlスレッドがまだどのように役立つかについては、 SOに関する別の質問での犯人自身の発言 を参照してください)

  • 並列処理で最も頻繁に採用されるパラダイムはメッセージパッシングであり、注目すべきはXです。Leroyの OcamlMPI 、プログラミング用のバインディングを提供します [〜#〜] spmd [〜#〜] = MPI標準 に対するスタイル。 上記で指摘したのと同じCWNの問題 は、例や他の多くの関連プロジェクトへの参照を提供します。

  • 別のメッセージパッシングソリューションは JoCaml であり、 join calculus として知られる新しいスタイルの同時通信を開拓します。 OCamlコンパイラとバイナリ互換であることに注意してください。

  • ただし、GCが並列処理で問題ないランタイムの接続を妨げることはありませんでした。 CWNのこの他の問題 のOCAML4MCの説明を参照してください。

もあります:

  • Netmulticore -マップされた共有メモリを介してocaml値を共有するマルチプロセッシング。

  • CamlP3l --Caml並列プログラム用のコンパイラ。

  • OCaml-Java -Javaバイトコードを出力するOCamlコンパイラ


ただし、Ocamlと並列プログラミングに関する最近の議論には従いませんでした。 私はこれを残します [〜#〜] cw [〜#〜] 他の人が私が言及したことを更新できるようにします。この質問が Haskellの類似の質問 と同じレベルの完全性に達することができれば素晴らしいでしょう。

23
Francois G

現在、OCamlランタイムは複数のコアを並行して実行することをサポートしていないため、単一のOCamlプロセスで複数のコアを利用することはできません。これが直接変更される可能性は低いです。 OCaml開発者が並列処理を増やすことに最も関心を持っている方向は、複数のOCamlランタイムを単一のプロセスで並列に実行できるようにすることのようです。これにより、非常に高速なメッセージパッシングが可能になりますが、共有メモリ構成で複数のスレッドを並行して実行することはできません。主な問題はガベージコレクターです。数年前、チームは並行GCを実験しましたが、シングルスレッドの場合には許容できない速度低下が発生しました。

FunctoryOCamlnet の2つのプロジェクトがあり、複数のプロセスを使用してマルチコア対応の並列処理を提供します。

一般に、OCamlコミュニティは、単一プロセスの共有メモリマルチスレッドよりも、プロセスの境界を越えて(OCamlnetのように)実行できるメッセージパッシングアプローチを好む傾向があります。プログラムを複数のプロセスに分割できる場合(多くの場合可能です!)、はい、複数のCPUを効率的に使用できます。

8

BSMLlibは、OCamlでのデータ並列プログラミングのための単純化されたプログラミングインターフェースを提供します。その実行はBSPスタイルのメッセージパッシングに相当しますが、OCamlのサブセットに対しては決定論的であり、宣言的ですらあります。重要な概念は、プロセスごとに1つずつ、値のベクトルに対応するパータイプです。

http://traclifo.univ-orleans.fr/BSML/http://fr.wikipedia.org/wiki/Bulk_Synchronous_Parallel_ML

GaétanHainsUniversityParis-Est

1
hains