0

これは私の最初の試みIPython.parallelですので、ご容赦ください。

この質問 Parfor for Pythonを読みまし たが、次のように簡単な例を実装するのに問題があります。

import gmpy2 as gm
import numpy as np
from IPython.parallel import Client

rc = Client()
lview = rc.load_balanced_view()
lview.block = True

a = 1
def L2(ii,jj):
    out = []
    out.append(gm.fac(ii+jj+a))
    return out 

Nloop = 100
ii = range(Nloop)
jj = range(Nloop)
R2 = lview.map(L2, zip(ii, jj))

私が抱えている問題は次のとおりです。

  1. aループの外側で定義されており、「プッシュ」のようなことをする必要があると思いますが、少し混乱しています。後で「プル」する必要がありますか?
  2. 関数に必要な 2 つの引数があり、それらを正しく渡す方法がわかりません。のようなことを試しzip(ii,jj)ましたが、いくつかのエラーが発生しました。
  3. また、ランダムなライブラリを使用しているという事実は、gmpy2物事に影響を与えるべきではないと思います。これは正しいです?これには何か特別なことをする必要がありますか?

理想的には、この単純な例でコードがエラーなしで実行されるように、あなたの助けが必要です。

失敗した試行を #2 に投稿することが有益だと思われる場合は、お知らせください。私は#1と暗闇の中にいます。

4

1 に答える 1

0

これを機能させる2つの方法を見つけました。

1 つはpush変数をコアに渡すことです。引っ張る必要はありません。変数は、各プロセス エンジンの名前空間で定義されるだけです。

rc.client[:].push({'a':a})
R2 = lview.map(L2, ii, jj)

もう 1 つの方法は、入力としてL2取り、関数に のa配列を渡すように再定義することです。amap

def L2(ii,jj,a):
    out = []
    out.append(gm.fac(ii+jj+a))
    return out
R2 = lview.map(L2, ii, jj, [a]*Nloop)

この Web サイトによるインポートに関して: http://ipython.org/ipython-doc/dev/parallel/parallel_multiengine.html#non-blocking-execution 必要なライブラリを関数にインポートするだけです。

関数内のインポートに注意してください。これは、タスクが実行される場所に適切なモジュールがインポートされるようにするための一般的なモデルです。view.execute('import numpy')() を使用して、エンジンの名前空間にモジュールを手動でインポートすることもできます。

または、このリンクに従って実行できます http://ipython.org/ipython-doc/dev/parallel/parallel_multiengine.html#remote-imports

于 2014-10-29T01:30:56.890 に答える