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
Was meinst du mit Verhalten, das du stromaufwärts beobachtest? Ein Käfer? – Chiel
Bitte beschreiben Sie das erwartete, gewünschte und beobachtete Verhalten deutlicher und stellen Sie ein [mcve] zur Verfügung. – Zulan
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