关于roofline模型,我有一些关于如何处理内存绑定点的问题。
问题:
1)如果从I0导出的I0.BW=Peak为1.21,而实际I1为0.71,是否意味着实际I1处于内存绑定状态?
2)如果I1位于内存绑定中,我们如何优化代码以获得更好的性能值?
3)数据移动少,缓存中加载的数据多?
4)如果带有I1=0.72的红点的性能值位于内存界以下或内存界之外,我们如何优化代码以获得更好的性能?
5)如果红色点位于内存边界区域,是否意味着内存没有得到充分利用?但是如何优化代码以获得更好的性能?

发布于 2022-10-09 11:55:47
如果从I0.BW=Peak派生的I0为1.21,而实际I1为0.71,是否意味着实际I1位于内存绑定中?
I0是一个计算同时饱和内存和填充CPU的点。这在实践中是非常不寻常的,因为这两个中的一个饱和,通常慢一点,另一个。对于内存来说尤其如此:读取往往会导致暂停,阻止CPU执行算术操作,因此与峰值触发器相比,减少了失败。
I1是一个计算确实是内存受限的点。
总的来说,黄线之前的左边部分是内存绑定的。
如果I1位于内存绑定中,我们如何优化代码以获得更好的性能值?
在这种情况下,您应该执行与内存相关的优化。要检查/优化的第一件事是内存访问模式:您应该尽可能多地读取数据并连续读取。然后,您应该避免阅读/写入许多庞大的数据集和计算数据的动态和就地。在实践中,这意味着不同算法的合并循环,这样就不会读取以前编写的数据。当多个算法之间的访问模式不相同时,平铺可以提供帮助。
的数据移动较少,还是缓存中加载的数据更多?
是的,较少的数据移动肯定会有所帮助。在这种情况下,访问模式无疑是最大的问题。如果可能的话,在缓存中拥有数据也会有所帮助(特别是当内存不是连续地读/写并且不能用于目标算法时)。有时,它是值得使用更多的计算密集型算法,表现明显更好的内存(例如。(更好的访问模式)因为内存比较慢,而且CPU速度和内存速度之间的差距也不打算很快缩小(事实上,这被称为“内存墙”)。
如果带有I1=0.72的红点的性能值位于内存边界以下或内存边界之外,我们如何优化代码以获得更好的性能?
有不同级别的内存绑定代码。例如,代码可以被一个NUMA节点的RAM速度绑定。它可以绑定所有NUMA节点的RAM速度之和。它可以被L3缓存绑定(通常比主内存快得多)。它也可以被L2缓存绑定。很难说它在实践中是哪一种。roofline模型的一个问题是,一个点只从两个度量中提取,这两个度量是从给定代码中得到的平均值。在实践中,代码可以被分割成一个执行RAM绑定操作的计算部分和一个算术绑定操作。结果将是平均的,结果将难以解释。需要更多的信息来了解正在发生的事情。性能计数器可以帮助实现这一点。
总的来说,我建议您更深入地分析正在发生的事情,并主要应用与内存相关的优化(见上文),以便在图形的右侧移动红色点。然后,稍后,您可以优化计算,以便将点向上移动。
如果红色点位于内存边界区域,是否意味着内存没有得到充分利用?
基本上,是的,但“记忆”的含义在这里还不够清楚(见上文)。这就是为什么需要进行更深入的分析。我建议您测量L3吞吐量和内存吞吐量。如果您在NUMA平台上运行您的代码,那么我建议您首先在一个NUMA节点上运行您的代码,以便了解在更简单的情况下所发生的事情。如果代码仅在多个NUMA节点上表现不佳,那么您就可以知道需要执行与NUMA相关的优化(例如。负责分配政策和第一接触)。
总的来说,一个错误/字节的~1是小的。代码通常仍然是内存绑定的,即使在大多数平台上有触发器/字节~10 (15-30通常是代码成为计算界的限制)。
https://stackoverflow.com/questions/74003790
复制相似问题