手把手建立Roofline模型(CPU)
Roofline模型原理
Roofline模型是由加州理工大学伯利克提出的用来建立当前计算平台在不同的计算强度(Operational Intensity)下能够达到的理论计算上限 。论文和基础理论和应用 Roofline Model与深度学习模型的性能分析 。本文旨在教授如何根据当前开发环境机器建立该模型,并简单的介绍如何根据算法计算OI(计算强度)。
需要准备的硬件参数
对于CPU而言,我们需要一下参数:
| 频率 | 内存带宽(double) | Avx512 Unit | Fma | |
|---|---|---|---|---|
| Intel Xeon Gold 6148 | 2.7GHz | 39.74GB/s | 2 | 2 | 
其中Avx512、Fma并非是必备参数。
查询CPU相关指标方法或网站:
- <https://ark.intel.com/content/www/us/en/ark/products/120489/intel-xeon-gold-6148-processor-27-5m-cache-2-40-ghz.html>
 - <https://en.wikichip.org/wiki/intel/xeon_gold/6148>
 - 在
LINUX下可以使用lscpu查询. 
计算相关参数:
当前CPU的理论峰值:
 \(理论性能峰值 ={频率*512*AVX数量*FMA \over 32/64}\)
AVX和FMA并不是必要参数,32/64取决于当前处理问题是单精度(32)或者双精度(64)
由上述公式,我们可以计算出Xeon Gold 6148的计算双精度理论性能峰值为2.7GHz*2(avx)*2(FMA)/64=86.4Gfplos。
计算当前内存带宽:
通常情况下我们可以通过 wikichip 搜索到,当然也可以通过 StreamBenchmark 程序获取。
建立Roofline模型

Roofline模型中的相关参数公式如下,并计算Xeon Gold 6148 的参数:
- \(\pi=理论性能峰值\) ,根据上文内容,我们已经计算出当前CPU的理论性能峰值就是86.4Gflops。
 - \(\beta=理论内存带宽\) ,上一章节有关于理论内存带宽获取方式,当前CPU的值为39.74Gflops。
 - \(I_{max} = {\pi \over \beta}\) ,显然易得当前值为2.17。
 
根据当前算法计算OI
访存密集型算法
void saxpy(double *a,double * b,double* c,int n,int s)
{
    for(int i=0;i<n;++i){
        a[i]=b[i]*s+c[i];
    }
}
分析程序的AI
该程序循环内做了一次乘法和一次加法,读取了三个数据,已知操作的数据都为64位浮点数,那么 \(OI={2*N \over 8*3*N}={1 \over 12}\)。根据公式 \(FLOPS=OI \times BW(bound witdh)\) 可得当前的算法的理论峰值为~3.3Gflops。实际测试结果为2.4Gflops,存在可能优化的空间。
运算密集型算法
最简单的运算密集型程序为矩阵乘法 。这里就不具体算法实现展示。直接分析程序的OI,假设矩阵的的大小为 \(M\) ,矩阵乘需要加载两次矩阵,并写入一次矩阵,那么总的数据加载读取量为 \(3 \times M \times M\) ,矩阵乘的每个元素需要需要进行 \(M\) 次乘操作和 \(M-1\) 次加操作,因此,计算总量为 \(2*(M-1) \times M^2\) ,当不考虑数据是64位浮点时,可得 \(OI={2*(M-1) \over 3*8}\) 。当矩阵大小大于40时,对于当前CPU输入计算密集型程序,可达到的理论峰值为86.4Gflops。
优化方式
论文 给出了一些可以优化的方式:
- 针对访存密集型程序,可以通过soft perfetch等技术优化。
 - 针对计算密集型程序,可以通过SIMD等技术优化。
 

手把手建立Roofline模型(CPU)的更多相关文章
- PowerDesigner软件建立新模型。
		
打开PowerDesigner软件,选择菜单文件->建立新模型,或者敲击键盘ctrl+N 弹出建立新模型窗口,模型类型选择Object-Oriented Model,图选择Class D ...
 - 利用libsvm-mat建立分类模型model参数解密[zz from faruto]
		
本帖子主要就是讲解利用libsvm-mat工具箱建立分类(回归模型)后,得到的模型model里面参数的意义都是神马?以及如果通过model得到相应模型的表达式,这里主要以分类问题为例子. 测试数据使用 ...
 - 图像配准建立仿射变换模型并用RANSAC算法评估
		
