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