3
#define DSFMT_MEXP 19937
5
#include "../../deps/random/randmtzig.c"
7
double *myrand(int n) {
8
double *d = (double *)malloc(n*sizeof(double));
9
dsfmt_gv_fill_array_close_open(d, n);
19
gettimeofday(&now, NULL);
20
return (double)now.tv_sec + (double)now.tv_usec/1.0e6;
24
return n < 2 ? n : fib(n-1) + fib(n-2);
27
long parse_int(const char *s, long base) {
30
for (unsigned int i=0; i<strlen(s); ++i) {
33
if (c >= '0' && c <= '9') d = c-'0';
34
else if (c >= 'A' && c <= 'Z') d = c-'A' + (int) 10;
35
else if (c >= 'a' && c <= 'z') d = c-'a' + (int) 10;
38
if (base <= d) exit(-1);
44
double *ones(int m, int n) {
45
double *a = (double *) malloc(m*n*sizeof(double));
46
for (int k=0; k<m*n; ++k) {
52
double *matmul_aat(int n, double *b) {
53
double *c = (double *) malloc(n*n*sizeof(double));
54
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasTrans, n, n, n, 1.0, b, n, b, n, 0.0, c, n);
58
int mandel(double complex z) {
61
for (n=0; n<=79; ++n) {
73
for (double re=-2.0; re<=0.5; re+=0.1) {
74
for (double im=-1.0; im<=1.0; im+=0.1) {
75
int m = mandel(re+im*I);
82
void quicksort(double *a, int lo, int hi) {
86
double pivot = a[(lo+hi)/2];
89
while (a[i] < pivot) {
92
while (a[j] > pivot) {
104
// Recursion for quicksort
115
for (int j=0; j<500; ++j) {
117
for (int k=1; k<=10000; ++k) {
124
struct double_pair { double s1, s2; };
126
struct double_pair randmatstat(int t) {
128
struct double_pair r;
129
double *v = (double*)calloc(t,sizeof(double));
130
double *w = (double*)calloc(t,sizeof(double));
131
double *a = (double*)malloc((n)*(n)*sizeof(double));
132
double *b = (double*)malloc((n)*(n)*sizeof(double));
133
double *c = (double*)malloc((n)*(n)*sizeof(double));
134
double *d = (double*)malloc((n)*(n)*sizeof(double));
135
double *P = (double*)malloc((n)*(4*n)*sizeof(double));
136
double *Q = (double*)malloc((2*n)*(2*n)*sizeof(double));
137
double *PtP1 = (double*)malloc((4*n)*(4*n)*sizeof(double));
138
double *PtP2 = (double*)malloc((4*n)*(4*n)*sizeof(double));
139
double *QtQ1 = (double*)malloc((2*n)*(2*n)*sizeof(double));
140
double *QtQ2 = (double*)malloc((2*n)*(2*n)*sizeof(double));
141
for (int i=0; i < t; i++) {
142
randmtzig_fill_randn(a, n*n);
143
randmtzig_fill_randn(b, n*n);
144
randmtzig_fill_randn(c, n*n);
145
randmtzig_fill_randn(d, n*n);
146
memcpy(P+0*n*n, a, n*n*sizeof(double));
147
memcpy(P+1*n*n, b, n*n*sizeof(double));
148
memcpy(P+2*n*n, c, n*n*sizeof(double));
149
memcpy(P+3*n*n, d, n*n*sizeof(double));
150
for (int j=0; j < n; j++) {
151
for (int k=0; k < n; k++) {
154
Q[2*n*(n+j)+k] = c[k];
155
Q[2*n*(n+j)+n+k] = d[k];
158
cblas_dgemm(CblasColMajor, CblasTrans, CblasNoTrans,
159
n, n, 4*n, 1.0, P, 4*n, P, 4*n, 0.0, PtP1, 4*n);
160
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
161
4*n, 4*n, 4*n, 1.0, PtP1, 4*n, PtP1, 4*n, 0.0, PtP2, 4*n);
162
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
163
4*n, 4*n, 4*n, 1.0, PtP2, 4*n, PtP2, 4*n, 0.0, PtP1, 4*n);
164
for (int j=0; j < n; j++) {
165
v[i] += PtP1[(n+1)*j];
167
cblas_dgemm(CblasColMajor, CblasTrans, CblasNoTrans,
168
2*n, 2*n, 2*n, 1.0, Q, 2*n, Q, 2*n, 0.0, QtQ1, 2*n);
169
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
170
2*n, 2*n, 2*n, 1.0, QtQ1, 2*n, QtQ1, 2*n, 0.0, QtQ2, 2*n);
171
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
172
2*n, 2*n, 2*n, 1.0, QtQ2, 2*n, QtQ2, 2*n, 0.0, QtQ1, 2*n);
173
for (int j=0; j < 2*n; j++) {
174
w[i] += QtQ1[(2*n+1)*j];
187
double v1=0.0, v2=0.0, w1=0.0, w2=0.0;
188
for (int i=0; i < t; i++) {
189
v1 += v[i]; v2 += v[i]*v[i];
190
w1 += w[i]; w2 += w[i]*w[i];
194
r.s1 = sqrt((t*(t*v2-v1*v1))/((t-1)*v1*v1));
195
r.s2 = sqrt((t*(t*w2-w1*w1))/((t-1)*w1*w1));
199
double *randmatmul(int n) {
200
double *A = myrand(n*n);
201
double *B = myrand(n*n);
202
double *C = (double*)malloc(n*n*sizeof(double));
203
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
204
n, n, n, 1.0, A, n, B, n, 0.0, C, n);
210
void printfd(int n) {
211
FILE *f = fopen("/dev/null", "w");
213
for (i = 0; i < n; i++)
214
fprintf(f, "%ld %ld\n", i, i);
218
void print_perf(const char *name, double t) {
219
printf("c,%s,%.6f\n", name, t*1000);
224
dsfmt_gv_init_gen_rand(0);
229
assert(fib(20) == 6765);
232
for (int i=0; i<NITER; ++i) {
236
if (t < tmin) tmin = t;
238
print_perf("fib", tmin);
242
for (int i=0; i<NITER; ++i) {
245
for (int k=0; k<1000; ++k) {
246
uint32_t n = dsfmt_gv_genrand_uint32();
248
uint32_t m = (uint32_t)parse_int(s, 16);
252
if (t < tmin) tmin = t;
254
print_perf("parse_int", tmin);
256
// // array constructor
258
// for (int i=0; i<NITER; ++i) {
260
// double *a = ones(200,200);
262
// t = clock_now()-t;
263
// if (t < tmin) tmin = t;
265
// print_perf("ones", tmin);
268
// //SUBROUTINE DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)
269
// double *b = ones(200, 200);
271
// for (int i=0; i<NITER; ++i) {
273
// double *c = matmul_aat(200, b);
275
// t = clock_now()-t;
276
// if (t < tmin) tmin = t;
279
// print_perf("AtA", tmin);
284
for (int i=0; i<NITER; ++i) {
286
mandel_sum = mandelperf();
288
if (t < tmin) tmin = t;
290
assert(mandel_sum == 14719);
291
print_perf("mandel", tmin);
295
for (int i=0; i<NITER; ++i) {
297
double *d = myrand(5000);
298
quicksort(d, 0, 5000-1);
301
if (t < tmin) tmin = t;
303
print_perf("quicksort", tmin);
308
for (int i=0; i<NITER; ++i) {
312
if (t < tmin) tmin = t;
314
assert(fabs(pi-1.644834071848065) < 1e-12);
315
print_perf("pi_sum", tmin);
318
struct double_pair r;
320
for (int i=0; i<NITER; ++i) {
322
r = randmatstat(1000);
324
if (t < tmin) tmin = t;
326
// assert(0.5 < r.s1 && r.s1 < 1.0 && 0.5 < r.s2 && r.s2 < 1.0);
327
print_perf("rand_mat_stat", tmin);
331
for (int i=0; i<NITER; ++i) {
333
double *C = randmatmul(1000);
337
if (t < tmin) tmin = t;
339
print_perf("rand_mat_mul", tmin);
343
for (int i=0; i<NITER; ++i) {
347
if (t < tmin) tmin = t;
349
print_perf("printfd", tmin);