-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsequential.cpp
More file actions
115 lines (81 loc) · 2.82 KB
/
sequential.cpp
File metadata and controls
115 lines (81 loc) · 2.82 KB
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
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#define PAD 2*sizeof(double)
using namespace std;
double** createMatrix(int dim, bool zeroes){
double **matrix = (double**) malloc(dim * sizeof(double*) * PAD);
for (int i = 0; i < dim; i++){
*(matrix + i) = (double*) malloc(dim * sizeof(double) + PAD);
for (int j = 0; j < dim; j++)
*(*(matrix + i) + j) = (zeroes)? 0.0 : (10.0*rand()/(RAND_MAX+1.0));
}
return matrix;
}
double** createMatrixWithZeroes(int dim){
return createMatrix(dim, 1);
}
int printMatrix(double **matrix, int dim){
for (int i = 0; i < dim; i++){
for (int j = 0; j < dim; j++)
printf("%.2f ", *(*(matrix + i) + j));
printf("\n");
}
printf("\n");
}
double ** createRandomMatrix(int dim){
return createMatrix(dim, 0);
}
void freeMatrix(double ***matrix, int dim){
for (int i = 0; i < dim; i++)
free(*(*matrix + i));
free(*matrix);
}
double** multiplyMatrix(double **matrixA, double **matrixB, double **matrixC, int dim, int threads){
double **answer = matrixC;
for (int i = 0; i < dim; i++){
for (int j = 0; j < dim; j++){
double cell = 0.0;
for (int n = 0; n < dim; n++)
cell += *(*(matrixA + i) + n) * *(*(matrixB + j) + n);
*(*(answer + i) + j) = cell;
}
}
return answer;
}
int main(){
int dim = 32;
int threads = 1;
printf("\n---------------------------------------------\n");
while (dim <= 2048){
double **matrixA = createRandomMatrix(dim);
double **matrixB = createRandomMatrix(dim);
double **matrixC = createMatrixWithZeroes(dim);
struct timeval start_time;
struct timeval end_time;
gettimeofday(&start_time, NULL);
matrixC = multiplyMatrix(matrixA, matrixB, matrixC, dim, threads);
gettimeofday(&end_time, NULL);
double seconds = (((1000.0*end_time.tv_sec) + (end_time.tv_usec/1000.0)) -
((1000.0*start_time.tv_sec) + (start_time.tv_usec/1000.0)))/1000.0;
//printf("\n");
//printf("matrix a\n");
//printMatrix(matrixA, dim);
//printf("matrix b\n");
//printMatrix(matrixB, dim);
//printf("matrix c\n");
//printMatrix(matrixC, dim);
printf("Taken time for a matrix of %dX%d with %d threads: %.5fs\n", dim, dim, threads, seconds);
freeMatrix(&matrixA, dim);
freeMatrix(&matrixB, dim);
freeMatrix(&matrixC, dim);
threads *= 2;
if (threads > 1){
printf("---------------------------------------------\n\n");
printf("---------------------------------------------\n");
threads = 1;
dim *= 2;
}
}
return 0;
}