内存带宽测试与AVX指令集读写内存

2023-10-30

一、内存理论带宽的计算

内存带宽计算公式:带宽=内存核心频率×内存总线位数×倍增系数。 

    先容我从DDR的技术说起,DDR采用时钟脉冲上升、下降沿各传一次数据,1个时钟信号可以传输2倍于SDRAM的数据,所以又称为双倍速率SDRAM。它的倍增系数就是2。

    DDR2仍然采用时钟脉冲上升、下降支各传一次数据的技术(不是传2次),但是一次预读4bit数据,是DDR一次预读2bit的2倍,因此,它的倍增系数是2X2=4。

    DDR3作为DDR2的升级版,最重要的改变是一次预读8bit,是DDR2的2倍,DDR的4倍,所以,它的倍增系数是2X2X2=8。

    需要补充的一点是,内存有三种不同的频率指标,它们分别是核心频率、时钟频率和有效数据传输频率。

  • 核心频率即为内存Cell阵列(Memory Cell Array)的工作频率,它是内存的真实运行频率;
  • 时钟频率即I/O Buffer(输入/输出缓存)的传输频率;
  • 有效数据传输频率则是指数据传送的频率。

    DDR3内存一次从存储单元预取8Bit的数据,在I/OBuffer(输入/输出缓存)上升和下降中同时传输,因此有效的数据传输频率达到了存储单元核心频率的8倍。同时DDR3内存的时钟频率提高到了存储单元核心的4倍。也就是说DDR3-800内存的核心频率只有100MHz,其I/O频率为400MHz,有效数据传输频率则为800MHz。

    从SDRAM-DDR时代,数据总线位宽时钟没有改变,都为64bit,但是采用双通道技术,可以获得64X2=128bit的位宽。

    下面计算一条标称DDR3 1066的内存条在默认频率下的带宽:

    1066是指有效数据传输频率,除以8才是核心频率。一条内存只用采用单通道模式,位宽为64bit。

    所以内存带宽=(1066/8)×64×8=68224Mbit。

    由此可知,如果内存工作在标称频率的时候,可以直接用标称频率×位宽,简化公式。 再根据8bit(位)=1Byte(字节),得68224/8=8528MByte=8.328125GB。 

    再以两条标称1066超频到1200的DDR3内存,组成双通道后的带宽:超频到1200后,内存核心频率应为1200/8=150MHz,而双通道的位宽=128bit:带宽=150×128×8=153600Mbit=18.75GB

参考:http://blog.chinaunix.net/uid-14214482-id-3220464.html

 

二、各种内存测试方式的对比

下文分别介绍了使用dd命令、mbw命令、sysbench、AVX指令进行测试。

《设备性能测试 : 内存带宽的测试》

《关于如何读写达到内存最大带宽的网站》

 

三、Bandwidth内存测试工具

详细可查看官网:https://zsmith.co/bandwidth.php

关于Bandwidth工具使用博客:《Bandwidth内存带宽测试工具》

 

四、STREAM内存测试工具

《内存带宽测试-STREAM的使用》

 

五、AVX/AVX2指令编程

《Intel 内部指令 --- AVX和AVX2学习笔记》

《Intel Intrinsics — AVX & AVX2 Learning Notes》

《AVX指令编写的快速拷贝FastMemcpy_Avx》

 

《AVX指令编写的另一个快速拷贝fastMemcpy,并给出了相应的测试结果》

其代码如下,相对来说,是比较靠谱的。

#include <immintrin.h>
#include <cstdint>
/* ... */
void fastMemcpy(void *pvDest, void *pvSrc, size_t nBytes) {
  assert(nBytes % 32 == 0);
  assert((intptr_t(pvDest) & 31) == 0);
  assert((intptr_t(pvSrc) & 31) == 0);
  const __m256i *pSrc = reinterpret_cast<const __m256i*>(pvSrc);
  __m256i *pDest = reinterpret_cast<__m256i*>(pvDest);
  int64_t nVects = nBytes / sizeof(*pSrc);
  for (; nVects > 0; nVects--, pSrc++, pDest++) {
    const __m256i loaded = _mm256_stream_load_si256(pSrc);
    _mm256_stream_si256(pDest, loaded);
  }
  _mm_sfence();
}

 

