CSAPP第五章 面向编译器的优化(2)

news2024/12/24 3:17:05

回顾 

c7a72aa409a746e6a068193c68cee92f.png

先复习一下之前的东西。 

练习5.7 

ec267a226d6f41e5b4ddc9b733c8e3c7.png

10a1349a7e534eb0b2d850be10120ab6.png

我们可以看到,相比combine4生成的基于指针的代码,GCC使用了C代码中数组引
用的更加直接的转换。循环索引i在寄存器rdx中,data的地址在寄存器rax中。和
前面一样,累积值acc在向量寄存器xmm0中。循环展开会导致两条vmulsd指令———
条将data[i]加到acc上,第二条将data[i+1]加到acc上。图5-18给出了这段代码的
图形化表示。每条vmulsd指令被翻译成两个操作:一个操作是从内存中加载一个数组元
素,另一个是把这个值乘以已有的累积值。这里我们看到,循环的每次执行中,对寄存
器xmm0读和写两次。可以重新排列、简化和抽象这张图,按照图5-19a所示的过程得到
图5-19b所示的模板。然后,把这个模板复制n/2次,给出一个长度为n的向量的计算,
得到如图5-20所示的数据流表示。在此我们看到,这张图中关键路径还是n个mul操
作——迭代次数减半了,但是每次迭代中还是有两个顺序的乘法操作。这个关键路径是循
环没有展开代码的性能制约因素,而它仍然是k×1循环展开代码的性能制约因素。
74b9b5418d1b4a1595cc4a990a46588d.png

b2de018817c3482cb116123cb9450e42.png

5b03c3219c714845848ccf8e49f47119.png

前面我们说到,可以把值存放在临时变量中,执行完之后再写入会内存,或者是利用代码移动减少函数的引用 

优化程序性能

循环展开

6692839a84324b9b8186d0c31e6e6e75.png

每次循环进行两个OP,

3a08d75af6c741af81910cbb3cf4a62e.png有数据依赖 

39398c3042ef4b00ae81e57350f4f15f.png

 

a0b58b420b9949868947b8740ec42217.png

那么我能能否 将乘法并行的计算,减少数据依赖性。

改进循环展开

042616de842a470686159acba0eb9a7c.png

 

d5201313e2964982a855955b654e9db9.png

通过测试数据不难发现,加法的时间没有明显改善,其他的方法程序性能优化了一倍。已经达到了延迟界限但是没有达到吞吐量界限。 

e66b466086944de380fa0c9163560b1e.png

 comment:   两个乘法可以在指令之前完成

例题讲解5.8

a0d64ccfb542493bad3ca5b6404f5368.png

63afe0222c294b3cab63ba79bdc4ccee.png

 循环展开 使用分离式累加器

f2a99fbc68cc49ab9f9723d1edfc4adf.png

注意看红色笔的部分 他使用了两条关键路径。

bebc4e592e8044c6b8b51ff82888bcd6.png 分析结果 :突破了延迟界 接近吞吐量界限

f362d7d05b574ae194dbe72c2e6c1756.png

 利用指令集并行处理 一个时钟周期处理两个加法 CPE = (N/2+1)*D/N = D/2

结论:我们发现采用k*K分离式加法器有利于提高程序性能。必须符合容量才可以

1a2ef9a76f41440a8207ca2ca631009a.png

3cb600a4714a4cbab6ee3d9f25e9487c.png

bcfcdabb7cdd46029b832daedc3547da.png

一些问题----寄存器溢出

5895c054606a47b39d518d215e9accb2.png

 原因是因为局部变量保存在寄存器中,当CPU所有的寄存器全被用完之后,新的局部变量,就会被存储在内存中。

今天的CSAPP就写道这里 明天继续

 

 

 

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

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

相关文章

bthome协议分析及esp32上的实现

前言 最近自己搞了些智能家居的小节点,但由于wifi入网方式功耗太高,于是关注起了蓝牙 bthome是一种灵活的低功耗BLE数据格式协议,用于广播传感器数据,此协议支持数据加密,目前最新为v2版本。在home assistant中也支持…

( “树” 之 BST) 108. 将有序数组转换为二叉搜索树 ——【Leetcode每日一题】

108. 将有序数组转换为二叉搜索树 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1: 输入…

【pytorch函数笔记】torch.split

官方文档:https://pytorch.org/docs/stable/generated/torch.split.html?highlightsplit torch.split(tensor, split_size_or_sections, dim0) Splits the tensor into chunks. Each chunk is a view of the original tensor. If split_size_or_sections is an in…

栈的基本操作(C语言实现)创建,销毁,入栈,出栈

前言 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的…

Linux网络编程服务端的创建

文章目录 前言一、编程前的准备1.相关函数的了解二、accept函数特别注意点三、具体函数的实现四、运行客户端和服务端进行通信验证总结前言 上篇文章讲解了如何创建一个客户端,这篇文章将创建一个服务端用来和上篇文章的客户端进行通信。 一、编程前的准备 1.相关函数的了解…

