- 博客(135)
- 收藏
- 关注
原创 第一章 绪论
计算机性能是一门令人激动的,富于变化同时又充满挑战的领域。本章的学习目标:1. 理解系统的性能、人员、活动和挑战。2. 理解观测和实验工具之间的区别。3. 对性能观测有一个基本的了解:统计、剖析、火焰图、跟踪、静态观测和动态观测。4. 了解方法的作用和Linux的60秒检查表。
2024-08-20 02:00:00
842
原创 第6章 HSA排队模型
本章了解如何将这些内核分派或提交给HSA系统执行。这是HSA队列的工作。HSA队列是一个异步框架,用于构建潜在从属内核的图表,以便在特定的HSA代理上执行。可以为HSA系统内的单个代理或多个代理创建多个队列。内核之间的依赖关系由HSA信号控制。信号代表了所有HSA系统提供的通用解决方案,并支持不同代理之间的低延迟同步和异步通信。为了实现低延迟调度,队列由HSA运行时分配。从那时起,应用程序以体系结构排队语言AQL数据包的形式将工作直接提交给队列。
2024-03-12 02:00:00
1796
原创 第5章 HSA内存模型
有两条经验法则可以帮助简化HSA竞争自由分析:1. 始终将相同的范围 应用于原子变量(例如,不要在原子A上执行工作组范围释放后再A上执行系统范围内获取)。2. 从包含所有直接涉及同步的执行单元(即忽略传递性)的最小范围实例中获取/释放。在HSA中,冲突既可以是普通的,也可以是原子的:1. 普通冲突描述了对同一位置的两个操作。至少有一个是写或读取-修改-写入,且至少有一个是普通操作。2. 原子冲突描述了从不同执行单元到相同位置的两个原子操作。
2024-03-08 03:00:00
1011
原创 第4章 HSA运行时
HSA运行时是一种精简的用户模式应用程序编程接口API,它提供了主机将计算内核启动到可用HSA代理程序所必须的接口。它可以分为两类:核心和扩展。HSA核心运行时API旨在支持HSA系统平台体系结构规范所需的操作,并且必须得到任何符合HSA的系统的支持。HSA扩展运行时API可以是HSA认可的或供应商特定的,并且对于符合HSA的系统是可选的。本章首先描述HSA核心运行时API,包括初始化和关闭、通知、系统和HSA代理信息、信号、队列、内存、代码对象和可执行文件,然后是经过HSA认证的运行时API。
2024-03-05 02:00:00
1122
原创 第3章 HSAIL 虚拟并行ISA
编写HSAIL与编写CPU汇编语言相似:语言使用加载/存储体系结构,支持基本的整数和浮点操作、分支、原子操作、多媒体操作,并使用固定大小的寄存器池。指令集定义了浮点双精度、单精度和半精度。HSAIL还支持函数指针、虚拟函数、共享虚拟内存、系统原子核用于高效跨设备通信的信号。此外,HSAIL还定义了组内存、层次同步原语(例如,工作组、代理和系统范围同步)以及可用于实现峰值的波前。
2024-03-03 09:50:18
729
原创 第2章 HSA概述
HSA在过去三十多年中,已经成为将CPU内核和CPU套接字绑定在一起的共享内存系统体系结构。HSA最初专注于将GPU有效地用作CPU的并行协处理器。后面意识到在GPU上高效运行所需的体系结构特征也适用于许多不同类型的专用处理单元,其中许多已经存在于SOC中。GPU最初是作为IO设备连接到CPU的。HSA基金会成立于2012年,当时SOC内部的GPU核心仍然很难编程。HSA基金会成立是为了解决这个问题,为SOC上所有类型的处理单元的体系结构整合铺平道路。
2024-02-29 00:45:00
654
1
原创 第1章 引言
HSA运行时的核心(必需)功能是管理HSA系统的计算设备(称为HSA代理),在可用的HSA代理上启动计算内核,分配\管理HSA内存,向用户进程报告内核执行,并支持HSA代理之间的通信。通过在延迟敏感的应用上使用CPU,同时在高度并行的吞吐量友好部件上使用GPU,异构计算系统可以获得比传统系统更高的应用性能和能源效率。首先介绍主要的HSA内存分段类型,然后解释如何使用所有权的概念来提供特定设备在一个时间窗口内需要访问的内存位置的性能和能源效率。物理效应的真实建模和仿真需要大量的计算能力。
2024-02-25 22:00:00
468
原创 第11章 互连网络体系结构
之前,我们尚未讨论如何可靠、快速地将消息从一个节点发送到另一个节点。本章目的是讨论多个处理器互连的结构。互连网络最重要的两个性能指标是延迟和带宽。基于共享存储多处理器的几个通信特性,与诸如局域网或因特网等其他网络系统相比,共享存储多处理器对互连结构性能具有独特的要求:1. 消息非常短。许多消息是一致性协议的请求和响应,但不包含数据,也有一些消息包含少量(高速缓存块大小的)数据,这些数据在当前主流系统中为64或128字节。2. 消息生成很频繁,因为每个读或写缺失都可能生成涉及几个节点的一致性消息。
2024-02-25 01:00:00
595
原创 第10章 高级缓存一致性设计
缓存一致性协议如何适应更大规模的系统。广播和侦听协议更早地涉及了可扩展性问题,因为流量和侦听频率时随着处理器个数的增加至少呈线性增加趋势,可用的互连网络带宽会很快被广播流量占满。本章讨论的基于目录式缓存一致性协议来实现可扩展性。主要问题在于如何处理协议竞争,以及瞬时状态的使用等。以及,讨论当前多核设计问题,例如如何处理不精确的目录信息、讨论一致性需要被以单个粒度来跟踪还是以多个粒度来跟踪、如何设计一致性可允许多核系统系统执行分区,以及线程迁移代价如何降低。
2024-02-24 01:00:00
1917
原创 第8章 对同步的硬件支持
为了保证并行程序执行的正确性和高效性,构建一个共享存储多处理器系统的硬件支持必须要解决缓存一致性、存储一致性和对同步原语的支持等问题。从软件的观点来看被广泛使用的同步原语包括锁、栅栏和点对点同步(信号量)。举例来说,锁和路障被大量使用在DOALL并行性和具有链式数据结构的应用程序上,而signal/wait同步对流水线DOACROSS并行性来说至关重要。如今将最低级别的同步原语以原子指令的形式在硬件上实现,然后将其他所有高级别的同步原语在软件中实现。
2024-02-20 02:00:00
1616
原创 第7章 缓存一致性基础
多个处理器单元互连的存储层次不同,使用的互连网络类型也不相同。1. 在共享缓存的方式中,缓存被所有处理器共享,每个处理器可以直接访问缓存的任意一部分。优点在于不需要缓存一致性的支持,因为系统中只有一个缓存,任何需要被缓存的数据都会被存放在一个唯一的地址。缺点是处理器核缓存需要被部署在非常近的距离之内,否则访问缓存的时延会非常高。另外,互连网络必须提供很高的带宽,因为所有存储器访问都必须通过互连网络。
2024-02-04 01:00:00
926
原创 附录C 流水线:基础与中级概念
流水线爱是一种将多条指令重叠执行的实现技术,它利用了一条指令所需的多个操作之间的并行性。(指令操作的非原子性和指令类型的多样性)在计算流水线中,每个步骤完成指令的一部分,每一步都被称为流水段或流水级。指令流水线的吞吐量由指令退出流水线的频率决定。由于流水级是连在一起的,所以所有流水级都必须做好同时工作的准备。将一条指令在流水线中下移一级所需的时间为处理器周期。由于所有流水级同时进行,所以处理器的长度由最慢流水级所需的时间决定。流水线设计者的目标是平衡每级流水线的长度。
2023-12-09 19:15:00
1263
2
原创 附录A 指令集基本原理
最早体系结构的指令集受到当时硬件技术的限制。只要硬件技术允许,计算机架构师就会探索支持高级语言的方式。在三个不同时期,关于如何高效支持程序,侧重点不一:1. 20世纪60年代,栈体系结构显得非常流行,跟高级语言很匹配。根据当时编译器技术,可能也的确如此。2. 20世纪70年达,架构师主要关注如何降低软件成本。其解决方案主要是用硬件代替软件,或者提供能够简化软件设计人员的高级体系结构。其结果就是高级语言计算机体系结构有着大量的寻址方式、多种数据类型和高度正交的体系结构。
2023-12-02 04:00:00
1854
原创 第5章 线程级并行 摘录
因为两个不同的处理器是通过各自的缓存来保留存储器视图的,所以针对同一存储地址,它们可能会看到不同的值,即缓存一致性问题。通俗的说,如果每次读取某一数据项都会返回该数据项的最新写入值,就说这个存储器系统是一致的。该定义看似正确,实则含混且过于简单。这个简单定义包含了存储器系统行为的两个方面,对于编写正确的共享存储器程序都至关重要:1. 一致性:定义了读操作能返回什么值。2. 连贯性:决定了一个写入值什么时候被读操作返回。
2023-12-01 01:00:00
1722
原创 第4章 向量、SIMD和GPU体系结构中的数据级并行
数据级并行对于个人移动设备越来越重要,因为这些设备上显示音频、视频和游戏重要性的应用程序越来越流行。当与一个比任务级并行更容易编程且可能具有更高能效的模型相结合时,就很容易理解为什么在这十年中数据级并行出现了复兴。传统处理器与GPU在性能方面最大的差别之一是集中--分散寻址。GPU的问题不只是哪种体系结构最好,而是当硬件投入足以出色地完成图形处理时,如何增强它以支持更具一般性的计算任务?尽管向量体系结构在理论上具有许多优点,但它能否像GPU一样作为图形学的基础还有待证明。
2023-11-22 02:00:00
2095
原创 第4章 循环变换
由于高级语言隐藏了底层硬件体系结构的大量细节,如果不经过优化直接将高级程序设计语言编写的程序部署在底层硬件上,往往无法充分利用底层硬件体系结构的处理能力。算子融合不仅可以提高计算密度,还可以避免相邻算子之间通过GPU设备内存通信引入的数据访问开销。循环变换和不同循环变换之间的组合是实现面向底层硬件体系结构的重要优化手段。本章将基于多面体模型详细介绍优化编译器实现循环变换及不同循环变换之间组合的方式,并介绍各种循环变换的应用场景,以及一些循环变换之间的关系。
2023-08-31 01:00:00
400
原创 第11章 优化多线程应用程序
1. 应用软件为多核做好准备;2. 线程通信可能会产生负加速效果。优化多线程应用程序的性能还涉及检测和缓存争用和一致性问题。
2023-08-23 23:00:00
195
2
原创 第10章 其他调优
如果程序中包含不依赖输入的计算,那么这些计算就可以提起在编译时计算而不是在运行时计算。C++14标准提供了constexpr函数,C++17标准通过了if constexpr提供编译时分支。
2023-08-23 03:00:00
142
原创 第9章 优化错误投机
1. 仅在TMA报告显示错误投机指标高才尝试解决分支预测错误问题;2. 通过查表和断言替换分支是否有收益,一定要测试它是否真的更好。
2023-08-23 02:15:00
141
原创 第8章 CPU后端优化
CPU后端低效:当前端完成取指和译码后,后端发生了过载而不能处理新的指令。TMA将后端bound分为存储和计算bound。
2023-08-23 02:00:00
322
原创 第7章 CPU前端优化
接下来讨论如何使用CPU监控特性寻找CPU上运行的代码中可被调优的位置。标准的算法和数据结构在性能敏感型工作负载并不总能表现的很好。例如,在“扁平化”数据结构的冲击下,链表基本上快被放弃了。传统链表中的每个节点都是动态分配的,除了引入耗时的内存分配操作,还可能让链表中所有元素分散在内存中,导致随机内存访问。二分搜索在排序数组中查找元素方面是最优的,但是该算法经常会有很多分支预测错误的问题,这就是为何线性搜索在小型(少于20个元素)整型数组上表现得最好。
2023-08-21 23:00:00
491
原创 第6章 性能分析相关的CPU特性
为什么如此关注分支指令?因为分支控制着程序的控制流。如果我们记录了每个分支的输出,就有可能逐行重建程序的执行路径。这也就是Intel Processor Trace技术所做的。硬件记录每条分支跳转指令的“起点”和“终点”地址以及一些附加的元数据。这些硬件寄存器像环形缓冲区,会被持续地覆写,只提供最近32个分支跳转输出。如果能够采集足够长时间的起始和终点对,就可以展开程序的控制流,类似一个有限深度的调用栈。并不是所有被执行分支跳转指令都能被检查到,通常CPU执行得太快以至于LBR有时并不能正常工作。
2023-08-21 02:00:00
640
原创 第5章 性能分析方法
1.时延和吞吐量通常是衡量性能的最终指标。2. 代码插桩帮我们跟踪程序中许多内容,但有较大开销。3. 跟踪有助于探索系统中异常。跟踪捕获完整的事件序列,且每个事件都附有时间戳。4. 负载表征是一种根据运行时行为比较和分组应用程序的方法。5. 采样会跳过程序执行的大部分时间,只取一个假定可以代表整个采样间隔的样本,但是它仍然能给出足够精确的样本分布。不需要重新编译,开销小,所以它是非常流行的性能分析方法。6. 计数和采样会产生非常低的运行时开销(通常低于2%)。
2023-08-19 16:47:09
302
原创 第3章 CPU微架构
地址中的最低顺序位定义了块内偏移量,组则是基于索引位来选择,一旦组被选定,就可以使用标签位来与该组中的所有标签进行比较。如果不匹配,则缓存未命中。硬件多线程CPU支持专用硬件资源以独立地跟踪CPU中每个线程的状态,目的是线程由于长时延活动(如内存引用)而被阻塞时,以最小的延迟从一个上下文切换到另一个上下文(不会产生保存和恢复线程上下文的成本)。指令的动态调度是通过复杂的硬件结构(记分板)和诸如寄存器重命名之类的技术实现的。软件预取是对硬件预取的补充,开发者可以通过特定的硬件指令提前指定需要的内存位置。
2023-08-18 23:00:00
630
3
原创 第8章 对同步的硬件支持 摘录
在获取锁的尝试中的第一条指令时test-and-set指令,它原子地执行下面几个步骤:首先从lockvar所在的存储单元中读取值到寄存器R1中(使用一个独占的读指令,如BusRfx或者BusUpgr),将寄存器R1中的值与0相比较。一个更加常用的解决办法(亦可用在非基于总线的多处理器系统中)不是阻止其他对总线的请求,而是使用执行原子指令的处理器的一致性控制器,来对块的其他所有请求延迟响应直到原子指令完成,或者否定确认请求,这样请求者会在未来重复请求。4)存储:需要的存储空间时线程数的函数。
2023-08-18 10:02:57
83
原创 第2章 性能测量
理解应用程序性能的第一步是学会对它进行测量。与绝大多数功能问题相比,性能问题通常很难跟踪和复现。任何关注过性能评估的人可能都知道公允地进行性能测量并从中得到准确结论是多么困难。因为在测量中存在误差,性能分析通常需要统计方法进行处理。开展公允地性能实验是获得精确及有意义结果的基本步骤。设计性能测试和配置测试环境都是性能评估工作的重要组成部分。
2023-08-17 23:00:00
292
原创 第1章 导读
在当前单核性能已经达到峰值,增长趋势趋于平缓时,把应用程序分布式运行于多个计算核是很有必要的,而这要求程序的不同线程之间能高效通信、排除不需要的资源并规避多线程程序的典型问题。性能优化是一场无尽的游戏,因为总是存在值得优化的地方,但是进一步的改进需要非常高的工程成本,但是优化成本很高。典型的通用多线程应用程序的性能并不总是随着分配到任务的CPU核数量的增长而线性增长,了解发生这种情况的原因及可能得解决方案对产品的未来发展至关重要。合理的性能调优工作总是要先定义性能目标,论述清楚达到的结果以及这样做的原因。
2023-08-16 21:26:49
197
原创 第1章 多核体系结构概述 摘录
多核首次实现了芯片上的并行计算。在多核之前,集群(超算)系统才能执行并行计算。是什么促使人们使用并行计算机?1. 与单个处理器系统提供的性能相比,并行计算机能够提供的绝对性能。某些科学发现的速度取决于在计算机上解决特定计算问题的速度。2. 成本调控的性能或功耗调控的性能方面更具吸引力。多核系统的成本比集群系统相对较小,尤其是软件成本和系统维护方面。在回顾并行计算机的历史时,应该记住摩尔定律是如何改变处理器体系结构的。并行体系结构最初是一个自然而然的想法,
2023-07-08 15:34:26
407
原创 第2章 存储器层次结构设计
存储器层次结构的可能性追溯到20世纪40~50年代。虚拟存储器出现在20世纪60年代,缓存出现在70年代。导致存储器层次结构的设计发生重大变化的一个趋势是,DRAM密度的增长速度和访问时间的缩短速度都在持续变缓。DRAM中使用的槽形电容器设计限制了它的扩展能力。诸如堆叠存储器之类的封装技术很有可能成为提升带宽和缩短延迟的主要方式。闪存相对于DRAM的潜在优势也正是它的致命弱点:它必须采用相当慢的批擦除重写周期。相变材料相对闪存的几点优势:不再需要速度缓存的“擦除-写入”周期,寿命也要长的多。
2023-06-07 21:38:51
1269
原创 第1章 量化设计与分析基础
计算机设计人员面临着一个非常复杂的任务:判断那些属性对于一种新计算机来说至关重要,然后在设计这种计算机时使其性能和能效达到最佳,同时还要满足成本、功耗和可用性约束条件。这项任务包括许多方面:指令集设计、功能组织、逻辑设计、实现方式。实现方式可能包含集成电路设计、封装、电源和散热。为使设计方案到达最优效果,设计人员需熟悉从编译器、操作系统到逻辑设计与封装等各种技术。几十年前,计算机体系结构一词通常是指指令集设计。计算机设计的其他方法称为实现,隐含之意就是实现方式通常不重要。目前本书作者认为这种观点是不对的。
2023-05-12 02:00:00
549
1
原创 第18章 多核计算机
了解驱动多核计算机发展的硬件性能问题;了解使用多线程多核计算机带来的软件性能问题;介绍了异构多核结构的2种主要方法;了解多核组织结构在嵌入式、PC、服务器和大型机上使用;
2023-05-07 02:00:00
605
原创 第17 章 并行处理
总结并行处理器组织架构的类型;描述对称多处理器的设计特点;理解多处理器系统中高速缓存一致性问题;解释mesi协议的主要地位;解释隐式和显式多线程之间的差异;总结集群设计的关键问题;解释非均匀存储访问的概念;概述云计算的概念;
2023-05-06 22:00:00
865
原创 第16章 指令级并行与超标量处理器
解释超标量与超流水方式的差异;定义指令级并行;讨论作为指令级并行局限性的相关性与资源冲突;概括叙述指令级并行涉及的设计问题;比较risc机器与超标量机器中提高流水线性能的技术;
2023-05-04 22:11:21
1090
原创 第15章 精简指令集计算机
概述关于指令执行特点的研究结果,这些特点推动来risc方法的发展;总结risc计算机的关键特征;理解使用大型寄存器文件对设计和性能的影响;理解基于编译器的寄存器优化来提高性能;讨论risc体系结构对流水线设计于性能的影响;列出并解释在risc计算机上进行流水线优化的关键方法;
2023-05-04 22:00:00
1320
原创 第14章 处理器结构与功能
区分用户可见寄存器和控制/状态寄存器,并讨论每种寄存器的用途;总结指令周期;讨论指令流水线背后的原理及其在实践中的工作方式;对比各种形式的流水线冒险;概要介绍x86处理器;概要介绍arm处理器结构;
2023-02-20 22:05:55
428
原创 第7章 输入/输出
解释作为计算机组成部分的io模块的使用;理解程序io和中断驱动io的区别,并讨论它们的优缺点;概述直接内存访问的操作;概述直接高速缓存访问;解释io通道的功能和用途;
2023-02-16 21:46:57
392
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人