これまでに解決されているかどうかはわかりませんが、探していましたが、探していたものが見つかりませんでした。私は私の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内で使用できますか?
残念ながら、numpy配列は本質的にはPythonオブジェクトなので、nogilコンテキストでは使用できません。この質問はしばらく私を盗んだし、私はそれを解決する何かを書いていないが、私はsklearn sourcodeをブラウズしていたし、彼らはngarコンテキストに入る前にデータを保存しているようだ。それはあなたがprangeとnogilを使うことができる純粋なCのコンテキストにあなたを入れなければなりません。 – Erotemic
アレイ全体を特に大きな次元でコピーするのに時間がかかりませんか?効率的な方法はありますか?可能であれば、コードを修正して答えとして書くことができますか?正しい構文とすべてを知るにはかなりの時間がかかります! – user52705