Thanks! I'll study these examples and see how they apply. I generally don't use such big numbers, however, I may break it over sets of numbers which could distribute the work more evenly.
On Wed, Jun 29, 2016 at 12:31 PM, Michael Jones <michael.jo...@gmail.com> wrote: > Try these versions: https://play.golang.org/p/HF6k0ovyoW > > Changes: > > 1. Numbers big enough that the multiplies take some time. > > 2. Two styles of synchronization and work distribution. > > Best case in this configuration is 3.9151x speedup on 4 core notebook: > > $ go test -bench=. > testing: warning: no tests to run > BenchmarkLoop-8 10 115728469 ns/op > BenchmarkParLoop2-8 50 29559001 ns/op > BenchmarkParLoop3-8 50 31231335 ns/op > > > Michael Jones > michael.jo...@gmail.com > > On Jun 28, 2016, at 7:05 PM, Michael Jones <michael.jo...@gmail.com> > wrote: > > You should expect linear speedup. But you’ll need to work fot it. Problems > in this version: > > 1. 10,000 parallel workers! Not very cache friendly. > 2. You don’t wait for the goroutines to finish, so not very meaningful. > > Look for the blog posts and videos about concurrently patterns. What you > likely want is a set of worker process (~ncpus or 2x that) doing the work > and a way to know when the work is done. > > Michael Jones > michael.jo...@gmail.com > > On Jun 28, 2016, at 5:01 PM, guyz...@gmail.com wrote: > > Hi, > > I'm attempting to optimize pair-wise operations over arrays of big > integers ('vectorize'). Currently, I tried creating two versions of a > point-wise multiplication function - one that is a simple serial for-loop, > and another that uses go-routines to create a parallel (or more correctly - > concurrent) for loop. The code is below along with the results, showing > that the parallel for loop is actually ~10x slower. > > My question is - is there a better way to achieve this, or is a naive > serial for-loop the best one can hope for? > > func BenchmarkLoop(b *testing.B) { > var x, y, z [10000]big.Int > for i := 0; i < 10000; i++ { > x[i].SetInt64(892745680) > y[i].SetInt64(353322197) > } > > for n := 0; n < b.N; n++ { > for i := 0; i < 10000; i++ { > z[i].Mul(&x[i], &y[i]) > } > } > } > > func BenchmarkParLoop1(b *testing.B) { > var x, y, z [10000]big.Int > runtime.GOMAXPROCS(4) // Tried playing with this value from 1-8 > for i := 0; i < 10000; i++ { > x[i].SetInt64(892745680) > y[i].SetInt64(353322197) > } > > for n := 0; n < b.N; n++ { > for i := 0; i < 10000; i++ { > go func(i int) { > z[i].Mul(&x[i], &y[i]) > }(i) > } > } > } > > Benchmarks: > > BenchmarkLoop-8 5000 350033 ns/op > > BenchmarkParLoop1-8 500 2352201 ns/op > > > > Thanks! > > -- > 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. > > > > -- 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.