CSAPP cache lab - Optimizing Matrix Transpose

news2024/11/5 15:24:09

CSAPP cache lab part B

矩阵转置

矩阵转置是一种操作,它将矩阵的行和列互换位置,即将原始矩阵的行变为转置矩阵的列,将原始矩阵的列变为转置矩阵的行。转置操作可以通过改变矩阵的布局来方便地进行某些计算和分析。

假设有一个m×n的矩阵A,其转置矩阵为n×m的矩阵B。那么B的第i行第j列的元素就是A的第j行第i列的元素,即B[i][j] = A[j][i]。

例如,对于以下矩阵A:

A = [ 1  2  3 ]
    [ 4  5  6 ]

其转置矩阵B为:

B = [ 1  4 ]
    [ 2  5 ]
    [ 3  6 ]

可以看到,B的第一行是A的第一列,B的第二行是A的第二列,以此类推。

矩阵转置在很多领域中都有广泛的应用,例如线性代数、图像处理、矩阵运算等。它可以用于求解线性方程组、计算矩阵的逆、矩阵相乘等操作。在编程中,可以使用循环和临时变量来实现矩阵转置,也可以使用现有的矩阵库或数学库提供的函数来完成转置操作。

part B 背景

在这里插入图片描述
已经实现了矩阵转置函数,需要通过提高cache hit的方式,提高性能。
int 类型通常是4bytes。

3种格式的矩阵:
在这里插入图片描述
预期:
在这里插入图片描述
cache 的参数:
s = 5, E = 1, b = 5
在这里插入图片描述

使用 cache blocking 优化 Matrix Transpose

在这里插入图片描述

执行matrix transpose 函数:

./test-trans -M 32 -N 32

test-trans 会生成 trace.f0 和trace.f1文件,

./csim-ref -v -s 5 -E 1 -b 5 -t trace.f0 | less

在这里插入图片描述
32 x 32 的case, 使用分块将miss从1183降低到了343。
对于32 x 32:
A[0][0] 的地址:602100 - A[0][7], set: 8
A[8][0] 的地址:602500 - A[8][7], set: 8
B[0][0] 的地址:642100 - B[0][7], set: 8
B[8][0] 的地址:642500 - B[8][7], set: 8
建议bszie 为8。
在这里插入图片描述
但是64 x 64的case 的miss 没有降低。
对于64 x 64:
A[0][0] 的地址:602100 - A[0][7], set: 8
A[4][0] 的地址:602500 - A[4][7], set: 8
B[0][0] 的地址:642100 - B[0][7], set: 8
B[4][0] 的地址:642500 - B[4][7], set: 8

为了减少缓存冲突,bsize建议设置为4。
当bsize == 4时,miss 下降到1891。
在这里插入图片描述
不同的blcok size会对cache miss 产生影响;

关于cache miss:

  1. A[0][0] 和 B[0][0], A[0][1] (602104)的setIndex 都是8, 存在cahce miss
  2. empty cache 会导致miss
    主要是以上两种情况导致的cache miss。
    在这里插入图片描述
    A[i][j] 到 A[i][j+bsize-1] 应该都是在同一个cache block ,再一次迭代将一个block的一行数据读出,可以减少缓存冲突,提高了局部访问,从而降低miss,让miss 降低1699。
    在这里插入图片描述
    同样,32 x 32的case, 也可以降低缓存冲突。
    在这里插入图片描述
    降低到300以下:
    在这里插入图片描述
    回到64 x 64的case, 使用4 x 4的block, 不能充分利用cache block, 会有4个block的浪费,所以存在优化空间。

在这里插入图片描述
由于 61 x 67, 每个cache line 不能保存完整的行,建议是使用较大的block, bsize为17时,可以满足miss 低于2000。

cache blocking

Cache blocking,也称为循环阻塞或循环平铺,是一种在高性能计算中用于优化内存的技术,特别是对涉及嵌套循环和数据结构(如矩阵)的算法。Cache blocking 的主要目标是改善数据局部性,减少缓存失效的次数,从而提高整个程序的性能。

以下是对 cache blocking 的概述:

  1. 动机:

    • 缓存层次结构: 现代计算机体系结构通常具有内存层次结构,包括寄存器、L1、L2甚至L3缓存,以及主内存。从较高层次的内存中访问数据比从较低层次的内存中访问数据更快。
    • 缓存行大小: 数据在内存层次结构之间以固定大小的块(称为缓存行)传输。有效地利用这些缓存行对于优化内存访问至关重要。
  2. 基本思想:

    • 循环嵌套优化: Cache blocking 通常应用于嵌套循环,这在科学计算和数值计算中很常见。其思想是将嵌套循环的迭代空间划分为适应缓存的小而连续的块。
  3. 技术:

    • 划分迭代空间: 将嵌套循环划分为迭代块,然后结构化算法以一次处理这些块。这减小了工作集大小,提高了空间局部性。
    • 数据重用: 通过在适应缓存的小块上操作,算法内部可以重复使用相同的数据,减少了从内存层次结构较慢的部分重新加载数据的需求。
  4. 优势:

    • 减少缓存失效: Cache blocking 通过确保算法访问的数据在需要时位于缓存中,帮助最小化了缓存失效次数。
    • 改善空间局部性: 具有空间局部性的数据访问模式提高了整体内存访问的效率,更好地利用了缓存行。
  5. 实现:

    • 编译器优化: 一些编译器可以在代码编译期间自动应用 cache blocking 转换。
    • 手动优化: 程序员也可以通过手动重组他们的代码来手动应用 cache blocking 技术。
  6. 应用:

    • 矩阵乘法: Cache blocking 在优化矩阵乘法算法中经常被使用。
    • 数值计算: 对涉及密集矩阵、卷积操作和其他数值计算的算法来说,cache blocking 是有益的。

Cache blocking 是一种重要的优化技术,特别是在科学计算和数值分析中,其中算法的性能往往受制于内存访问模式。通过精心管理数据局部性,cache blocking 有助于充分利用现代计算机体系结构的层次结构,从而实现更好的性能。

分块

在这里插入图片描述
使用分块,列也可以利用cache hit提高算法效率。

在这里插入图片描述
不使用分块一次迭代,可能出发多次line i的缓存冲突。

cache blocking 论文

推荐 “Cache Performance of Blocked Algorithms” by Monica S. Lam, Edward E. Rothberg, and Michael E. Wolf
这是一篇经典的论文,探讨了在矩阵乘法等计算中如何通过缓存块来优化性能。这篇论文发表在1991年的 ACM SIGPLAN 论文集上。

函数指针

指向函数的指针是一种特殊类型的指针,它可以指向函数的内存地址。通过函数指针,可以将函数作为参数传递给其他函数、在运行时动态选择要调用的函数,或者将函数作为返回值返回。

函数指针的声明方式与普通指针相似,只是在声明时需要指定函数的返回类型和参数列表。例如,以下是一个指向函数的指针的声明示例:

int (*func_ptr)(int, int);

在上述声明中,func_ptr是一个指向返回类型为int,参数列表为两个int类型的函数的指针。可以通过将函数的名称赋值给函数指针来进行初始化,如下所示:

int sum(int a, int b) {
    return a + b;
}

int main() {
    int (*func_ptr)(int, int) = sum;
    int result = func_ptr(3, 4); // 调用sum函数,将结果赋值给result变量
    return 0;
}

在上述示例中,将函数sum的地址赋值给了函数指针func_ptr,然后可以通过函数指针来调用函数并获取结果。

通过函数指针,可以实现函数的动态调用和多态性,使得代码更加灵活和可扩展。

c语言二维数组的地址

在这里插入图片描述
在C或C++中,static int A[256][256]; 和 static int B[256][256]; 这样的静态多维数组的地址是固定的。静态数组在程序运行时在全局数据区分配内存,其地址在整个程序执行期间保持不变

在大多数操作系统中,程序的全局静态数据区(Global Static Data Area)通常在程序加载时被分配,并且在整个程序运行期间保持不变。这包括全局变量、静态变量以及静态数组等。因此,如果你多次执行程序,这些全局静态数据的地址通常不会改变。

当程序加载到内存时,操作系统会为全局静态数据分配内存,并将其初始化。这些数据存储在固定的内存位置,以便程序可以随时访问它们。因此,每次运行程序时,全局静态数据区的地址保持不变。

这种行为有助于确保程序能够正常访问全局静态数据,并且程序中的其他部分可以依赖这些数据的固定位置。但是请注意,这种固定性仅适用于全局静态数据,而不适用于局部变量或动态分配的内存(例如使用 mallocnew 分配的内存),它们的地址可能在运行时变化。

