File: bench_smallops.c

package info (click to toggle)
libm4rie 20150908-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 2,520 kB
  • sloc: sh: 11,430; ansic: 9,873; makefile: 100
file content (136 lines) | stat: -rw-r--r-- 3,013 bytes parent folder | download | duplicates (4)
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <m4rie/m4rie.h>
#include "cpucycles.h"
#include "benchmarking.h"

struct smallops_params {
  rci_t k; 
  rci_t m;
  rci_t n;
  char const *algorithm;
};

int run_mzed_add(void *_p, unsigned long long *data, int *data_len) {
  struct smallops_params *p = (struct smallops_params *)_p;
  *data_len = 2;

  gf2e *ff = gf2e_init(irreducible_polynomials[p->k][1]);

  mzed_t *A = mzed_init(ff,p->m,p->n);
  mzed_randomize(A);
  mzed_t *B = mzed_init(ff,p->m,p->n);
  mzed_randomize(B);
  mzed_t *C = mzed_init(ff,p->m,p->n);

  data[0] = walltime(0);
  data[1] = cpucycles();

  mzed_add(C, A, B);

  data[1] = cpucycles() - data[1];
  data[0] = walltime(data[0]);

  mzed_free(A);
  mzed_free(B);
  mzed_free(C);

  gf2e_free(ff);
  return 0;
}


int run_mzed_slice(void *_p, unsigned long long *data, int *data_len) {
  struct smallops_params *p = (struct smallops_params *)_p;
  *data_len = 2;

  gf2e *ff = gf2e_init(irreducible_polynomials[p->k][1]);

  mzed_t *A = mzed_init(ff,p->m,p->n);
  mzed_randomize(A);
  mzd_slice_t *a = mzd_slice_init(ff,p->m,p->n);

  data[0] = walltime(0);
  data[1] = cpucycles();

  mzed_slice(a, A);

  data[1] = cpucycles() - data[1];
  data[0] = walltime(data[0]);

  mzed_free(A);
  mzd_slice_free(a);

  gf2e_free(ff);
  return 0;
}

int run_mzed_cling(void *_p, unsigned long long *data, int *data_len) {
  struct smallops_params *p = (struct smallops_params *)_p;
  *data_len = 2;

  gf2e *ff = gf2e_init(irreducible_polynomials[p->k][1]);

  mzd_slice_t *a = mzd_slice_init(ff,p->m,p->n);
  mzd_slice_randomize(a);
  mzed_t *A = mzed_init(ff, p->m, p->n);

  data[0] = walltime(0);
  data[1] = cpucycles();

  mzed_cling(A, a);

  data[1] = cpucycles() - data[1];
  data[0] = walltime(data[0]);

  mzed_free(A);
  mzd_slice_free(a);

  gf2e_free(ff);
  return 0;
}

void print_help() {
  printf("bench_smallops:\n\n");
  printf("REQUIRED\n");
  printf("  e -- integer between 2 and 10\n");
  printf("  m -- integer > 0\n");
  printf("  n -- integer > 0\n");
  printf("  what -- mze_cling\n");
  printf("          mzed_slice\n");
  printf("          mzed_add\n");
  printf("\n");
  bench_print_global_options(stdout);
}


int main(int argc, char **argv) {
  global_options(&argc, &argv);

  if (argc < 5) {
    print_help();
    m4ri_die("");
  }

  struct smallops_params params;

  params.k = atoi(argv[1]);
  params.m = atoi(argv[2]);
  params.n = atoi(argv[3]);

  srandom(17);
  unsigned long long data[2];

  if(strcmp(argv[4],"mzed_slice") == 0) {
    run_bench(run_mzed_slice, (void*)&params, data, 2);
  } else if(strcmp(argv[4],"mzed_cling") == 0) {
    run_bench(run_mzed_cling, (void*)&params, data, 2);
  } else if(strcmp(argv[4],"mzed_add") == 0) {
    run_bench(run_mzed_add, (void*)&params, data, 2);
  }


  double cc_per_op = ((double)data[1])/ ( (double)params.m * (double)params.n );

  printf("%s: m: %5d, n: %5d, cpu cycles: %10llu, cc/(mn): %.5lf, wall time: %lf\n", argv[4], params.m, params.n, data[1], cc_per_op, data[0] / 1000000.0);
}