Add more entropy to matrix multiplication input
authorAndrew Waterman <waterman@cs.berkeley.edu>
Sat, 13 Dec 2014 02:17:31 +0000 (18:17 -0800)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Sat, 13 Dec 2014 02:17:31 +0000 (18:17 -0800)
This will exercise the floating-point units more thoroughly.

benchmarks/common/util.h
benchmarks/mm/mm_main.c

index 638f02419304705a704fe841c35639fe8e6e0d48..24a1cadc07b3e6f30028be6e051ef471fc149ad4 100644 (file)
@@ -31,6 +31,8 @@ static void setStats(int enable) {}
 extern void setStats(int enable);
 #endif
 
+#include <stdint.h>
+
 extern int have_vec;
 
 #define static_assert(cond) switch(0) { case 0: case !!(long)(cond): ; }
@@ -109,6 +111,12 @@ static void __attribute__((noinline)) barrier(int ncores)
   __sync_synchronize();
 }
 
+static uint64_t lfsr(uint64_t x)
+{
+  uint64_t bit = (x ^ (x >> 1)) & 1;
+  return (x >> 1) | (bit << 62);
+}
+
 #ifdef __riscv
 #include "encoding.h"
 #endif
index 3bbfdcf559ca98fdb2b49da79e0cd49cb1878367..e11923515b653c84b05809dbdfb18d539415e13f 100644 (file)
@@ -8,6 +8,7 @@ void thread_entry(int cid, int nc)
 {
   const int R = 8;
   int m, n, p;
+  uint64_t s = 0xdeadbeefU;
   
   if (have_vec) {
     m = HCBM;
@@ -25,10 +26,10 @@ void thread_entry(int cid, int nc)
 
   for (size_t i = 0; i < m; i++)
     for (size_t j = 0; j < p; j++)
-      a[i*p+j] = i+j;
+      a[i*p+j] = (t)(s = lfsr(s));
   for (size_t i = 0; i < p; i++)
     for (size_t j = 0; j < n; j++)
-      b[i*n+j] = i-j;
+      b[i*n+j] = (t)(s = lfsr(s));
   memset(c, 0, m*n*sizeof(c[0]));
 
   size_t instret, cycles;
@@ -65,9 +66,10 @@ void thread_entry(int cid, int nc)
     for (size_t j = 0; j < n; j++)
     {
       t s = 0;
-      for (size_t aik = i, bkj = -j; aik < i+p; aik++, bkj++)
-        s += (t)aik*(t)bkj;
-      if (fabs(c[i*n+j]-s*R) > 1e-6*s)
+      for (size_t k = 0; k < p; k++)
+        s += a[i*p+k] * b[k*n+j];
+      s *= R;
+      if (fabs(c[i*n+j]-s) > fabs(1e-6*s))
       {
         printf("C%d: c[%lu][%lu] %f != %f\n", cid, i, j, c[i*n+j], s);
         exit(1);