Speed up benchmarks that take a long time to run
[riscv-tests.git] / benchmarks / mt-matmul / matmul.c
index 95fbe0303d762ba5f5981a30301448311e4b8606..6d7b97863a5a023ffffa2f04e4152b736a900784 100644 (file)
@@ -1,20 +1,23 @@
+// See LICENSE for license details.
+
 #include "dataset.h"
 #include "dataset.h"
+#include "util.h"
+#include <stddef.h>
+
+#pragma GCC optimize ("unroll-loops")
 
 
-//--------------------------------------------------------------------------
-// single-thread, naive version
-//
-void __attribute__((noinline)) matmul(const int coreid, const int ncores, const int lda,  const data_t A[], const data_t B[], data_t C[] )
+void matmul(const size_t coreid, const size_t ncores, const size_t lda,  const data_t A[], const data_t B[], data_t C[])
 {
 {
-   int i, j, k;
-  
-   for ( i = 0; i < lda; i++ )
-   {
-      for ( j = 0; j < lda; j++ )  
-      {
-         for ( k = coreid; k < lda; k+=ncores ) 
-         {
-            C[i + j*lda] += A[j*lda + k] * B[k*lda + i];
-         }
-      }
-   }
+  size_t i, j, k;
+  size_t block = lda / ncores;
+  size_t start = block * coreid;
+  for (i = 0; i < lda; i++) {
+    for (j = start; j < (start+block); j++) {
+      data_t sum = 0;
+      for (k = 0; k < lda; k++)
+        sum += A[j*lda + k] * B[k*lda + i];
+      C[i + j*lda] = sum;
+    }
+  }
 }
 }