Created
December 1, 2010 21:39
-
-
Save kevroletin/724276 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <stdio.h> | |
#include <math.h> | |
//---------- MEGA PROFILER ---------- | |
unsigned long long __time1, __time2, __dt, __min_dt; | |
#define TEST_HEAD(REPEAT_TIMES)\ | |
__min_dt = 0xffffffff;\ | |
for (int __i = 0; __i < REPEAT_TIMES; ++__i)\ | |
{\ | |
#define TEST_START \ | |
asm volatile (\ | |
"lfence;"\ | |
"rdtsc;"\ | |
"movl %%eax, __time1;"\ | |
"movl %%edx, __time1+4;"\ | |
:\ | |
:\ | |
:"edx", "eax"\ | |
);\ | |
#define TEST_FIN(RES)\ | |
asm volatile (\ | |
"lfence;"\ | |
"rdtsc;"\ | |
"movl %%eax, __time2;"\ | |
"movl %%edx, __time2+4;" \ | |
:\ | |
:\ | |
:"edx", "eax"\ | |
);\ | |
__dt = __time2 - __time1;\ | |
if (__dt < __min_dt) __min_dt = __dt;\ | |
}\ | |
RES = __min_dt;\ | |
//-------------------- | |
typedef int Matrix[4][4]; | |
unsigned long long ov, res; | |
int main() | |
{ | |
TEST_HEAD(1000); | |
TEST_START; | |
TEST_FIN(ov); | |
std::cout << "min overhead: " << ov << "\n"; | |
//---------- Matrix Multiplication ---------- | |
Matrix a, b, c; | |
int i, j, k; | |
int c_cnt = 10000; | |
TEST_HEAD(c_cnt) | |
TEST_START | |
{ | |
for (i = 0; i < 4; ++i) | |
for (j = 0; j < 4; ++j) | |
{ | |
c[i][j] = a[i][0] * b[0][i]; | |
for (k = 1; k < 4; ++k) | |
c[i][j] += a[i][k] * b[k][j]; | |
} | |
} | |
TEST_FIN(res); | |
std::cout << "3 cicles: " << res - ov << "\n"; | |
TEST_HEAD(c_cnt) | |
TEST_START | |
{ | |
c[0][0] = a[0][0] * b[0][0]; | |
c[0][0] += a[0][1] * b[1][0]; | |
c[0][0] += a[0][2] * b[2][0]; | |
c[0][0] += a[0][3] * b[3][0]; | |
c[0][1] = a[0][0] * b[0][1]; | |
c[0][1] += a[0][1] * b[1][1]; | |
c[0][1] += a[0][2] * b[2][1]; | |
c[0][1] += a[0][3] * b[3][1]; | |
c[0][2] = a[0][0] * b[0][2]; | |
c[0][2] += a[0][1] * b[1][2]; | |
c[0][2] += a[0][2] * b[2][2]; | |
c[0][2] += a[0][3] * b[3][2]; | |
c[0][3] = a[0][0] * b[0][3]; | |
c[0][3] += a[0][1] * b[1][3]; | |
c[0][3] += a[0][2] * b[2][3]; | |
c[0][3] += a[0][3] * b[3][3]; | |
c[1][0] = a[1][0] * b[0][0]; | |
c[1][0] += a[1][1] * b[1][0]; | |
c[1][0] += a[1][2] * b[2][0]; | |
c[1][0] += a[1][3] * b[3][0]; | |
c[1][1] = a[1][0] * b[0][1]; | |
c[1][1] += a[1][1] * b[1][1]; | |
c[1][1] += a[1][2] * b[2][1]; | |
c[1][1] += a[1][3] * b[3][1]; | |
c[1][2] = a[1][0] * b[0][2]; | |
c[1][2] += a[1][1] * b[1][2]; | |
c[1][2] += a[1][2] * b[2][2]; | |
c[1][2] += a[1][3] * b[3][2]; | |
c[1][3] = a[1][0] * b[0][3]; | |
c[1][3] += a[1][1] * b[1][3]; | |
c[1][3] += a[1][2] * b[2][3]; | |
c[1][3] += a[1][3] * b[3][3]; | |
c[2][0] = a[2][0] * b[0][0]; | |
c[2][0] += a[2][1] * b[1][0]; | |
c[2][0] += a[2][2] * b[2][0]; | |
c[2][0] += a[2][3] * b[3][0]; | |
c[2][1] = a[2][0] * b[0][1]; | |
c[2][1] += a[2][1] * b[1][1]; | |
c[2][1] += a[2][2] * b[2][1]; | |
c[2][1] += a[2][3] * b[3][1]; | |
c[2][2] = a[2][0] * b[0][2]; | |
c[2][2] += a[2][1] * b[1][2]; | |
c[2][2] += a[2][2] * b[2][2]; | |
c[2][2] += a[2][3] * b[3][2]; | |
c[2][3] = a[2][0] * b[0][3]; | |
c[2][3] += a[2][1] * b[1][3]; | |
c[2][3] += a[2][2] * b[2][3]; | |
c[2][3] += a[2][3] * b[3][3]; | |
c[3][0] = a[3][0] * b[0][0]; | |
c[3][0] += a[3][1] * b[1][0]; | |
c[3][0] += a[3][2] * b[2][0]; | |
c[3][0] += a[3][3] * b[3][0]; | |
c[3][1] = a[3][0] * b[0][1]; | |
c[3][1] += a[3][1] * b[1][1]; | |
c[3][1] += a[3][2] * b[2][1]; | |
c[3][1] += a[3][3] * b[3][1]; | |
c[3][2] = a[3][0] * b[0][2]; | |
c[3][2] += a[3][1] * b[1][2]; | |
c[3][2] += a[3][2] * b[2][2]; | |
c[3][2] += a[3][3] * b[3][2]; | |
c[3][3] = a[3][0] * b[0][3]; | |
c[3][3] += a[3][1] * b[1][3]; | |
c[3][3] += a[3][2] * b[2][3]; | |
c[3][3] += a[3][3] * b[3][3]; | |
} | |
TEST_FIN(res); | |
std::cout << "by hand: " << res - ov << "\n"; | |
TEST_HEAD(c_cnt) | |
TEST_START | |
{ | |
c[0][0] = a[0][0] * b[0][0]; | |
c[0][0] += a[0][1] * b[1][0]; | |
c[0][0] += a[0][2] * b[2][0]; | |
c[0][0] += a[0][3] * b[3][0]; | |
c[0][1] = a[0][0] * b[0][1]; | |
c[0][1] += a[0][1] * b[1][1]; | |
c[0][1] += a[0][2] * b[2][1]; | |
c[0][1] += a[0][3] * b[3][1]; | |
c[0][2] = a[0][0] * b[0][2]; | |
c[0][2] += a[0][1] * b[1][2]; | |
c[0][2] += a[0][2] * b[2][2]; | |
c[0][2] += a[0][3] * b[3][2]; | |
c[0][3] = a[0][0] * b[0][3]; | |
c[0][3] += a[0][1] * b[1][3]; | |
c[0][3] += a[0][2] * b[2][3]; | |
c[0][3] += a[0][3] * b[3][3]; | |
c[1][0] = a[1][0] * b[0][0]; | |
c[1][0] += a[1][1] * b[1][0]; | |
c[1][0] += a[1][2] * b[2][0]; | |
c[1][0] += a[1][3] * b[3][0]; | |
c[1][1] = a[1][0] * b[0][1]; | |
c[1][1] += a[1][1] * b[1][1]; | |
c[1][1] += a[1][2] * b[2][1]; | |
c[1][1] += a[1][3] * b[3][1]; | |
c[1][2] = a[1][0] * b[0][2]; | |
c[1][2] += a[1][1] * b[1][2]; | |
c[1][2] += a[1][2] * b[2][2]; | |
c[1][2] += a[1][3] * b[3][2]; | |
c[1][3] = a[1][0] * b[0][3]; | |
c[1][3] += a[1][1] * b[1][3]; | |
c[1][3] += a[1][2] * b[2][3]; | |
c[1][3] += a[1][3] * b[3][3]; | |
c[2][0] = a[2][0] * b[0][0]; | |
c[2][0] += a[2][1] * b[1][0]; | |
c[2][0] += a[2][2] * b[2][0]; | |
c[2][0] += a[2][3] * b[3][0]; | |
c[2][1] = a[2][0] * b[0][1]; | |
c[2][1] += a[2][1] * b[1][1]; | |
c[2][1] += a[2][2] * b[2][1]; | |
c[2][1] += a[2][3] * b[3][1]; | |
c[2][2] = a[2][0] * b[0][2]; | |
c[2][2] += a[2][1] * b[1][2]; | |
c[2][2] += a[2][2] * b[2][2]; | |
c[2][2] += a[2][3] * b[3][2]; | |
c[2][3] = a[2][0] * b[0][3]; | |
c[2][3] += a[2][1] * b[1][3]; | |
c[2][3] += a[2][2] * b[2][3]; | |
c[2][3] += a[2][3] * b[3][3]; | |
c[3][0] = a[3][0] * b[0][0]; | |
c[3][0] += a[3][1] * b[1][0]; | |
c[3][0] += a[3][2] * b[2][0]; | |
c[3][0] += a[3][3] * b[3][0]; | |
c[3][1] = a[3][0] * b[0][1]; | |
c[3][1] += a[3][1] * b[1][1]; | |
c[3][1] += a[3][2] * b[2][1]; | |
c[3][1] += a[3][3] * b[3][1]; | |
c[3][2] = a[3][0] * b[0][2]; | |
c[3][2] += a[3][1] * b[1][2]; | |
c[3][2] += a[3][2] * b[2][2]; | |
c[3][2] += a[3][3] * b[3][2]; | |
c[3][3] = a[3][0] * b[0][3]; | |
c[3][3] += a[3][1] * b[1][3]; | |
c[3][3] += a[3][2] * b[2][3]; | |
c[3][3] += a[3][3] * b[3][3]; | |
int tmp; | |
tmp = a[1][0]; a[1][0] = a[0][1]; a[0][1] = tmp; | |
tmp = a[2][0]; a[2][0] = a[0][2]; a[0][2] = tmp; | |
tmp = a[2][1]; a[2][1] = a[1][2]; a[1][2] = tmp; | |
tmp = a[3][0]; a[3][0] = a[0][3]; a[0][3] = tmp; | |
tmp = a[3][1]; a[3][1] = a[1][3]; a[1][3] = tmp; | |
tmp = a[3][2]; a[3][2] = a[2][3]; a[2][3] = tmp; | |
} | |
TEST_FIN(res); | |
std::cout << "by hand(and transp): " << res - ov << "\n"; | |
TEST_HEAD(c_cnt) | |
TEST_START | |
{ | |
int tmp; | |
tmp = b[1][0]; b[1][0] = b[0][1]; b[0][1] = tmp; | |
tmp = b[2][0]; b[2][0] = b[0][2]; b[0][2] = tmp; | |
tmp = b[2][1]; b[2][1] = b[1][2]; b[1][2] = tmp; | |
tmp = b[3][0]; b[3][0] = b[0][3]; b[0][3] = tmp; | |
tmp = b[3][1]; b[3][1] = b[1][3]; b[1][3] = tmp; | |
tmp = b[3][2]; b[3][2] = b[2][3]; b[2][3] = tmp; | |
c[0][0] = a[0][0] * b[0][0]; | |
c[0][0] += a[0][1] * b[0][1]; | |
c[0][0] += a[0][2] * b[0][2]; | |
c[0][0] += a[0][3] * b[0][3]; | |
c[0][1] = a[0][0] * b[1][0]; | |
c[0][1] += a[0][1] * b[1][1]; | |
c[0][1] += a[0][2] * b[1][2]; | |
c[0][1] += a[0][3] * b[1][3]; | |
c[0][2] = a[0][0] * b[2][0]; | |
c[0][2] += a[0][1] * b[2][1]; | |
c[0][2] += a[0][2] * b[2][2]; | |
c[0][2] += a[0][3] * b[2][3]; | |
c[0][3] = a[0][0] * b[3][0]; | |
c[0][3] += a[0][1] * b[3][1]; | |
c[0][3] += a[0][2] * b[3][2]; | |
c[0][3] += a[0][3] * b[3][3]; | |
c[1][0] = a[1][0] * b[0][0]; | |
c[1][0] += a[1][1] * b[0][1]; | |
c[1][0] += a[1][2] * b[0][2]; | |
c[1][0] += a[1][3] * b[0][3]; | |
c[1][1] = a[1][0] * b[1][0]; | |
c[1][1] += a[1][1] * b[1][1]; | |
c[1][1] += a[1][2] * b[1][2]; | |
c[1][1] += a[1][3] * b[1][3]; | |
c[1][2] = a[1][0] * b[2][0]; | |
c[1][2] += a[1][1] * b[2][1]; | |
c[1][2] += a[1][2] * b[2][2]; | |
c[1][2] += a[1][3] * b[2][3]; | |
c[1][3] = a[1][0] * b[3][0]; | |
c[1][3] += a[1][1] * b[3][1]; | |
c[1][3] += a[1][2] * b[3][2]; | |
c[1][3] += a[1][3] * b[3][3]; | |
c[2][0] = a[2][0] * b[0][0]; | |
c[2][0] += a[2][1] * b[0][1]; | |
c[2][0] += a[2][2] * b[0][2]; | |
c[2][0] += a[2][3] * b[0][3]; | |
c[2][1] = a[2][0] * b[1][0]; | |
c[2][1] += a[2][1] * b[1][1]; | |
c[2][1] += a[2][2] * b[1][2]; | |
c[2][1] += a[2][3] * b[1][3]; | |
c[2][2] = a[2][0] * b[2][0]; | |
c[2][2] += a[2][1] * b[2][1]; | |
c[2][2] += a[2][2] * b[2][2]; | |
c[2][2] += a[2][3] * b[2][3]; | |
c[2][3] = a[2][0] * b[3][0]; | |
c[2][3] += a[2][1] * b[3][1]; | |
c[2][3] += a[2][2] * b[3][2]; | |
c[2][3] += a[2][3] * b[3][3]; | |
c[3][0] = a[3][0] * b[0][0]; | |
c[3][0] += a[3][1] * b[0][1]; | |
c[3][0] += a[3][2] * b[0][2]; | |
c[3][0] += a[3][3] * b[0][3]; | |
c[3][1] = a[3][0] * b[1][0]; | |
c[3][1] += a[3][1] * b[1][1]; | |
c[3][1] += a[3][2] * b[1][2]; | |
c[3][1] += a[3][3] * b[1][3]; | |
c[3][2] = a[3][0] * b[2][0]; | |
c[3][2] += a[3][1] * b[2][1]; | |
c[3][2] += a[3][2] * b[2][2]; | |
c[3][2] += a[3][3] * b[2][3]; | |
c[3][3] = a[3][0] * b[3][0]; | |
c[3][3] += a[3][1] * b[3][1]; | |
c[3][3] += a[3][2] * b[3][2]; | |
c[3][3] += a[3][3] * b[3][3]; | |
} | |
TEST_FIN(res); | |
std::cout << "by hand(with transposition): " << res - ov << "\n"; | |
TEST_HEAD(c_cnt) | |
TEST_START | |
{ | |
int tmp; | |
tmp = b[1][0]; b[1][0] = b[0][1]; b[0][1] = tmp; | |
tmp = b[2][0]; b[2][0] = b[0][2]; b[0][2] = tmp; | |
tmp = b[2][1]; b[2][1] = b[1][2]; b[1][2] = tmp; | |
tmp = b[3][0]; b[3][0] = b[0][3]; b[0][3] = tmp; | |
tmp = b[3][1]; b[3][1] = b[1][3]; b[1][3] = tmp; | |
tmp = b[3][2]; b[3][2] = b[2][3]; b[2][3] = tmp; | |
} | |
TEST_FIN(res); | |
std::cout << "transposition: " << res - ov << "\n"; | |
return 0; | |
} | |
/*---------- generator (with transposition ---------- | |
std::cout << "int tmp;\n"; | |
for (i = 0; i < 4; ++i) | |
for (j = 0; j < i; ++j) | |
std::cout << "tmp = b[" << i << "][" << j << "]; a[" | |
<< i << "][" << j << "] = b[" << j << "][" | |
<< i << "]; b[" << j << "][" << i << "] = tmp;\n"; | |
for (i = 0; i < 4; ++i) | |
for (j = 0; j < 4; ++j) | |
{ | |
std::cout << "c[" << i << "][" << j << "] = a[" | |
<< i << "][0] * b[" << j << "][0];\n" ; | |
for (k = 1; k < 4; ++k) | |
std::cout << "c[" << i << "][" << j << "] += a[" | |
<< i << "][" << k << "] * b[" | |
<< j << "][" << k << "];\n"; | |
} | |
*/ | |
/*---------- generator ---------- | |
for (i = 0; i < 4; ++i) | |
for (j = 0; j < 4; ++j) | |
{ | |
std::cout << "c[" << i << "][" << j << "] = a[" | |
<< i << "][0] * b[0][" << j << "];\n" ; | |
for (k = 1; k < 4; ++k) | |
std::cout << "c[" << i << "][" << j << "] += a[" | |
<< i << "][" << k << "] * b[" | |
<< k << "][" << j << "];\n"; | |
} | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment