Changeset 0b84b15 for benchmark/readyQ/cycle.go
- Timestamp:
- Oct 29, 2020, 3:33:45 PM (2 years ago)
- Branches:
- arm-eh, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 93068e53
- Parents:
- b35ab2d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
benchmark/readyQ/cycle.go
rb35ab2d r0b84b15 1 package main 2 3 import ( 4 "bufio" 5 "flag" 6 "fmt" 7 "os" 8 "runtime" 9 "sync/atomic" 10 "time" 11 "golang.org/x/text/language" 12 "golang.org/x/text/message" 13 ) 14 15 var clock_mode bool 16 var threads_left int64 17 var stop int32 18 var duration float64 19 var stop_count uint64 20 21 func fflush(f *bufio.Writer) { 22 defer f.Flush() 23 f.Write([]byte("\r")) 24 } 25 26 func wait(start time.Time, is_tty bool) { 27 f := bufio.NewWriter(os.Stdout) 28 tdur := time.Duration(duration) 29 for true { 30 time.Sleep(100 * time.Millisecond) 31 end := time.Now() 32 delta := end.Sub(start) 33 if is_tty { 34 fmt.Printf(" %.1f",delta.Seconds()) 35 fflush(f) 36 } 37 if clock_mode && delta >= (tdur * time.Second) { 38 break 39 } else if !clock_mode && atomic.LoadInt64(&threads_left) == 0 { 40 break 41 } 42 } 43 } 44 45 func partner(result chan uint64, mine chan int, next chan int) { 46 count := uint64(0) 47 for true { 48 <- mine 49 next <- 0 50 count += 1 51 if clock_mode && atomic.LoadInt32(&stop) == 1 { break } 52 if !clock_mode && count >= stop_count { break } 53 } 54 55 atomic.AddInt64(&threads_left, -1); 56 result <- count 57 } 58 59 func main() { 60 var nprocs int 61 var nthreads int 62 var ring_size int 63 64 nprocsOpt := flag.Int("p", 1, "The number of processors") 65 nthreadsOpt := flag.Int("t", 1, "The number of threads") 66 ring_sizeOpt := flag.Int("r", 2, "The number of threads per cycles") 67 durationOpt := flag.Float64("d", 0, "Duration of the experiment in seconds") 68 stopOpt := flag.Uint64("i", 0, "Duration of the experiment in iterations") 69 70 flag.Parse() 71 72 nprocs = *nprocsOpt 73 nthreads = *nthreadsOpt 74 ring_size = *ring_sizeOpt 75 duration = *durationOpt 76 stop_count = *stopOpt 77 78 if duration > 0 && stop_count > 0 { 79 panic(fmt.Sprintf("--duration and --iterations cannot be used together\n")) 80 } else if duration > 0 { 81 clock_mode = true 82 stop_count = 0xFFFFFFFFFFFFFFFF 83 fmt.Printf("Running for %f seconds\n", duration) 84 } else if stop_count > 0 { 85 clock_mode = false 86 fmt.Printf("Running for %d iterations\n", stop_count) 87 } else { 88 duration = 5 89 clock_mode = true 90 fmt.Printf("Running for %f seconds\n", duration) 91 } 92 93 runtime.GOMAXPROCS(nprocs) 94 tthreads := nthreads * ring_size 95 threads_left = int64(tthreads) 96 97 result := make(chan uint64) 98 channels := make([]chan int, tthreads) 99 for i := range channels { 100 channels[i] = make(chan int, 1) 101 } 102 103 for i := 0; i < tthreads; i++ { 104 pi := (i + nthreads) % tthreads 105 go partner(result, channels[i], channels[pi]) 106 } 107 fmt.Printf("Starting\n"); 108 109 atomic.StoreInt32(&stop, 0) 110 start := time.Now() 111 for i := 0; i < nthreads; i++ { 112 channels[i] <- 0 113 } 114 wait(start, true); 115 116 atomic.StoreInt32(&stop, 1) 117 end := time.Now() 118 delta := end.Sub(start) 119 120 fmt.Printf("\nDone\n") 121 122 global_counter := uint64(0) 123 for i := 0; i < tthreads; i++ { 124 global_counter += <- result 125 } 126 127 p := message.NewPrinter(language.English) 128 p.Printf("Took %f ms\n", delta.Seconds()) 129 p.Printf("Yields per second : %18.2f\n", float64(global_counter) / delta.Seconds()) 130 p.Printf("ns per yields : %18.2f\n", float64(delta.Nanoseconds()) / float64(global_counter)) 131 p.Printf("Total yields : %15d\n", global_counter) 132 p.Printf("Yields per threads : %15d\n", global_counter / uint64(tthreads)) 133 p.Printf("Yields per procs : %15d\n", global_counter / uint64(nprocs)) 134 p.Printf("Yields/sec/procs : %18.2f\n", (float64(global_counter) / float64(nprocs)) / delta.Seconds()) 135 p.Printf("ns per yields/procs : %18.2f\n", float64(delta.Nanoseconds()) / (float64(global_counter) / float64(nprocs))) 136 137 }
Note: See TracChangeset
for help on using the changeset viewer.