我已经并行化了一些代码来为电影制作帧。除了创建最终帧的那个之外,所有等级都退出while循环,尽管它达到了最终条件。另外我发现只有在while循环后添加CW.Barrier()时才会生成最终帧。如果那不存在,那么它会在倒数第二帧停止。
rank = CW.Get_rank()
size = CW.Get_size()
rit = 0 #rank iterator. Its used to assign frames to make
while len(frames) > 0:
if rank == rit:
frame_val = frames.pop() #gets frame
orit = 0
while orit < size:
if orit != rit:
CW.send(frames, dest=orit, tag=1) #and then sends undated frame list to other ranks
orit = orit + 1
#other ranks recieve new list of frames.
if rank != rit:
frames = CW.recv(source=rit, tag=1)
if rank == rit:
#Creates frame
print 'Created frame', frame_val, 'on rank', rank
#iterates through ranks to distribute frames.
rit = rit +1
if rit == size:
rit = 0
CW.Barrier()
print "completed making movie frames on rank", rank
答案 0 :(得分:0)
Derp,所以我没有在我的问题中提供足够的信息。在
if rank == rit:
#Creates frame
print 'Created frame', frame_val, 'on rank', rank
实际上看起来更像是:
if rank == rit:
CW.Barrier()
#Creates frame
print 'Created frame', frame_val, 'on rank', rank
因为在某些等级上看起来已经退出,所以并非所有等级都在最后一帧上达到此CW.Barrier()函数。这个障碍在这个地方根本不是必需的,所以它固定了!