rdtsc命令で特定のプログラムの実行時間をクロック計測で求める方法について
質問
rdtsc命令でクロック計測をしようと思い、調べていたところ以下の資料にたどり着きました。
資料
こちらのページのToolsに掲載されていたプログラムをコンパイルし実行したところ、以下の結果を得ました。
rdtsc命令でクロック計測したいのは、行列の掛け算なのですが、現在実行しているプログラムをどのように使えば計測したいプログラムの実行時間を計測することができるでしょうか。
プログラム
実行結果
value: 1392111630540 delta: 0
value: 1392111630576 delta: 36
value: 1392111630598 delta: 22
value: 1392111630626 delta: 28
value: 1392111630640 delta: 14
value: 1392111630654 delta: 14
value: 1392111630672 delta: 18
value: 1392111630702 delta: 30
value: 1392111630718 delta: 16
value: 1392111630732 delta: 14
value: 1392111630760 delta: 28
value: 1392111630774 delta: 14
value: 1392111630788 delta: 14
value: 1392111630816 delta: 28
value: 1392111630828 delta: 12
value: 1392111630842 delta: 14
value: 1392111630856 delta: 14
value: 1392111630884 delta: 28
value: 1392111630898 delta: 14
value: 1392111630910 delta: 12
value: 1392111630924 delta: 14
(略)
value: 1392111632012 delta: 12
value: 1392111632038 delta: 26
value: 1392111632052 delta: 14
value: 1392111632064 delta: 12
value: 1392111632076 delta: 12
value: 1392111632106 delta: 30
value: 1392111632118 delta: 12
value: 1392111632130 delta: 12
value: 1392111632142 delta: 12
value: 1392111632170 delta: 28
value: 1392111632182 delta: 12
value: 1392111632196 delta: 14
value: 1392111632224 delta: 28
value: 1392111632238 delta: 14
value: 1392111632250 delta: 12
value: 1392111632262 delta: 12
value: 1392111632290 delta: 28
=====
value: 1392112066122 delta: 1392112066122
value: 1392112069948 delta: 3826
value: 1392112073782 delta: 3834
value: 1392112077324 delta: 3542
(略)
value: 1392112390816 delta: 3434
value: 1392112394684 delta: 3868
value: 1392112398372 delta: 3688
value: 1392112402150 delta: 3778
value: 1392112406074 delta: 3924
value: 1392112409476 delta: 3402
value: 1392112412772 delta: 3296
value: 1392112417012 delta: 4240
実行プログラム
#include <stdio.h>
#if defined(__i386__)
static __inline__ unsigned long long rdtsc(void)
{
unsigned long long int x;
__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
return x;
}
#elif defined(__x86_64__)
static __inline__ unsigned long long rdtsc(void)
{
unsigned hi, lo;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}
#elif defined(__powerpc__)
static __inline__ unsigned long long rdtsc(void)
{
unsigned long long int result=0;
unsigned long int upper, lower,tmp;
__asm__ volatile(
"0: \n"
"\tmftbu %0 \n"
"\tmftb %1 \n"
"\tmftbu %2 \n"
"\tcmpw %2,%0 \n"
"\tbne 0b \n"
: "=r"(upper),"=r"(lower),"=r"(tmp)
);
result = upper;
result = result<<32;
result = result|lower;
return(result);
}
#endif
main()
{
int i;
#define MAX 100
unsigned long long int vals[MAX];
unsigned long long int lastval = 0, thisval;
for ( i = 0 ; i < MAX ; i++ )
vals[i] = 1;
for ( i = 0 ; i < MAX ; i++ )
vals[i] = rdtsc();
for ( i = 0 ; i < MAX ; i++ )
printf("value: %llu delta: %llu\n",vals[i],
i ? vals[i]-vals[i-1] : 0);
printf("=====\n");
for ( i = 0 ; i < 100 ; i++ ) {
thisval = rdtsc();
printf("value: %llu delta: %llu\n",
thisval, thisval - lastval);
lastval = thisval;
}
}
実行時間を測定したいプログラム
#include<stdio.h>
#define N 2
int main(int argc, char *argv[])
{
double A[N][N] = {
{1.0, 2.0},
{2.0, 1.0}
};
double B[N][N] = {
{3.0, 1.0},
{0.0, 3.0}
};
double C[N][N] = {
{0.0, 0.0},
{0.0, 0.0}
};
int i, j, k;
for(i=0; i<N; i++)
for(j=0; j<N; j++)
for(k=0; k<N; k++)
C[i][j] += A[i][k]*B[k][j];
}