一、引言

计算机的世界里,CPU任务分为CPU bound和IO bound。而实际场景下往往是两者混合型任务。针对性能的优化,普遍关注点都在CPU上(不论是CPU的频点和CPU的选核), 往往忽略对IO bound的任务的优化。而DDR作为SOC芯片代码运行空间和数据缓存空间,在不同应用状态下,SOC对DDR访问的带宽需求不一样。譬如听音乐时访问带宽需求较小,此时DDR工作在较低的频率,而通过网络信号观看高清视频时,则对带宽需求较大。DDR则需要提高工作频率。由此可见,SOC需要根据系统的运行情况动态调整DDR的总线工作频,以提高CPU工作效率,并降低系统在运行状态的功耗,达到性能功耗的平衡。

二、BUS DCVS

什么是BUS DCVS?

BUS DCVS,其 Bus Dynamic Clock and Voltage Scaling 的缩写,它是一种总线频率选择的算法,用于在动态的工作负载间选择最佳的频率点,以满足性能和功耗的平衡。

先来看看现代SOC架构,对于DDR这个slave而言,其对应的master会很多,例如 CPU,GPU,NPU,DISPLAY,CAMERA 等等。每隔一段时间各个master就会给你自己对带宽的需求,最终由RPM汇总仲裁后设定最终的DDR频率。

本文主要介绍主流平台CPU的BUS DCVS策略

以上图所示架构,BUS DCVS主要是根据L2->L3,L3->system cache,System 和cache->DDR 等路径上对带宽的需求,选择最合适的频点以达到功耗和性能的平衡。

Bus DCVS 提供了2种调频策略

1. bw_hwmon (bandwidth hardwaremonitor)

基于CPU到cache 和 cache 到 DDR 的流量带宽调整cache 和 DDR的频率

2. memlat(memory latency)

基于 cache和 DDR 的 CPU 相关统计数据来调整相应频率。

三、BUS DCVS 软件架构

BUS DCVS分为3个大部分

  1. User space (用户空间)

表现形式为sysfs 节点。路径为/sys/class/devfreq/socddr-bw和/sys/class/devfreq/socddr-lat(分别对应2种不同的策略方式)。当然还有devfreq的标准节点,min_freq/max_freq/cur_freq。用户空间的软件可以通过访问对应的文件获取当前master 对 DDR的带宽需求。如果具有某些权限,设置可以通过设置相应的参数来控制当前master 对 DDR 带宽需求的策略

  1. Kernel space(内核空间)

CPU 的BUS DCVS与其他的非CPUFreq调频的外设一样,是基于devfreq 框架的一套机制。其核心为devfreq framework,设备的抽象为bimc-bwmon 和arm-memlat-mon,策略的抽象为governor bw_hwmon 和 memlat。

  1. RPM OS

其主要作用是手机各个master voted的ddr 带宽,最终设定DDR的频率到LPDDR的硬件上。

四、bw_hwmon策略

1. 源码路径

a) drivers/devfreq/devfreq_devbw.c

b) drivers/devfreq/bimc-bwmon.c

c) driver/devfreq/governor_bw_hwmon.c

d) arch/arm64/boot/dts/vendor/qcom/

2. bw_hwmon软件框图

bw_hwmon策略涉及到的模块大致分为 devbw,bimc-bwmon,和devfreq framework。

a)  bimc-bwmon:其代表代表 BIMC带宽监视器的设备,可用于测量来自 BIMC 主端口的读/写流量的带宽。

b) devbw:master对ddr slave的带宽需求

c) devfreq framework:非 CPU 设备的通用动态电压和频率缩放 (DVFS) 框架bw_hwmon调频策略的触发时机

d) 根据时间片轮询查看单位时间窗口的平均带宽

e) 根据配置带宽上升下降的阈值作为触发点,一旦在单位时间内上升或者下降过快,则触发中断通知更新频率

基于上述的触发时机,bimc-bwmon收到硬件监测到的带宽信息,根据软件的计算规则,预估需要调整的带宽,将其下发至devbw匹配OPP表,将需要的频率通过RPM驱动发送到RPM core,根据多个master对带宽的需求最终决策DDR需求的频率。

3. 初始化流程

a) bimc-bwmon驱动通过设备名”qcom,bimc-bwmon[0-4]”匹配到对应的devicetree中的硬件信息,获取中断号,获取控制器的版本,针对不同功能的控制器进行初始化。然后调用register_bw_hwmon初始化devfreq_governor类,并赋值其函数指针get_target_freq和event_handler,最终通过devfreq_add_governor注册到devfreq framework。