主流优化缓存命中

缓存命中对于提高计算机系统性能非常关键。以下是一些主流的优化缓存命中的方法:

  1. 局部性原理(Locality Principle):

    • 时间局部性:访问的数据很可能在不久的将来再次被访问。
    • 空间局部性:访问的数据附近的数据很可能在不久的将来被访问。
  2. 缓存友好的数据结构:

    • 尽量使用数组而不是链表,因为数组的元素在内存中是连续存储的,有较好的空间局部性。
    • 对于多维数组,尽量按照主要方向顺序存储数据,以增加空间局部性。
  3. 缓存对齐(Cache Alignment):

    • 将数据结构和数组按照缓存行的大小对齐,以减少缓存行的浪费。
  4. 循环展开(Loop Unrolling):

    • 将循环中的迭代次数展开,减少循环的迭代次数,提高局部性。
  5. 软件预取(Software Prefetching):

    • 在代码中预测未来可能会使用的数据,并在需要时提前将其加载到缓存中,以减少缓存未命中。
  6. 避免假共享(False Sharing):

    • 确保不同线程使用的数据不共享同一缓存行,以避免因为一个线程修改数据而导致其他线程的缓存无效。
  7. 缓存感知型算法:

    • 一些算法可以被设计为更加缓存友好,例如分块算法(Tiling)。
  8. 数据压缩:

    • 在某些情况下,通过使用压缩算法可以减少数据传输的量,从而减少缓存需求。
  9. 硬件级别的优化:

    • 利用硬件指令集中的一些优化指令,如SSE(Streaming SIMD Extensions)等,来提高对缓存的利用率。
  10. 分级缓存(Cache Hierarchy)优化:

    • 了解和合理利用不同级别的缓存,以最大化缓存命中率。

tiling 和 blocking 的区别?

“Blocking” 和 “tiling” 都是优化算法以提高缓存利用率的技术。尽管它们的目标相似,但它们在实现上有一些细微的差别:

  1. Blocking(块级优化):

    • 概念: Blocking 通过将数据划分为小块(块),然后按块处理,以提高数据局部性。
    • 操作: 对于一个矩阵,可以将其分割为较小的子矩阵(块),然后按块进行计算。这有助于提高空间局部性,因为它使得相邻的数据在物理内存中更加接近,减少了缓存未命中的可能性。
    • 实现: 常用于优化矩阵运算,如矩阵乘法。算法会按块处理矩阵,以减少对主存的访问次数。
  2. Tiling(瓦片优化):

    • 概念: Tiling 是一种更广泛的优化方法,它涵盖了 blocking 的概念,但更一般地用于描述将计算分解为小的、独立的任务单元,这些任务单元可以并行执行,从而提高缓存利用率。
    • 操作: 与 blocking 类似,通过将数据分割成小块(瓦片)并按瓦片进行计算,以提高局部性。但在某些上下文中,瓦片也可能指的是分割问题空间,使得可以并行地处理各个瓦片。
    • 实现: Tiling 不仅适用于矩阵运算,还可用于其他类型的问题,包括图像处理、信号处理等。

总的来说,blocking 是 tiling 的一个特例。Tiling 的概念更加通用,可以适用于不同类型的问题,而 blocking 更专注于按块处理数据以提高空间局部性。在许多上下文中,这两个术语可能会被交替使用。

硬件和软件缓存

硬件实现的缓存和软件实现的缓存是两种不同的概念,它们分别指的是在计算机系统中由硬件和软件管理的缓存。

  1. 硬件实现的缓存:

    • 位置: 硬件缓存是由计算机体系结构中的硬件组件实现和管理的。通常,现代计算机体系结构包括多层次的硬件缓存,如L1、L2和L3缓存。
    • 管理: 硬件缓存的管理是透明的,即它由硬件自动完成,而不需要软件的直接干预。硬件使用一些缓存替换策略和预取算法,以提高缓存的效率和性能。
    • 访问速度: 由于硬件缓存是直接嵌入到处理器芯片中的,它们通常具有非常快的访问速度。
  2. 软件实现的缓存:

    • 位置: 软件缓存是在应用程序或操作系统级别由软件实现的,而不是由硬件实现的。这可能涉及到在主存储器中维护缓存结构,例如软件缓存池。
    • 管理: 软件缓存的管理需要软件程序员手动实现,包括数据的存储、检索、替换和更新。软件缓存通常需要更多的软件开发和维护工作。
    • 访问速度: 与硬件缓存相比,由于软件缓存是在主存储器中实现的,其访问速度可能相对较慢。

