gpt4 book ai didi

c - CLFLUSH 如何处理尚未在高速缓存中的地址?

转载 作者:太空狗 更新时间:2023-10-29 16:38:31 25 4
gpt4 key购买 nike

我们正在尝试使用 Intel CLFLUSH 指令在用户空间刷新 Linux 中进程的缓存内容。

我们创建了一个非常简单的 C 程序,它首先访问一个大数组,然后调用 CLFLUSH 来刷新整个数组的虚拟地址空间。我们测量 CLFLUSH 刷新整个阵列所需的延迟。程序中数组的大小是一个输入,我们将输入从 1MB 更改为 40MB,步长为 2MB。

在我们的理解中,CLFLUSH 应该刷新缓存中的内容。所以我们期望看到刷新整个数组的延迟首先根据数组的大小线性增加,然后当数组大小大于 20MB 时延迟应该停止增加,这是我们程序的 LLC 的大小.

然而,实验结果却相当令人意外,如图所示。阵列大小大于 20MB 后,延迟不会停止增加。

我们想知道如果地址还不在缓存中,CLFLUSH 是否可能在 CLFLUSH 将地址从缓存中刷新之前引入地址?我们还尝试在 Intel 软件开发人员手册中搜索,但没有找到任何关于如果地址不在缓存中 CLFLUSH 将做什么的解释。

enter image description here

下面是我们用来画图的数据。第一列是以 KB 为单位的数组大小,第二列是以秒为单位刷新整个数组的延迟。

任何建议/建议都非常感谢。

[已修改]

前面的代码是不必要的。 CLFLUSH 可以在用户空间中更容易地完成,尽管它具有相似的性能。所以我删除了乱码以避免混淆。

SCENARIO=Read Only
1024,.00158601000000000000
3072,.00299244000000000000
5120,.00464945000000000000
7168,.00630479000000000000
9216,.00796194000000000000
11264,.00961576000000000000
13312,.01126760000000000000
15360,.01300500000000000000
17408,.01480760000000000000
19456,.01696180000000000000
21504,.01968410000000000000
23552,.02300760000000000000
25600,.02634970000000000000
27648,.02990350000000000000
29696,.03403090000000000000
31744,.03749210000000000000
33792,.04092470000000000000
35840,.04438390000000000000
37888,.04780050000000000000
39936,.05163220000000000000

SCENARIO=Read and Write
1024,.00200558000000000000
3072,.00488687000000000000
5120,.00775943000000000000
7168,.01064760000000000000
9216,.01352920000000000000
11264,.01641430000000000000
13312,.01929260000000000000
15360,.02217750000000000000
17408,.02516330000000000000
19456,.02837180000000000000
21504,.03183180000000000000
23552,.03509240000000000000
25600,.03845220000000000000
27648,.04178440000000000000
29696,.04519920000000000000
31744,.04858340000000000000
33792,.05197220000000000000
35840,.05526950000000000000
37888,.05865630000000000000
39936,.06202170000000000000

最佳答案

你想看看 Skylake 的新优化指南,英特尔推出了另一个版本的 clflush,称为 clflush_opt,它是弱排序的,在你的场景中会表现得更好。

请参阅此处的第 7.5.7 节 - http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf

In general, CLFLUSHOPT throughput is higher than that of CLFLUSH, because CLFLUSHOPT orders itself with respect to a smaller set of memory traffic as described above and in Section 7.5.6. The throughput of CLFLUSHOPT will also vary. When using CLFLUSHOPT, flushing modified cache lines will experience a higher cost than flushing cache lines in non-modi fied states. CLFLUSHOPT will provide a performance benefit over CLFLUSH for cache lines in any coherenc e states. CLFLUSHOPT is more suitable to flush large buffers (e.g. greater than many KBytes), comp ared to CLFLUSH. In single-threaded applications, flushing buffers using CLFLUSHOPT may be up to 9X better than using CLFLUSH with Skylake microarchi- tecture.

该部分还解释了刷新修改的数据较慢,这显然来自写回惩罚。

至于增加的延迟,您是否正在测量遍历地址范围并刷新每行所需的总时间?在那种情况下,你线性依赖于数组大小,即使它超过了 LLC 大小。即使行不存在,clflush 也必须由执行引擎和内存单元处理,并为每一行查找整个缓存层次结构,即使它不存在。

关于c - CLFLUSH 如何处理尚未在高速缓存中的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35900401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com