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为每个核有几个线程。