相关疑难解决方法(0)

x86的MOV真的可以"免费"吗?为什么我不能重现这个呢?

我一直看到人们声称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)

c x86 assembly cpu-registers micro-optimization

23
推荐指数
2
解决办法
2113
查看次数

为什么运行一个空程序需要这么多指令?

所以最近学习了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)。 …

linux cpu assembly perf

5
推荐指数
1
解决办法
757
查看次数

基准测试 - 如何计算发送到 CPU 的指令数以查找消耗的 MIPS

假设我有一个软件,并且想要使用黑盒方法研究其行为。我有一个 3.0GHz CPU,有 2 个插槽和 4 个核心。如您所知,为了找出每秒指令数 (IPS),我们必须使用以下公式:

IPS = sockets*(cores/sockets)*clock*(instructions/cycle)
Run Code Online (Sandbox Code Playgroud)

首先,我想找到我的特定算法每个周期的指令数。然后我意识到使用块盒方法几乎不可能计算它,我需要对算法进行深入分析。

但现在,我有两个问题:无论我的机器上运行什么类型的软件及其CPU使用率,有没有办法计算每秒发送到CPU的指令数(每秒百万条指令(MIPS))?是否有可能找到指令集的类型(添加、比较、输入、跳转等)?

任何脚本或工具推荐都将受到赞赏(任何语言)。

cpu performance benchmarking assembly profiling

4
推荐指数
1
解决办法
6058
查看次数

如何确定在C程序中执行的x86机器指令的数量?

我正在做一个家庭作业问题,要求我找出运行我在C中写的短程序时执行的机器代码指令的数量.

问题是我可以使用我想要的任何工具来解决它,但我对C很新,并且很少知道如何解决这个问题.

我需要哪些类型的工具来解决这个问题?

c x86 profiling isa

4
推荐指数
1
解决办法
579
查看次数

Perf Stat与Perf记录

我感到困惑的区别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)

perf

2
推荐指数
1
解决办法
1284
查看次数