2016-04-07 17 views
1

Ich habe ein Programm, das sehr parallelisierbar ist. Ich vermute, dass einige Prozessoren dieses Python-Skript schneller beenden als andere Prozessoren, was das Verhalten erklären würde, das ich vor diesem Code beobachte. Ist es möglich, dass dieser Code es ermöglicht, dass einige MPI-Prozesse früher abgeschlossen werden als andere?Ist es möglich, dass einige Prozesse in diesem Programm schneller abgeschlossen werden als andere?

dacout = 'output_file.out' 
comm = MPI.COMM_WORLD 
rank = comm.Get_rank() 
nam ='lcoe.coe' 
csize = 10000 
with open(dacout) as f: 
    for i,l in enumerate(f): 
     pass 
numlines = i 
dakchunks = pd.read_csv(dacout, skiprows=0, chunksize = csize, sep='there_are_no_seperators') 
linespassed = 0 
vals = {} 
for dchunk in dakchunks: 
    for line in dchunk.values: 
     linespassed += 1 
     if linespassed < 49 or linespassed > numlines - 50: continue 
     else: 
      split_line = ''.join(str(s) for s in line).split() 
     if len(split_line)==2: 
       if split_line[0] == 'nan' or split_line[0] == '-nan': continue 

       if split_line[1] != nam: continue 
       if split_line[1] not in vals: 
        try: vals[split_line[1]] = [float(split_line[0])] 
        except NameError: continue 
       else:vals[split_line[1]].append(float(split_line[0])) 
# Calculate mean and x s.t. Percentile_x(coe_dat)<threshold_coe 
self.coe_vals = sorted(vals[nam]) 
self.mean_coe = np.mean(self.coe_vals) 
self.p90 = np.percentile(self.coe_vals, 90) 
self.p95 = np.percentile(self.coe_vals, 95) 

count_vals = 0.00 
for i in self.coe_vals: 
    count_vals += 1 
    if i > coe_threshold: break 
self.perc = 100 * (count_vals/len(self.coe_vals)) 
if rank==0: 
    print>>logf, self.rp, self.rd, self.hh, self.mean_coe 
    print self.rp, self.rd, self.hh, self.mean_coe, self.p90, self.perc 
+0

Was meinst du mit Verhalten, das du stromaufwärts beobachtest? Ein Käfer? – Chiel

+0

Bitte beschreiben Sie das erwartete, gewünschte und beobachtete Verhalten deutlicher und stellen Sie ein [mcve] zur Verfügung. – Zulan

+1

In dem von Ihnen geposteten Code lesen alle Prozesse die gleiche Datei und berechnen dasselbe. Aber der einzige Prozess, der das Ergebnis druckt, ist Prozess 0. Dies ist kein paralleles Rechnen, das macht mehrere Male dasselbe! Einige Prozesse können dieses Skript vor anderen beenden, da das Skript nicht mit einer Barriere endet. Verwenden Sie 'comm.barrier()', um alle Prozesse des Communicators 'comm' zu synchronisieren. Tun Sie es nur, wenn es notwendig ist: Barrieren können Leistungen beeinträchtigen ... – francis

Antwort

1

In dem Code, den Sie gepostet haben, lesen alle Prozesse die gleiche Datei und berechnen dasselbe. Aber der einzige Prozess, der das Ergebnis druckt, ist Prozess 0. Dies ist kein paralleles Rechnen, das macht mehrere Male dasselbe!

Einige Prozesse können dieses Skript vor anderen beenden, da das Skript durch eine Barriere endet nicht. Verwenden Sie comm.barrier(), um alle Prozesse des Communicators comm zu synchronisieren. Tun Sie es nur, wenn es notwendig ist: Barrieren können Leistungen beeinträchtigen ...