2016-01-08 1 views
0

Я распараллеливал некоторые коды для создания кадров для фильма. Все ряды выходят из цикла while, за исключением тех, которые создают окончательный кадр, несмотря на то, что он достигает конечного состояния. Также я обнаружил, что это делает только окончательный кадр, если я добавлю CW.Barrier() после цикла while. Если этого нет, то он останавливается на втором последнем кадре.MPI4PY - Почему мой цикл while выходит только в некоторых рядах?

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

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() на последние кадры. Этот барьер на самом деле не нужен на этом месте, поэтому он исправлен!