整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

一文看懂CPU算力测算方法

一文看懂CPU算力测算方法

到CPU算力,就不能不提到FLOPS了。



FLOPS是CPU每秒浮点运算次数,也称为每秒峰值速度,英语是Floating-point operations per second;简写就是FLOPS,flops 或者 flop/s。

在多数情况下,测算FLOPS比测算每秒指令数(IPS)要准确。

要测算FLOPS就要搞清楚浮点数的精度。



浮点(floating-point)指的是带有小数的数值,浮点运算就是小数的四则运算,常用来测量计算机运算速度或被用来估算计算机性能,特别是在科学计算领域会使用到大量的浮点运算,对CPU的算力性能要求就比较高了。

说到浮点计算能力,就涉及到半精度、单精度、双精度三种类型,双精度是64位的(FP64),单精度是32位的(FP32),半精度是16位的(FP16),半精度是英伟达在2002年搞出来的,双精度和单精度是为了计算,而半精度更多是为了降低数据传输和存储成本。

双精度浮点数

单精度浮点数

半精度浮点数

双精度、单精度、半精度都分成3部分,符号位,指数和尾数。

不同精度只不过是指数位和尾数位的长度不一样。

解析一个浮点数就5条规则

1、如果指数位全零,尾数位是全零,那就表示0
2、如果指数位全零,尾数位是非零,就表示一个很小的数(subnormal),计算方式 (?1)^signbit × 2^?126 × 0.fractionbits
3、如果指数位全是1,尾数位是全零,表示正负无穷
4、如果指数位全是1,尾数位是非零,表示不是一个数NAN
5、剩下的计算方式为 (?1)^signbit × 2^(exponentbits?127) × 1.fractionbits
常用的语言几乎都不提供半精度的浮点数,这时候需要我们自己转化。

所以,要做算力规划时要结合其使用场景来分析,其实很多场景对于精度要求也没那么高,例如:分布式深度学习里面,如果用半精度的话,比起单精度来可以节省一半传输成本。考虑到深度学习的模型可能会有几亿个参数,使用半精度传输还是非常有价值的。

通常,在没有特别明确算力算法的前提下,我们默认都是按照双精度去测算算力能力的。

一般做算力规模分析时会明确算力单位如EFLOPS,或PFLOPS,这就需要自己根据情况去换算了,但都是通过FLOPS换算而来的。

浮点计算值的换算单位:

一个MFLOPS(megaFLOPS)等于每秒一佰万(=10^6)次的浮点运算

一个GFLOPS(gigaFLOPS)等于每秒拾亿(=10^9)次的浮点运算

一个TFLOPS(teraFLOPS)等于每秒万亿(=10^12)次的浮点运算

一个PFLOPS(petaFLOPS)等于每秒千万亿(=10^15)次的浮点运算

一个EFLOPS(exaFLOPS)等于每秒百亿亿(=10^18)次的浮点运算

一个ZFLOPS(zettaFLOPS)等于每秒十万京(=10^21)次的浮点运算


对于FLOPS的计算公式为: FLOPS=CPU核数*单核主频*CPU单个周期浮点计算值*1000000

只要我们知道CPU的型号,就可以到对应的CPU厂商网站上查询相关参数了。

下面我们拿intel的CPU为例,到Intel官网进行查询,网址如下:https://ark.intel.com/content/www/us/en/ark/search.html

输入具体的CPU型号,如 6240R,进入对应参数页面。

https://ark.intel.com/content/www/us/en/ark/products/199343/intel-xeon-gold-6240r-processor-35-75m-cache-2-40-ghz.html





CPU单个周期浮点计算值有点复杂,具体如下表

instruction set(指令集)

每时钟周期的单精度运算次数

每时钟周期的双精度运算次数

SSE(128-bits)

8

4

AVX(256-bits)

16

8

AXV2(256-bits)

32

16

AXV256(512-bits)

64

16(FMA=1)
32(FMA=2)