服务(第九篇)tomcat的部署和优化

tomcat的介绍: 免费的、开放源代码的Web应用服务器(用java开发的) Apache软件基金会(Apache Software Foundation)Jakarta项目中的一个核心项目 由Apache、Sun和一些公司及个人共同开发而成 深受Java爱好者的喜爱,并得到部分软…

干货|实验操作难入门?快来看JoVE视频网站!

Hello,大家好! 这里是壹脑云科研圈,我是喵君姐姐~ 当导师要求我们学习、模仿一些学术大神所做的心理学实验,尤其是采用脑影像、脑电技术等高端仪器的实验时,我们往往会因为缺少对具体操作细节的了解而感到困惑或困难。…

【python视图2】基于networkx的10个绘图技巧

一、说明 networkx在02年5月产生,是用python语言编写的软件包,便于用户对复杂网络进行创建、操作和学习。利用networkx可以以标准化和非标准化的数据格式存储网络、生成多种随机网络和经典网络、分析网络结构、建立网络模型、设计新的网络算法、进行网络…

MIPI摄像头工程=7系列FPGA + OV5640(MIPI) + 15 分钟 + VITIS

项目使用东西 硬件 Spartan-7 SP701 FPGA 7系列FPGA电阻网络实现的MIPI接口 OV5640 MIPI接口 软件 AMD Vivado 2020 版本以上 AMD Vitis 2020 介绍 MIPI 接口现在非常流行,国产FPGA目前基本都带MIPI接口,而AMD-Xilinx是从U系列开始支持MIPI电平&#x…

使用CMake的CPack工具打包项目

为了介绍如何使用CMake的CPack工具进行项目打包,这里使用了前文CMake项目使用ctestgtest进行单元测试中的示例。 为了更接近实际开发中项目的情况,自行下载gtest并进行源码编译来模拟实际项目中的依赖项;在实际的开发中,可能会有…

chatgpt智能提效职场办公-ppt怎么压缩文件大小

作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 压缩PPT文件大小有以下几种方法: 压缩图片大小:在PPT当中,图片是占用存储空间最大的部分&#xff0…

物联网多协议、多场景自定义测试|XMeter Cloud 更新

近日,全球首个物联网 MQTT 负载测试云服务 XMeter Cloud 推出了自定义场景测试功能。 该功能将满足用户自主定义测试场景和测试更广泛协议的需求,实现对除 MQTT 以外的 TCP、WebSocket、HTTP 等其他网络协议的测试,帮助用户构建更复杂的测试…

mybatis模糊查询以及结果封装详解

mybatis模糊查询以及结果封装详解 创建maven项目&#xff1a;项目结构如图所示 准备数据库表&#xff1a; 准备pom.xml所需的依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0…

程序地址空间(下)

目录 &#xff1a; 1.接上部分内容再谈谈地址空间是什么&#xff1f;&#xff1f; 2.页表MMU&#xff08;硬件设备&#xff09; 3.为什么要搞个虚拟地址映射到物理地址 4.解释为什么最开始的问题&#xff1f;&#xff1f;&#xff1f; ---------------------------------------…

Spring 的 IoC(控制反转)

IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;也是一个概念&#xff0c;同时是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出松耦合、更优良的程序。 在这里说 IoC 之…

Java ---包装类

&#xff08;一&#xff09;包装类概念 官方说法&#xff1a; Java是面向对象的语言&#xff0c;但是为了便于开发者的使用&#xff0c;Java中却沿用了C语言的基本数据类型&#xff0c;在进行基本的数据计算时&#xff0c;开发者可以直接使用基础类。但是当需要和Java其他对象…

如何理解ThreadLocal

ThreadLocal的基本概念 在并发编程中&#xff0c;多个线程访问同一个变量&#xff0c;可能会出现线程安全问题、为了保证在多线程环境下访问共享变量的安全性&#xff0c;通常在访问共享变量的时候加锁&#xff0c;以实现线程同步的效果。 使用同步锁机制保证多线程访问共享变…

ChatGPT | 一文详解ChatGPT(学习必备)

本文概要 本篇文章主要介绍ChatGPT的产生和使用体验&#xff0c;适合不了解ChatGPT或者了解不够透彻的小伙伴&#xff0c;文中的描述非常详细&#xff0c;干货满满&#xff0c;感兴趣的小伙伴快来一起学习吧&#xff01; &#x1f31f;个人简介 ☀️大家好&#xff01;我是新人…

信息的相关性和冗余度:信息在整个文明中的作用

文章目录 I 古埃及的象形文字1.1 罗塞塔石碑1.2 古埃及文字音节和希腊字母的对应表1.3 破解古埃及文字 I 古埃及的象形文字 1.1 罗塞塔石碑 这个石碑是在公元前196年埃及国王托勒密五世加冕一周年的诏书。 在此前大约一百年&#xff0c;埃及已经被来自希腊北方城邦的亚历山大…

C++------引用

一、 引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 类型& 引用变量名(对象名) 引用实体&#xff1b; int main() {//一个变量可以有多个引用…