From: Jeremy Faller Date: Tue, 25 Feb 2020 02:08:12 +0000 (-0500) Subject: [dev.link] cmd/link: parallelize reloc sym X-Git-Tag: go1.15beta1~679^2~93 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=491615e3f7acca2964744307adf3655eb3e778b2;p=gostls13.git [dev.link] cmd/link: parallelize reloc sym I tried a couple of different architectures (goroutine per symbol, 8 goroutines handling symbols from channels, and this architecture), and this was the best. Another possible approach could be to divide up the space of relocations, forgo the channels, and just pass slices to the relocation routines, which would possibly be faster. Reloc 13.9ms ± 5% 9.0ms ±10% -35.09% (p=0.000 n=8+9) Change-Id: I5111220e855313fae4b89d64277759c4dc33b697 Reviewed-on: https://go-review.googlesource.com/c/go/+/220842 Reviewed-by: Than McIntosh Reviewed-by: Cherry Zhang --- diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 629cd5cd27..25dda36293 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -571,19 +571,31 @@ func relocsym(target *Target, err *ErrorReporter, lookup LookupFn, syms *ArchSym } func (ctxt *Link) reloc() { + var wg sync.WaitGroup target := &ctxt.Target reporter := &ctxt.ErrorReporter lookup := ctxt.Syms.ROLookup syms := &ctxt.ArchSyms - for _, s := range ctxt.Textp { - relocsym(target, reporter, lookup, syms, s) - } - for _, s := range datap { - relocsym(target, reporter, lookup, syms, s) - } - for _, s := range dwarfp { - relocsym(target, reporter, lookup, syms, s) - } + wg.Add(3) + go func() { + for _, s := range ctxt.Textp { + relocsym(target, reporter, lookup, syms, s) + } + wg.Done() + }() + go func() { + for _, s := range datap { + relocsym(target, reporter, lookup, syms, s) + } + wg.Done() + }() + go func() { + for _, s := range dwarfp { + relocsym(target, reporter, lookup, syms, s) + } + wg.Done() + }() + wg.Wait() } func windynrelocsym(ctxt *Link, rel, s *sym.Symbol) {