手把手建立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机制 新的项目中如果有部 ...
随机推荐
- mysql处理警告 Warning: Using a password on the command line interface can be insecure.
vim /etc/mysql/my.cnf [mysqldump] user=user_name password=password 格式: [只用密码的命令] user=用户名 password=密 ...
- 网络层主要协议与arp欺骗
网络层主要协议与arp欺骗 目录 网络层主要协议与arp欺骗 一.网络层(Network Layer) 1.网络层的功能 2.IP数据报(IP Datagram) 二.网络层的主要协议 1.ICMP协 ...
- 编译安装nginx,实现多域名 https
一.编译安装nginx 1.1 获取源码包 [root@cetnos7 ~]#wget -O /usr/local/src/nginx-1.18.0.tar.gz http://nginx.org/d ...
- Spring Cloud Alibaba Nacos路由策略之保护阈值!
在 Nacos 的路由策略中有 3 个比较重要的内容:权重.保护阈值和就近访问.因为这 3 个内容都是彼此独立的,所以今天我们就单独拎出"保护阈值"来详细聊聊. 保护阈值 保护阈值 ...
- 04 前端之BOM与DOM
目录 前端之BOM与DOM BOM与DOM操作 BOM操作 前端之BOM与DOM BOM与DOM操作 BOM 浏览器对象模型>>>:使用js操作浏览器 DOM 文档对象模型>& ...
- python生成器对象&常见内置函数
内容概要 异常捕获(补充) for循环本质 生成器 yield 和 return优缺点 笔试题 常用内置函数 内容详细 一.异常捕获补充 try: print(name) except NameErr ...
- 暑假撸系统5- Thymeleaf 常用标签的
上次博客已经是三天前了,后期修补和细化的东西多了,进度没有前几天那么明显了.因为原来工作大多是后端居多,如果非要前台也会选择一些相对对ui依赖比较小的框架,比如extjs,所以这次的基础排版就费劲了, ...
- .NET core实现一个简易的事件协调器(saga)
在领域驱动设计中,由于领域边界的存在,以往的分层设计中业务会按照其固有的领域知识被切分到不同的限界中,并且引入了领域事件这一概念来降低单个业务的复杂度,通过非耦合的事件驱动来完成复杂的业务.但是事件驱 ...
- Dubbo SPI机制之三Adaptive自适应功能
JDK标准中SPI机制的一个问题就是其一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源:扩展点加载失败,其他扩展点都用不了了.Dubbo是如何解决该问题动态的选 ...
- for循环例子
代码 点击查看[ForTest.java]代码 //package com.d; import java.util.Scanner; /** * For循环例子 * @date: 2022.2.24 ...