2011-08-03 6 views
5

私は数百ものセルの長いMathematicaファイルを持っています。私は並列評価を使いたいと思います。私は2プロセッサx 4コアの各マシンに16Gbのメモリを持っています。私のMathematicaのライセンスでは、最大で2つのマスターカーネルを走らせることができます。マスターの1人が4つのスレーブカーネルを持つことができます(これはしばらくプレイした後の私の解釈です)。Mathematicaで並行して評価するセル

2つの異なるノートブックで2つのマスターカーネルでコードを実行しました。さらにスピードアップするために、私はParallelEvaluate[]でいくつかの細胞をカプセル化しようとしました。次に、マスターカーネルの1つを通してお互いに気づかずに実行しているコードのコピーが4つあります。これは問題ありません。 (私は基本的に、できる限り多くのコード/マスカーネルのコピーをできるだけ並行して実行しようとしています。

私のコードは長すぎて複雑なので、すべてのセルを再度編集して並列に評価する必要はありません。私の手帳の冒頭に置くことができる魔法はありますか?その後に評価されるすべてのセルは、デフォルトでParallelEvaluate[ ... cell contents.... ]になりますか?

+1

は、あなたが 'ParallelEvaluate []'すべてのあなたの細胞にしたいことを本当によろしいですか?あなたはすでにあなたのコードでそれを試しましたか?ヒント:あなたはおそらく単一の結果を得ているリストを取得するでしょう。 –

+0

はいテーブルのリストを取得していますが、それは大丈夫です。私は手動でこれらのテーブルをマスターカーネルで組み合わせ、結果を分析します。私は計算を高速化するためにすべての数学関数を使うもっとも簡単な方法を見つけようとしています。 – Hsn

+0

$ Pre = ParallelEvaluateで試してみましたが、今はMmaを使用できません(HWの問題)おそらくあなたは試してみたいと思っています –

答えて

2

belisariusによって提案されているように、$ Pre = ParallelEvaluateは私が望むものとまったく同じです。 1つの問題は、私が$ Pre = Identityを実行してマスターカーネルに戻ることができるようにするときでした。mathematicaはマスターカーネルではなくスレーブカーネルで評価しようとしています。私は以下のようにそれを解決しました:SetSharedVariable [parallelcontrol]; parallelcontrol = ParallelEvaluate; $ Pre:= parallelcontrol; ...すべてがここの奴隷で評価されている...; parallelcontrol =アイデンティティ。

LaunchKernels[] 

{KernelObject [1、 "ローカル"]、KernelObject [2、:....すべてが...ここでは2つのコアを持っている私のラップトップ上のサンプルの実行があるのみで、マスターに評価されるように戻って"ローカル"]}

$KernelID 
ParallelEvaluate[$KernelID] 

{1,2}

SetSharedVariable[parcontrol]; $Pre := parcontrol; parcontrol = ParallelEvaluate 

ヌル[ParallelEvaluate]

$KernelID 

{1,2}

parcontrol = Identity 

{アイデンティティ、アイデンティティ}

$KernelID 
parcontrol = ParallelEvaluate 

ParallelEvaluate

$KernelID 

{1、2}

関連する問題