簡體   English   中英

帶有Openmp的Cython numpy數組(無GIL)

[英]Cython numpy array with Openmp (No GIL)

我不確定以前是否已解決此問題,我嘗試搜索但未找到我一直在尋找的東西。 我想使以下代碼正常工作(文件名為some_CD.pyx)

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)

我的setup.py如下所示

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()]
)

我不確定這段代碼中有很多東西。 首先,我是否以正確的方式使用numpy數組? 是否在prange中使用float64,np.int類型的變量?

該循環是並行算法,因此無法並行化。 換句話說,以后的迭代取決於前面的迭代的結果。

忽略此問題,這是更改代碼的方法。

如果沒有GIL,則只能使用基本索引(不進行切片)和少量的Cython特有的Python函數(主要是此處列出的Python函數)。 因此,您只需要使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的附加臨時變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM