内存带宽测试与AVX指令集读写内存
一、内存理论带宽的计算
内存带宽计算公式:带宽=内存核心频率×内存总线位数×倍增系数。
先容我从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、地址对齐等知识进行一些了解和学习。
若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!
同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。
内存带宽测试与AVX指令集读写内存相关推荐
- bandwidth 0.32k 发布,内存带宽测试工具
bandwidth 0.32k 修复了一些小的 AVX 问题. Bandwidth 是一个内存带宽测试的基准工具,但它也可以测量网络带宽.它可以测量每个内存系统的最大内存带宽,包括主内存,L1和L2缓 ...
- stream.c 内存带宽测试
内存带宽测试工具:stream 介绍 Stream测试是内存测试中业界公认的内存带宽性能测试基准工具,作为衡量服务器内存性能指标的通用工具. 2. 原理 申请了三个巨大的双精度浮点数组a[N], b[ ...
- Linux下stream内存带宽测试参数和示例详解附源码(总结)
目录 一.简介 二.使用简介 2.1 测试内容简介 2.2 编译参数简介 2.3 具体参数示例 三.源码下载及使用 四.其他相关知识链接 FIO测试硬盘性能参数和实例总结 一.简介 本文通过实例详细讲 ...
- 【开发工具】【stream】内存带宽测试工具(Stream)的使用
获取更多相关的嵌入式开发工具,可收藏系列博文,持续更新中: [开发工具]嵌入式常用开发工具汇总帖 Stream简介 STREAM是一套综合性能测试程序集,通过fortran和C两种高级且高效的语言编写 ...
- K1 Power Linux上Stream测试内存带宽
K1 Power Linux上Stream测试内存带宽 本篇文章介绍在K1 Power Linux上理论内存带宽结算,实测内存带宽方法,衡量服务器的内存带宽水平.需要说明的是,对于Scale UP的P ...
- 小甲鱼c++源码_飞凌课堂丨OK1046A-C内存交互测试,小白也能看懂
笔者最近需要进行OK1046A-C内存部分的测试,linux相关的资料和方法纷杂繁多,但如鼠饮河,自得其量,还是找了如下软件进行测试,也分享给大家. 01-工具简介 Bandwitdh工具简介 Ban ...
- 服务器内存延迟,内存带宽、延迟性能测试
内存带宽.延迟性能测试 华为FusionServer 2488H V5服务器主板集成了48个内存插槽,但送测机器配备有限.由于送测机型整合了四通道内存控制器,这样使得平台的内存带宽得到了明显的提升. ...
- 内存稳定性测试_内存条选择两条8G还是单条16G?通过对比浅谈该如何选择
内存条作为电脑的核心部件之一,其性能对于整机的性能还是有一定影响.现在内存条主要分为马甲条和普条,马甲条简言之就是带有金属马甲的内存条,一般都会带有超频的功能.随着灯条的出现,也就是在马甲条上加装了R ...
- sisoftware java测试_SiSoftware Sandra测试及全文总结_内存硬盘评测-中关村在线
●SiSoftware Sandra测试 这是一套功能强大的系统分析评测工具,拥有超过30种以上的测试项目,主要包括有 CPU.Drives.CD-ROM/DVD.Memory.SCSI.APM/AC ...
- 内存兼容性测试软件,Ryzen内存测试:有BUG兼容性较差_DIY攒机选购指南-中关村在线...
锐龙AMD Ryzen内存测试:有BUG兼容性较差 据悉Ryzen 7的一个"小Bug":当插满4条DDR4内存的时候,频率最高只能上到DDR4-2400,插2条的时候就能上到DD ...
最新文章
- 特质波动率python
- Python入门100题 | 第012题
- 第十天学习Java的笔记(数组)
- Spring Boot配置文件加载顺序
- org.apache.hadoop.hbase.PleaseHoldException: Master is initializing(解決方案汇总+自己摸索)
- 关于softmax loss这个概念
- lfw2019_来自 LFW SS20 你应该知道的5个时尚趋势
- BreadCrumb控件
- 基于JAVA+Swing+MYSQL的在线考试系统
- 用python生成多个txt文件
- java闭包lambda,(lambda)函数闭包捕获了什么?
- 【渝粤教育】国家开放大学2019年春季 2633轨道交通信号与通信系统 参考试题
- Spring初学快速入门
- Composer报错: require(): Failed opening required ‘.../markbaker/matrix/.../functions/adjoint.php‘
- win10运行安装软件程序提示“为了对电脑进行保护,已经阻止此应用” 有效解决方法记录
- Windows10 64位安装MySQL(免安装版本)
- 哥尼斯堡七桥问题用计算机,哥尼斯堡七桥问题解法真的解不出来?请尽快解答.急...
- 孩子小学总喜欢用计算机做数学,数学到底该怎样学?真实用!
- SlashData开发者工具榜首等你而定!!!
- OpenCV-Python实战(番外篇)——OpenCV中利用鼠标事件动态绘制图形
热门文章
- Unity 接入有道智云AI - 图片翻译
- python画马鞍面_在matlab中怎么画马鞍面?
- 美团外卖自动化业务运维系统建设
- Nods.js安装配置(windows)
- AI制作ICON流程
- 关于win7系统重装完鼠标不能用的解决办法
- lbochs模拟器最新版_bochs模拟器最新版下载
- 【项目管理/PMP/PMBOK第六版/新考纲】计算题! 假设情景分析/类比估算/处理变更/结束采购/高层级风险/组织过程资产
- c语言setlocale函数,setlocale函数
- 微信小游戏上线发布全流程详解