0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在你的应用程序里内存的访问带宽能够达到多少?

冬至配饺子 来源:开发内功修炼 作者:张彦飞allen 2022-08-30 16:58 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

带宽是存储系统一个的一个非常重要的衡量指标,内存带宽指的是CPU从内存读取或写入数据到内存的速率。我们今天来思考一个问题,在你的应用程序里内存的访问带宽能够达到多少?

1、各代内存规格

理论上内存带宽的计算公式是:Band Width = Speed * Data Width。在这个公式的基础上,我们来看一下各代规格的内存带宽表现。

pYYBAGMN0JaAP-gQAACzK2Ayvr8242.png

图1 各代内存带宽规格

从上图来看,DDR3代的内存 DDR3代1066MHz的带宽都已经达到了8.5GB/s, DDR4代3200MHz更是达到了惊人的25.6G。厂家在进行销售的时候也都是用这个公式来算,言外之意就是告诉你:“我家的产品非常快,大家赶快来买啊!”

厂家这么宣传似乎也不算错,但是有诱导性的谎言在其中。厂家这个数据的基础是内存严格以顺序IO的方式工作,而且把传输的内存地址也当数据来看,进而计算出的结果。但我们在《内存随机访问也比顺序慢,带你深入理解内存IO过程》中明白了的是,内存在并一定是所有的Data Speed周期都在源源不断往外吐数据。在CPU传入了行地址后,内存打开一行需要tRCD+tRP个时钟周期的延迟。输入列地址后,又需要等待CL个时钟周期。而内存作为易失性存储元器件,又需要定时对所有的行进行充电,来保证数据不丢失。所以,在实践中,我们并不是总是能够达到厂家宣传的理论带宽值。

注意:理论带宽值计算时采用的是内存的Speed,也就是其数据频率。而内存的延迟呢,用的是时钟周期。现代的内存在时钟周期的上沿和下沿都可以传输数据,所以数据频率比Speed又慢了一半。对于笔者Speed为1067MHz的内存条,其时钟频率是553MHz。

***说过,实践是检验真理的唯一标准。我们今天就来进行一下实际的测试,看看内存的到底每秒能给我们吐出多少的数据。和前文《实际测试内存在顺序IO和随机IO时的访问延时差异》的测试方法类似,我们今天对方法进行下小改动,用它来测试带宽。

2、顺序IO情况核心测试方法

测试代码主体上和延迟测试差不多,定义一个指定大小的数组,然后以指定步长对其进行访问。

poYBAGMN0KSAadyyAABVCCQzOc0031.png

考虑到内存对齐能提高性能,所以公平起见,我们每次都是按内存位宽去取的(一个double 8个字节,正好是一个内存位宽)。带宽就是一秒内访问过的字节总数,所以我们通过如下代码进行计算。

result = total_accessed_bytes * 1000 / used_microseconds;

3、顺序IO情况带宽测试结果

笔者的服务器上的内存条是DDR3,1067MHz,延迟参数为7-7-7-24。我们进行了多场景的测试。

场景一:固定数组大小2K,调节步长

poYBAGMN0L6AaBI7AAA10fOLvZw392.png

数组为2k,足够小到L1 cache全部都能装的下。这时候其实基本实际内存IO发生的很少,大部分都是更高效的L1 cache的IO,在CPU内部就完成了。但最高值也才6G而已,也没有达到厂家宣称的8GB。

场景二:固定步长为8,数组从32K到64M

pYYBAGMN0NOAbjKSAABDuNLdnFo811.png

数组越大,Cache越装不下,数据访问的IO会更多地往后穿透到L2、L3和内存。L1、L2、L3和内存IO的性能依次递减,因此数组越大,平均带宽就会越低。

场景三:步长为32,数组从32K到64M

poYBAGMN0OiAeO6SAABChIbWD64157.png

步长增加后,穿透到内存的次数进一步增加,带宽进一步下降。这个时候,我们应用程序视角看到的数据带宽已经下降到1GB以下了。

4、再测随机IO情况

前面的测试情况,虽然步长也在变化,但都是有序递增。这样内存的连续两次IO之间,虽然列地址会变,但是行地址极有可能不发生变化,因此效率还是算比较高。我们这次是来彻底随机进行访问,再来看一下。

pYYBAGMN0PmAQ8EyAAA6-fOd-wk416.png

当数组比较小的时候,虽然乱序访问,但是cache能兜住,因此内存IO实际上发生的很少。但当数组增加到64M的时候,再加上哪一级Cache都兜不住了。再加上访问又足够随机,因此都穿透到了内存,而且行的行地址也极大可能发生变化。这时,内存带宽竟然下降到了474M。

5、结论

