c-保存数组所需的缓存行



考虑在C中声明为double a[100]的数组。需要多少64字节缓存行才能容纳完整的阵列?

简短回答:100/64/8=12.5->13个高速缓存行。

更多信息:以下是一般计算:假设你有X个类型为A的元素。由于这是一个数组,你可以假设是连续内存。设大小(A(是类型A的一个元素的字节大小64B,保持阵列所需的64B高速缓存行的数目为(X/(64/size(A(((。

说明:您需要计算每个缓存行的元素数,即(64/size(A((。然后你想知道需要多少缓存行来容纳X个元素,X除以每个缓存行的元素数量。为了避免诸如";错误高速缓存共享";。

对于您的案例:双人间的尺寸是8B(找不到任何情况下它会像对这个问题的评论所暗示的那样是2B(。在每个缓存行上可以容纳(64/8(=8个元素。因此,您需要(100/8(=12.5个缓存行来容纳整个阵列。由于大多数时候你会想避免";假高速缓存共享";,这意味着您可能也会占用整个第13个缓存行。

注意:当元素的大小划分缓存行大小而没有提醒时,这种方法效果很好。它也适用于一般情况,但会导致一些元素被写入两个不同的缓存行。这通常不是空闲的,因为有时您必须读取两个缓存行才能读取单个值,但当您处理连续数组时,这就没什么大不了的了。如果您确实想在没有元素穿过缓存线的情况下进行计算,只需使用:(X/floor(64/size(A(((。例如,如果A是32b系统大小上的长双(A(,则为10B。在这种情况下,第一个公式将给出(100/(64/10((=15.625,但如果不跨越缓存线,则会得到(100/floor(64/10((=100/6=16.6,因此总共还有一条缓存线。

最新更新