objref idvec, spikevec idvec = new Vector() spikevec = new Vector() iterator serialize_output() {local i if (pc.id == 0) { $o1.wopen() $o1.close() } pc.barrier() for i=0, pc.nhost-1 { if (i == pc.id) { $o1.aopen() iterator_statement $o1.close() } pc.barrier() } } proc want_all_spikes() {local i, gid localobj mgr idvec.buffer_size(10000) spikevec.buffer_size(10000) for cell_gids(&gid, &i) if (gid < splitbit) { pc.spike_record(gid, spikevec, idvec) } for i=0, mgrs_list.count()-1 { mgr = mgrs_list.object(i) if (object_id(mgr.md)) { pc.spike_record(mgr.md_gid, spikevec, idvec) } if (object_id(mgr.gd)) { pc.spike_record(mgr.gd_gid, spikevec, idvec) } } } // replaced by version in spike2file.hoc proc spike2file() { local i localobj outf, s s = new String() //sprint(s.s, "out_%d_%d.dat", odor_idx, pnm.nhost) sprint(s.s, "out_%s_%d.dat", wbase.s, pnm.nhost) outf = new File(s.s) for serialize_output(outf) { for i=0, idvec.size-1 { outf.printf("%.10g %d\n", spikevec.x[i], idvec.x[i]) } } } {load_file("spike2file.hoc")} // replaces above (and different prototypw) objref tdat_ tdat_ = new Vector(7) tdat_.x[5] = cxcpu // expected from lptiter.hoc mindelay_ = 1e9 proc prun() {local told pc.setup_transfer() mindelay_ = pc.set_maxstep(10) runtime=startsw() tdat_.x[0] = pc.wait_time stdinit() if (0) { if (0) { pc.psolve(tstop/2) savestate() }else{ restorestate() } } // pc.psolve(tstop) while(t < tstop) { told = t tnext = t + checkpoint_interval if (tnext > tstop) { tnext = tstop } if (pc.id == 0) printf("tnext = %g\n", tnext) pc.psolve(tnext) // In case infinite loop due to round off error in fixed // step method. // May wish to use a dt which is a negative power of 2 if (t == told) { if (pc.id == 0) { printf("psolve did not advance time from t=%.20g to tnext=%.20g\n", t, tnext) } break } spike2file(spikevec, idvec, n_spkout_sort, n_spkout_files) } tdat_.x[0] = pc.wait_time - tdat_.x[0] runtime = startsw() - runtime tdat_.x[1] = pc.step_time tdat_.x[2] = pc.send_time tdat_.x[3] = pc.vtransfer_time(0) // for gaps tdat_.x[4] = pc.vtransfer_time(1) // for splitcells // printf("%d wtime %g\n", pc.id, waittime) } objref mxhist_ proc mkhist() { if (pc.id == 0) { mxhist_ = new Vector($1) pc.max_histogram(mxhist_) } } proc prhist() {local i, j if (pc.id == 0 && object_id(mxhist_)) { printf("histogram of #spikes vs #exchanges\n") j = 0 for i=0, mxhist_.size-1 { if (mxhist_.x[i] != 0) { j = i } } for i = 0, j { printf("%d\t %d\n", i, mxhist_.x[i]) } printf("end of histogram\n") } } func mindelay() {local i, md if (pc.nhost > 1) { pc.context("{pc.post(\"mindelay\", mindelay_)}") for i=1, pc.nhost-1 { pc.take("mindelay", &md) if (md < mindelay_) { mindelay_ = md } } } return mindelay_ // see nc_append } objref tavg_stat, tmin_stat, tmax_stat, idmin_stat, idmax_stat proc poststat() { pc.post("poststat", pc.id, tdat_) } proc getstat() {local i, j, id localobj tdat tdat = tdat_.c tavg_stat = tdat_.c tmin_stat = tdat_.c tmax_stat = tdat_.c idmin_stat = tdat_.c.fill(0) idmax_stat = tdat_.c.fill(0) if (pc.nhost > 1) { pc.context("poststat()\n") for i=0, pc.nhost-2 { pc.take("poststat", &id, tdat) tavg_stat.add(tdat) for j = 0, tdat_.size-1 { if (tdat.x[j] > tmax_stat.x[j]) { idmax_stat.x[j] = id tmax_stat.x[j] = tdat.x[j] } if (tdat.x[j] < tmin_stat.x[j]) { idmin_stat.x[j] = id tmin_stat.x[j] = tdat.x[j] } } } } tavg_stat.div(pc.nhost) } objref spstat_ proc postspstat() {local i spstat_ = new Vector() cvode.spike_stat(spstat_) i = spstat_.size spstat_.resize(spstat_.size + 4) spstat_.x[i] = pc.spike_statistics(&spstat_.x[i+1], &spstat_.x[i+2],\ &spstat_.x[i+3]) pc.post("postspstat", pc.id, spstat_) } proc print_spike_stat_info() {local i, j, id localobj spstat, sum, min, max, idmin, idmax, label spstat = new Vector() spstat_ = new Vector() cvode.spike_stat(spstat_) i = spstat_.size spstat_.resize(spstat_.size + 4) spstat_.x[i] = pc.spike_statistics(&spstat_.x[i+1], &spstat_.x[i+2],\ &spstat_.x[i+3]) sum = spstat_.c min = spstat_.c max = spstat_.c idmin = spstat_.c.fill(0) idmax = spstat_.c.fill(0) if (pc.nhost > 1) { pc.context("postspstat()\n") for i=0, pc.nhost-2 { pc.take("postspstat", &id, spstat) sum.add(spstat) for j=0, spstat.size-1 { if (spstat.x[j] > max.x[j]) { idmax.x[j] = id max.x[j] = spstat.x[j] } if (spstat.x[j] < min.x[j]) { idmin.x[j] = id min.x[j] = spstat.x[j] } } } } label = new List() label.append(new String("eqn")) label.append(new String("NetCon")) label.append(new String("deliver")) label.append(new String("NC deliv")) label.append(new String("PS send")) label.append(new String("S deliv")) label.append(new String("S send")) label.append(new String("S move")) label.append(new String("Q insert")) label.append(new String("Q move")) label.append(new String("Q remove")) label.append(new String("max sent")) label.append(new String("sent")) label.append(new String("received")) label.append(new String("used")) printf("%10s %13s %10s %10s %5s %5s\n",\ "", "total", "min", "max", "idmin", "idmax") for i=0, spstat_.size-1 { printf("%-10s %13.0lf %10d %10d %5d %5d\n",\ label.object(i).s, sum.x[i], min.x[i], max.x[i], idmin.x[i], idmax.x[i]) } printf("\n%-10s %-10s %-10s %-10s %-10s %-10s %-10s %-10s %-10s\n",\ "setup", "run", "avgspkxfr", "avgcomp", "avgx2q", "avgvxfr", "avgsplit", "avgcx", "avgactcx") printf("%-10.4g %-10.4g", setuptime, runtime) for i=0, tdat_.size-1 { printf(" %-10.4g", tavg_stat.x[i]) } printf("\n\n%5s %-15s %-15s %-15s %-15s %-15s %-15s %-15s\n", \ "", "id spkxfr", "id com", "id x2q", "id vxfr", "id split", "id cx", "id actcx") printf("%-5s", "min") for i=0, tdat_.size-1 { printf(" %-4d %-10.4g", idmin_stat.x[i], tmin_stat.x[i]) } printf("\n%-5s", "max") for i=0, tdat_.size-1 { printf(" %-4d %-10.4g", idmax_stat.x[i], tmax_stat.x[i]) } printf("\n") } proc savestate() {local i localobj s, ss, f, rl s = new String() sprint(s.s, "svst.%04d", pnm.myid) f = new File(s.s) ss = new SaveState() ss.save() ss.fwrite(f, 0) rl = new List("Random") f.printf("Random %d\n", rl.count) for i=0, rl.count-1 { f.printf("%d\n", rl.object(i).seq()) } f.close } proc restorestate() {local i localobj s, ss, f, rl s = new String() sprint(s.s, "svst.%04d", pnm.myid) f = new File(s.s) ss = new SaveState() ss.fread(f, 0) rl = new List("Random") if (f.scanvar() != rl.count) { execerror("Random count unexpected", "") } for i=0, rl.count-1 { rl.object(i).seq(f.scanvar()) } f.close ss.restore() }