4

比較的計算集約的な毎年のデータを計算しています。データを計算するための反復を実行するのにかかる時間を短縮するために、numba を (大きな効果を得るために) 使用しました。ただし、20 年間の独立したデータがあることを考えると、それらを 4 つの異なる CPU コアで実行できる 4 つのグループ x 5 に分割したいと考えています。

def compute_matrices(self):
    for year in self.years:
         self.xs[year].compute_matrix()

上記のコード スニペットでは、関数は属性 year および xs を含む Class 内のメソッドです。yearは単なる整数の年でありxs、xs.data と compute_matrix() メソッドを格納する断面オブジェクトです。

これを複数のコアに分割する最も簡単な方法は何ですか?

  1. ループを自動的に分割して異なるプロセスで実行し、結果を結合できる Numba スタイルのデコレータがあれば素晴らしいことです。これは存在しますか?

  2. Python.multiprocessing を使用するのが最善の策ですか?

4

2 に答える 2

3

したがって、これについて調べることができることがいくつかあります。

ナンバープロ: https ://store.continuum.io/cshop/accelerate/ . これは基本的に強化された Numba であり、メニーコアおよびマルチコア アーキテクチャのサポートを提供します。残念ながら安くはありません。

数式: https://code.google.com/p/numexpr/ . これは、ハイパースレッディングを実装する numpy 配列の式エバリュエーターです。

Numexpr-Numba (実験的): https://github.com/gdementen/numexpr-numba . 名前が示すように、これは Numba バックエンドを使用する Numexpr です。

答えの多くは、メソッドで何が行われるかによって異なりますcompute_matrix

(開発時間の点で) 最速の解決策は、おそらくmultiprocessingライブラリを使用して計算を分割することです。compute_matrix関数に副作用がなければ、マルチプロセッシングを使用する方が簡単になることに注意してください。

于 2014-04-05T09:10:29.223 に答える
1

複雑なオブジェクトに対して私が見つけた最も簡単な方法は、IPython Parallel Computing Engine を活用することです。

以下を使用して実行中の Ipython クラスターを取得するipcluster start -n 4か、ノートブックを使用します。

次に、異なるクライアントに割り当てられた xs オブジェクトを反復処理できます。

def multicore_compute_matrices(self):
    from IPython.parallel import Client
    c = Client()
    xs_list = []
    years = sorted(self.years)
    # - Ordered List of xs Objects - #
    for year in years
         xs_list.append(self.xs[year])
    # - Compute across Clusters - #
    results = c[:].map_sync(lambda x: x.compute_matrix(), xs_list)
    # - Assign Results to Current Object - #
    year = years[0]
    for result in results:
        self.xs[year].matrix = result
        year += 1

経過時間の%time結果:

%time A.compute_matrices()
Wall Time: 5.53s

%time A.multicore_compute_matrices():
Wall Time: 2.58s
于 2014-04-07T02:10:23.567 に答える