对于 C++11,我一直在使用以下模式来实现具有并行迭代器的图形数据结构。节点只是索引,边是邻接数据结构中的条目。为了遍历所有节点,一个函数(lambda,closure...)被传递给一个parallelForNodes
方法,并以每个节点作为参数调用。迭代细节很好地封装在方法中。
现在我想用 Cython 尝试同样的概念。Cython 提供了cython.parallel.prange
使用 OpenMP 在一定范围内并行化循环的功能。为了使并行性起作用,需要使用nogil=True
参数停用 Python 的全局解释器锁。如果没有 GIL,就不允许使用 Python 对象,这很棘手。
是否可以将这种方法与 Cython 一起使用?
class Graph:
def __init__(self, n=0):
self.n = n
self.m = 0
self.z = n # max node id
self.adja = [[] for i in range(self.z)]
self.deg = [0 for i in range(self.z)]
def forNodes(self, handle):
for u in range(self.z):
handle(u)
def parallelForNodes(self, handle):
# first attempt which will fail...
for u in prange(self.z, nogil=True):
handle(u)
# usage
def initialize(u):
nonlocal ls
ls[u] = 1
G.parallelForNodes(initialize)