source: doc/theses/colby_parsons_MMAth/benchmarks/actors/proto/Matrix/GoMatrix.go

Last change on this file was 5adf4f4, checked in by caparson <caparson@…>, 16 months ago

added caf/uC++/proto benchmarks

  • Property mode set to 100644
File size: 3.4 KB
Line 
1// https://github.com/AsynkronIT/protoactor-go
2// https://pkg.go.dev/github.com/AsynkronIT/protoactor-go/actor
3package main
4
5import (
6        "os"; "strconv"; "fmt"; "time"; "runtime"; "sync/atomic"
7        "github.com/asynkron/protoactor-go/actor"
8)
9
10var xr, xc, yc uint64 = 3_072, 3_072, 3_072 // default values
11
12var Processors int = 1
13
14var starttime time.Time;
15var shake = make( chan string )
16var actorCnt uint64 = 0
17
18type Msg struct {
19        Z []int
20        X []int
21        Y [][]int
22}
23
24func NewMsg( Z_ []int, X_ []int, Y_ [][]int ) *Msg {
25        return &Msg{ Z: Z_, X: X_, Y: Y_ }
26}
27
28var msg Msg
29type MatrixMult struct {
30        actors [] * actor.PID;
31        id, rounds, group, recs, sends int;
32}
33var system * actor.ActorSystem
34
35func ( state * MatrixMult ) Receive( context actor.Context ) {
36        switch msg := context.Message().(type) {
37          case * Msg:
38                for i := uint64(0); i < yc; i += 1 {
39                        msg.Z[i] = 0
40                        for j := uint64(0); j < xc; j += 1 {
41                                msg.Z[i] = msg.X[j] * msg.Y[j][i]
42                        }
43                }
44
45                if ( atomic.AddUint64( &actorCnt, 1 ) == xr ) {
46                        shake <- "hand"
47                } // if
48          default:
49                // ignore actor.Started message
50        }
51}
52
53func usage() {
54        fmt.Printf( "Usage: %v " +
55                "[ yc (> 0) | 'd' (default %v) ] " +
56                "[ xc (> 0) | 'd' (default %v) ] " +
57                "[ xr (> 0) | 'd' (default %v) ]\n",
58                "[ processors (> 0) | 'd' (default %v) ]\n",
59                os.Args[0], yc, xc, xr, Processors );
60        os.Exit( 1 );
61}
62
63func main() {
64        switch len( os.Args ) {
65          case 5:
66                if os.Args[4] != "d" {                                                  // default ?
67                        Processors, _ = strconv.Atoi( os.Args[4] )
68                        if Processors < 1 { usage(); }
69                } // if
70                fallthrough
71          case 4:
72                if os.Args[3] != "d" {                                                  // default ?
73                        xr, _ = strconv.ParseUint( os.Args[3], 10, 64 )
74                        if xr < 1 { usage(); }
75                } // if
76                fallthrough
77          case 3:
78                if os.Args[2] != "d" {                                                  // default ?
79                        xc, _ = strconv.ParseUint( os.Args[2], 10, 64 )
80                        if xc < 1 { usage(); }
81                } // if
82                fallthrough
83          case 2:
84                if os.Args[1] != "d" {                                                  // default ?
85                        yc, _ = strconv.ParseUint( os.Args[1], 10, 64 )
86                        if yc < 1 { usage(); }
87                } // if
88          case 1:                                                                                       // use defaults
89          default:
90                usage();
91        } // switch
92
93        runtime.GOMAXPROCS( Processors );
94        system = actor.NewActorSystem();
95       
96
97        // set up matrices
98        X := make( [][]int, xr )
99        Y := make( [][]int, xc )
100        Z := make( [][]int, xr )
101       
102        for r := uint64(0); r < xr; r += 1 { // set up X subarrays
103                X[r] = make( []int, xc )
104                for c := uint64(0); c < xc; c += 1 { // set up X values
105                        X[r][c] = int(r * c % 37)
106                }
107        }
108
109        for r := uint64(0); r < xc; r += 1 { // set up Y subarrays
110                Y[r] = make( []int, yc )
111                for c := uint64(0); c < yc; c += 1 { // set up Y values
112                        Y[r][c] = int(r * c % 37)
113                }
114        }
115
116        for r := uint64(0); r < xr; r += 1 { // set up Z subarrays
117                Z[r] = make( []int, yc )
118        }
119
120        system = actor.NewActorSystem();
121
122        starttime = time.Now();
123        actors := make( [] * actor.PID, xr );
124        messages := make( []*Msg, xr );
125        for r := uint64(0); r < xr; r += 1 { // create messages and actors
126                messages[r] = NewMsg(Z[r], X[r], Y);
127                props := actor.PropsFromProducer( func() actor.Actor { return &MatrixMult{} })
128                actors[r] = system.Root.Spawn(props)
129        } // for
130        for r := uint64(0); r < xr; r += 1 { // send messages to actors
131                system.Root.Send( actors[r], messages[r] );
132        } // for
133
134        <- shake // wait for actors to finish
135
136        fmt.Printf( "%.2f\n", time.Since( starttime ).Seconds() );
137} // main
138
139// /usr/bin/time -f "%Uu %Ss %Er %Mkb" GoMatrix
140
141// Local Variables: //
142// tab-width: 4 //
143// compile-command: "go build" //
144// End: //
Note: See TracBrowser for help on using the repository browser.