我一直看到人们声称MOV指令可以在x86中免费,因为寄存器重命名.
对于我的生活,我无法在一个测试用例中验证这一点.每个测试用例我尝试揭穿它.
例如,这是我用Visual C++编译的代码:
#include <limits.h>
#include <stdio.h>
#include <time.h>
int main(void)
{
unsigned int k, l, j;
clock_t tstart = clock();
for (k = 0, j = 0, l = 0; j < UINT_MAX; ++j)
{
++k;
k = j; // <-- comment out this line to remove the MOV instruction
l += j;
}
fprintf(stderr, "%d ms\n", (int)((clock() - tstart) * 1000 / CLOCKS_PER_SEC));
fflush(stderr);
return (int)(k + j + l);
}
Run Code Online (Sandbox Code Playgroud)
这为循环生成以下汇编代码(随意生成这个你想要的;你显然不需要Visual C++):
LOOP:
add edi,esi
mov …Run Code Online (Sandbox Code Playgroud) 所以最近学习了perflinux中的命令。我决定进行一些实验,因此我创建了一个空的 C 程序并测量了运行所需的指令数:
echo 'int main(){}'>emptyprogram.c && gcc -O3 emptyprogram.c -o empty
perf stat ./empty
Run Code Online (Sandbox Code Playgroud)
这是输出:
Performance counter stats for './empty':
0.341833 task-clock (msec) # 0.678 CPUs utilized
0 context-switches # 0.000 K/sec
0 cpu-migrations # 0.000 K/sec
112 page-faults # 0.328 M/sec
1,187,561 cycles # 3.474 GHz
1,550,924 instructions # 1.31 insn per cycle
293,281 branches # 857.966 M/sec
4,942 branch-misses # 1.69% of all branches
0.000504121 seconds time elapsed
Run Code Online (Sandbox Code Playgroud)
为什么它使用这么多指令来运行一个实际上什么也不做的程序?我认为这可能是将程序加载到操作系统中所需的一些基准指令数,因此我寻找了用汇编语言编写的最小可执行文件,并且发现了一个在此处输出的 142 字节可执行文件"Hi World"(http://timelessname.txt)。 …
假设我有一个软件,并且想要使用黑盒方法研究其行为。我有一个 3.0GHz CPU,有 2 个插槽和 4 个核心。如您所知,为了找出每秒指令数 (IPS),我们必须使用以下公式:
IPS = sockets*(cores/sockets)*clock*(instructions/cycle)
Run Code Online (Sandbox Code Playgroud)
首先,我想找到我的特定算法每个周期的指令数。然后我意识到使用块盒方法几乎不可能计算它,我需要对算法进行深入分析。
但现在,我有两个问题:无论我的机器上运行什么类型的软件及其CPU使用率,有没有办法计算每秒发送到CPU的指令数(每秒百万条指令(MIPS))?是否有可能找到指令集的类型(添加、比较、输入、跳转等)?
任何脚本或工具推荐都将受到赞赏(任何语言)。
我正在做一个家庭作业问题,要求我找出运行我在C中写的短程序时执行的机器代码指令的数量.
问题是我可以使用我想要的任何工具来解决它,但我对C很新,并且很少知道如何解决这个问题.
我需要哪些类型的工具来解决这个问题?
我感到困惑的区别perf record,并perf stat当谈到计数像页面错误,缓存缺失和任何从其他事件perf list.我在"问题1"的答案下面有2个问题,也可能有助于回答"问题2",但是在没有问题的情况下我明确地写出了问题.
问题1:我的理解是perf stat得到计数的"摘要"但是当与-I选项一起使用时,以指定的毫秒间隔获得计数.使用此选项是否可以总结间隔内的计数或获得间隔内的平均值,或完全不同的其他内容?我认为它总结了.该PERF维基称它聚集,但我想,这可能意味着无论是.
问题2:为什么不perf stat -e <event1> -I 1000 sleep 5给出相同的计数,好像我总结了以下命令的每秒计数perf record -e <event1> -F 1000 sleep 5?
例如,如果我使用"page-faults"作为event1的事件,我会得到以下每个命令下面列出的输出.(我假设句点字段是perf record's perf.data文件中事件的计数)
PERF STAT
perf stat -e page-faults -I 1000 sleep 5
# time counts unit events
1.000252928 54 page-faults
2.000498389 <not counted> page-faults
3.000569957 <not counted> page-faults
4.000659987 <not counted> page-faults
5.000837864 2 page-faults
Run Code Online (Sandbox Code Playgroud)
完美记录
perf record -e page-faults -F 1000 …Run Code Online (Sandbox Code Playgroud) assembly ×3
c ×2
cpu ×2
perf ×2
profiling ×2
x86 ×2
benchmarking ×1
isa ×1
linux ×1
performance ×1