Add LICENSE
[riscv-tests.git] / benchmarks / mm / mm_main.c
1 // See LICENSE for license details.
2
3 #include "common.h"
4 #include <assert.h>
5 #include <stdlib.h>
6 #include <stdio.h>
7 #include "util.h"
8
9 void thread_entry(int cid, int nc)
10 {
11 const int R = 8;
12 int m, n, p;
13 uint64_t s = 0xdeadbeefU;
14
15 if (have_vec) {
16 m = HCBM;
17 n = HCBN;
18 p = HCBK;
19 } else {
20 m = CBM;
21 n = CBN;
22 p = CBK;
23 }
24
25 t a[m*p];
26 t b[p*n];
27 t c[m*n];
28
29 for (size_t i = 0; i < m; i++)
30 for (size_t j = 0; j < p; j++)
31 a[i*p+j] = (t)(s = lfsr(s));
32 for (size_t i = 0; i < p; i++)
33 for (size_t j = 0; j < n; j++)
34 b[i*n+j] = (t)(s = lfsr(s));
35 memset(c, 0, m*n*sizeof(c[0]));
36
37 size_t instret, cycles;
38 if (have_vec) {
39 for (int i = 0; i < R; i++)
40 {
41 instret = -rdinstret();
42 cycles = -rdcycle();
43 mm_rb_hwacha(m, n, p, a, p, b, n, c, n);
44 instret += rdinstret();
45 cycles += rdcycle();
46 }
47 } else {
48 for (int i = 0; i < R; i++)
49 {
50 instret = -rdinstret();
51 cycles = -rdcycle();
52 mm(m, n, p, a, p, b, n, c, n);
53 instret += rdinstret();
54 cycles += rdcycle();
55 }
56 }
57
58 printf("C%d: reg block %dx%dx%d, cache block %dx%dx%d\n",
59 cid, RBM, RBN, RBK, CBM, CBN, CBK);
60 printf("C%d: %d instructions\n", cid, (int)(instret));
61 printf("C%d: %d cycles\n", cid, (int)(cycles));
62 printf("C%d: %d flops\n", cid, 2*m*n*p);
63 printf("C%d: %d Mflops @ 1 GHz\n", cid, 2000*m*n*p/(cycles));
64
65 #if 1
66 for (size_t i = 0; i < m; i++)
67 {
68 for (size_t j = 0; j < n; j++)
69 {
70 t s = 0;
71 for (size_t k = 0; k < p; k++)
72 s += a[i*p+k] * b[k*n+j];
73 s *= R;
74 if (fabs(c[i*n+j]-s) > fabs(1e-6*s))
75 {
76 printf("C%d: c[%lu][%lu] %f != %f\n", cid, i, j, c[i*n+j], s);
77 exit(1);
78 }
79 }
80 }
81 #endif
82
83 barrier(nc);
84 exit(0);
85 }