From 491615e3f7acca2964744307adf3655eb3e778b2 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Mon, 24 Feb 2020 21:08:12 -0500 Subject: [PATCH] [dev.link] cmd/link: parallelize reloc sym MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- src/cmd/link/internal/ld/data.go | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) 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) { -- 2.48.1