10
#define DSFMT_MEXP 19937
12
#include "../../deps/random/randmtzig.c"
16
double *myrand(int n) {
17
double *d = (double *)malloc(n*sizeof(double));
18
dsfmt_gv_fill_array_close_open(d, n);
28
gettimeofday(&now, NULL);
29
return (double)now.tv_sec + (double)now.tv_usec/1.0e6;
33
return n < 2 ? n : fib(n-1) + fib(n-2);
36
long parse_int(const char *s, long base) {
39
for (unsigned int i=0; i<strlen(s); ++i) {
42
if (c >= '0' && c <= '9') d = c-'0';
43
else if (c >= 'A' && c <= 'Z') d = c-'A' + (int) 10;
44
else if (c >= 'a' && c <= 'z') d = c-'a' + (int) 10;
47
if (base <= d) exit(-1);
53
double *ones(int m, int n) {
54
double *a = (double *) malloc(m*n*sizeof(double));
55
for (int k=0; k<m*n; ++k) {
61
double *matmul_aat(int n, double *b) {
62
double *c = (double *) malloc(n*n*sizeof(double));
63
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasTrans, n, n, n, 1.0, b, n, b, n, 0.0, c, n);
67
int mandel(complex<double> z) {
69
complex<double> c = complex<double>(real(z), imag(z));
70
for (n=0; n<=79; ++n) {
82
for (double re=-2.0; re<=0.5; re+=0.1) {
83
for (double im=-1.0; im<=1.0; im+=0.1) {
84
int m = mandel(complex<double>(re, im));
91
void quicksort(double *a, int lo, int hi) {
95
double pivot = a[(lo+hi)/2];
98
while (a[i] < pivot) {
101
while (a[j] > pivot) {
113
// Recursion for quicksort
124
for (int j=0; j<500; ++j) {
126
for (int k=1; k<=10000; ++k) {
133
struct double_pair { double s1, s2; };
135
struct double_pair randmatstat(int t) {
137
struct double_pair r;
138
double *v = (double*)calloc(t,sizeof(double));
139
double *w = (double*)calloc(t,sizeof(double));
140
double *a = (double*)malloc((n)*(n)*sizeof(double));
141
double *b = (double*)malloc((n)*(n)*sizeof(double));
142
double *c = (double*)malloc((n)*(n)*sizeof(double));
143
double *d = (double*)malloc((n)*(n)*sizeof(double));
144
double *P = (double*)malloc((n)*(4*n)*sizeof(double));
145
double *Q = (double*)malloc((2*n)*(2*n)*sizeof(double));
146
double *PtP1 = (double*)malloc((4*n)*(4*n)*sizeof(double));
147
double *PtP2 = (double*)malloc((4*n)*(4*n)*sizeof(double));
148
double *QtQ1 = (double*)malloc((2*n)*(2*n)*sizeof(double));
149
double *QtQ2 = (double*)malloc((2*n)*(2*n)*sizeof(double));
150
for (int i=0; i < t; i++) {
151
randmtzig_fill_randn(a, n*n);
152
randmtzig_fill_randn(b, n*n);
153
randmtzig_fill_randn(c, n*n);
154
randmtzig_fill_randn(d, n*n);
155
memcpy(P+0*n*n, a, n*n*sizeof(double));
156
memcpy(P+1*n*n, b, n*n*sizeof(double));
157
memcpy(P+2*n*n, c, n*n*sizeof(double));
158
memcpy(P+3*n*n, d, n*n*sizeof(double));
159
for (int j=0; j < n; j++) {
160
for (int k=0; k < n; k++) {
163
Q[2*n*(n+j)+k] = c[k];
164
Q[2*n*(n+j)+n+k] = d[k];
167
cblas_dgemm(CblasColMajor, CblasTrans, CblasNoTrans,
168
n, n, 4*n, 1.0, P, 4*n, P, 4*n, 0.0, PtP1, 4*n);
169
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
170
4*n, 4*n, 4*n, 1.0, PtP1, 4*n, PtP1, 4*n, 0.0, PtP2, 4*n);
171
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
172
4*n, 4*n, 4*n, 1.0, PtP2, 4*n, PtP2, 4*n, 0.0, PtP1, 4*n);
173
for (int j=0; j < n; j++) {
174
v[i] += PtP1[(n+1)*j];
176
cblas_dgemm(CblasColMajor, CblasTrans, CblasNoTrans,
177
2*n, 2*n, 2*n, 1.0, Q, 2*n, Q, 2*n, 0.0, QtQ1, 2*n);
178
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
179
2*n, 2*n, 2*n, 1.0, QtQ1, 2*n, QtQ1, 2*n, 0.0, QtQ2, 2*n);
180
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
181
2*n, 2*n, 2*n, 1.0, QtQ2, 2*n, QtQ2, 2*n, 0.0, QtQ1, 2*n);
182
for (int j=0; j < 2*n; j++) {
183
w[i] += QtQ1[(2*n+1)*j];
196
double v1=0.0, v2=0.0, w1=0.0, w2=0.0;
197
for (int i=0; i < t; i++) {
198
v1 += v[i]; v2 += v[i]*v[i];
199
w1 += w[i]; w2 += w[i]*w[i];
203
r.s1 = sqrt((t*(t*v2-v1*v1))/((t-1)*v1*v1));
204
r.s2 = sqrt((t*(t*w2-w1*w1))/((t-1)*w1*w1));
208
double *randmatmul(int n) {
209
double *A = myrand(n*n);
210
double *B = myrand(n*n);
211
double *C = (double*)malloc(n*n*sizeof(double));
212
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
213
n, n, n, 1.0, A, n, B, n, 0.0, C, n);
219
void printfd(int n) {
220
FILE *f = fopen("/dev/null", "w");
222
for (i = 0; i < n; i++)
223
fprintf(f, "%ld %ld\n", i, i);
227
void print_perf(const char *name, double t) {
228
printf("c,%s,%.6f\n", name, t*1000);
233
dsfmt_gv_init_gen_rand(0);
238
assert(fib(20) == 6765);
241
for (int i=0; i<NITER; ++i) {
245
if (t < tmin) tmin = t;
247
print_perf("fib", tmin);
251
for (int i=0; i<NITER; ++i) {
254
for (int k=0; k<1000; ++k) {
255
uint32_t n = dsfmt_gv_genrand_uint32();
257
uint32_t m = (uint32_t)parse_int(s, 16);
261
if (t < tmin) tmin = t;
263
print_perf("parse_int", tmin);
265
// // array constructor
267
// for (int i=0; i<NITER; ++i) {
269
// double *a = ones(200,200);
271
// t = clock_now()-t;
272
// if (t < tmin) tmin = t;
274
// print_perf("ones", tmin);
277
// //SUBROUTINE DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)
278
// double *b = ones(200, 200);
280
// for (int i=0; i<NITER; ++i) {
282
// double *c = matmul_aat(200, b);
284
// t = clock_now()-t;
285
// if (t < tmin) tmin = t;
288
// print_perf("AtA", tmin);
293
for (int i=0; i<NITER; ++i) {
295
mandel_sum = mandelperf();
297
if (t < tmin) tmin = t;
299
assert(mandel_sum == 14720);
300
print_perf("mandel", tmin);
304
for (int i=0; i<NITER; ++i) {
306
double *d = myrand(5000);
307
quicksort(d, 0, 5000-1);
310
if (t < tmin) tmin = t;
312
print_perf("quicksort", tmin);
317
for (int i=0; i<NITER; ++i) {
321
if (t < tmin) tmin = t;
323
assert(fabs(pi-1.644834071848065) < 1e-12);
324
print_perf("pi_sum", tmin);
327
struct double_pair r;
329
for (int i=0; i<NITER; ++i) {
331
r = randmatstat(1000);
333
if (t < tmin) tmin = t;
335
// assert(0.5 < r.s1 && r.s1 < 1.0 && 0.5 < r.s2 && r.s2 < 1.0);
336
print_perf("rand_mat_stat", tmin);
340
for (int i=0; i<NITER; ++i) {
342
double *C = randmatmul(1000);
346
if (t < tmin) tmin = t;
348
print_perf("rand_mat_mul", tmin);
352
for (int i=0; i<NITER; ++i) {
356
if (t < tmin) tmin = t;
358
print_perf("printfd", tmin);