cache测试及其矩阵优化

CMU 15213:cache memories笔记和cache实验 1. 笔记 cache基本概念 1.cache:S、E、B S:sets E:the number of lines per set B:the number of bytes per block 2.地址格式: 一般:tag bits+set index+block offset 可选:set index + tag bits + block offset 3.直接映射:one line... 阅读详情
利用c/c++测试电脑的cache参数,知识点主要有以下几个:

1. SSE 指令预取

Intel公司的单指令多数据流式扩展(SSE,Streaming SIMD Extensions)技术能够有效增强CPU浮点运算的能力。具体情况请移步维基。

C++中包含SSE指令的头文件:
#include <xmmintrin.h>

预取指令:_mm_prefetch

void _mm_prefetch(char *p, int i)
从地址P处预取尺寸为cache line大小的数据缓存,参数i指示预取方式(_MM_HINT_T0, _MM_HINT_T1, _MM_HINT_T2, _MM_HINT_NTA,分别表示不同的预取方式)
T0 预取数据到所有级别的缓存,包括L0。
T1 预取数据到除L0外所有级别的缓存。
T2 预取数据到除L0和L1外所有级别的缓存。
NTA  预取数据到非临时缓冲结构中,可以最小化对缓存的污染。
如果在CPU操作数据之前,我们就已经将数据主动加载到缓存中,那么就减少了由于缓存不命中,需要从内存取数的情况,这样就可以加速操作,获得性能上提升。使用主动缓存技术来优化内存拷贝。

注意,CPU对数据操作拥有绝对自由!使用预取指令只是按我们自己的想法对CPU的数据操作进行补充,有可能CPU当前并不需要我们加载到缓存的数据,这样,我们的预取指令可能会带来相反的结果,比如对于多任务系统,有可能我们冲掉了有用的缓存。不过,在多任务系统上,由于线程或进程的切换所花费的时间相对于预取操作来说太长了, 所以可以忽略线程或进程切换对缓存预取的影响。

参考:MSDN
http://hi.baidu.com/sige_online/blog/item/a80522ceec812433b700c829.html
http://www.codeguru.com/forum/archive/index.php/t-337156.html
http://blog.youkuaiyun.com/igame/archive/2007/08/21/1752430.aspx


2. 编译带有SSE指令的程序
需要使用以下选项:
g++ -Wall -march=pentium4 -mmmx -o run.out test.cpp

否则就会出现如下类似错误:
/usr/lib/gcc/i386-redhat-linux/4.1.2/include/xmmintrin.h:34:3: error: #error "SSE instruction set not enabled"

如果是多线程程序,还要加上-lpthread选项


3. 计时函数

3.1 clock()

#include<time.h>

获得该程序从启动到函数此处调用占用CPU的时间
常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元
可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间,单位为秒

3.2 gettimeofday()

#include<sys/time.h>
int gettimeofday(struct timeval*tv, struct timezone *tz)
gettimeofday()会把目前的时间用tv结构体返回,当地时区的信息则放到tz所指的结构中

struct  timeval{
    long  tv_sec;/*秒*/
    long  tv_usec;/*微妙*/
};

struct  timezone{
    int tz_minuteswest;/*和greenwich 时间差了多少分钟*/
    int tz_dsttime;/*type of DST correction*/
};

在gettimeofday()函数中tv或者tz都可以为空。如果为空则就不返回其对应的结构体。
函数执行成功后返回0,失败后返回-1,错误代码存于errno中。
在使用gettimeofday()函数时,第二个参数一般都为空,因为我们一般都只是为了获得当前时间,而不用获得timezone的数值

4. 矩阵优化

大矩阵的计算时间主要消费在IO访问上,可以利用cache的空间局部性原理,对矩阵的IO进行优化,本文主要是从行列相乘入手,利用转置

C++矩阵转置:从基础实现到分块优化的性能提升 矩阵转置是线性代数中的基础运算,其核心原理是将矩阵的行列互换。在计算机科学中,这一操作不仅是算法学习的经典案例,更是理解内存布局和性能优化的关键切入点。从技术价值看,高效的转置实现能显著提升图像处理、科学计算和机器学习等领域的计算效率。应用场景广泛,尤其在处理大规模数据时,优化内存访问模式至关重要。本文深入探讨了C++中矩阵的不同存储结构(如vector<vector<T>>和扁平化vector<T>)对转置性能的影响,并重点介绍了分块优化技术。通过利用CPU缓存特性,分块策略能有效减少缓存缺失,从而大幅提 阅读详情

相关推荐

工作流进阶:多 Job 编排、矩阵构建与依赖缓存

本文深入工作流编排,讲解如何拆分多个 Job、使用矩阵构建覆盖多版本环境,以及如何利用缓存加速依赖安装。

