// iterator over this cpu subset using lpt whole cell algorithm // assuming a specified complexity for mitral and granule cxmitral = 1675 cxgranule = 258 objref lptiter_gidvec, pc iterator cell_gids() { local i if (object_id(lptiter_gidvec) == 0) { lptiter_set() } for i=0, lptiter_gidvec.size-1 { \$&1 = lptiter_gidvec.x[i] \$&2 = i iterator_statement } } proc lptiter_set() {local i localobj ldbal, cx, p cx = new Vector(ncell) cx.fill(cxmitral, nmitral_begin, ngranule_begin-1) cx.fill(cxgranule, ngranule_begin, ncell-1) p = lptiter_lpt(cx, pc.nhost, 0) lptiter_gidvec = p.c.indvwhere("==", pc.id) lptiter_gidvec.add(nmitral_begin) //for i=0, lptiter_gidvec.size-1 { printf("%d %d\n", pc.id, lptiter_gidvec.x[i])} } // from loadbal.hoc // least processing time algorithm // \$o1 is vector of weights \$2 is number of partitions // return is vector of partition indices parallel to weights obfunc lptiter_lpt() {local i, j localobj wx, ix, pw if (\$3) { print \$o1.size, " piece weights" \$o1.printf } wx = \$o1.sortindex.reverse ix = new Vector(\$o1.size) pw = new Vector(\$2) for i=0, \$o1.size-1 { j = wx.x[i] w = \$o1.x[j] ip = pw.min_ind pw.x[ip] += w ix.x[j] = ip } if (\$3) { print \$2, " partition complexities" pw.printf } if (pw.mean) { thread_cxbal_ = pw.max/(pw.mean) }else{ thread_cxbal_ = 1 } return ix }