我搜索并使用了许多方法来测量经过的时间。为此目的有很多问题。例如,this https://stackoverflow.com/questions/6749621/how-to-create-a-high-resolution-timer-in-linux-to-measure-program-performance/6749768#6749768问题很好,但是当你需要一个准确的时间记录器时我找不到一个好的方法。为此,我想在这里分享我的方法,供大家使用,如有错误,还望指正。
更新&注意:这个问题是针对Benchmarking的,不到一纳秒。和使用完全不一样clock_gettime(CLOCK_MONOTONIC,&start);
它记录的时间超过一纳秒。
UPDATE :衡量加速比的常用方法是重复程序中应进行基准测试的部分。但是,正如评论中提到的,当研究人员依赖自动矢量化时,它可能会显示出不同的优化。
NOTE它不够准确,无法测量一次重复所经过的时间。在某些情况下,我的结果表明该部分必须重复超过 1K 或 1M 才能获得最短的时间。
建议 :我不熟悉 shell 编程(只知道一些基本命令...)但是,也许可以测量最短时间,而无需在程序内重复。
我目前的解决方案为了防止分支,我使用宏重复颂歌部分#define REP_CODE(X) X X X... X X
其中 X 是我想要进行基准测试的代码部分,如下所示:
//numbers
#define FMAX1 MAX1*MAX1
#define COEFF 8
int __attribute__(( aligned(32))) input[FMAX1+COEFF]; //= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
int __attribute__(( aligned(32))) output[FMAX1];
int __attribute__(( aligned(32))) coeff[COEFF] = {1,2,3,4,5,6,7,8};//= {1,1,1,1,1,1,1,1};//; //= {1,2,1,2,1,2,1,2,2,1};
int main()
{
REP_CODE(
t1_rdtsc=_rdtsc();
//Code
for(i = 0; i < FMAX1; i++){
for(j = 0; j < COEFF; j++){//IACA_START
output[i] += coeff[j] * input[i+j];
}//IACA_END
}
t2_rdtsc=_rdtsc();
ttotal_rdtsc[ii++]=t2_rdtsc-t1_rdtsc;
)
// The smallest element in `ttotal_rdtsc` is the answer
}
这不会影响优化,但也会受到代码大小的限制,某些情况下编译时间会太多。
有什么建议和更正吗?
提前致谢。