-
Notifications
You must be signed in to change notification settings - Fork 0
/
ex01_example.cpp
89 lines (68 loc) · 2.21 KB
/
ex01_example.cpp
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
#include "Timer.h"
#include <iostream>
#include <vector>
extern "C" {
#include <cblas.h>
}
#ifdef USE_LIKWID
extern "C" {
#include <likwid.h>
}
#endif
int main()
{
const int M = 3;
const int N = 2;
const int K = 3;
double A[ M * K ] = { 1.0, 2.0, 3.0,
2.0, 4.0, 6.0,
3.0, 6.0, 9.0 };
const int lda = 3;
double B[ K * N ] = { 1.0, 2.0,
2.0, 4.0,
3.0, 6.0 };
const int ldb = 2;
double C[ M * N ] = { -1.0, -1.0,
-1.0, -1.0,
-1.0, -1.0 };
const int ldc = 2;
#ifdef USE_LIKWID
likwid_markerInit();
likwid_markerStartRegion( "array" );
#endif
siwir::Timer timer;
for( int i = 0; i < 10000; ++i )
cblas_dgemm( CblasRowMajor, CblasNoTrans, CblasNoTrans, M, N, K, 1.0, A, lda, B, ldb, 0.0, C, ldc );
double time = timer.elapsed();
#ifdef USE_LIKWID
likwid_markerStopRegion( "array" );
#endif
std::cout << "Calculation took " << time << " seconds\nC =\n"
<< " " << C[0] << " " << C[1] << "\n"
<< " " << C[2] << " " << C[3] << "\n"
<< " " << C[4] << " " << C[5] << "\n\n";
////////////////
// C++ vector //
////////////////
std::vector< double > vA{ 1.0, 2.0, 3.0, 2.0, 4.0, 6.0, 3.0, 6.0, 9.0 };
std::vector< double > vB( K * N );
vB[0] = 1.0; vB[1] = 2.0;
vB[2] = 2.0; vB[3] = 4.0;
vB[4] = 3.0; vB[5] = 6.0;
std::vector< double > vC( M * N, -1.0 );
#ifdef USE_LIKWID
likwid_markerStartRegion( "vector" );
#endif
timer.reset();
for( int i = 0; i < 10000; ++i )
cblas_dgemm( CblasRowMajor, CblasNoTrans, CblasNoTrans, M, N, K, 1.0, vA.data(), lda, vB.data(), ldb, 0.0, vC.data(), ldc );
time = timer.elapsed();
#ifdef USE_LIKWID
likwid_markerStopRegion( "vector" );
likwid_markerClose();
#endif
std::cout << "Calculation took " << time << " seconds\nvC =\n"
<< " " << vC[0] << " " << vC[1] << "\n"
<< " " << vC[2] << " " << vC[3] << "\n"
<< " " << vC[4] << " " << vC[5] << "\n\n";
}