那么,6240R的核数为10,主频为2.4Hz,每时钟周期的双精度运算次数32,其单颗CPU的GFLOPS算力算法就是24*2.4*32=1843.2 GFLOPS

索性将之前用过的CPU都拿出来分析了一下,顺便按照CPU计算能力排个序。

们的最终目标是求下面的积分算式:

integral-function


1.先看求和的方法:

求整数数列的和:

function sum_integers(a, b) {
    return a > b ? 0
        : a + sum_integers(a+1, b);
}

求立方和:

function sum_cubes(a, b) {
    return a > b ? 0
        : cube(a) + sum_cubes(a+1, b);
}

求下面的序列之和:

求pi的序列

function pi_sum(a, b) {
    return a > b ? 0
        : 1 / (a * (a+2)) + pi_sum(a+4, b);
}

该值收敛于pi/8.

2.提取抽象部分

数学上的求和公式为:

sigma notation

抽象到数学方程为:

function sum(term, a, next, b) {
    return a > b ? 0
        : term(a) + sum(term, next(a), next, b);
}

应用上面的公式重新计算立方和:

function inc(n) {
    return n + 1;
}

function sum_cubes(a, b) {
    return sum(cube, a, inc, b);
}

求整数之和:

function identity(x) {
    return x;
}
function sum_integers(a, b) {
    return sum(identity, a, inc, b);
}

最后是pi值的求和:

function pi_sum(a, b) {
    function pi_term(x) {
        return 1 / (x * (x+2));
    }
    function pi_next(x) {
        return x + 4;
    }
    return sum(pi_term, a, pi_next, b);
}

3.求积分

积分公式为:

积分公式

方程为:

function integral(f, a, b, dx) {
    function add_dx(x) {
        return x + dx;
    }
    return sum(f, a + dx/2, add_dx, b) * dx;
}
integral(cube, 0, 1, 0.01);

如此便能应用简单的抽象解决问题。

PC端进行网页制作时,经常使用固定像素并且内容居中的网页布局,为了适应小屏幕的设备,在移动设备和跨平台(响应式)网页开发过程中,多数使用流式布局,下面我们就对流式布局进行详细介绍。

流式布局是一种等比例缩放布局方式,在CSS代码中使用百分比来设置宽度,也称百分比自适应的布局。 流式布局实现方法是将CSS固定像素宽度换算为百分比宽度。换算公式如下: 目标元素宽度/父盒子宽度=百分数宽度 下面通过一个案例来演示固定布局如何转换为百分比布局,如demo4-1.html 所示。

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>固定布局转换为百分比布局</title>
	<style type="text/css">
		body>*{ width: 980px; height:auto; margin:0 auto;
				margin-top:10px;
				border:1px solid #000; padding:5px;}
		header{ height:50px;}
		section{ height: 300px;}
		footer{ height:30px;}
		section>*{ height:100%; border:1px solid #000; float:left;}
		aside{ width:250px;}
		article{ width:700px; margin-left:10px;}
	</style>

</head>
<body>
<header>header</header>
<nav>nav</nav>
<section>
	<aside>aside</aside>
	<article>article</article>
</section>
<footer> footer</footer>
</body>
</html>

打开Chrome浏览器访问demo4-1.html,页面效果如下图所示。

可以尝试改变浏览器窗口的大小,页面元素的大小不会随浏览器窗口改变,如下图所示。

下面修改demo4-1样式代码,将所有宽度修改为百分比的形式,具体如下:

	<style type="text/css">
		body>*{ width:95%; height:auto; margin:0 auto; margin-top:10px;
               border:1px solid #000; padding :5px; }
		header{ height:50px; }
		section{ height: 300px; }
		footer{ height:30px;}
		section>*{ height:100%; border:1px solid #000; float:left; }
		aside{ width:25.510204%; /*250÷980*/}
		article{ width: 71.428571%; /*700÷980*/margin-left:1.0204088%;}
	</style>

刷新页面,缩小浏览器,页面按百分比随浏览器逐渐缩小,显示完整,页面效果如下图所示: