Как использовать что-то вроде openMP в Cython? - PullRequest
5 голосов
/ 26 января 2011

В основном у меня есть проблема, которая в значительной степени охватывает параллель, и я думаю, что я достиг предела того, как быстро я могу сделать это с простым Python и многопроцессорностью, поэтому я сейчас пытаюсь поднять его на более низкий уровень через Cythonи, надеюсь, openMP.

Короче говоря, мне интересно, как я могу использовать openMP с Cython, или мне придется обернуть некоторый необработанный код C и загрузить / связать его через Cython?

Или я могу скомпилировать Cython до кода C, затем изменить код C, добавив его в прагмы openMP, затем скомпилировать в библиотеку и загрузить в Python?

Ответы [ 4 ]

8 голосов
/ 03 апреля 2014

Этот вопрос задан 3 года назад, и в настоящее время Cython имеет доступные функции, которые поддерживают бэкэнд OpenMP. См. Например документацию здесь . Одна очень удобная функция - 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]
3 голосов
/ 22 августа 2013

Если кто-то споткнется по этому вопросу:

Теперь в Cython есть прямая поддержка OpenMP через модуль cython.parallel, см. http://docs.cython.org/src/userguide/parallelism.html

1 голос
/ 30 января 2011

Согласно cython wiki , разработчики подумали о множестве вариантов, но я не верю, что они еще что-то реализовали.

Если ваша проблема смущающе параллельна,и у вас уже есть решение для многопроцессорной обработки, почему бы просто не заставить каждый рабочий процесс вызывать некоторый код Cython вместо кода Python?

0 голосов
/ 27 января 2011

У меня нет опыта работы с OpenMP, но вам может повезти с попыткой zeromq (включая привязки python):

easy_install pyzmq

...