所以内存的带宽并没有你想象的那么快,在随机IO工作模式的情况下,带宽只有474M而已。现在SSD固态硬盘顺序IO也差不多能达到这个数量级了。所以,我们以后不要鲁莽地说内存比硬盘要快很多。快不快,关键取决于你怎么用!



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • DDR
    DDR
    +关注

    关注

    11

    文章

    747

    浏览量

    68543
  • 带宽
    +关注

    关注

    3

    文章

    1030

    浏览量

    43030
  • 时钟
    +关注

    关注

    11

    文章

    1953

    浏览量

    134561
  • 存储系统
    +关注

    关注

    2

    文章

    428

    浏览量

    41778
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    学生适合使用的SOLIDWORKS 云应用程序

    随着科技的不断发展,计算机辅助设计(CAD)技术已经成为现代工程教育的重要组成部分。SOLIDWORKS作为一款CAD软件,其教育版云应用程序为学生提供了强大而灵活的设计平台。本文将探讨
    的头像 发表于 09-15 10:39 532次阅读
    学生适合使用的SOLIDWORKS 云<b class='flag-5'>应用程序</b>

    HarmonyOS优化应用内存占用问题性能优化一

    一、 概述 用户功能的不断增强,应用越来越复杂,占用的内存也在不断膨胀,而内存作为系统的稀缺资源比较有限,当应用程序占用过多内存时,系统可能会频繁进行
    发表于 05-21 11:27

    如何从 Microsoft Visual C++ 应用程序 (CyAPI.h) 访问 CYUSB3014 芯片组的 i2c 接口?

    1. 如何从 Microsoft Visual C++ 应用程序 (CyAPI.h) 访问 CYUSB3014 芯片组的 i2c 接口? 我在定制相机中使用 CYUSB3014。 当我开发我的相机
    发表于 05-19 07:21

    如何使用CYUSB3KIT-003使用GPIO访问SRAM的应用程序

    你好。我是CYUSB3的初学者。 我想创建一个使用 CYUSB3KIT-003 使用 GPIO 访问 SRAM 的应用程序。 目前我已经在我的电脑上安装了SDK,但是有什么参考资料吗?
    发表于 05-14 06:51

    使用C++中的CyAPI编写的应用程序上遇到了问题,求解决

    我在使用 C++ 中的 CyAPI 编写的应用程序上遇到了问题。 我将 XferData() 方法与其他所有端点类型一起使用,没有遇到任何问题。 但是,将其与 Endpoint0 一起使用会引发
    发表于 05-13 06:11

    将LTC6563用作跨阻放大器时如何才能达到手册中标注的600MHz带宽

    的光电二极管,反向电压加到-8V时宣称仅有0.55pf的结电容,光电流输入的部分一到六层全部挖空以尽量减少电容。目前在5K欧姆档位下能够达到380MHz带宽。 如果我想进一步提高带宽
    发表于 03-21 07:41

    快速搞懂C语言程序内存分区!

    程序运行过程中,操作系统会根据程序的需要,将内存划分为多个功能不同的区段,以便更高效地管理内存资源和确保程序的稳定运行。不同的
    的头像 发表于 03-14 17:37 1341次阅读
    快速搞懂C语言<b class='flag-5'>程序</b><b class='flag-5'>内存</b>分区!

    InterBase和Firebird数据访问组件介绍

    和 Android 平台。 基于 IBDAC 的应用程序使用 InterBase 直接连接到服务器 客户。IBDAC 旨在帮助程序员更快、更清晰地开发 InterBase 数据库应用程序。 与 InterBase 的本地连接
    的头像 发表于 01-23 11:50 935次阅读
    InterBase和Firebird数据<b class='flag-5'>访问</b>组件介绍

    AWTK-WEB 快速入门(4) - JS Http 应用程序

    导读XMLHttpRequest改变了Web应用程序与服务器交换数据的方式,fetch是其继任者。本文介绍一下如何使用JS语言开发AWTK-WEB应用程序,并用fetch访问远程数据。用AWTKDesigner新建一个应用程
    的头像 发表于 01-22 11:31 737次阅读
    AWTK-WEB 快速入门(4) - JS Http <b class='flag-5'>应用程序</b>

    ANACONDA——关于发布数据应用程序的新简单方法

    与 Anaconda 的云笔记本服务无缝集成,为用户提供了一种轻松共享笔记本结果的方式,并让其他人也可以随意的访问它们。 下面我们来了解关于这项新功能的实际应用: 这项功能与 Panel 的多功能性相结合,将彻底改变您发布数据应用程序的方式。使用这个强大的工具,为共享和协
    的头像 发表于 01-17 11:39 646次阅读
    ANACONDA——关于发布数据<b class='flag-5'>应用程序</b>的新简单方法

    EE-62:在C语言中访问短字内存

    电子发烧友网站提供《EE-62:在C语言中访问短字内存.pdf》资料免费下载
    发表于 01-07 14:02 0次下载
    EE-62:在C语言中<b class='flag-5'>访问</b>短字<b class='flag-5'>内存</b>

    通过Skyvia Connect SQL终端节点访问任何数据

    作为网关 ADO.NET 通过最知名和最广泛使用的 .NET 数据访问接口将不同的数据库和云应用程序连接到 .NET 数据相关程序和技术。 .NET Framework 支持 我们的 ADO.NET
    的头像 发表于 01-02 09:31 596次阅读
    通过Skyvia Connect SQL终端节点<b class='flag-5'>访问</b>任何数据

    南亚科技与补丁科技携手开发定制超高带宽内存

    近日,台湾地区知名的DRAM内存制造商南亚科技宣布,已与专业DRAM设计公司补丁科技达成战略合作,共同致力于定制超高带宽内存(Customized Ultra-High-Bandwidth
    的头像 发表于 12-20 14:28 936次阅读

    如何使用内存加速存储访问速度

    增长,这使得其中只能存放很少量的数据表项。而为了解决这一问题,现有工作使用部分主机端内存(high performance booster, HPB)来缓存映射表项。然而文章中发现,现有的HPB管理策略并不能够很好的提升用户体验。这是因为现有的管理策略通常可能会将前台应用
    的头像 发表于 12-19 10:54 1065次阅读
    如何使用<b class='flag-5'>内存</b>加速存储<b class='flag-5'>访问</b>速度

    TAS2521应用程序参考指南

    电子发烧友网站提供《TAS2521应用程序参考指南.pdf》资料免费下载
    发表于 12-10 13:49 0次下载
    TAS2521<b class='flag-5'>应用程序</b>参考指南