Parallel network simulations with NEURON (Migliore et al 2006)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:64229
The NEURON simulation environment has been extended to support parallel network simulations. The performance of three published network models with very different spike patterns exhibits superlinear speedup on Beowulf clusters.
Reference:
1 . Migliore M, Cannia C, Lytton WW, Markram H, Hines ML (2006) Parallel network simulations with NEURON. J Comput Neurosci 21:119-29 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism:
Cell Type(s):
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Methods;
Implementer(s): Hines, Michael [Michael.Hines at Yale.edu];
/
netmod
parscalebush
AMPA.mod *
arhRT03.mod *
cadecay.mod
cadRT03.mod
cah.mod
calRT03.mod
catRT03.mod *
GABAa.mod *
GABAb.mod *
intf.mod
k2RT03.mod *
kahpRT03.mod
kaRT03.mod *
kca.mod *
kcRT03.mod
kdr.mod
kdrp.mod
kdrRT03.mod *
kmRT03.mod *
misc.mod
myfit.mod
na.mod
nafRT03.mod *
nap.mod
napRT03.mod *
NMDA.mod *
nstim.mod
stats.mod
vecst.mod
batch.hoc
bg
bg_cvode.inc
boltz_cvode.inc
geneval_cvode.inc
geom.hoc
init.hoc
netcon.inc
network.hoc
nqsnet.hoc
nspike.dat
params.hoc
parnetwork.hoc
parnqsnet.hoc
perfrun.hoc
prebatch_.hoc
run.hoc
spkplt.hoc *
x_vs_nspike.hoc
                            
proc want_all_spikes() { local i, gid
	for pcitr(&i, &gid) {
		pnm.spike_record(gid)
	}
}

objref mxhist_
proc mkhist() {
	if (pnm.myid == 0) {
		mxhist_ = new Vector($1)
		pc.max_histogram(mxhist_)
	}
}
proc prhist() {local i, j
	if (pnm.myid == 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")
	}
}

objref tdat_
tdat_ = new Vector(3)
proc prun() {
	pnm.set_maxstep(10)
	runtime=startsw()
	tdat_.x[0] = pnm.pc.wait_time
	stdinit()
	pnm.psolve(tstop)
	tdat_.x[0] = pnm.pc.wait_time - tdat_.x[0]
	runtime = startsw() - runtime
	tdat_.x[1] = pnm.pc.step_time
	tdat_.x[2] = pnm.pc.send_time	
//	printf("%d wtime %g\n", pnm.myid, waittime)
}

proc poststat() {
	pnm.pc.post("poststat", pnm.myid, tdat_)
}

objref spstat_
proc postspstat() {
	spstat_ = new Vector()
	cvode.spike_stat(spstat_)
	pnm.pc.post("postspstat", pnm.myid, spstat_)
}

objref tavg_stat, tmin_stat, tmax_stat, idmin_stat, idmax_stat

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 (pnm.nwork > 1) {
		pnm.pc.context("poststat()\n")
		for i=0, pnm.nwork-2 {
			pnm.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(pnm.nhost)
}

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_)
	sum = spstat_.c
	min = spstat_.c
	max = spstat_.c
	idmin = spstat_.c.fill(0)
	idmax = spstat_.c.fill(0)
	if (pnm.nwork > 1) {
		pnm.pc.context("postspstat()\n")
		for i=0, pnm.nwork-2 {
			pnm.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"))
	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])
	}
}

proc perf2file() { local i  localobj perf
	perf = new File()
	perf.aopen("perf.dat")
	perf.printf("%d %d     %g %g     ",pnm.nhost, pnm.ncell, setuptime, runtime)
	for i=0, tdat_.size-1 { perf.printf(" %g", tavg_stat.x[i]) }
	perf.printf("     ")
	for i=0, tdat_.size-1 { perf.printf(" %d %g ", idmin_stat.x[i], tmin_stat.x[i]) }
	perf.printf("     ")
	for i=0, tdat_.size-1 { perf.printf(" %d %g ", idmax_stat.x[i], tmax_stat.x[i]) }
	perf.printf("\n")

	perf.close
}

proc spike2file() { localobj outf
	outf = new File()
	outf.wopen("out.dat")
	for i=0, pnm.idvec.size-1 {
		outf.printf("%g\t%d\n", pnm.spikevec.x[i], pnm.idvec.x[i])
	}
	outf.close
}