六、关于使用AVX指令实现memcpy的总结

AVX指令集功能很强,但是应该只是对于计算类,使用后会得到性能的显著提升。

而对于内存读写类的指令,如:

_mm256_stream_load_si256
_mm256_stream_si256

等类似函数,其实对内存读写速度与读写的数据大小有关系,

有时候比memcpy快,有时候更慢,哪怕AVX256bit同时操作的数据是32字节。

关于读写速率的优化,感觉涉及的地方蛮多的,这个可能需要花点时间对指令集、Cache、地址对齐等知识进行一些了解和学习。

 


若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存带宽测试与AVX指令集读写内存 的相关文章

  • React TypeScript

    1 安装 就像安装其他插件库一样 在项目文件夹下执行 npm install antd save 如果你安装了 yarn 也可以执行 yarn add antd 2 引用 import Button Tooltip from antd im
  • window下C语言中strtok函数的使用

    基础知识 原型 char strtok char str const char delim 功能 分解字符串为一组字符串 参数说明 str为要分解的字符串 delim为分隔符字符串 其中 str 不能用指针来存储 因为这个方法的本质是 找到
  • IOS 使用自定义View实现圆形布局(Swift)

    前面写过用安卓实现 还是同个需求 只不过现在需要做苹果版本 网上搜到了类似的案列点击打开链接只不过他的是用UICollectionView 跟我的需求有点不符合 没有搜到完全符合的案例 没办法自己写个 记录一下 也给有同种需求的童鞋填个坑
  • C#泛型List删除多个元素的方法

    泛型List如果删除一个 很简单 直接 RemoveAt index 即可 但如果有多个元素 那么删除起来并不是特别简单 需要使用 for 循环的倒叙删除 例子如下 class Program public class Students p
  • windows10安装linux环境

    Windows里玩转Linux 目标 一般的做法 神仙般的做法 可能会遇到的问题 目标 想要在windows里玩转linux 一般的做法 在windows里安装vmware或virtual box 新建一个虚拟机 在虚拟机里通过iso安装l
  • Python ttkbootstrap 制作账户注册信息界面

    前言 ttkbootstrap 是一个基于 tkinter 的界面美化库 使用这个工具可以开发出类似前端 bootstrap 风格的 tkinter 桌面程序 ttkbootstrap 不仅有丰富的案例 同时还有完善的官方文档 可惜是英文的
  • 宽高都200px的div在浏览器窗口居中(水平垂直都居中)

    1 fixed 从中间移动定位 position fixed width 200px height 200px left 50 top 50 margin left 100px margin top 100px 第一行设置完 盒子的左上角的
  • 国茂股份全面迁移到亚马逊云科技,降本增效,驱动业务增长

    亚马逊云科技宣布 中国通用机械工业减速机行业的标杆企业江苏国茂股份有限公司 简称 国茂股份 正在全面迁移到亚马逊云科技 在中国大陆 西云数据运营宁夏区域 光环新网运营北京区域 将ERP 企业资源计划系统 APS 高级计划与排程系统 MES
  • Docker安装使用阿里云镜像

    registry mirrors https kfwkfulq mirror aliyuncs com https 2lqq34jg mirror aliyuncs com https pee6w651 mirror aliyuncs co
  • 【满分】【华为OD机试真题2023 JS】最小的调整次数

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 最小的调整次数 知识点队列栈 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 有一个特异性的双端队列 该队列可以从头部或尾部添加数据 但是只能从头部移出数据 小A
  • dns服务器响应 异常,DNS云学堂|快速定位DNS解析异常问题,牢记这四种DNS状态码...

    DNS的状态码在进行故障排查的时候起着至关重要的作用 在DNS的维护中会经常遇到DNS解析异常问题 通过DNS的状态码可以初步判断DNS解析的异常问题 本期云学堂通过详解DNS状态码的定义 给出常见状态码的场景举例 enjoy 写在前面 本
  • (一)Matlab三日基础入门——矩阵和数组

    目录 创建数组 方式一 直接创建 方式二 调函数创建 zeros 功能 创建由0组成的数组 ones 功能 创建由1组成的数组 rand 功能 创建 0 1 之间均匀分布的随机数生成的数组 矩阵和数组运算 单一运算符 转置 行列互换 计算矩
  • [leetcode]刷题--关于位运算的几道题

    1 位运算的本质 其实是对二进制补码储存形式的修改 位运算常见的运算符为 lt lt 左移n个位置 算数移位 符号位不变 gt gt 右移动n个位置 采用直接丢弃末尾数字的方法 符号位不变 移位都是算数移位 按位取反 对于包括符号位在内全部
  • 两种公钥加密算法——Merkle-Hellman背包、RSA

    今天看了一些加密体制 很厉害 佩服之余顺便总结下公钥 对称密钥很多啊 历史比较有名的有DES AES RC系列 水平不够说不清楚 所以不写了 自己以后也要看 所以尽量通俗易懂 其实是不怎么会很官方很学术 顺道说 明天就七夕了 我还在搞些啥跟
  • ubuntu 20.04.4编译 继续尝试编译Android 12,13

    之前使用虚拟机编译过Android10 现在开始记录编译12 上次忘记给镜像了这次补上镜像ubuntu 20 04 4 desktop amd64 链接 https pan baidu com s 1REJ2cIJyqupLRQjN9SW0
  • 深搜Dfs遍历节点以及寻路

    深搜遍历从起点出发能走的所有节点 对于一个节点 只要发现了没走过的点就走到它 如果有多个点可走就任选一个 递归调用 由于是从起点开始遍历 因此遍历过程也是产生路径的过程 因此深搜遍历是有路径信息的 单纯的根据数据结构遍历所有点是没有路径信息

