Should be public now, thanks for bringing that to my attention. On Sunday, 7 April 2019 20:41:41 UTC+2, robert engels wrote: > > The link to the repo does not allow not credentialed access... > > On Apr 7, 2019, at 5:58 AM, Tharen Abela <abela...@gmail.com <javascript:>> > wrote: > > I'll preface this by saying this is for academic purposes. > > I am working in the following repository > <https://gitlab.com/AbelThar/go.batch>, but the following files are the > ones relevant, I'll reference them as I explain what I have: > > *0*. go 1.11.5 commit 7cf31d8f `proc.go` > <https://gitlab.com/AbelThar/go.batch/blob/7cf31d8f4116420e396c5e8690c043b2ce83f90a/src/runtime/proc.go> > > `runtime2.go` > <https://gitlab.com/AbelThar/go.batch/blob/7cf31d8f4116420e396c5e8690c043b2ce83f90a/src/runtime/runtime2.go> > *1*. Modified with 1 goroutine `proc.go` > <https://gitlab.com/AbelThar/go.batch/blob/b10ef431c29b01fa7568a7bf9712a0286033266f/src/runtime/proc.go> > > `runtime2.go` > <https://gitlab.com/AbelThar/go.batch/blob/b10ef431c29b01fa7568a7bf9712a0286033266f/src/runtime/runtime2.go> > *2*. Modified with 1 goroutine per batch `proc.go` > <https://gitlab.com/AbelThar/go.batch/blob/c066d64315f1da3bb20976456929fec00673d70f/src/runtime/proc.go> > > `runtime2.go` > <https://gitlab.com/AbelThar/go.batch/blob/c066d64315f1da3bb20976456929fec00673d70f/src/runtime/runtime2.go> > > > For convenience, here are the diffs: 0 <-> 1 > <https://www.diffchecker.com/qfIN3GCW>, 1 <-> 2 > <https://www.diffchecker.com/xNFmlNCl> > > I have provided some quick sketches to explain further. > > The first is a representation of the current scheduler, with Local > Runqueues and the P locks for stealing (*0*). > > <gostd.png> > > > > > From this point I modified it by (files at *1*): > - Removing Work-Stealing > - Modified the Local Run Queue to only keep one goroutine > > (look at 0 <-> 1 diff for more detail) > > This works as expected, no benchmarks fail etc... (benchmarks using the > ones provided from shootout - binarytree, fannkuch, etc.) > Sketch for reference: > > <oneG.png> > In *2*, I want to have a batch struct, in which the goroutine is > contained, with the global run queue replaced by a global batch queue, for > now I am keeping it at a 1 goroutine, but the point is to *batch* a number > of goroutines together. > > So for now it will simply serve as overhead. > > <batch.png> > > bQueue is the same as gQueue, just adapted for batches. The GRQ has been > changed to a Global Batch Queue, with type bQueue, and respective > operations make use of the batches; globrunqput first puts the G in a > batch, then in the GBQ, and globrunqget gets a batch, and pops the G within > it. (look at 1 <-> 2 diff for more detail) > > When it came to the batch solution, I have a bunch of extra batches > pre-allocated, which a goroutine is placed in, when put in the global > queue. This is mainly due that a P is required to allocate a batch, and at > exitsyscall, it cannot acquire a P. Its also an optimization, as it will > reduce the number of batch objects created. > > The current problem I am encountering is that the GC occasionally > incorrectly sweeps the batch object. To allocate I do use the `acquirem`, > similarly used in acquireSudog. I also keep an `allb` slice, with pointers > to all batches, similar to `allp` and `allm`. > > By occasionally, I mean that about 1/3 times it does work, and for > programs that do not invoke the GC, it consistently works. > > When it does crash, running it by default, I get: > runtime: nelems=512 nalloc=2 previous allocCount=1 nfreed=65535 > fatal error: sweep increased allocation count > The nalloc and allocCount is always x and x+1, respectively (not only 2 > and 1). > > Running with `GODEBUG=gccheckmark=1`, I get the following output: > runtime: marking free object 0xc000448020 found at *(0xc0004d8000+0x48) > base=0xc0004d8000 s.base()=0xc0004d8000 s.limit=0xc0004da000 s.spanclass= > 18 s.elemsize=128 s.state=mSpanInUse > *(base+0) = 0xc0000160f0 > *(base+8) = 0xc000016100 > *(base+16) = 0xc000016110 > *(base+24) = 0xc000016120 > *(base+32) = 0xc000068000 > *(base+40) = 0xc000068010 > *(base+48) = 0xc00046c000 > *(base+56) = 0xc000068060 > *(base+64) = 0xc00046c010 > *(base+72) = 0xc000448020 <== > *(base+80) = 0x0 > *(base+88) = 0x0 > *(base+96) = 0x0 > *(base+104) = 0x0 > *(base+112) = 0x0 > *(base+120) = 0x0 > obj=0xc000448020 s.base()=0xc000448000 s.limit=0xc00044a000 s.spanclass=5 > s.elemsize=16 s.state=mSpanInUse > *(obj+0) = 0x0 > *(obj+8) = 0xc00046c010 > fatal error: marking free object > > > The pointer of the object is a batch type (checked with printing the > pointer when allocated) > > I'm not sure if there is anything I missed in the allocation process for > safety; I don't mind not so ideal solution like an inefficient lock or > something along those lines. > I appreciate any help I can get. > > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golan...@googlegroups.com <javascript:>. > For more options, visit https://groups.google.com/d/optout. > <gostd.png><oneG.png><batch.png> > > >
-- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.