我已经开始玩弄并行编程和cython/openmp,我有一个简单的程序,它使用prange对数组求和:
import numpy as np
from cython.parallel import prange
from cython import boundscheck, wraparound
@boundscheck(False)
@wraparound(False)
def parallel_summation(double[:] vec):
cdef int n = vec.shape[0]
cdef double total
cdef int i
for i in prange(n, nogil=True):
total += vec[i]
return total
它似乎可以与一个设置.py文件。不过,我想知道是否有可能调整这个功能,并有一点更多的控制处理器在做什么。你知道吗
假设我有4个处理器:我想把向量分解成4个部分,然后让每个处理器局部地添加其中的元素。最后,我可以合并每个处理器的结果,得到总的和。从cython文档中,我无法收集这样的东西是否可行(文档有点稀疏)。你知道吗
如果有人能解释一下是否/如何使用cython/openmp实现这样的功能,或者帮助查找一些相关的示例(在网上很难找到简单的示例),我将不胜感激。你知道吗
这正是这里已经发生的事情。Cython从你的就地操作推断出你想做一个缩减。OpenMP将使用
total
变量的私有(零初始化)副本实现并行循环,并将它们全部添加到循环末尾的total
。你知道吗在生成的C中,如下所示:
您只需要启用OpenMPas described here。你知道吗
您应该在代码中更改的一件事是初始化
total = 0
,否则它只是一个可能包含垃圾的单元化C变量。你知道吗相关问题 更多 >
编程相关推荐