优化我们的程序(数据篇):自空间复用

news2025/1/3 13:37:40

自空间复用

当遍历的元素恰好在一条cache线上时,称之为自空间复用,在前面我们已经知道了矩阵的秩就是数据的空间维度,也就是相对独立变量的个数。

当矩阵的秩小于循环嵌套深度时,此时一定是可以进行优化的。

例如:

for(i=0; i<100; i++){
	for(j=0; j<100; j++){
		for(k=0; k<100; k++){
			Z[i+j+k] = 0;
		}
	}
}

对于这个例子,矩阵的秩为:
( 1 1 1 ) \begin{pmatrix} 1&1&1 \end{pmatrix} (111)

观察程序我们也可以发现,只需要一个变量其实就可以完成遍历。

矩阵的秩

因此,我们再一次强调矩阵的秩的含义:它代表了数据遍历所需要的空间维度。数据本身就有维度,以数组为例,有一维数组、二维数组、三维数组等等,对于不同维度的数组,我们需要不同个数的独立变量才可以遍历全部元素,一维需要一个变量、二维需要两个、、以此类推。

我们假设每个独立变量只在不同的一层循环中出现,且变量作用维度不同,那么此时矩阵的秩刚好等于循环嵌套深度,也就是独立变量的个数。

发现自空间复用的技巧是不考虑矩阵的最后一行,对于假设情况,此时截断后的矩阵的秩小于循环嵌套深度,又因为数据的空间维度相对独立,因此截断的维度会线性改变数组的下标,也就是说,它迭代时,元素处于同一条cache线上,此时自空间复用是可行的。

看过了假设的例子,先明确一个结论:矩阵的秩不可能大于循环嵌套深度,而是等于或小于循环嵌套深度。

例如:数据是二维的,但是对于需要遍历的数据,它们的分布其实是线性的,所以矩阵的秩是一,最终会等于循环嵌套深度

for(i=0; i<50; i++){
	Z[i][i+1]=0;
}

原因很简单,矩阵的秩代表了数据遍历时的空间维度,循环嵌套深度是具体的迭代产生者,如果秩大于循环嵌套深度,那么就意味着有些维度是无法被迭代到的,这种程序不可能出现!

例如:j代表了另外一个维度的遍历,但是此时循环迭代程序必须更新,这种程序不可能出现!

for(i=0; i<10; i++){
	Z[i][j]=0;
}

不过矩阵的秩是可以小于循环嵌套深度的,

例如:

for(i=0; i<10;i++){
	for(j=0; j<10; j++){
		Z[i+j]=0;
	}
}

这个矩阵的秩为1,循环嵌套深度为2,但是j变量是多余的,本质上它遍历的元素还是在一条cache线上,也就是同一个维度。

也就是说,如果矩阵的秩一开始就小于循环嵌套深度,那么一定可以发生自空间复用。

发现自空间复用

发现自空间复用的技巧是不考虑矩阵的最后一行,从上面我们可以得出,正常情况下,矩阵的秩小于或等于循环嵌套的深度。

当矩阵的秩小于循环嵌套的深度时,截断后的矩阵仍然满足矩阵的秩小于循环嵌套深度的关系,此时一定可以发生自空间复用。

当矩阵的秩等于循环嵌套深度时,截断后的矩阵也满足矩阵的秩小于循环嵌套深度的关系,此时也一定可以发生自空间复用。

考虑数组访问如下:

Z[1][i][2*i+j]

删除最后一行,得到矩阵如下:
( 0 0 1 0 ) \begin{pmatrix} 0&0\\ 1&0 \end{pmatrix} (0100)
这个矩阵的秩为1,但是循环嵌套的深度为2,所以可以进行自空间复用。

我们观察最后一行下标,事实也确实如此,因为遍历时,j是线性增长的,2i不属于该循环,所以[2*i+j]也是线性增长的,也就是说,它的迭代是在同一条cache线上。

对程序设计的要求

不考虑矩阵的最后一行,其实就是在找出独立的、线性改变数组访问的迭代,其实这对于程序设计有一个要求,那就是所有的数组下标都要与循环嵌套一一对应。

再考虑数组访问如下:

Z[2*i+j][i][1]

此时截断后的矩阵的秩为2,循环嵌套深度也为2,此时该技巧就不成立了。

