Mercurial > gemma
changeset 686:a2f107f1e4e7 octree
octree: run each slice in contour tool concurrently.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Thu, 20 Sep 2018 00:13:47 +0200 |
parents | a8672ba9ebad |
children | be90ab542aa7 |
files | cmd/octree2contour/main.go |
diffstat | 1 files changed, 64 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/cmd/octree2contour/main.go Wed Sep 19 23:17:03 2018 +0200 +++ b/cmd/octree2contour/main.go Thu Sep 20 00:13:47 2018 +0200 @@ -3,6 +3,9 @@ import ( "flag" "log" + "runtime" + "sort" + "sync" "time" ) @@ -12,6 +15,27 @@ max = flag.Float64("m", 10, "max height from lowest point") ) +type result struct { + h float64 + triangles int +} + +func processLevels( + tree *octree, + jobs <-chan float64, + results chan<- result, + wg *sync.WaitGroup, +) { + defer wg.Done() + for h := range jobs { + var triangles int + tree.horizontal(h, func([]int32) { + triangles++ + }) + results <- result{h, triangles} + } +} + func process(tree *octree) { var triangles int start := time.Now() @@ -20,17 +44,49 @@ triangles++ }) } else { + + results := make(chan result) + done := make(chan struct{}) + + var all []result + + go func() { + for { + select { + case r := <-results: + all = append(all, r) + case <-done: + return + } + } + }() + + var wg sync.WaitGroup + jobs := make(chan float64) + for i, n := 0, runtime.NumCPU(); i < n; i++ { + wg.Add(1) + go processLevels(tree, jobs, results, &wg) + } for h := tree.min.z; h <= tree.max.z; h += *step { - var level int - tree.horizontal(h, func([]int32) { - level++ - }) - log.Printf("level %f: %d\n", h, level) - triangles += level + jobs <- h } + close(jobs) + wg.Wait() + done <- struct{}{} + + sort.Slice(all, func(i, j int) bool { + return all[i].h < all[j].h + }) + + var sum int + for i := range all { + a := &all[i] + sum += a.triangles + log.Printf("level %f: %d\n", a.h, a.triangles) + } + log.Printf("num triangles: %d\n", sum) } - log.Printf("traversal took: %v\n", time.Since(start)) - log.Printf("num triangles: %d\n", triangles) + log.Printf("processing took: %s\n", time.Since(start)) } func main() {