kaixin110a的博客 10

C语言写的Cache模拟器:带自动测试、性能剖析和实验报告的完整教学包

用标准C语言实现的Cache模拟器,支持直接映射和组相联两种结构,内置LRU替换算法,能解析内存地址、统计命中/缺失次数、模拟块加载与替换全过程。配套driver.py脚本可自动运行测试用例,并与csim-ref参考程序比对输出结果,确保逻辑正确性。提供gprof和valgrind使用示例,帮助识别缓存不友好访问模式,比如跨行读取、步长非对齐等;包含trans.c和test-trans.c用于实测矩阵转置优化效果,直观展示不同缓存参数(块大小、组数、行数)对实际程序性能的影响。所有代码适配Linux环境(U

l3m4n的博客 223

机械臂抓取前言

机械臂相关的笔记

weixin_64037619的博客 3908

SAP 移动类型简述

SAP系统中用于标志物料移动(收货/发货/转储/转储记帐)的三位的数字/字母 通常分几大类:收货 发货 转储 库房调整 常用的有: 收货类 (MB1C) 101 采购订单收货 103 采购订单收货至冻结状态 122 无采购订单退货 161 按退货采购订单退货 131 从生产订单 501 无采购订单收货 511 免费收货 发货类(MB1A) 201 成本中心消耗

forever_crazy的专栏 7201

用 n8n 提取静态网页内容:从 HTTP Request 到 HTML 节点全解析

本文介绍了如何使用n8n的HTTP Request和HTML节点组合提取静态网页内容。首先通过HTTP Request节点获取网页HTML源码,然后使用HTML节点解析并提取所需数据。关键点包括:1)HTTP Request节点设置URL和GET方法;2)HTML节点配置Source Data为JSON并指定data字段;3)重点掌握Extraction Values参数,特别是CSS选择器(使用.和#定位元素)、Key命名、Return Value类型选择等。文章通过实例演示了标题和正文的提取方法,并提供

muyouking 4568

DexProtector内存校验绕过与DEX提取实战

DEX文件是Android应用的核心执行单元,其动态加载与运行时保护机制直接关系到App安全强度。DexProtector作为主流商业加固方案,摒弃传统文件级防护,转而依托ART虚拟机下的匿名内存映射段(anonymous mmap)构建多维校验体系——涵盖字节码完整性校验、内存页属性检测及运行时环境感知。其技术价值在于将防护锚点从静态APK迁移至动态内存态,大幅提升逆向门槛。典型应用场景包括金融类App的防篡改加固、游戏客户端的反外挂保护,以及政企应用的合规性安全增强。本文聚焦DexProtector v

weixin_30315435的博客 714

保姆级教程:Unity编辑器汉化全流程(从下载到配置避坑指南)

本文提供Unity编辑器汉化的保姆级教程,涵盖从下载中文语言包到配置避坑的全流程。详细解析版本适配、文件系统交互及编辑器底层配置逻辑,帮助开发者高效完成汉化,解决常见报错问题,提升工作效率。

weixin_30825581的博客 155

Claude AI实战指南:从注册到精通,突破手机验证的终极解决方案

本文提供了一份详尽的Claude AI实战指南,重点解决了国内用户注册过程中的手机号验证难题,并分享了使用技巧。文章详细介绍了如何通过虚拟手机号服务等方案完成注册,并深入解析了Opus、Sonnet、Haiku三大模型的特点与选择策略,帮助用户从注册到精通,高效利用这一安全、健谈的AI助手进行内容创作、编程开发与学习研究。

weixin_29092031的博客 1232

用 ABAP CDS 把树建起来:Hierarchy 的建模、调试与消费全流程

CDS Hierarchy 将树形数据结构作为一等公民引入 ABAP 开发,通过定义父子关联、根节点条件和兄弟排序规则,让数据库原生支持层级查询。相比传统递归处理方式,它能避免性能瓶颈,提供$node系统字段描述节点结构信息,并支持与SAP UI框架无缝集成。这种方法简化了组织架构、成本中心等业务场景的层级数据处理,使开发人员能够专注于业务逻辑而非底层实现。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 207

Spring AI Alibaba实战训练营-20 基于注解驱动的MCP快速开发入门指南

本文详细讲解如何使用SpringAiAlibaba快速开发基于注解驱动的MCP应用。文章详细介绍了MCP协议并且重点介绍了Spring AI通过注解驱动的开发方式简化MCP服务开发。具体包括服务端和客户端的注解使用、城市最新时间查询MCP项目结构概览(服务端和客户端模块)以及环境配置要求。

program哲学 295

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: 常用排序算法的实现
下一篇: 怎样阅读论文(台湾彭明辉)
Parle
博客等级 码龄14年 36粉丝 69原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值