python - 如何在 Cython 中使用 openMP 之类的东西?

标签 python parallel-processing openmp cython

基本上我遇到了一个非常令人尴尬的并行问题,我认为我已经达到了使用普通 python 和多处理的速度的极限,所以我现在正尝试通过 Cython 将它提升到一个较低的水平希望是 openMP。

简而言之,我想知道如何将 openMP 与 Cython 结合使用,或者我是否必须包装一些原始 C 代码并通过 Cython 加载/绑定(bind)到它?

或者我可以让 Cython 编译成 C 代码,然后修改 C 代码以添加到 openMP 编译指示中,然后编译成库并将其加载到 Python 中吗?

最佳答案

这个问题是 3 年前的,现在 Cython 有支持 OpenMP 后端的可用功能。参见示例 the documentation here . 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]

关于python - 如何在 Cython 中使用 openMP 之类的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4808569/

相关文章:

python - 无法使用openpyxl保存excel文件

c++ - 为什么并行版本更慢?

c++ - C++代码设计中的多代理系统

c++ - 使用 omp_set_num_threads 后,我可以使 OpenMP 恢复到理想的线程数吗?

r - TraMineR 的并行计算

c++ - 如何正确使用 OpenMP 中的 update() 子句

python - 为什么python客户端收不到SSE事件?

python - Flask RestPlus 继承模型无法按预期工作

python - 如何在 GTK 中使用字体文件

c++ - 多处理=多个进程运行?