C++11 では、並列反復子を使用してグラフ データ構造を実装するために、次のパターンを使用しています。ノードは単なるインデックスであり、エッジは隣接データ構造のエントリです。すべてのノードを反復するために、関数 (ラムダ、クロージャーなど) がメソッドに渡され、parallelForNodes
各ノードを引数として呼び出されます。反復の詳細は、メソッドにうまくカプセル化されています。
次に、Cython で同じコンセプトを試してみたいと思います。Cython はcython.parallel.prange
OpenMP を使用して、範囲を超えたループを並列化する機能を提供します。並列処理を機能させるには、Python のグローバル インタープリター ロックをパラメーターで無効にする必要がありnogil=True
ます。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)