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() {