4

最高速度を出すためには、それができることが重要ではないでしょうか。

編集:

たとえば、Clojure には複数のコアを使用するpmapがあります。

Harrop 博士は次のように書いています (2011 年 1 月 9 日):
OCaml 3.12 のファーストクラス モジュールなど、言語に追加された新機能は、マルチコア機能ほど価値がありません。

4

2 に答える 2

6

はい、できます。このためには、マルチプロセッシング モデルを使用する必要があります。このモデルでは、複数のプロセスを生成して個別に計算を実行し、結果をマージするようにプログラムします。

最も簡単な方法は、Unix.forkシステム コールを使用してプログラムを 2 つのプロセスにフォークすることです。これについては、オンライン ブックUnix system programming in OCamlなどで説明されています。コア間で分割したい計算が単純な構造 (反復、入力プールへのマッピング) の場合、Parmapは、アプリケーション内のいくつかの関数呼び出しを変更するだけで、かなり簡単に並列処理の恩恵を受けることができるライブラリです (すでに十分に構成されています)。より高度なこと (共有メモリ構造、メッセージ ボックスへの直接アクセスなど) を行いたい場合、Ocaml-net プロジェクトはNetmulticoreライブラリを介して多くの便利な機能をサポートしています。

分散プログラミング (複数のマシンのクラスターで実行されるプログラム) を実行する場合、OcamlMPIライブラリは、よく知られた分散メッセージ パッシング フレームワーク MPI のサポートを提供します。また、より実験的で高レベルのJoCaml拡張機能もあります。これは、同時通信に対して興味深い、より研究的なアプローチを使用します。

特定のパフォーマンスの制約がない場合、またはアプリケーションが本質的にシーケンシャルである場合は、計算を並列化しようとしても意味がないことに注意してください (同期の簿記オーバーヘッドが高くなります)。アムダールの法則

于 2013-01-26T23:27:58.593 に答える
0

並列コードが大量のデータを生成する場合、OCaml で効率的に戻す簡単な方法はありません。従来の回避策は、プロセスをフォークして結果を親プロセスにマーシャリングすることですが、親プロセスは単一のコアですべてのデータを逆シリアル化し、すべてを独自のヒープに再割り当てします。これはマルチコアでは非常に非効率的であり、OCaml が を含むほとんどの並列アルゴリズムの効率的な実装を表現できないことを意味しますpmap

于 2015-01-23T13:43:48.287 に答える