小编Paw*_*ski的帖子

注册管道计算

我最近在阅读关于管道优化的文章.我想询问我是否正确理解处理器如何处理流水线操作.

这是简单测试程序的C++代码:

#include <vector>

int main()
{
    std::vector<int> vec(10000u);
    std::fill(vec.begin(), vec.end(), 0);
    for (unsigned i = 0u; i < vec.size(); ++i)
    {
        vec[i] = 5;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和for循环生成的汇编代码的一部分:

...
00007FF6A4521080  inc         edx  
    {
        vec[i] = 5;
00007FF6A4521082  mov         dword ptr [rcx+rax*4],5  
00007FF6A4521089  mov         eax,edx  
00007FF6A452108B  cmp         rax,r9  
00007FF6A452108E  jb          main+80h (07FF6A4521080h)  
    }
...
Run Code Online (Sandbox Code Playgroud)

在程序中,向量" vec "分配有恒定大小并用零填充.重要的"工作"发生在for循环中,其中所有向量变量都分配给5(只是一个随机值).

我想问一下这个汇编程序代码是否会在管道中出现停顿?原因是所有指令都以某种方式相关并在相同的寄存器上工作.例如,cmp rax r9mov eax, edx实际为eax/rax赋值之前,管道需要等待指令吗?

循环10000次是分支预测应该开始工作的地方.jb指令跳转10000次,最后才会通过.这意味着分支预测器应该很容易预测跳跃将在大多数时间发生.但是,如果代码本身在循环内部停顿,那么从我的角度来看,这种优化是没有意义的.


我的目标架构是Skylake i5-6400

c++ x86 assembly cpu-architecture

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

标签 统计

assembly ×1

c++ ×1

cpu-architecture ×1

x86 ×1