6

基本的に、私は並列化をかなり困難にする問題を抱えており、プレーンな python とマルチプロセッシングでどれだけ速くできるかの限界に達したと思うので、Cython とできれば openMP を介してそれをより低いレベルにしようとしています。 .

つまり、Cython で openMP を使用する方法、または生の C コードをラップして Cython 経由でロード/バインドする必要があるかどうか疑問に思っています。

または、Cython を C コードにコンパイルしてから、C コードを変更して openMP プラグマを追加し、ライブラリにコンパイルして Python にロードできますか?

4

5 に答える 5

11

この質問は 3 年前のもので、現在、Cython には OpenMP バックエンドをサポートする機能が用意されています。たとえば、こちらのドキュメントを参照してください。非常に便利な関数の 1 つにprange. これは、(かなり素朴な)dot関数を を使用して実装する方法の一例ですprange

"/opemmp"引数を C コンパイラに渡してコンパイルすることを忘れないでください。

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

ctypedef np.double_t cDOUBLE
DOUBLE = np.float64

def mydot(np.ndarray[cDOUBLE, ndim=2] a, np.ndarray[cDOUBLE, ndim=2] b):

    cdef np.ndarray[cDOUBLE, ndim=2] c
    cdef int i, M, N, K

    c = np.zeros((a.shape[0], b.shape[1]), dtype=DOUBLE)
    M = a.shape[0]
    N = a.shape[1]
    K = b.shape[1]

    for i in prange(M, nogil=True):
        multiply(&a[i,0], &b[0,0], &c[i,0], N, K)

    return c

@cython.wraparound(False)
@cython.boundscheck(False)
@cython.nonecheck(False)
cdef void multiply(double *a, double *b, double *c, int N, int K) nogil:
    cdef int j, k
    for j in range(N):
        for k in range(K):
            c[k] += a[j]*b[k+j*K]
于 2014-04-03T13:27:33.787 に答える
3

誰かがこの質問につまずいた場合:

現在、cython.parallel モジュールを介して cython で OpenMP を直接サポートしています。http://docs.cython.org/src/userguide/parallelism.html を参照してください

于 2013-08-22T10:47:58.010 に答える
1

cython wikiによると、開発者はさまざまなオプションについて考えてきましたが、まだ何も実装していないと思います。

問題が驚異的並列であり、すでにマルチプロセッシングソリューションがある場合は、各ワーカープロセスにPythonコードではなくcythonコードを呼び出させてみませんか?

于 2011-01-30T10:40:09.243 に答える
0

私は OpenMP の経験がありませんが、zeromqを試してみれば運がいいかもしれません(python バインディングが含まれています):

easy_install pyzmq

于 2011-01-27T09:51:01.663 に答える