Mathematica 8でコマンドを作成してすべてのコアを使用する方法は?


5

Mathematica 8の多くのコマンド(IntegrateSimplifyなど)は、システム上で単一のコアのみを使用しているようです。すべてのコアを計算に使用するようにアフィニティを変更する方法はありますか?


4
私の推測では、これらのコマンドを簡単に並列化することはできないため、異なるコアで同時に実行するとパフォーマンスが向上しません。だからこそ、Wolframはそれを並列コンピューティング用に実装することを気にしませんでした。しかし、理論的なコンピューターサイエンスと数学の専門家ではないため、統合アルゴリズムの実装方法がわかりません。
-slhck

回答:


3

他の質問やコメントで述べたように、のようなものIntegrateとはSimplifyMathematicaがメッセージを返すので、並列化は本当に難しいだろうParallelize::nopar1と進む「順次評価を。」

(リフレクションでFullSimplifyはありますが、基本的には多くの異なるルールを試し、それらに対してリーフカウントを実行することで機能するため、並列化できます...)

あなたが行うには、多くの積分または単純化を持っている場合は、使用できるParallelTableParallelMapなどを...

些細な例として、被積分関数がある場合

In[1]:= ints = Table[x^n, {n, 1, 10}]
Out[1]= {x, x^2, x^3, x^4, x^5, x^6, x^7, x^8, x^9, x^10}

使用できます ParallelTable

In[2]:= ParallelTable[Integrate[int, x], {int, ints}]
Out[2]= {x^2/2, x^3/3, x^4/4, x^5/5, x^6/6, x^7/7, x^8/8,\ 
         x^9/9, x^10/10, x^11/11}

または ParallelMap

In[3]:= ParallelMap[Integrate[#, x] &, ints]
Out[3]= {x^2/2, x^3/3, x^4/4, x^5/5, x^6/6, x^7/7, x^8/8,\  
         x^9/9, x^10/10, x^11/11}

明らかに、上記のような積分の小さなリストの場合、並列化のオーバーヘッドはおそらく利益よりも大きいでしょう。しかし、本当に大きなリストと複雑な積分がある場合は、おそらくそれだけの価値があります。


コメントに応じて編集する

OPが興味をそそる非常に厄介な被積分関数(注:進むにつれて結果を本当に単純化する必要があります!)を考えると、積分を単項式の和に分解し、を使用して積分を実行するコードがありますParallelDo

まず、pastebinから積分をインポートします

In[1]:= import = Import["http://pastebin.com/raw.php?i=JZ0CXewJ", "Text"];

統合ドメインを抽出する

In[2]:= intLimits = Rest@(2 Pi^5 ToExpression[StringReplace[import, "Integrate" -> "List"]])
        vars = intLimits[[All, 1]];

Out[2]= {{\[Theta]3, 0, 2*Pi}, {\[Theta]2, 0, 2*Pi}, 
         {\[Theta]1, 0, 2*Pi}, {\[CurlyPhi]2, 0, Pi/2}, {\[CurlyPhi]1, 0, Pi/2}}

被積分関数は、21のモンスター用語の合計です

In[4]:= integrand = First@(2 Pi^5 ToExpression[StringReplace[import, "Integrate" -> "Hold"]]);
        Length[integrand]
        LeafCount[integrand]

Out[5]= 21
Out[6]= 48111

恐ろしい混乱を一口サイズのチャンクに分解する必要があります。まず、積分からさまざまな関数をすべて抽出します

In[7]:= (fns=Union[vars, Cases[integrand, (Cos|Sin|Tan|Sec|Csc|Cot)[x_]/;!FreeQ[x,Alternatives@@vars],Infinity]])//Timing
Out[7]= {0.1,{\[Theta]1, <snip> ,Tan[\[CurlyPhi]2]}}

次から構築された単項式の(13849非消失)係数を見つけます fns

In[8]:= coef = CoefficientRules[integrand, fns]; // Timing
         Length@coef

Out[8]= {35.63, Null}
Out[9]= 13849

すべての係数に積分変数がないことを確認します

In[10]:= FreeQ[coef[[All, 2]], Alternatives@@vars]
Out[10]= True

実際にFactoror Simplifyを使用して係数をクリーンアップし、ByteSize約5倍減らすことができることに注意してください。

これは、単項式を再構築し、それを積分し、その係数と再結合する方法です。たとえば、40番目の単項式は、消失しない積分を与えます。

In[11]:= monomialNum=40;
         Times@@(fns^coef[[monomialNum,1]])
         Integrate[%, Sequence@@intLimits]
         coef[[monomialNum,2]] %//Factor
Out[12]= \[Theta]1 Cos[\[Theta]1]^2 Cos[\[CurlyPhi]1]^4 Cos[4 \[CurlyPhi]1] Cos[\[CurlyPhi]2]^4 Cos[2 \[CurlyPhi]2] Sin[\[Theta]1]^2
Out[13]= \[Pi]^6/256
Out[14]= -((k1^2 (k1-k2) (k1+k2) (-2+p) p^3 \[Pi]^6 \[Sigma]^4)/(131072 \[Omega]1))

とりあえず、項数を減らします。デュアルコアラップトップですべての作業を行うのに永遠に時間がかかるからです。積分のセット全体を評価する場合は、次の行を削除またはコメントアウトします

In[15]:= coef = RandomChoice[coef, 100];  (* Delete me!! *)

OK、単項積分結果の空のリストを初期化します

In[16]:= SetSharedVariable[ints]
         ints = ConstantArray[Null, Length@coef];

我々は積分を行うように、我々Printアウト NUM:{タイミング、結果} 集積各単項式のため。CellLabel印刷された各セルの積分をやっているコアを示しています。印刷が面倒になることがあります-面倒な場合はPrintPrintTemporyまたはに置き換えます##&進行状況バーなどの動的変数を使用して計算を監視することもできます

ParallelDo[Print[c, ": ", Timing[
            ints[[c]] = Integrate[Times@@(fns^coef[[c,1]]), Sequence@@intLimits]]], 
           {c, Length@coef}]

係数と組み合わせる

1/(2 Pi^5) Simplify[ints.coef[[All, 2]]]

そして(願わくば)それがそうです!


5つの変数による積分があり、最初は1つずつ積分できますが、問題はこの1つの積分にすべてのコアを使用する方法です。もちろん、FullSimplifyコマンドも並列化できません。
-derdack

反復/多次元積分?数値の場合、モンテカルロ評価を並列化できます。必要な分析結果である場合、問題が発生している可能性があります。FullSimplifyコメントが意味することは、アルゴリズムにはおそらく並列化の余地があるということです。Mmaに現在の形式で並列化させることはできません。
サイモン

問題は、分析結果が欲しいことです。最初は、複数の積分を分離できます。しかし、1つだけの分析計算は1か月になることもあれば、どのくらいの長さになるか分からないこともあります。「Maple 15」は、このバージョンでは並列計算を行うと書いていますが、私はテストし、統合のために同時に多くのコアで動作することもできませんでした。maplesoft.com/products/maple/new_features/index.aspx#parallel
derdack

申し訳ありませんが、積分の限界は数値です。たとえば、Integrate [0..5] Integrate [0..8] Integrate [0..2](large function)dx dy dz。大きな関数は、a x + b y + c * zの形式です。ここで、a、b、cは、a、b、cの形式の分析定数です。この場合、並列化を使用できますか?
-derdack

それで、int(ax + by + cz)dx dy dzという形式の積分があります。ここで、a、b、cはx、y、zから独立していますか?それはささいなことではありませんか-または私は何かを見逃していますか?
サイモン

4

Parallelize doumentationから、例>考えられる問題の下で:

並列化できない式は通常どおり評価されます。

Parallelize[Integrate[1/(x - 1), x]]

ここに画像の説明を入力してください


Linuxでも同じ問題だと思いますか?
-derdack

Win7でこのメッセージを受け取ったからです:ParallelCombine :: nopar:使用可能な並列カーネルがありません。逐次評価を進めます。>>
ダーダック

1
計算における「カーネル」とは、単に言えば、データに繰り返し適用されるアルゴリズムの一部にすぎません。タスクに並列カーネルがない場合、並列に実行できません。これはすべてのオペレーティングシステムで同じであり、ソフトウェア、つまりMathematicaのみに依存しています。
slhck
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.