2016-11-04 18 views
0

これまでに解決されているかどうかはわかりませんが、探していましたが、探していたものが見つかりませんでした。私は私のsetup.pyがOpenMP(GILなし)を使用したCython numpy配列

from distutils.core import setup, Extension 
from Cython.Build import cythonize 
import numpy 

ext_modules = [ 
    Extension(
     "some_CD", 
     ["some_CD.pyx"], 
     extra_compile_args=['-fopenmp'], 
     extra_link_args=['-fopenmp'], 
    ) 
] 

setup(
    name='some_parallel', 
    ext_modules=cythonize(ext_modules), 
    include_dirs=[numpy.get_include()] 
) 

私は確認していない多くのものが、このコードではありますが、以下のようになります

import numpy as np 
cimport numpy as np 
cimport cython 
from cython.parallel import * 

ctypedef np.float64_t DTYPE 

cdef DTYPE evaluate_objective(np.ndarray[DTYPE, ndim=2] A,np.ndarray[DTYPE, ndim=1] b,np.ndarray[DTYPE, ndim=1] x): 
    return x.dot(A.dot(x) - b.dot(x)) 

cpdef DTYPE coordinate_descent(np.ndarray[DTYPE, ndim=2] A,np.ndarray[DTYPE, ndim=1] b,int nDim, int nIter): 
    cdef int i, iter 
    cdef np.ndarray[DTYPE, 
        ndim=1] x = \ 
        np.zeros(nDim,) 
    cdef DTYPE temp 
    for iter in prange(nIter,nogil=True): 
     i = (iter%nDim) 
     temp = (b[i]-(A[:,i].dot(x)*x[i]) + (A[i,i]*x[i]*x[i]))/A[i,i] 
     x[i] = np.max([0,np.min([temp,1])]) 
    return evaluate_objective(A,b,x) 

次のコード作業(some_CD.pyxされているファイルの名前)を取得したいと思います。まず最初に、numpy配列を正しい方法で使用していますか? float64を使用していますが、np.int型変数はprange内で使用できますか?

+0

残念ながら、numpy配列は本質的にはPythonオブジェクトなので、nogilコンテキストでは使用できません。この質問はしばらく私を盗んだし、私はそれを解決する何かを書いていないが、私はsklearn sourcodeをブラウズしていたし、彼らはngarコンテキストに入る前にデータを保存しているようだ。それはあなたがprangeとnogilを使うことができる純粋なCのコンテキストにあなたを入れなければなりません。 – Erotemic

+0

アレイ全体を特に大きな次元でコピーするのに時間がかかりませんか?効率的な方法はありますか?可能であれば、コードを修正して答えとして書くことができますか?正しい構文とすべてを知るにはかなりの時間がかかります! – user52705

答えて

0

このループは反復アルゴリズムなので並列化できません。言い換えれば、後の反復は初期の反復の結果に依存する。この問題を無視

は、ここにあなたがコードを変更する方法を..だ

GILなしであなただけの基本的なインデックス(無スライシング)とCythonで同棲特別なPython関数(非常に少数の主にこれらのlisted hereを使用することができます)。だから、prangeのボディをより明白に明示する必要があります。

for iter in prange(nIter, nogil=True): 
    i = iter % nDim 

    Ai_dot_x = 0 
    for j in range(x.shape[0]): 
     Ai_dot_x += A[j,i] * x[j] 

    temp = (b[i] - Ai_dot_x*x[i] + A[i,i]*x[i]*x[i])/A[i,i] 
    x[i] = max(0, min(temp, 1)) 

Ai_dot_xあなたはcdefに持っている追加の一時的な変数です。

+0

Cythonの詳細はわかりませんが、 'prange(nIter):'を 'range(nIter/nDim):'と 'prange(nDim、nogil = True):'データ依存性を解決するには分割しませんか?私はそれらが最初に合併された理由を見逃す。 – Zulan

+0

@ user6758673変更を加えた後、質問にトレースバックを追加しました。上記を確認してください。 – user52705

+0

@ Zulanあなたが言及したのは、並列アルゴリズムの降下(部分的に非同期)とは異なるアルゴリズムかもしれません。私がしようとしているのは、各座標が複数回更新された真の非同期更新です。 – user52705

関連する問題