2012-03-13 8 views
5

8つのコアを持つ1台のマシンを仮定します。 Haskellでは、threadedオプションを使用してコンパイルし、実行時に+RTS -Nxを使用して、使用するコア数を指定できます。例えばスピードアップを得るためにF#測定を行う方法

$ myprg args // sequential run 
$ myprg args +RTS -N1 // parallel run on 1..8 cores 
$ myprg args +RTS -N2 
$ myprg args +RTS -N4 
$ myprg args +RTS -N8 

これより、増加するコア数を使用してランタイムを取得し、これを使用して高速化を取得し、グラフをプロットすることができます。

私は並列プログラムを持っていると仮定して、F#でどのようにこれを行いますか?コード内のパラレルマップを使用して?

編集: 見つけたのはParallelOptionsです。 MaxDegreeOfParallelism which may私はその正確な振る舞いについては必要なものだと思っていますが、私はそれをプログラム的に使用しなければなりません。つまり、期待通りに動作する限りです。MaxDegreeOfParallelism = numのコアプログラムは、 'またはスレッド。

EDIT: ProcessorAffinityが実際に使用するコアの数を制限するが、適切にモノに実装されていないようです。私はWindows上でチェックし、それは動作するようです。実際に使うのは良い考えではありませんが。ランタイムシステムは、タスクの管理方法とスケジュール方法をよりよく決定できる必要があります。また、MaxDegreeOfParallelismは、基本的に生成されたタスクの数を設定する「並列レベル」に近いため、粒度を変更するために使用できます。

+2

Windowsを使用している場合は、タスクマネージャでCPU数を設定するだけです。http://www.addictivetips.com/windows-tips/how-to-set-processor-affinity-to-an -application-in-windows/ –

+0

私はLinux/monoを使用しています。 Linuxで同じことをする方法はありますか? – vis

+6

F#はネイティブ.NETアセンブリを作成します。アセンブリは、実行時に指定されたルール(CLR)に従います。このルールは、デフォルトですべてのCPUコアにアフィニティがあります。 System.Diagnostics.Process.GetCurrentProcess()。ProcessorAffinity'を設定することで、_fewer_数のコアのCLRを制限することができます。 – bytebuster

答えて

2

F#がネイティブ.NETアセンブリを作成します。アセンブリは、実行時に指定されたルール(CLR)に従います。このルールは、デフォルトですべてのCPUコアにアフィニティがあります。 System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinityを設定することにより、個のコア数がより少ない個のCLRを制限できます。

この回答はMono環境では不完全なようです。 ProcessorAffinityis a bit maskなので、0は確かに無効な状態です。私はまた、MSDNに記述されているように、なぜsetterが例外をスローしなかったのか疑問に思っています。

私はschedutilsを使用してMonoの親和性をチェックし、MONO_NO_SMP環境フラグが設定されていないかどうかを確認します。

2

bytebusterさんのコメントを引用すると:

F#がネイティブ.NETアセンブリを作成します。アセンブリは、実行時に指定されたルール(CLR)に従います。このルールは、デフォルトですべてのCPUコアにアフィニティがあります。 System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinityを設定すると、より少ないコア数でCLRを制限できます。

(あなたはコメントを残して、私はこれを削除します答えを追加した場合)

+0

あなたはおそらくコミュニティウィキ(あなたが元の作者でない場合)として答えをマークするべきです。 –

+0

@TomasPetricek:Done – Guvante

+0

私は 'ProcessorAffinity'を使用しようとしましたが、8つのコアを持つマシン上で並列プログラムを実行するときには違いはありません。 1,2,4,8にアフィニティを設定するとスピードアップが増えることが期待されますが、そうではありません。ランタイムは同じで、このプロパティを設定しても差はありません。これが起こっている理由は何ですか? msdnのドキュメントを見た後、私はそれがプロセッサコアではなく物理プロセッサに当てはまると考える傾向があります。 – vis

関連する問題