对应线性代数的意义

假设程序设计合理,程序的每一列都对应不同的迭代变量,为了确保存在空间复用,我们必须要确保被我们截断后的变量的基本向量[0,1]位于截断矩阵的零空间中。

例如:

对于Z[1][i][2*i+j],迭代变量j的零向量是[0,1],刚好位于截断后的矩阵的零空间中

这是因为当该向量在截断矩阵的零空间中时,我们可以把除了最内层下标之外的所有下标都固定下来,确保最后一层迭代是线性变换的,这样就可以确保它对数组元素的访问是处于同一条cache线。

缺陷

考虑如下访问:

Z[1][i][2*i+50*j]

我们同样使用上面的方法截断矩阵,结果确实满足矩阵秩的要求,那么我们可以把这些元素都保存在cache中吗?

在这种情况下,访问确实是线性的,但是却跨越了50个元素,除非该cache线能保存元素的个数远远超过50个,否则该自空间复用的收益非常低,甚至是无法被自空间复用。

总结

以上属于自空间复用内容,主要重点是访问元素与cache线的线性关系。前面两篇已经写完了自复用内容,接下来写写组复用内容。

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

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

相关文章

Unity学习笔记(四)如何实现角色攻击、组合攻击

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 实现动画 首先实现角色移动的动画&#xff0c;动画的实现过程在第二篇&#xff0c;这里仅展示效果 attack1 触发攻击动画 实现脚本 接下来我们通过 Animator 编辑动画之间的过渡&#…

如何使用MySQL的group_concat函数快速做关联查询?

当我们需要做一对多的关联查询时&#xff0c;会很容易想到用left join来实现。例如&#xff0c;现有country表和city表之间建立了一对多的关联关系。如果要展示各国家以及城市列表&#xff0c;会很容易想到以下SQL&#xff1a; SELECT country, city FROM country LEFT JOI…

Go快速开发框架2.6.0版本更新内容快速了解

GoFly企业版框架2.6.0版本更新内容较多&#xff0c;为了大家能够快速了解&#xff0c;本文将把更新内容列出详细讲解。本次更新一段时间以来大伙反馈的问题&#xff0c;并且升级后台安全认证机制&#xff0c;增加了RBAC权限管理及系统操作日志等提升后台数据安全性。 更新明细…

行业分析---造车新势力之零跑汽车

1 背景 在之前的博客中&#xff0c;笔者撰写了多篇行业分析的文章&#xff08;科技新能源&#xff09;&#xff1a; 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 《行业分析---…

大数据与机器学习(它们有何关系?)

想了解大数据和机器学习吗&#xff1f;我们将为你解释它们是什么、彼此之间有何关联&#xff0c;以及它们为何在数据密集型应用中如此重要。 大数据和机器学习是如何相互关联的&#xff1f; 大数据指的是传统存储方法无法处理的海量数据。机器学习则是计算机系统从观察结果和…

有趣的python绘图介绍

以下介绍了几个有趣的Python绘图&#xff0c;感兴趣可以动手实践下&#xff01; 一、正方形螺旋线 from turtle import *speed("fastest") pensize(2) color["purple","blue","red","black"] for i in range(200):pencolo…

【Mysql】Mysql/Mariadb开启binlog日志

前言 MySQL 的二进制日志&#xff08;Binary Log&#xff0c;简称 binlog&#xff09;用于记录数据库的所有更改操作&#xff0c;包括数据更改&#xff08;如 INSERT, UPDATE, DELETE&#xff09;和结构更改&#xff08;如 CREATE TABLE, ALTER TABLE&#xff09;。二进制日志的…

python检测同心圆

python检测同心圆 原图如下&#xff1a; import cv2 import numpy as np# 读取图像 image_path r"E:\pycharm3\pythonProject\image\image.png" img cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # 灰度图像 img_color cv2.imread(image_path, cv2.IMREAD_C…

萌萌哒的八戒

萌萌哒的八戒 下载压缩包后&#xff0c;打开发现有一张照片 既然是关于猪的&#xff0c;那就用猪圈密码解码 flag{whenthepigwanttoeat}

【人工智能机器学习基础篇】——深入详解监督学习之模型评估:掌握评估指标(准确率、精确率、召回率、F1分数等)和交叉验证技术

深入详解监督学习之模型评估 在监督学习中&#xff0c;模型评估是衡量模型性能的关键步骤。有效的模型评估不仅能帮助我们理解模型在训练数据上的表现&#xff0c;更重要的是评估其在未见数据上的泛化能力。本文将深入探讨监督学习中的模型评估方法&#xff0c;重点介绍评估指…

pytorch基础之注解的使用--003

Title 1.学习目标2.定义3.使用步骤4.结果 1.学习目标 针对源码中出现一些注解的问题&#xff0c;这里专门写一篇文章进行讲解。包括如何自定义注解&#xff0c;以及注意事项&#xff0c;相信JAVA中很多朋友业写过&#xff0c;但是今天写的是Python哦。。。 2.定义 在 Python…

Linux day 1129

家人们今天继续学习Linux&#xff0c;ok话不多说一起去看看吧 三.Linux常用命令 3.1 Linux命令体验 3.1.1 常用命令演示 在这一部分中&#xff0c;我们主要介绍几个常用的命令&#xff0c;让大家快速感 受以下 Linux 指令的操作方式。主要包含以下几个指令&#xff1a; ls命…

【基础篇】二、MySQL数据库的操作

文章目录 前言Ⅰ. 创建数据库1、语法2、举例 Ⅱ. 字符集和校验规则1、查看系统默认字符集以及校验规则2、查看数据库支持的字符集3、查看数据库支持的字符集校验规则4、校验规则对数据库的影响 Ⅲ. 操作数据库1、查看数据库2、显示创建语句3、使用数据库4、删除数据库5、修改数…

NLP中的神经网络基础

一&#xff1a;多层感知器模型 1&#xff1a;感知器 解释一下&#xff0c;为什么写成 wxb>0 &#xff0c;其实原本是 wx > t ,t就是阈值&#xff0c;超过这个阈值fx就为1&#xff0c;现在把t放在左边。 在感知器里面涉及到两个问题&#xff1a; 第一个&#xff0c;特征提…

2025常见的软件测试面试题

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 “ 今天我给大家介绍一些python自动化测试中常见的面试题&#xff0c;涵盖了Python基础、测试框架、测试工具、测试方法等方面的内容&#xff0c;希望能够帮助…

日常编码练习

通过投票对团队排名 题目要求&#xff1a; 解题思路&#xff1a; 思路&#xff1a;以示例1为例 1、我们需要去遍历该数据结构&#xff0c;同时记录每个字符出现的次数。为此需要定义一张哈希表来建立映射关系。 注&#xff1a;哈希表仅仅起到了两个作用 ①&#xff1a;建立映射…

Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J实现原理分析

文章目录 官网SLF4J 简单使用案例分析SLF4J 获取 Logger 的原理获取 ILoggerFactory 的过程获取 Logger 的过程SLF4J 与底层日志框架的集成 小结 官网 https://slf4j.org/ Simple Logging Facade for Java &#xff08;SLF4J&#xff09; 用作各种日志记录框架&#xff08;e.g…

HALCON中用于分类的高斯混合模型create_class_gmm

目录 一、创建用于分类的高斯混合模型函数二、代码和效果展示三、相关函数 一、创建用于分类的高斯混合模型函数 create_class_gmm( : : NumDim, NumClasses, NumCenters, CovarType, Preprocessing, NumComponents, RandSeed : GMMHandle)create_class_gmm创建用于分类的高斯…

在实际开发中,如何权衡选择使用哪种数据结构和算法?

学习数据结构与算法有一段时间了&#xff0c;听音频、看视频、看专栏、看书、抄书&#xff0c;尝试了很多种方法&#xff0c;今天在 专栏 中看到一篇文章&#xff0c;觉得很不错&#xff0c;摘抄如下。 学习数据结构和算法&#xff0c;不要停留在学院派的思维中&#xff0c;只把…

Airbnb/Booking 系统设计(high level architecture)

原文地址 CodeKarle: Airbnb System Design | Booking.com System Design B站搜 “Airbnb System Design” 有视频版本 需求&#xff1a; 功能性需求 系统用户包括商家和客人。 Hotel - 商家&#xff08;拥有hotel的人&#xff09; onboarding - 商家可以入住系统。 update…