Skip to content

Instantly share code, notes, and snippets.

@kevroletin
Created December 1, 2010 21:39
Show Gist options
  • Save kevroletin/724276 to your computer and use it in GitHub Desktop.
Save kevroletin/724276 to your computer and use it in GitHub Desktop.
#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