summaryrefslogtreecommitdiff
path: root/debug.c
blob: 22a718b351e431a4968b547e5fb349ca4fc99334 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

#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,
            ""
            );
}