深入理解计算机系统学习笔记

一、处理器操作的抽象模型

作为分析在现代处理器上执行的机器级程序性能的一个工具,我们会使用程序的数据流(data-flow)表示,这是一种图形化的表示方法,展现了不同操作之间的数据相关是如何限制它们的执行顺序的。

1. 从机器级代码到数据流图

程序的数据流表示是非正式的。我们只是想用它来形象地描述程序中的数据相关是如何主宰程序的性能的。

对于形成循环的代码片段,我们可以将访问到的寄存器分为四类:

只读:这些寄存器只用作源值,可以作为数据,也可以用来计算内存地址,但是在循环中它们是不会被修改的。循环combine4的只读寄存器是%rax。

只写:这些寄存器作为数据传送操作的目的。在本循环中没有这样的寄存器。

局部:这些寄存器在循环内部被修改和使用,迭代与迭代之间不相关。在这个循环中,条件码寄存器就是例子:cmp操作会修改它们,然后jne操作会使用它们,不过这种相关是在单次迭代之内的。

循环:对于循环来说,这些寄存器既作为源值,又作为目的,一次迭代中产生的值会在另一次迭代中用到。可以看到,%rdx和%xmm0是combine4的循环寄存器,对应于程序值 data+i 和 acc。

可以看到,循环寄存器之间的操作链决定了限制性能的数据相关。

2. 其他性能因素

对于整数加法的情况,测试值比预测值要慢。说明了一个原则,那就是数据流表示中的关键路径提供的只是程序需要周期数的下界。还有其他一些因素会限制性能,包括可用的功能单元的数量和任何一步中功能单元之间能够传递数据值的数量。

延迟界限是基本的限制,决定了我们的合并运算能执行多快。

二、循环展开

循环展开是一种程序变换,通过增加每次迭代计算的元素的数量,减少循环的迭代次数。循环展开能够从两个方面改进程序的性能。

首先,它减少了不直接 有助于程序结果的操作的数量,例如循环索引计算和条件分支。

第二,它提供了一些方 法,可以进一步变化代码,减少整个计算中关键路径上的操作数量。

三、提高并行性

程序的性能是受运算单元的延迟限制的。虽然计算acc新值的功能单元能够每个时钟周期开始一个新的操作,但是它只会每L个周期开始一条新操作,这里L是合并操作的延迟。现在我们要考察打破这种顺序相关,得到比延迟界限更好性能的方法。

四、多个累积变量

对于一个可结合和可交换的合并运算来说,比如说整数加法或乘法,我们可以通过将一组合并运算分割成两个或更多的部分,并在最后合并结果来提高性能。

上图中展示的是使用这种方法的代码。比较只做循环展开和既做循环展开同时也使用两路并行这两种方法,得到下面的性能:

看到所有情况都得到了改进,整数乘、浮点加、浮点乘改进了约2倍,而整数加 也有所改进。最棒的是,我们打破了由延迟界限设下的限制。处理器不再需要延迟一个加法或乘法操作以待前一个操作完成。

五、重新结合变换

一种打破顺序相关从而使性能提高到延迟界限之外的方法。

图中给出了一个函数combine7,它与 combine5的展开代码的唯一区别在于内循环中元素合并的方式。在combines5中,合并是以下面这条语句来实现的:

acc = (acc OP data[i]) OP data[i+l];

而在corabine7 中,合并是以这条语句来实现的

acc = acc OP (data[i] OP data[i+l]);

差别仅在于两个括号是如何放置的。我们称之为重新结合变换(reassociation transformation) , 因为括号改变了向量元素与累积值acc的合并顺序,产生了我们称为 “2*la” 的 循环展开形式。整数加的性能几乎与使用k*1展开的版本(combines)的性能相同,而其他三种情况则与使用并行累积变量的版本(combines)相同,是k*1扩展的性能的两倍。这些情况已经突破了延迟界限造成的限制。      

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-03-16 07:16:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-16 07:16:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-16 07:16:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-16 07:16:04       18 阅读

热门阅读

  1. MapReduce超详解

    2024-03-16 07:16:04       18 阅读
  2. CMake官方教程6--为CDash提供支持

    2024-03-16 07:16:04       17 阅读
  3. ZooKeeper 概述

    2024-03-16 07:16:04       24 阅读
  4. with open----bug

    2024-03-16 07:16:04       18 阅读
  5. 获取iOS和Android的app下载渠道和相关参数的方式

    2024-03-16 07:16:04       17 阅读
  6. 手写 UE4中的 TArray

    2024-03-16 07:16:04       17 阅读
  7. DNSlog漏洞探测

    2024-03-16 07:16:04       18 阅读
  8. 【Hadoop】 Hive:内部表与外部表的创建与查看

    2024-03-16 07:16:04       19 阅读