aboutsummaryrefslogtreecommitdiffstats
path: root/test/monniaux/mod_int_mat
diff options
context:
space:
mode:
authorDavid Monniaux <david.monniaux@univ-grenoble-alpes.fr>2019-01-18 15:16:17 +0100
committerDavid Monniaux <david.monniaux@univ-grenoble-alpes.fr>2019-01-18 15:16:17 +0100
commit99e5f103393d554b0d2725303682a35d343a09b6 (patch)
tree45627b7e157b6a07146fcd722a5464c7ebb29937 /test/monniaux/mod_int_mat
parentac6e6181c48b0e21219c1ea57e30fa8d3c3f1714 (diff)
downloadcompcert-kvx-99e5f103393d554b0d2725303682a35d343a09b6.tar.gz
compcert-kvx-99e5f103393d554b0d2725303682a35d343a09b6.zip
moved to subdirectory
Diffstat (limited to 'test/monniaux/mod_int_mat')
-rw-r--r--test/monniaux/mod_int_mat/Makefile46
-rw-r--r--test/monniaux/mod_int_mat/int_mat.c138
-rw-r--r--test/monniaux/mod_int_mat/int_mat_run.c94
-rw-r--r--test/monniaux/mod_int_mat/modint.h41
4 files changed, 319 insertions, 0 deletions
diff --git a/test/monniaux/mod_int_mat/Makefile b/test/monniaux/mod_int_mat/Makefile
new file mode 100644
index 00000000..be534653
--- /dev/null
+++ b/test/monniaux/mod_int_mat/Makefile
@@ -0,0 +1,46 @@
+CFLAGS=-Wall -O3
+K1C_CC=k1-mbr-gcc
+K1C_CFLAGS=-Wall -O3 -std=c99
+K1C_CCOMP=../../ccomp
+K1C_CCOMPFLAGS=-Wall -O3 -D__thread= -D__int128=int
+
+PRODUCTS=int_mat.host int_mat.gcc.k1c.out int_mat.ccomp.k1c.out int_mat.ccomp.k1c.s int_mat.gcc.k1c.s
+
+all: $(PRODUCTS)
+
+%.gcc.k1c.s: %.c
+ $(K1C_CC) $(K1C_CFLAGS) -S $< -o $@
+
+%.gcc.k1c.o: %.gcc.k1c.s
+ $(K1C_CC) $(K1C_CFLAGS) -c $< -o $@
+
+%.gcc.k1c.o: %.gcc.k1c.c
+ $(K1C_CC) $(K1C_CFLAGS) -c $< -o $@
+
+%.ccomp.k1c.s: %.c
+ $(K1C_CCOMP) $(K1C_CCOMPFLAGS) -S $< -o $@
+
+%.ccomp.k1c.o: %.ccomp.k1c.s
+ $(K1C_CCOMP) $(K1C_CCOMPFLAGS) -c $< -o $@
+
+%.ccomp.k1c.o: %.ccomp.k1c.c
+ $(K1C_CCOMP) $(K1C_CCOMPFLAGS) -c $< -o $@
+
+int_mat.host: int_mat.c int_mat_run.c modint.h
+ $(CC) $(CFLAGS) int_mat.c int_mat_run.c -o $@
+
+int_mat.gcc.k1c.s int_mat.ccomp.k1c.s: modint.h
+
+int_mat.gcc.k1c: int_mat.gcc.k1c.o int_mat_run.gcc.k1c.o
+ $(K1C_CC) $(K1C_CFLAGS) $+ -o $@
+
+int_mat.ccomp.k1c: int_mat.ccomp.k1c.o int_mat_run.gcc.k1c.o
+ $(K1C_CCOMP) $(K1C_CCOMPFLAGS) $+ -o $@
+
+%.k1c.out: %.k1c
+ k1-cluster --cycle-based -- $< | tee $@
+
+clean:
+ $(RM) -f $(PRODUCTS) int_mat.gcc.k1c.o int_mat.ccomp.k1c.o
+
+.PHONY: clean
diff --git a/test/monniaux/mod_int_mat/int_mat.c b/test/monniaux/mod_int_mat/int_mat.c
new file mode 100644
index 00000000..d3e14e26
--- /dev/null
+++ b/test/monniaux/mod_int_mat/int_mat.c
@@ -0,0 +1,138 @@
+#include "modint.h"
+
+void modint_mat_mul1(unsigned m, unsigned n, unsigned p,
+ modint * restrict c, unsigned stride_c,
+ const modint *a, unsigned stride_a,
+ const modint *b, unsigned stride_b) {
+ for(unsigned i=0; i<m; i++) {
+ for(unsigned k=0; k<p; k++) {
+ c[i*stride_c+k] = 0;
+ }
+ }
+ for(unsigned i=0; i<m; i++) {
+ for(unsigned k=0; k<p; k++) {
+ for(unsigned j=0; j<n; j++) {
+ c[i*stride_c+k] += a[i*stride_a+j] * b[j*stride_b+k];
+ }
+ }
+ }
+ for(unsigned i=0; i<m; i++) {
+ for(unsigned k=0; k<p; k++) {
+ c[i*stride_c+k] %= MODULUS;
+ }
+ }
+}
+
+void modint_mat_mul2(unsigned m, unsigned n, unsigned p,
+ modint * restrict c, unsigned stride_c,
+ const modint *a, unsigned stride_a,
+ const modint *b, unsigned stride_b) {
+ for(unsigned i=0; i<m; i++) {
+ for(unsigned k=0; k<p; k++) {
+ modint total = 0;
+ for(unsigned j=0; j<n; j++) {
+ total += a[i*stride_a + j] * b[j*stride_b + k];
+ }
+ c[i*stride_c+k] = total % MODULUS;
+ }
+ }
+}
+
+void modint_mat_mul3(unsigned m, unsigned n, unsigned p,
+ modint * restrict c, unsigned stride_c,
+ const modint *a, unsigned stride_a,
+ const modint *b, unsigned stride_b) {
+ for(unsigned i=0; i<m; i++) {
+ for(unsigned k=0; k<p; k++) {
+ modint total0 = 0, total1 = 0;
+ unsigned j;
+ for(j=0; j+1<n; j+=2) {
+ total0 += a[i*stride_a + j] * b[j*stride_b + k];
+ total1 += a[i*stride_a + (j+1)] * b[(j+1)*stride_b + k];
+ }
+ if (j < n) {
+ total0 += a[i*stride_a + j] * b[j*stride_b + k];
+ }
+ c[i*stride_c+k] = (total0+total1) % MODULUS;
+ }
+ }
+}
+
+void modint_mat_mul4(unsigned m, unsigned n, unsigned p,
+ modint * c, unsigned stride_c,
+ const modint *a, unsigned stride_a,
+ const modint *b, unsigned stride_b) {
+ const modint *pa_i = a;
+ modint * pc_i = c;
+ for(unsigned i=0; i<m; i++) {
+ for(unsigned k=0; k<p; k++) {
+ const modint *pb_j_k = b+k, *pa_i_j = pa_i;
+ modint total = 0;
+ for(unsigned j=0; j<n; j++) {
+ total += *pa_i_j * *pb_j_k;
+ pa_i_j ++;
+ pb_j_k += stride_b;
+ }
+ pc_i[k] = total % MODULUS;
+ }
+ pa_i += stride_a;
+ pc_i += stride_c;
+ }
+}
+
+void modint_mat_mul5(unsigned m, unsigned n, unsigned p,
+ modint * c, unsigned stride_c,
+ const modint *a, unsigned stride_a,
+ const modint *b, unsigned stride_b) {
+ const modint *pa_i = a;
+ modint * pc_i = c;
+ for(unsigned i=0; i<m; i++) {
+ for(unsigned k=0; k<p; k++) {
+ const modint *pb_j_k = b+k, *pa_i_j = pa_i;
+ modint total = 0;
+ for(unsigned j2=0, n2=n/2; j2<n2; j2++) {
+ modint p0 = *pa_i_j * *pb_j_k;
+ pa_i_j ++;
+ pb_j_k += stride_b;
+ modint p1 = *pa_i_j * *pb_j_k;
+ pa_i_j ++;
+ pb_j_k += stride_b;
+ total += p0 + p1;
+ }
+ if (n%2) {
+ total += *pa_i_j * *pb_j_k;
+ }
+ pc_i[k] = total % MODULUS;
+ }
+ pa_i += stride_a;
+ pc_i += stride_c;
+ }
+}
+
+modint modint_random(void) {
+ static uint64_t next = 1325997111;
+ next = next * 1103515245 + 12345;
+ return next % MODULUS;
+}
+
+void modint_mat_random(unsigned m,
+ unsigned n,
+ modint *a, unsigned stride_a) {
+ for(unsigned i=0; i<m; i++) {
+ for(unsigned j=0; j<n; j++) {
+ a[i*stride_a + j] = modint_random();
+ }
+ }
+}
+
+bool modint_mat_equal(unsigned m,
+ unsigned n,
+ const modint *a, unsigned stride_a,
+ const modint *b, unsigned stride_b) {
+ for(unsigned i=0; i<m; i++) {
+ for(unsigned j=0; j<n; j++) {
+ if (a[i*stride_a + j] != b[i*stride_b + j]) return false;
+ }
+ }
+ return true;
+}
diff --git a/test/monniaux/mod_int_mat/int_mat_run.c b/test/monniaux/mod_int_mat/int_mat_run.c
new file mode 100644
index 00000000..9d5c0c57
--- /dev/null
+++ b/test/monniaux/mod_int_mat/int_mat_run.c
@@ -0,0 +1,94 @@
+#include <stdbool.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <inttypes.h>
+#include "modint.h"
+
+typedef uint64_t cycle_t;
+
+#ifdef __K1C__
+#include <mppa_bare_runtime/k1c/registers.h>
+static inline void cycle_count_config(void)
+{
+ /* config pmc for cycle count */
+ uint64_t pmc_value = __builtin_k1_get(K1_SFR_PMC);
+
+ pmc_value &= ~(0xfULL);
+ __builtin_k1_set(K1_SFR_PMC, pmc_value);
+}
+
+static inline uint64_t get_cycle(void)
+{
+ return __builtin_k1_get(K1_SFR_PM0);
+}
+#else
+static inline void cycle_count_config(void) { }
+#ifdef __x86_64__
+#include <x86intrin.h>
+static inline cycle_t get_cycle(void) { return __rdtsc(); }
+#else
+static inline cycle_t get_cycle(void) { return 0; }
+#endif
+#endif
+
+int main() {
+ const unsigned m = 40, n = 21, p = 30;
+ cycle_count_config();
+ modint *a = malloc(sizeof(modint) * m * n);
+ modint_mat_random(m, n, a, n);
+ modint *b = malloc(sizeof(modint) * n * p);
+ modint_mat_random(n, p, b, p);
+
+ modint *c1 = malloc(sizeof(modint) * m * p);
+ cycle_t c1_time = get_cycle();
+ modint_mat_mul1(m, n, p, c1, p, a, n, b, p);
+ c1_time = get_cycle()-c1_time;
+
+ modint *c2 = malloc(sizeof(modint) * m * p);
+ cycle_t c2_time = get_cycle();
+ modint_mat_mul2(m, n, p, c2, p, a, n, b, p);
+ c2_time = get_cycle()-c2_time;
+
+ modint *c3 = malloc(sizeof(modint) * m * p);
+ cycle_t c3_time = get_cycle();
+ modint_mat_mul3(m, n, p, c3, p, a, n, b, p);
+ c3_time = get_cycle()-c3_time;
+
+ modint *c4 = malloc(sizeof(modint) * m * p);
+ cycle_t c4_time = get_cycle();
+ modint_mat_mul4(m, n, p, c4, p, a, n, b, p);
+ c4_time = get_cycle()-c4_time;
+
+ modint *c5 = malloc(sizeof(modint) * m * p);
+ cycle_t c5_time = get_cycle();
+ modint_mat_mul5(m, n, p, c5, p, a, n, b, p);
+ c5_time = get_cycle()-c5_time;
+
+ printf("c1==c2: %s\n"
+ "c1==c3: %s\n"
+ "c1==c4: %s\n"
+ "c1==c5: %s\n"
+ "c1_time = %" PRIu64 "\n"
+ "c2_time = %" PRIu64 "\n"
+ "c3_time = %" PRIu64 "\n"
+ "c4_time = %" PRIu64 "\n"
+ "c5_time = %" PRIu64 "\n",
+ modint_mat_equal(m, n, c1, p, c2, p)?"true":"false",
+ modint_mat_equal(m, n, c1, p, c3, p)?"true":"false",
+ modint_mat_equal(m, n, c1, p, c4, p)?"true":"false",
+ modint_mat_equal(m, n, c1, p, c5, p)?"true":"false",
+ c1_time,
+ c2_time,
+ c3_time,
+ c4_time,
+ c5_time);
+
+ free(a);
+ free(b);
+ free(c1);
+ free(c2);
+ free(c3);
+ free(c4);
+ free(c5);
+ return 0;
+}
diff --git a/test/monniaux/mod_int_mat/modint.h b/test/monniaux/mod_int_mat/modint.h
new file mode 100644
index 00000000..5295258b
--- /dev/null
+++ b/test/monniaux/mod_int_mat/modint.h
@@ -0,0 +1,41 @@
+#include <stdint.h>
+#include <stdbool.h>
+
+typedef uint32_t modint;
+#define MODULUS 257
+
+void modint_mat_mul1(unsigned m, unsigned n, unsigned p,
+ modint * restrict c, unsigned stride_c,
+ const modint *a, unsigned stride_a,
+ const modint *b, unsigned stride_b);
+
+void modint_mat_mul2(unsigned m, unsigned n, unsigned p,
+ modint * restrict c, unsigned stride_c,
+ const modint *a, unsigned stride_a,
+ const modint *b, unsigned stride_b);
+
+void modint_mat_mul3(unsigned m, unsigned n, unsigned p,
+ modint * restrict c, unsigned stride_c,
+ const modint *a, unsigned stride_a,
+ const modint *b, unsigned stride_b);
+
+void modint_mat_mul4(unsigned m, unsigned n, unsigned p,
+ modint * restrict c, unsigned stride_c,
+ const modint *a, unsigned stride_a,
+ const modint *b, unsigned stride_b);
+
+void modint_mat_mul5(unsigned m, unsigned n, unsigned p,
+ modint * restrict c, unsigned stride_c,
+ const modint *a, unsigned stride_a,
+ const modint *b, unsigned stride_b);
+
+modint modint_random(void);
+
+void modint_mat_random(unsigned m,
+ unsigned n,
+ modint *a, unsigned stride_a);
+
+bool modint_mat_equal(unsigned m,
+ unsigned n,
+ const modint *a, unsigned stride_a,
+ const modint *b, unsigned stride_b);