diff options
author | David Monniaux <david.monniaux@univ-grenoble-alpes.fr> | 2019-01-18 15:16:17 +0100 |
---|---|---|
committer | David Monniaux <david.monniaux@univ-grenoble-alpes.fr> | 2019-01-18 15:16:17 +0100 |
commit | 99e5f103393d554b0d2725303682a35d343a09b6 (patch) | |
tree | 45627b7e157b6a07146fcd722a5464c7ebb29937 /test/monniaux/mod_int_mat | |
parent | ac6e6181c48b0e21219c1ea57e30fa8d3c3f1714 (diff) | |
download | compcert-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/Makefile | 46 | ||||
-rw-r--r-- | test/monniaux/mod_int_mat/int_mat.c | 138 | ||||
-rw-r--r-- | test/monniaux/mod_int_mat/int_mat_run.c | 94 | ||||
-rw-r--r-- | test/monniaux/mod_int_mat/modint.h | 41 |
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); |