总的来说,硬件实现的缓存是通过处理器芯片内的硬件组件实现和管理的,而软件实现的缓存是通过软件层面的数据结构和算法来实现的。硬件缓存通常更为高效,但软件缓存允许更大的灵活性和可编程性。在实际应用中,两者可能会结合使用以最大程度地提高系统性能。

软件缓存的例子

软件实现的缓存通常涉及在应用程序或操作系统层面手动管理数据的存储、检索和更新。以下是一些软件实现的缓存的例子:

  1. 文件系统缓存:

    • 操作系统通常维护一个文件系统缓存,用于存储最近读取或写入的文件块。这样,如果相同的数据被多次访问,就可以从缓存中读取,而不是重新访问磁盘。
  2. 数据库查询缓存:

    • 在数据库查询中,可以手动实现一个查询结果的缓存,以避免重复执行相同的查询。如果之前已经执行过某个查询并且结果没有发生变化,就可以从缓存中获取结果,而不必再次查询数据库。
  3. Web应用程序缓存:

    • Web应用程序可以使用缓存来存储页面内容、图像或其他资源,以减少对服务器的请求。浏览器缓存是其中的一种形式,它可以缓存页面元

docker 的坑

https://zhuanlan.zhihu.com/p/342594115

links

https://zhuanlan.zhihu.com/p/112040924
https://zhuanlan.zhihu.com/p/79058089
https://zhuanlan.zhihu.com/p/387662272
https://blog.csdn.net/qq_42241839/article/details/122984159

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1366957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java回溯算法、最短路径算法、最小生成树算法

回溯算法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 最短路径算法 从某顶点出发,沿图的边到达另一顶点所经过的路径中…

autodl学术加速

今天使用autodl加载预训练BERT模型失败,在官方文档里面找到了官方给的代理使用方法。 直接在bash输入: 开启学术加速: source /etc/network_turbo取消学术加速: unset http_proxy && unset https_proxy据说是只能访问这…

.pings勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言: 随着科技的发展,网络空间中的威胁也日益猖獗,其中之一就是勒索病毒,而.pings 勒索病毒则是其中的一种。本文将深入介绍.pings 勒索病毒的特征、恢复被其加密的数据文件的方法,并提供预防措施,以保障…

Python武器库开发-武器库篇之敏感路径扫描器开发(四十二)

Python武器库开发-武器库篇之敏感路径扫描器开发(四十二) 我们在信息收集的过程中,会发现部署的目标网站之后会有很多的敏感文件,比如说配置文件(.cfg)、数据文件(.sql)、目录文件(/backup /conf /admin)。这些配置的…

WSL使用Ubuntu 20.04版本运行py-bottom-up-attention的记录,及其可能错误的解决方法

文章目录 1. 切换linux的镜像2. 安装gcc3. 查看显卡驱动4. 安装gcc版本5. wsl安装cuda 10.16. 新建虚拟环境8. 安装依赖包9. 运行代码错误运行的所有历史命令如下 WSL使用Ubuntu 20.04版本运行py-bottom-up-attention的记录,及其可能错误的解决方法 github代码地址…

Ubuntu下Lighttpd服务器安装,并支持PHP

1、说明 Lighttpd 是一个德国人领导的开源Web服务器软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的web server环境。具有非常低的内存开销、cpu占用率低、效能好以及丰富的模块等特点。 Lighttpd是众多OpenSource轻量级…

C++力扣题目--94,144,145二叉树非递归(迭代)遍历

为什么可以用迭代法(非递归的方式)来实现二叉树的前后中序遍历呢? 我们在栈与队列:匹配问题都是栈的强项 (opens new window)中提到了,递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地…

使用 vue-json-viewer 工具在界面显示json格式数据

安装vue-json-viewer npm install vue-json-viewer --save 引入&#xff1a; import JsonViewer from vue-json-viewer Vue.use(JsonViewer) 使用&#xff1a; <json-viewer :value"jsonData" show-double-quotes :preview-mode"true" :show-array…

excel中相同类型的数据归到一起显示

