diff options
Diffstat (limited to 'test/mppa/mmult/mmult.c')
-rw-r--r-- | test/mppa/mmult/mmult.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/test/mppa/mmult/mmult.c b/test/mppa/mmult/mmult.c new file mode 100644 index 00000000..04ac4605 --- /dev/null +++ b/test/mppa/mmult/mmult.c @@ -0,0 +1,54 @@ +#include "../lib/types.h" +#include "../lib/prng.h" + +#ifdef __UNIT_TEST_MMULT__ +#define SIZE 50 +#else +#include "test.h" +#endif + +void mmult_row(uint64_t C[][SIZE], uint64_t A[][SIZE], uint64_t B[][SIZE]){ + for (int i = 0 ; i < SIZE ; i++) + for (int j = 0 ; j < SIZE ; j++) + C[i][j] = 0; + + for (int i = 0 ; i < SIZE ; i++) + for (int j = 0 ; j < SIZE ; j++) + for (int 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]){ + for (int i = 0 ; i < SIZE ; i++) + for (int j = 0 ; j < SIZE ; j++) + C[i][j] = 0; + + for (int k = 0 ; k < SIZE ; k++) + for (int i = 0 ; i < SIZE ; i++) + for (int j = 0 ; j < SIZE ; j++) + C[i][j] += A[i][k] * B[k][j]; +} + +#ifdef __UNIT_TEST_MMULT__ +static uint64_t C1[SIZE][SIZE], C2[SIZE][SIZE], A[SIZE][SIZE], B[SIZE][SIZE]; + +int main(void){ + srand(42); + + for (int i = 0 ; i < SIZE ; i++) + for (int j = 0 ; j < SIZE ; j++){ + A[i][j] = randlong(); + B[i][j] = randlong(); + } + + mmult_row(C1, A, B); + mmult_col(C2, A, B); + + for (int i = 0 ; i < SIZE ; i++) + for (int j = 0 ; j < SIZE ; j++) + if (C1[i][j] != C2[i][j]) + return -1; + + return 0; +} +#endif /* __UNIT_TEST_MMULT__ */ |