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

Last change on this file was f945fa7, checked in by Peter A. Buhr <pabuhr@…>, 13 hours ago

fix spelling mistake in directory name

  • 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.