b) devbw驱动通过如下设备名”qcom,devbw*”匹配到对应的devicetree中的硬件信息,初始化devbw 设备的信息dev_data类,并将其设置为driver的私有数据。设置devfreq framework结构的devfreq_dev_profile中的target 和 get_dev_status函数及polling_ms的初始值。

同时设置设备的OPP表(OPP表的代码以DTS的形式表现)。

最终通过devfreq_add_device将devbw 设备添加到devfreq framework的devfreq list链表中。此时会与devfreq governor建立两者的联系。

c) 当event_handler收到GOV_START信号以后,start_monitor 会注册中断函数,此中断就对应上升下降阈值的触发时机。如果有设置polling_ms则会queue_delayed_work 更新频率。

4. 频率调整流程

如上图所示为devfreq framework的通用的更新外设频率的流程

updatedevfreq 为核心函数,其流程如下

1.通过get_target_freq重新评估需要的频率

2.通过get_cur_freq获取当前的频率,如果实现此接口,则使用上次的频率作为当前频率

3.最后通过target 函数指针调用设置硬件的clock

其中get_target_freq 函数指针对应的函数就是bus dcvs的策略算法实现,此处为devfreq_bw_hwmon_get_freq,其本质就是get_bw_and_set_irq函数。

5. get_bw_and_set_irq

此策略中的变量参数比较多,但是本质上最基本的计算方式如下图所示

AB:平均需求的带宽

IB:瞬时需求的带宽

a) guard_band_mbps:基于性能的目的引入guard_band,在投票之前为measured_mbps += guard_band_mbps,为了解决带宽更新不及时导致的问题

b) decay_rate:此参数的范围为0-100,如果设置为100则不考虑历史的影响。且只有在当前测量值比上一次需求带宽小的情况才生效,用于避免频率更新后的乒乓性。

c) bw_step:类似取整的参数,用于降低更新频率的频繁性。

d) io_percent:用于计算IB,CPU的执行过程是一部分时间在访存,一部分时间在执行。相当于设定访存所占时间的百分比。

五、memlat策略

1. 源码路径

a) drivers/devfreq/devfreq_devbw.c

b) drivers/devfreq/arm-memlat-mon.c

c) driver/devfreq/governor_memlat.c

d) arch/arm64/boot/dts/vendor/qcom/

2. memlat软件架构

Gover normemlat 是对 bw_hwmon机制的补充,主要对应memory latency sensitivity的任务

memlat策略涉及到的模块大致分为 devbw,memlat-mon,和devfreq framework。

  1. memlat-mon:其代表的是使用PMU来度量访存延时的设备。

  2. devbw:master对ddr slave的带宽需求。

  3. devfreqframework:非 CPU 设备的通用动态电压和频率缩放 (DVFS) 框架。

3. 初始化流程

a)   设备dts信息

qcom,target-dev:此设备对应的master。

qcom,cachemiss-ev:测量的缓存未命中事件。

qcom,core-dev-table:CPU核心频率到所需带宽投票的映射表。

operating-points-v2:从master到slave的带宽OPP表。

b) arm-memlat-mon驱动通过设备名”qcom,arm-memlat*”匹配到对应的devicetree中的硬件信息,获取miss_ev_id,并对相关结构体进行初始化。然后调用register_memlat初始化devfreq_governor类,并赋值其函数指针get_target_freq和event_handler,最终通过devfreq_add_governor注册到devfreq framework。

c) 同bw_hwmon策略一样,event_handle 收到GOV_START信号以后,调用start_hwmon对相关的events进行初始化,同时启动delayed work更新频率。

4. 频率调整流程

此策略的因子比较简单。在每次的时间周期内,统计PM Uevent获取的instructions count 和 L2miss rate,只有当inst / miss 小于ratioceil的时候才会触发更新频率。最终将需求的带宽频率调用devfreq_bw的set_bw函数设置到硬件。

六、总结

随着各大厂商对芯片性能功耗的极致优化,对于一些cpu stall的场景可以通过BUS DCVS更精细化的优化进行改善。最后祝愿各位在技术的道路上越走越远。

