diff options
Diffstat (limited to 'test/mppa/mmult')
-rw-r--r-- | test/mppa/mmult/.gitignore | 4 | ||||
-rw-r--r-- | test/mppa/mmult/Makefile | 67 | ||||
-rw-r--r-- | test/mppa/mmult/README.md | 17 | ||||
-rw-r--r-- | test/mppa/mmult/mmult.c | 146 | ||||
-rw-r--r-- | test/mppa/mmult/mmult.h | 10 |
5 files changed, 0 insertions, 244 deletions
diff --git a/test/mppa/mmult/.gitignore b/test/mppa/mmult/.gitignore deleted file mode 100644 index c9cd4c65..00000000 --- a/test/mppa/mmult/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -mmult-test-ccomp-k1c -mmult-test-gcc-k1c -mmult-test-gcc-x86 -.zero diff --git a/test/mppa/mmult/Makefile b/test/mppa/mmult/Makefile deleted file mode 100644 index 667faef8..00000000 --- a/test/mppa/mmult/Makefile +++ /dev/null @@ -1,67 +0,0 @@ -K1CC ?= k1-cos-gcc -CC ?= gcc -CCOMP ?= ccomp -CFLAGS ?= -O2 -SIMU ?= k1-mppa -TIMEOUT ?= 10s - -K1CCPATH=$(shell which $(K1CC)) -CCPATH=$(shell which $(CC)) -CCOMPPATH=$(shell which $(CCOMP)) -SIMUPATH=$(shell which $(SIMU)) - -PRNG=../prng/prng.c - -ALL= mmult-test-gcc-x86 mmult-test-gcc-k1c mmult-test-ccomp-k1c -CCOMP_OUT= mmult-test-ccomp-k1c.out -GCC_OUT= mmult-test-gcc-k1c.out -X86_GCC_OUT= mmult-test-gcc-x86.out -STUB_OUT=.zero - -all: $(ALL) - -mmult-test-gcc-x86: mmult.c $(PRNG) $(CCPATH) - $(CC) $(CFLAGS) $(filter-out $(CCPATH),$^) -o $@ - -mmult-test-gcc-k1c: mmult.c $(PRNG) $(K1CCPATH) - $(K1CC) $(CFLAGS) $(filter-out $(K1CCPATH),$^) -o $@ - -mmult-test-ccomp-k1c: mmult.c $(PRNG) $(CCOMPPATH) - $(CCOMP) $(CFLAGS) $(filter-out $(CCOMPPATH),$^) -o $@ - -.SECONDARY: -%k1c.out: %k1c $(SIMUPATH) - ret=0; timeout $(TIMEOUT) $(SIMU) -- $< > $@ || { ret=$$?; }; echo $$ret >> $@ - -%x86.out: %x86 - ret=0; timeout $(TIMEOUT) ./$< > $@ || { ret=$$?; }; echo $$ret >> $@ - -.zero: - @echo "0" > $@ - -.PHONY: -test: test-x86 test-k1c - -.PHONY: -test-x86: $(X86_GCC_OUT) $(STUB_OUT) - @if ! diff $< $(STUB_OUT); then\ - >&2 echo "ERROR x86: $< failed";\ - else\ - echo "GOOD x86: $< succeeded";\ - fi - -.PHONY: -test-k1c: $(GCC_OUT) $(STUB_OUT) - @if ! diff $< $(STUB_OUT); then\ - >&2 echo "ERROR k1c: $< failed";\ - else\ - echo "GOOD k1c: $< succeeded";\ - fi - -.PHONY: -check: $(CCOMP_OUT) $(STUB_OUT) - @if ! diff $< $(STUB_OUT); then\ - >&2 echo "ERROR k1c: $< failed";\ - else\ - echo "GOOD k1c: $< succeeded";\ - fi diff --git a/test/mppa/mmult/README.md b/test/mppa/mmult/README.md deleted file mode 100644 index ef2bff7e..00000000 --- a/test/mppa/mmult/README.md +++ /dev/null @@ -1,17 +0,0 @@ -MMULT -===== - -Examples of matrix multiplication using different methods. - -We compute matrix multiplication using column-based matrix multiplication, then row-based, and finally block based. - -The test verifies that the result is the same on the three methods. If it is the same, 0 will be returned. - -The following commands can be run inside the folder: - -- `make`: produces the unitary test binaries - - `mmult-test-gcc-x86` : binary from gcc on x86 - - `mmult-test-k1c-x86` : binary from gcc on k1c - - `mmult-test-ccomp-x86` : binary from ccomp on k1c -- `make test`: tests the return value of the binaries produced by gcc. -- `make check`: tests the return value of the binary produced by CompCert. diff --git a/test/mppa/mmult/mmult.c b/test/mppa/mmult/mmult.c deleted file mode 100644 index aeb91d48..00000000 --- a/test/mppa/mmult/mmult.c +++ /dev/null @@ -1,146 +0,0 @@ -#include "../prng/types.h" -#include "../prng/prng.h" - -#define __UNIT_TEST_MMULT__ - -#ifdef __UNIT_TEST_MMULT__ -#define SIZE 10 -#else -#include "test.h" -#endif - -void mmult_row(uint64_t C[][SIZE], uint64_t A[][SIZE], uint64_t B[][SIZE]){ - int i, j, k; - - for (i = 0 ; i < SIZE ; i++) - for (j = 0 ; j < SIZE ; j++) - C[i][j] = 0; - - for (i = 0 ; i < SIZE ; i++) - for (j = 0 ; j < SIZE ; j++) - for (k = 0 ; k < SIZE ; k++) - C[i][j] += A[i][k] * B[k][j]; -} - -void mmult_col(uint64_t C[][SIZE], uint64_t A[][SIZE], uint64_t B[][SIZE]){ - int i, j, k; - - for (i = 0 ; i < SIZE ; i++) - for (j = 0 ; j < SIZE ; j++) - C[i][j] = 0; - - for (k = 0 ; k < SIZE ; k++) - for (i = 0 ; i < SIZE ; i++) - for (j = 0 ; j < SIZE ; j++) - C[i][j] += A[i][k] * B[k][j]; -} - -typedef struct mblock { - int imin, imax, jmin, jmax; - uint64_t *mat; -} mblock; - -#define MAT_XY(mat, x, y) (mat)[(x)*SIZE + (y)] -#define MAT_IJ(block, i, j) MAT_XY((block)->mat, (block)->imin + (i), block->jmin + (j)) - -void divac_mul(mblock *C, const mblock *A, const mblock *B){ - const int size = C->imax - C->imin; - int i, j, k; - - for (i = 0 ; i < size ; i++) - for (j = 0 ; j < size ; j++) - for (k = 0 ; k < size ; k++) - MAT_IJ(C, i, j) += MAT_IJ(A, i, k) * MAT_IJ(B, k, j); -} - -#define BLOCK_X_MID(block) ((block)->imin + (block)->imax) / 2 -#define BLOCK_Y_MID(block) ((block)->jmin + (block)->jmax) / 2 - -#define MAKE_MBLOCK(newb, block, I, J) \ - mblock newb = {.mat=(block)->mat};\ - if ((I) == 0){\ - newb.imin = (block)->imin;\ - newb.imax = BLOCK_X_MID((block));\ - } else {\ - newb.imin = BLOCK_X_MID((block));\ - newb.imax = (block)->imax;\ - } if ((J) == 0){\ - newb.jmin = (block)->jmin;\ - newb.jmax = BLOCK_Y_MID((block));\ - } else {\ - newb.jmin = BLOCK_Y_MID((block));\ - newb.jmax = (block)->jmax;\ - } - -void divac_part(mblock *C, const mblock *A, const mblock *B); - -void divac_wrap(mblock *C , char IC, char JC, - const mblock *A, char IA, char JA, - const mblock *B, char IB, char JB){ - MAKE_MBLOCK(Cb, C, IC, JC); - MAKE_MBLOCK(Ab, A, IA, JA); - MAKE_MBLOCK(Bb, B, IB, JB); - - divac_part(&Cb, &Ab, &Bb); -} - - -void divac_part(mblock *C, const mblock *A, const mblock *B){ - const int size = C->imax - C->imin; - - if (size % 2 == 1) - divac_mul(C, A, B); - else{ - /* C_00 = A_00 B_00 + A_01 B_10 */ - divac_wrap(C, 0, 0, A, 0, 0, B, 0, 0); - divac_wrap(C, 0, 0, A, 0, 1, B, 1, 0); - - /* C_10 = A_10 B_00 + A_11 B_10 */ - divac_wrap(C, 1, 0, A, 1, 0, B, 0, 0); - divac_wrap(C, 1, 0, A, 1, 1, B, 1, 0); - - /* C_01 = A_00 B_01 + A_01 B_11 */ - divac_wrap(C, 0, 1, A, 0, 0, B, 0, 1); - divac_wrap(C, 0, 1, A, 0, 1, B, 1, 1); - - /* C_11 = A_10 B_01 + A_11 B_11 */ - divac_wrap(C, 1, 1, A, 1, 0, B, 0, 1); - divac_wrap(C, 1, 1, A, 1, 1, B, 1, 1); - } - -} - -void mmult_divac(uint64_t C[][SIZE], uint64_t A[][SIZE], uint64_t B[][SIZE]){ - mblock Cb = {.mat = (uint64_t *) C, .imin = 0, .imax = SIZE, .jmin = 0, .jmax = SIZE}; - mblock Ab = {.mat = (uint64_t *) A , .imin = 0, .imax = SIZE, .jmin = 0, .jmax = SIZE}; - mblock Bb = {.mat = (uint64_t *) B , .imin = 0, .imax = SIZE, .jmin = 0, .jmax = SIZE}; - - divac_part(&Cb, &Ab, &Bb); -} - -#ifdef __UNIT_TEST_MMULT__ -static uint64_t C1[SIZE][SIZE], C2[SIZE][SIZE], C3[SIZE][SIZE]; -static uint64_t A[SIZE][SIZE], B[SIZE][SIZE]; - -int main(void){ - srand(42); - int i, j; - - for (i = 0 ; i < SIZE ; i++) - for (j = 0 ; j < SIZE ; j++){ - A[i][j] = randlong(); - B[i][j] = randlong(); - } - - mmult_row(C1, A, B); - mmult_col(C2, A, B); - mmult_divac(C3, A, B); - - for (i = 0 ; i < SIZE ; i++) - for (j = 0 ; j < SIZE ; j++) - if (!(C1[i][j] == C2[i][j] && C1[i][j] == C3[i][j])) - return -1; - - return 0; -} -#endif /* __UNIT_TEST_MMULT__ */ diff --git a/test/mppa/mmult/mmult.h b/test/mppa/mmult/mmult.h deleted file mode 100644 index 3721784a..00000000 --- a/test/mppa/mmult/mmult.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef __MMULT_H__ -#define __MMULT_H__ - -#include "../lib/types.h" - -void mmult_row(uint64_t *A, const uint64_t *B, const uint64_t *C); -void mmult_column(uint64_t *A, const uint64_t *B, const uint64_t *C); -void mmult_strassen(uint64_t *A, const uint64_t *B, const uint64_t *C); - -#endif /* __MMULT_H__ */ |