随机推荐

  • 关于ABAP批次或生产订单特性值的随记

    阅读目录 特性值 后台表 批次特性值 生产订单特性值 特性值 特性值是为了控制一些特定属性 特性字段可以在SAP里配置 以方便管控物料或者订单 后台表 特性值涉及到的SAP后台表有 CABN CABNT CAWN CAWNT KSML KL
  • Vue、Vue CLI、Webpack 和 Webpack CLI 的版本兼容对照表

    Vue Vue CLI Webpack 和 Webpack CLI 的版本兼容对照表 Vue Vue 2 x x Webpack 3 x Vue Loader 14 x Vue 3 x x Webpack 4 x Vue Loader 15
  • 基于MQTT协议的 org.eclipse.paho.client.mqttv3 源码学习(二)

    http blog csdn net chenbifeng article details 25067761 一 主要类介绍 二 重点类代码分析 对于长连接 一般是直接从消息的接收和发送类开始读 上面知道paho中消息发送和接收是在Comm
  • axios从入门到源码分析

    axios是什么 axios 基于promise封装的ajax库 基于这个类库发送ajax请求 默认就是基于promise管理的 核心还是XMLHttpRequest axios中文文档8 axios中文网 axios axios中GET系
  • NRF24L01跳频抗信道干扰功能探讨

    接触到此问题是由于在一个项目中使用了Si24R1 1主机发四从机收 调试过程中发现从机接收会丢包 40包丢2包 查阅资料发现可能是因为外部其他2 4G设备 比如蓝牙 WiFi 干扰信号 实测将速率从1M下降到250k 并且将信道调整到120
  • 解决spring-boot-configuration-processor导入之后,任没有提示问题

    解决spring boot configuration processor导入之后 任没有提示问题 在检查之后得出 idea在导入spring boot configuration processor依赖之后 任然没有提示 在检查pom文件
  • 机器学习中,fit_transform,fit,transform三个函数的区别和作用

    写在前面 fit和transform没有任何关系 仅仅是数据处理的两个不同环节 之所以出来fit transform这个函数名 仅仅是为了写代码方便 会高效一点 sklearn里的封装好的各种算法使用前都要fit fit相对于整个代码而言
  • 【FPGA】Synopsys vcs2018仿真问题汇总

    1 重启后lisense问题 问题原因 可能是lmgrd服务不正常导致的 这边通过下面几个步骤解决 切换到root用户 su root 彻底关闭lmgrd服务 lmdown ps aux grep lmgrd kill 9 xxxx 验证本
  • Hbase集群调优

    一 hbase现有硬件资源的理论性能 1 集群容量规划公式 优化调整 发挥硬件的最大优势 Disk Size Java Heap RegionSize MemstoreSize ReplicationFactor HeapFractionF
  • 解压报错tar: This does not look like a tar archive

    从google drive上下载了一个权重文件 是tar格式的 于是我想当然的使用指令进行解压 tar xvf filename tar 但是始终报错 tar This does not look like a tar archive ta
  • 【亲测】mwget安装成功

    微信公众号 leetcode algos life 代码随想随记 小红书 412408155 CSDN https blog csdn net woai8339 type blog 抖音 暂未开始 计划开始 tian72530 知乎 暂未开
  • 商城APP软件开发要素有哪些

    商城APP软件体系是当今电商行业经常会运用的商城体系 既支撑企业对企业的运营形式 也支撑卖家对消费者的运营形式 便是现在常见的B2C B2B的电商形式APP 跟着现在的互联网的遍及现在这些电商都是成为了电商商家开展的不可缺少的互联网平台 打
  • Golang流程控制-if(十一)

    单分支 if 条件表达式 代码块 说明 当条件表达式为true时 就会执行 内的代码 注意 是必须有的 就算你只写一行代码 双分支 if 条件表达式 代码块1 else 代码块2 说明 当条件表达式成立 执行代码块1 否则执行代码块2 也是
  • 【STM32CubeMX项目】小时钟V1.0

    前言 基于STM32CubeMx STM32F103C6T6编写时钟功能 现在以及能实现时钟的简单功能 做文记录下 还有很多可以改进的地方 也算留下的基础版本下来备份吧 我愿称之为V1 0版本 可供学习参考 实物 引脚接线 OLED STM
  • springboot启动流程

    springboot启动流程 四 application配置文件加载过程 lay 博客园 cnblogs com
  • 完全用 GNU/Linux 工作

    完全用 GNU Linux 工作 摈弃 Windows 低效率的工作方式 发掘 Linux 身上的 UNIX 气质 我已经半年没有使用 Windows 的方式工作了 Linux 高效的完成了我所 有的工作 GNU Linux 不是每个人都想
  • 【SQLi-LABS】Less -11 注入思路以及过程

    前言 less 11 是 sqli labs 的第一道 POST 型注入题 因此 我们不能再用之前 GET 型注入的方法 在搜索框进行注入 而是要在输入框里面完成注入 下面的注入流程是基于nliuc师傅的视频教程实现的 下面是他的博客 大家
  • C 语言中int, float, double 和 char 字节大小

    C 语言中int float double 和 char 字节大小 使用 sizeof 操作符计算int float double 和 char四种变量字节大小 sizeof 是 C 语言的一种单目操作符 并不是函数 sizeof 操作符以
  • 百炼智能发布垂直模型“爱迪生”,B2B行业的AIGC大潮来了

    图片来源 Pixels AIGC终于来到B2B行业 企业服务 AGI时代已拉开帷幕 数科星球原创 作者丨苑晶 编辑丨大兔 百炼智能是一家专注B2B行业的智能营销企业 在过去 该行业经历了大数据 人工智能时代的洗礼 随着行业对数据的运用不断纯
  • 内存带宽测试与AVX指令集读写内存

    一 内存理论带宽的计算 内存带宽计算公式 带宽 内存核心频率 内存总线位数 倍增系数 先容我从DDR的技术说起 DDR采用时钟脉冲上升 下降沿各传一次数据 1个时钟信号可以传输2倍于SDRAM的数据 所以又称为双倍速率SDRAM 它的倍增系