Devfreq Bus Dcvs的更多相关文章

  1. 设备模型(device-model)之平台总线(bus),驱动(driver),设备(device)

    关于关于驱动设备模型相关概念请参考<Linux Device Drivers>等相关书籍,和内核源码目录...\Documentation\driver-model 简单来说总线(bus) ...

  2. Matlab中使用脚本和xml文件自动生成bus模块

    帮一个老师写的小工具 在一个大工程中需要很多bus来组织信号,而为了规范接口,需要定义很多BusObject,用Matlab语言手写这些BusObject比较费工夫 所以用xml配置文件来写,也便于更 ...

  3. bzoj 1537: [POI2005]Aut- The Bus 线段树

    bzoj 1537: [POI2005]Aut- The Bus 先把坐标离散化 设f[i][j]表示从(1,1)走到(i,j)的最优解 这样直接dp::: f[i][j] = max{f[i-1][ ...

  4. linux下bus、devices和platform的基础模型

    转自:http://blog.chinaunix.net/uid-20672257-id-3147337.html 一.kobject的定义:kobject是Linux2.6引入的设备管理机制,在内核 ...

  5. ACE bus

    ACE bus增加的内容: 1):5状态的cache model 2):关于coherency的additional signal 3):两个cache master访问shared cache的ad ...

  6. 利用Service bus中的queue中转消息

    有需求就有对策就有市场. 由于公司global的policy,导致对公司外发邮件的service必须要绑定到固定的ip地址,所以别的程序需要调用发邮件程序时,问题就来了,如何在azure上跨servi ...

  7. c程序中出现segment error 和 bus error 的原因

    在c程序中,经常会遇到段错误(segment error)和总线错误(bus error),这两种问题出现的原因可能如下 段错误: 对一个NULL指针解引用. 访问程序进程以外的内存空间. 实际上,第 ...

  8. Azure Service Bus 中的身份验证方式 Shared Access Signature

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  9. Windows Azure Service Bus Topics实现系统松散耦合

    前言 Windows Azure中的服务总线(Service Bus)提供了多种功能, 包括队列(Queue), 主题(Topic),中继(Relay),和通知中心(Notification Hub) ...

  10. Windows Azure Service Bus Notification Hub推送通知

    前言 随着Windows Azure 在中国的正式落地,相信越来越多的人会体验到Windows Azure带来的强大和便利.在上一篇文章中, 我们介绍了如何利用Windows Azure中的Servi ...

随机推荐

  1. java+mysql+tomcat环境变量配置(windows版)

    jdk8(本人用的jdk8) 系统变量->新建:{JAVA_HOME=[JDK安装目录]} 系统变量->PATH:头部追加%JAVA_HOME%\bin;%JAVA_HOME%\jre\b ...

  2. 搭建lnmp环境-mysql(第五步)

    版本mysql 5.7 先删除系统自带的db 新建文件夹/data/download 进入后下载 wget http://repo.mysql.com/mysql57-community-releas ...

  3. windows server dhcp与AD域

    创建两台windows server 2016 同一个网络适配器 windows1 配置window1手动网络 安装域 设置密码下一步下一步 重启 完成域安装后创建用户 配置windows1 dhcp ...

  4. 【Centos】RPM安装Mysql8

    先去官网下载RPM包,没想到RPM包是红帽发行版 https://dev.mysql.com/downloads/mysql/ 使用wget直接下载到Centos里面: wget https://cd ...

  5. Ubuntu-20.04.6-server安装MySQL实现远程连接

    Ubuntu-20.04.6-server安装MySQL,修改密码 安装MySQL 一.查看是否安装数据库 mysql --version 二.更新系统中的所有软件包和存储库 sudo apt upd ...

  6. Rust项目的代码组织

    学习一种编程语言时,常常优先关注在语言的语法和标准库上,希望能够尽快用上新语言来开发,我自己学习新的开发语言时也是这样. 不过,想用一种新的语言去开发实际的项目,或者自己做点小工具的话,除了语言本身之 ...

  7. Webots —— 好用的人形机器人仿真平台

    相关: https://cyberbotics.com/doc/guide/tutorials 下载地址: https://github.com/cyberbotics/webots/releases ...

  8. .NET中各种线程同步锁

    编程编的久了,总会遇到多线程的情况,有些时候我们要几个线程合作完成某些功能,这时候可以定义一个全局对象,各个线程根据这个对象的状态来协同工作,这就是基本的线程同步. ​支持多线程编程的语言一般都内置了 ...

  9. C# 导出Excel NPOI 修改指定单元格的样式 或者行样式

    参考文章:原文链接:https://blog.csdn.net/chensirbbk/article/details/52189985 #region 2.NPOI读取Excel 验证Excel数据的 ...

  10. Docker 抓取 buildx 缓存

    有时候由于配置的失误,导致构建了好久的镜像没能推送到云或者保存到本地.而如果重新构建,则可能又要全部重来.其实这时候我们可以导出 buildx 中的缓存到本地文件,再将本地文件导入为镜像.这样可以节省 ...