source: doc/theses/colby_parsons_MMAth/benchmarks/channels/go/contend/contend.go@ b28ce93

Last change on this file since b28ce93 was e2f827f, checked in by caparson <caparson@…>, 2 years ago

added go counterpart to cfa benchmarks

  • Property mode set to 100644
File size: 2.8 KB
Line 
1package main
2
3import (
4 "fmt"
5 "sync"
6 "time"
7 "runtime"
8 "os"
9 "strconv"
10)
11
12var Processors, Channels, ProdsPerChan, ConsPerChan, ChannelSize int = 1, 1, 1, 1, 128
13var cons_done, prod_done bool = false, false;
14var total_operations, cons_check, prod_check uint64 = 0, 0, 0
15var m sync.Mutex
16
17var prodJoin chan int = make(chan int, ProdsPerChan * Channels + 1)
18var consJoin chan int = make(chan int, ConsPerChan * Channels + 1)
19
20func consumer( channel chan uint64 ) {
21 var count uint64 = 0
22 var checksum uint64 = 0
23 for {
24 if cons_done { break }
25 j := <- channel
26 checksum = checksum ^ j
27 if ! prod_done { count++ }
28 }
29 m.Lock()
30 total_operations += count
31 cons_check = cons_check ^ checksum
32 // fmt.Print("C: ",count)
33 m.Unlock()
34 consJoin <- 0
35}
36
37func producer( channel chan uint64 ) {
38 var count uint64 = 0
39 var checksum uint64 = 0
40 for {
41 if prod_done { break }
42 checksum = checksum ^ count
43 channel <- count
44 count++
45 }
46 m.Lock()
47 total_operations += count
48 prod_check = prod_check ^ checksum
49 // fmt.Print("P: ",count, " ")
50 m.Unlock()
51 prodJoin <- 0
52}
53
54func usage() {
55 fmt.Printf( "Usage: %v " +
56 "[ processors (> 0) | 'd' (default %v) ] " +
57 "[ ChannelSize (> 0) | 'd' (default %v) ]\n",
58 os.Args[0], Processors, ChannelSize );
59 os.Exit( 1 );
60}
61
62func main() {
63 switch len( os.Args ) {
64 case 3:
65 if os.Args[2] != "d" { // default ?
66 ChannelSize, _ = strconv.Atoi( os.Args[2] )
67 if ChannelSize < 0 { usage(); }
68 } // if
69 fallthrough
70 case 2:
71 if os.Args[1] != "d" { // default ?
72 Processors, _ = strconv.Atoi( os.Args[1] )
73 if Processors < 1 { usage(); }
74 } // if
75 case 1: // use defaults
76 default:
77 usage();
78 } // switch
79 runtime.GOMAXPROCS( Processors );
80 ProdsPerChan = Processors /2
81 ConsPerChan = Processors / 2
82
83 // fmt.Println("Processors: ",Processors," Channels: ",Channels," ProdsPerChan: ",ProdsPerChan," ConsPerChan: ",ConsPerChan," Channel Size: ",ChannelSize)
84
85 chans := make( [] chan uint64, Channels )
86 for i := range chans {
87 chans[i] = make(chan uint64, ChannelSize)
88 }
89 for i := range chans {
90 for j := 0; j < ProdsPerChan; j++ {
91 go producer( chans[i] )
92 }
93
94 for j := 0; j < ConsPerChan; j++ {
95 go consumer( chans[i] )
96 }
97 }
98
99
100 // wait 10 seconds
101 time.Sleep(time.Second * 10)
102 // fmt.Println("prod done\n")
103 prod_done = true
104 for j := 0; j < ProdsPerChan * Channels ; j++ {
105 <-prodJoin
106 }
107 // fmt.Println("cons done\n")
108 cons_done = true
109 for i := range chans {
110 L: for {
111 select {
112 case k := <-chans[i]:
113 cons_check = cons_check ^ k
114 default:
115 break L
116 }
117 }
118 }
119 for i := range chans {
120 close(chans[i])
121 }
122
123 for j := 0; j < ConsPerChan * Channels; j++{
124 <-consJoin
125 }
126
127
128 if cons_check != prod_check {
129 fmt.Println("\nChecksum mismatch: Cons: %d, Prods: %d", cons_check, prod_check)
130 }
131 fmt.Println(total_operations)
132}
Note: See TracBrowser for help on using the repository browser.