当初选方向时就由于从小几何就不好.缺乏空间想像能力才没有选择摄影測量方向而是选择了GIS. 昨天同学找我帮他做图像匹配.这我哪里懂啊,无奈我是一个别人有求于我,总是不好意思开口拒绝的人.于是乎就看着他 ...
 - 使用PyTorch建立图像分类模型
		
概述 在PyTorch中构建自己的卷积神经网络(CNN)的实践教程 我们将研究一个图像分类问题--CNN的一个经典和广泛使用的应用 我们将以实用的格式介绍深度学习概念 介绍 我被神经网络的力量和能力所 ...
 - Sequelize 类 建立数据库连接 模型定义
		
1:Sequelize 类 Sequelize是引用Sequelize模块获取的一个顶级对象,通过这个类可以获取模块内对其他对象的引用.比如utils.Transaction事务类.通过这个顶级对象创 ...
 - 读书笔记 effective c++  Item 32 确保public继承建立“is-a”模型
		
1. 何为public继承的”is-a”关系 在C++面向对象准则中最重要的准则是:public继承意味着“is-a”.记住这个准则. 如果你实现一个类D(derived)public继承自类B(ba ...
 - 『高性能模型』Roofline Model与深度学习模型的性能分析
		
转载自知乎:Roofline Model与深度学习模型的性能分析 在真实世界中,任何模型(例如 VGG / MobileNet 等)都必须依赖于具体的计算平台(例如CPU / GPU / ASIC 等 ...
 - Roofline Model与深度学习模型的性能分析
		
原文链接: https://zhuanlan.zhihu.com/p/34204282 最近在不同的计算平台上验证几种经典深度学习模型的训练和预测性能时,经常遇到模型的实际测试性能表现和自己计算出的复 ...
 - 黑马程序员——ARC机制总结和用ARC建立模型
		
ARC 全称:Automatic Reference Counting 使用ARC 只需要在建立一个新的项目的时候把 下面的√打上 Xcode5以后都会默认建议开发者使用ARC机制 新的项目中如果有部 ...
 
随机推荐
- 如何使Label显示时,一行顶部居中,两行靠左显示----董鑫
			
有时我们会碰到这种情况,一个要根据内容显示一行还是两行,一行时还要靠着顶部再居中,比如下面 最左边的名称,要求是靠上的,如果按照正常的方式写的话,可能一行的话就会出现居中显示了,不会顶着头部显示. 我 ...
 - Java静态变量、静态块、构造块、构造函数、main函数、普通代码块的执行顺序
			
测试代码 public class SingleTest { public static String v = "StaticValue"; static { System.out ...
 - 06.python语法入门--与用户交互、运算符
			
与用户交互 输入 input # python2与python3的区别 '''python3''' # 将获取到的用户输入赋值给变量名res res = input(' ...
 - Solution -「CF 908D」New Year&Arbitrary Arrangement
			
\(\mathcal{Description}\) Link. 给定 \(n,p_a,p_b\),初始有一个空串,每次操作有 \(\frac{p_a}{p_a+p_b}\) 的概率在其后添加字 ...
 - Solution -「BJWC 2018」「洛谷 P4486」Kakuro
			
\(\mathcal{Description}\) Link. 有一个 \(n\times m\) 的网格图,其中某些格子被主对角线划成两个三角形,称这样的格子为特殊格:初始时,除了一些障碍格 ...
 - HTML5知识点笔记
			
1.HTML是一种标记语言 2.HTML元素不区分大小写 //可以在xss绕过waf时使用 3.<code></code>为空元素标签 <code/>为自闭合标签 ...
 - JUC之Java中的阻塞队列及其实现原理
			
在文章线程池实现原理 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中介绍了线程池的组成部分,其中一个组成部分就是阻塞队列.那么JAVA中的阻塞队列如何实现的呢? 阻塞队列,关键字是阻塞 ...
 - SopringBoot2.x整合Redis
			
1.导入相关依赖 <!-- redis 依赖 --> <dependency> <groupId>org.springframework.boot</grou ...
 - NPM保资源管理工具
			
一.简介 什么是NPM NPM全称Node Package Manager,是Node.js包管理工具,是全球最大的模块生态系统,里面所有的模块都是开源免费的:也是Node.js的包管理工具,相当于前 ...
 - 攻防世界Web_shrine
			
题目: 给的是源代码,整理一下如下: 看到jinjia flask,render_template_string猜测到这题应该是考查python模板注入. 代码分析可以得到以下信息: 1.路径在 /s ...