我有一个任务,我需要制作一个基准程序来测试任何处理器的性能,使用两种排序算法(迭代算法和递归算法)。事情是我的老师告诉我,我必须创建三个不同的程序(即3个.c文件),每个排序算法两个(两个都必须从文本文件中读取整数,用\ n&s;和将相同的数字写入另一个文本文件但已排序)和基准程序。在基准程序中,我需要使用公式MIPs = NI / T * 10 ^ 6计算MIP(每秒百万条指令),其中NI是指令数,T是执行这些指令所需的时间。我必须能够通过计算其MIP然后求解T的等式来估计每个算法在任何处理器上所花费的时间,如EstimatedTime = NI / MIPs * 10 ^ 6。 我的问题是......我究竟如何用另一个程序衡量程序的性能?我从未做过类似的事情。我的意思是,我想我可以在C中使用TIME函数并测量执行X行和东西的时间,但是只有当所有3个函数(2个排序算法和1个基准函数)都在同一个程序中时我才能这样做。我甚至不知道如何开始。
哦,顺便说一句,我必须通过交叉编译从C到MIPS(asm语言)的排序算法并计算使用的指令数来计算指令数。
任何准则都将受到赞赏......我目前有这些功能:
答案 0 :(得分:0)
如何编译多个文件并将它们链接在一起取决于编译器。以GCC为例,它可以像
一样简单gcc -O3 -g3 -W -Wall -Wextra main.c sortalog1.c sortalgo_2.c [...] sortalgo_n.c -o sortingbenchmark
这不是最常用的方法,但对于这项任务来说还不错。
如果要计算操作码,最好将各个c文件单独编译为ASM。对要分析汇编程序输出的每个C文件执行以下操作:
gcc -c -S sortalgo_n.c
不要忘记将函数声明放入公共头文件中,并将其包含在您使用它们的任何位置!
对于基准测试:您确实知道每个C操作的ASM操作的数量,虽然这并不容易,但可以将该计数映射到C代码的每一行。如果你有这个,你所要做的就是增加一个计数器。例如:如果一行C代码转换为123个ASM操作码,则将计数器增加123.
您可以使用一个全局变量来执行此操作。如果每个排序算法使用多个线程,则需要注意添加是原子的(使用_Atomic
或互斥,或者您的OS /编译器/库提供的任何内容)。
答案 1 :(得分:0)
在Linux系统上,您可以使用硬件性能计数器:perf stat ./a.out
并获得周期,指令,缓存未命中和分支错误预测的准确计数。 (其他柜台也可用,但这些是默认的)。
这为您提供了动态指令计数,计算循环内部指令实际运行的次数。
MIPS和计数指令的交叉编译很容易为您提供静态指令计数,但需要实际遵循asm如何计算每个循环运行的次数。