#include #include #include #include #include "tests.h" #include "matrix.h" #define STR_FMT(str, ...) \ do { \ int tmp = asprintf(&(str), __VA_ARGS__); \ if (tmp < 0) str = NULL; \ } while (0) #define TIMER(_dt, ...) \ do { \ clock_t _t; \ _t = clock(); \ (__VA_ARGS__); \ *_dt = ((double) (clock() - _t)) / CLOCKS_PER_SEC; \ } while (0) #define MATRIX_BM_BOUND_L 0 #define MATRIX_BM_BOUND_U 100 #define MATRIX_BM_N_SAMPLES 100 #define MATRIX_BM_TYPE MATRIX_NONE #define BENCHMARK_RAND1(m, n, func, details_str, ...) \ do { \ double _samples[MATRIX_BM_N_SAMPLES]; \ for (int i = 0; i < MATRIX_BM_N_SAMPLES; ++i) \ { \ Matrix *_A = matrix_rand((m), (n), MATRIX_BM_BOUND_L, MATRIX_BM_BOUND_U, MATRIX_BM_TYPE); \ TIMER(&_samples[i], \ func(_A, ##__VA_ARGS__) \ ); \ matrix_free(_A); \ } \ print_bm(#func, (details_str), _samples, MATRIX_BM_N_SAMPLES); \ } while(0) #define BENCHMARK_RAND2(m1, n1, m2, n2, func, details_str, ...) \ do { \ double _samples[MATRIX_BM_N_SAMPLES]; \ for (int i = 0; i < MATRIX_BM_N_SAMPLES; ++i) \ { \ Matrix *_A = matrix_rand((m1), (n1), MATRIX_BM_BOUND_L, MATRIX_BM_BOUND_U, MATRIX_BM_TYPE); \ Matrix *_B = matrix_rand((m2), (n2), MATRIX_BM_BOUND_L, MATRIX_BM_BOUND_U, MATRIX_BM_TYPE); \ TIMER(&_samples[i], \ func(_A, _B, ##__VA_ARGS__) \ ); \ matrix_free_many(2, _A, _B); \ } \ print_bm(#func, (details_str), _samples, MATRIX_BM_N_SAMPLES); \ } while(0) void print_bm(char *func_str, char *details_str, double samples[], size_t n_samples) { double max = samples[0], min = samples[0], sum = 0; for (size_t i = 0; i < n_samples; ++i) { if (samples[i] > max) max = samples[i]; else if (samples[i] < min) min = samples[i]; sum += samples[i]; } printf("BENCHMARK (CPU time in s)\n"); printf("---------------------\n"); printf("Function : %s\n", func_str); if (details_str[0] != '\0') printf("Details : %s\n", details_str); printf("Total (%ld samples) : %f\n", n_samples, sum); printf("Avg. : %f\n", sum / n_samples); printf("Max : %f\n", max); printf("Min : %f\n", min); } int main() { srand(time(NULL)); /* run_tests() */ int n = 100; BENCHMARK_RAND1( n, n, matrix_swap, "rows", MATRIX_SWAP_ROWS, 0, 1 ); printf("\n"); BENCHMARK_RAND1( n, n, matrix_swap1, "rows", MATRIX_SWAP_ROWS, 0, 1 ); printf("\n"); BENCHMARK_RAND2( n, n, n, n, matrix_eq, "", 0.01 ); printf("\n"); BENCHMARK_RAND2( n, n, n, n, matrix_add, "" ); }