for循环超标量优化

参考博客:https://zhuanlan.zhihu.com/p/195008675

参考博客:https://zhuanlan.zhihu.com/p/52112475

参考链接:https://zhuanlan.zhihu.com/p/611959623

超标量优化,是指cpu的一个核同时拥有多个流水线。

一个流水线是指 取指令,读内存,计算,写回,大概这样的几步。

从上至下来说的话就是,一个cpu有多个核,一个核可以有多个调度单元,只有一个运算单元,一个运算单元可以拥有多个流水线。

超线程:对与运算单元的利用率优化是为这一个运算单元配置多个调度单元,这样可以尽量保持运算单元忙。

超标量:对运算单元加强,允许一个运算单元拥有多个流水线。

超流水:对于流水线优化,比如将 取指令,读内存,计算,写回 这样的4步流水线优化成,取指令,读寄存区,读内存,传数据,计算,传回数据,写回 更细致的多步流水线,使得流水线运行的更丝滑。

for循环有时候可以通过将计算部分拆成多个并行的部分,这样就可以利用超标量的优化,提升运算速度。

比如

mov [1], eax
mov [4], ebx
mov [8], ecx
mov [12], edx

想这样四个不同的寄存区放到4个不同的地址,相互不冲突,那么对于这个运算核来说就可以同时进行。

对于下面这种例子就可以优化:

#include <iostream>
#include <string>

using namespace std;

int calc(int n) {
    int ans=1;
    for(int i=1;i<=n;++i) {
        ans*=i;
    }
    return ans;
}

int main() {
    int n=1000000000;
    calc(n);

    return 0;
}

通过将for循环拆分成可以并行的部分,就可以利用超标量。

#include <iostream>
#include <string>

using namespace std;

int calc(int n) {
    int ans=1;
    int v1=1, v2=1, v3=1, v4=1;
    for(int i=1;i<=n;i+=4) {
        v1*=i;
        v2*=(i+1);
        v3*=(i+2);
        v4*=(i+3);
    }
    ans = v1*v2*v3*v4;
    return ans;
}

int main() {
    int n=1000000000;
    calc(n);

    return 0;
}

查看当前cpu的超线程

lscpu命令查看cpu的状态,超线程状态下threads per core数值为2,禁用时为1. threads per core为每个核有几个线程。

文章目录