1.选中所有数据 2.开始菜单-排序和筛选-自定义排序 3.选择分类关键字 此处&#xff0c;以属性为例 4.效果 归类后的数据&#xff1a;

JetPack组件学习ViewModel

ViewModel的使用 1.需要先创建ViewModel类&#xff0c;继承自ViewModel重写onclear方法&#xff0c;使得页面销毁的时候能够走到自定义的onClear方法中 class MyViewModel : ViewModel() {//共享数据的核心在于拿到同一个LiveData实例&#xff0c;也就是拿到同一个ViewModel实…

面试算法102:加减的目标值

题目 给定一个非空的正整数数组和一个目标值S&#xff0c;如果为每个数字添加“”或“-”运算符&#xff0c;请计算有多少种方法可以使这些整数的计算结果为S。例如&#xff0c;如果输入数组[2&#xff0c;2&#xff0c;2]并且S等于2&#xff0c;有3种添加“”或“-”的方法使…

商中在线(商务中国)域名外部入库流程

注册商是商中在线&#xff0c;且在商中在线管理的&#xff0c;请使用此教程外部入库。 如您的域名注册商是商中在线但在聚名管理&#xff0c;请参考教程&#xff1a;聚名平台域名外部入库流程 -西部数码帮助中心 一、在我司提交入库 1、在【业务管理】-【域名管理】-【外…

Qt/QML编程学习之心得:一个音频播放器的实现(29)

在window下&#xff0c;打开音乐播放器&#xff0c;然后打开一个.mp3文件&#xff0c;就可以实现播放了&#xff0c;那么在Qt/QML中如何实现呢&#xff1f;首先所有的设计都是基于音乐播放器的&#xff0c;嵌入式linux下同样也有音乐播放器&#xff0c;比如mplayer。其调用方法…

2_工厂设计_工厂方法和抽象工厂

工厂设计模式-工厂方法 1.概念 工厂方法模式(Fatory Method Pattern ) 是指定义一个创建对象的接口&#xff0c;但让实现这个接口的类来决定实例化哪个类&#xff0c;工厂方法让类的实例化推迟到子类中进行。 在工厂方法模式中用户只需要关心所需产品对应的工厂&#xff0c;…

阿里开源AnyText:可在图像中生成任意精准文本,支持中文!

‍随着Midjourney、Stable Difusion等产品的出现&#xff0c;文生图像领域获得了巨大突破。但是想在图像中生成/嵌入精准的文本却比较困难。 经常会出现模糊、莫名其妙或错误的文本&#xff0c;尤其是对中文支持非常差&#xff0c;例如&#xff0c;生成一张印有“2024龙年吉祥…

数据分析基础之《pandas(1)—pandas介绍》

一、pandas介绍 1、2008年Wes McKinney&#xff08;韦斯麦金尼&#xff09;开发出的库 2、专门用于数据分析的开源python库 3、以numpy为基础&#xff0c;借力numpy模块在计算方面性能高的优势 4、基于matplotlib能够简便的画图 5、独特的数据结构 6、也是三个单词组合而…

2024年数学建模美赛能用chatGPT之类的AI吗?官方给了明确规定!

这两年chatGPT等大语言模型火了&#xff0c;能对话&#xff0c;自然也能回答数学建模方面的问题。 那美赛能不能用这些AI呢&#xff1f;2024年美赛官方对chatGPT等的使用做出了明确的规定&#xff08;其中的VI. Contest Instructions部分&#xff09;&#xff1a; https://ww…

《2024 AIGC 应用层十大趋势白皮书》:近屿智能OJAC带您一起探索AI未来

Look&#xff01;&#x1f440;我们的大模型商业化落地产品&#x1f4d6;更多AI资讯请&#x1f449;&#x1f3fe;关注Free三天集训营助教在线为您火热答疑&#x1f469;&#x1f3fc;‍&#x1f3eb; 近日国际知名咨询机构IDC发布《2024 AIGC 应用层十大趋势白皮书》的发布&am…

水文模型(科普类)

SWMM 模型概况&#xff1a; SWMM5 系列拥有编辑区域数据的功能&#xff0c;而且能模拟水文、 水力和水质。其核心部分是管道汇流计算模块&#xff0c;提供了恒定流法、运动波法和动力波法三种水动力学 方法。其中动力波法通过求解完整的圣维南方 程组进行计算&#xff0c;能够…