Cell splitting in neural networks extends strong scaling (Hines et al. 2008)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:97917
Neuron tree topology equations can be split into two subtrees and solved on different processors with no change in accuracy, stability, or computational effort; communication costs involve only sending and receiving two double precision values by each subtree at each time step. Application of the cell splitting method to two published network models exhibits good runtime scaling on twice as many processors as could be effectively used with whole-cell balancing.
Reference:
1 . Hines ML, Eichner H, Schürmann F (2008) Neuron splitting in compute-bound parallel network simulations enables runtime scaling with twice as many processors. J Comput Neurosci 25:203-10 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Generic;
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];
/
splitcell
nrntraub
cells
hoc
mod
net
README
balcomp.hoc *
bgrunme
bgsmall.sh
bgsplit.sh
cell_templates.hoc *
clear.hoc *
finit.hoc *
fortmap.hoc *
gidcell.hoc
gidcell.ses *
init.hoc
manage_setup.hoc
metisbal.sh
mosinit_orig.hoc *
onecell.hoc
onecell.ses *
prcellstate.hoc *
prepare.sh
printcon.hoc *
spkplt.hoc *
vclampg.hoc *
vcompclamp.hoc *
vcompsim.hoc *
                            
load_file("nrngui.hoc")
load_file("hoc/traubcon.hoc")
load_file("fortmap.hoc")
load_file("cell_templates.hoc")

// til the shift bug in the mod files are fixed (table depends on range variable)
usetable_naf2 = 0
usetable_naf = 0
usetable_napf_spinstell = 0
usetable_napf_tcr = 0

objref runinfo_, choice_, cell, nil, stim1, stim2, mchoice_
runinfo_ = new List()
strdef tstr1, tstr2
for i=1,14 {getstr(tstr1) runinfo_.append(new String(tstr1))}
deepaxax	0 0.4
deepbask 	0 0.3
deepLTS		0 0.4
nontuftRS	0 0.8
nRT		0 0.3
spinstell	0 -0.25 10 0.25
supaxax		0 0.4
supbask		0 0.4
supLTS		0 0.4
suppyrFRB	0 0.0 10 0.4
suppyrRS	0 0.0 5 0.75
TCR		0 -0.9 100 0.5
tuftIB		0 0 10 1.5
tuftRS		0 -0.4 50 0.8

//for i=0, runinfo_.count-1 {print runinfo_.object(i).s}

proc mkpanel() {local i
	exact_ = 0  normal_ = 1
	choice_ = new Vector(runinfo_.count)
	xpanel("Cell Run")
	for i=0, runinfo_.count-1 {
		sscanf(runinfo_.object(i).s, "%s", tstr1)
		sprint(tstr2, "runcell(%d) run()", i)
		xcheckbox(tstr1, &choice_.x[i], tstr2)
	}
	xlabel("")
	xcheckbox("NEURON style ri", &normal_, "exact(0)")
	xcheckbox("Exact traub style ri", &exact_, "exact(1)")
	if (name_declared("showtstspk")) {
		xlabel("")
		xbutton("Raster for test sim", "showtstspk()")
	}
	xpanel(20, 80, 0)
}
mkpanel()

proc mkpanel2() {local i
	exact_ = 0  normal_ = 1
	mchoice_ = new Vector(runinfo_.count)
	xpanel("Cell Make")
	for i=0, runinfo_.count-1 {
		sscanf(runinfo_.object(i).s, "%s", tstr1)
		sprint(tstr2, "mkcell(%d) run()", i)
		xcheckbox(tstr1, &mchoice_.x[i], tstr2)
	}
	xlabel("")
	xpanel(20, 500, 0)
}
//mkpanel2()

load_file("onecell.ses")

proc exact() {
	normal_ = ($1 == 0)
	exact_ = ($1 != 0)
	runcell(cellnum)
}

proc runcell() {local i, t1,a1,t2,a2  localobj vvec, tvec, f, g
	cellnum = $1
	choice_.fill(0)
	choice_.x[$1] = 1
	t2 = 1e9   a2 = 0
	i = sscanf(runinfo_.object($1).s, "%s %lf %lf %lf %lf", tstr1, \
		&t1, &a1, &t2, &a2)
//	print tstr1, t1, a1, t2, a2
	cell = nil
	sprint(tstr2, "cell = new %s()", tstr1)
	execute(tstr2)
	access cell.comp[1]
	define_shape()
	g = Graph[0]
	g.erase_all
	f = new File()
	sprint(tstr2, "dat/%s_v_F.dat", tstr1)
//	sprint(tstr2, "../p2c/data/GROUCHO110.%s", tstr1)
	clipboard_retrieve(tstr2)
	tvec = hoc_obj_[1]
	vvec = hoc_obj_[0]
	vvec.line(g, tvec, 2, 1)
	g.exec_menu("Keep Lines")
	g.exec_menu("Keep Lines")
	stim1 = nil
	stim2 = nil
	stim1 = new IClamp(.5)
	stim2 = new IClamp(.5)
	stim1.del = t1  stim2.del = t2
	stim1.amp = .3  stim2.amp = 0
	stim1.dur = 50  stim2.dur = 1e9
	sprint(tstr2, "cell.comp[%d].v(.5)", cell.presyn_comp)
	g.addvar(tstr2)
	if (exact_) { traubexact(cell, tci) }
}

runcell(0)

objref cell2

proc mkcell() {local i, t1,a1,t2,a2  localobj vvec, tvec, f, g
	cellnum = $1
	mchoice_.fill(0)
	mchoice_.x[$1] = 1
	t2 = 1e9   a2 = 0
	i = sscanf(runinfo_.object($1).s, "%s %lf %lf %lf %lf", tstr1, \
		&t1, &a1, &t2, &a2)
//	print tstr1, t1, a1, t2, a2
	cell2 = nil
	sprint(tstr2, "cell2 = new %s()", tstr1)
	execute(tstr2)
}

objref fih0_, fih1_
fih0_ = new FInitializeHandler(0, "finit0()")
fih1_ = new FInitializeHandler(1, "finit1()")

proc finit0() { local ix
	if (cell != nil) {
		ix = cell.type()
		forsec cell.all { v = type_vinit.x[ix] }
		if (ix == TCRtype) {
			forsec cell.all { v = -85 }
		}
	}
	if (cell2 != nil) {
		ix = cell2.type()
		forsec cell2.all { v = type_vinit.x[ix] }
		if (ix == TCRtype) {
			forsec cell2.all { v = -85 }
		}
	}
}

proc finit1() { local ix
	if (cell != nil) {
		ix = cell.type()
		if (ix == TCRtype) {
			forsec cell.all { v = type_vinit.x[ix] }
		}
	}
	if (cell2 != nil) {
		ix = cell2.type()
		forsec cell2.all { v = type_vinit.x[ix] }
		if (ix == TCRtype) {
			forsec cell2.all { v = type_vinit.x[ix] }
		}
	}
}


Loading data, please wait...