【问题标题】:Cache use, spatial locality, and latency缓存使用、空间局部性和延迟
【发布时间】:2012-04-26 16:34:43
【问题描述】:

我正在学习有关空间局部性的缓存操作。 (到目前为止,我的参考文献是 Lin 和 Snyder 的 Principles of Parallel Programmingthis tutorial,当然还有 Wikipedia。)

以以下示例为例,使用 gcc 编译,在 Windows 7 Professional 上运行,使用 Intel Core2 Duo CPU (L7500)。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int *array;
    int length;
    int count;
    int range;
    int i;

    // generate an array of a million integers between 0 and 99
    length = 1000000;
    range = 100;
    array = calloc(length, sizeof(int));
    srand(time(NULL));
    for(i = 0; i < length; i++)
    {
        array[i] = rand() % range;
        // printf("%d\n", array[i]);
    }

    // count the number of occurrences of 3 in the array
    count=0;
    for(i=0; i<length; i++)
    {
        if(array[i]==3)
        {
            count++;
        }
    }
    printf("count = %6d\n", count);

    return 0;
}

现在在例程的后半部分,将读取整个整数数组,因此 CPU 应根据空间位置提前将它们加载到缓存中。但是在循环期间的任何时候,有多少数组可以/应该/应该加载到缓存中?一次一个缓存行(64 字节/每个 int 4 字节 = 16 个整数),它的大块,还是一举一动整个数组?

此外,据我了解,将数据从 RAM 加载到缓存(或根据教科书,从非本地内存到本地内存)所涉及的延迟可能比实际运行例程所需的时间要重要得多。是吗?

现在假设我们将此代码移动到多处理器/多核机器上,代码的计数部分更改为在 4、8、16 等并行线程中运行(使用 pthreads),对数组的单独部分进行计数,然后在最后将私人计数加在一起。这是否会导致 RAM 到缓存延迟的多次单独出现,从而使并行版本的运行速度比串行版本慢?

【问题讨论】:

    标签: c caching pthreads parallel-processing localityofreference


    【解决方案1】:

    是的,内存速度和延迟确实在许多算法中占主导地位,因此有必要尽可能高效地使用内存缓存来加快这些速度。

    并行运行可能会损害您的性能,但通常不会。弄清楚这一点需要大量的测试和调整。

    例如,以连接到一组 RAM 的四核芯片为例。如果算法需要最大速度的内存读取,并且计算速度总是快于 RAM 速度,那么并行运行将不会获得任何收益,并且可能会减慢速度。

    但如果你有一个双插槽系统,每个 CPU 都会有自己的 RAM,算法会加快。

    或者,系统可能会从 1 组 RAM 升级到 4 组,并从单通道切换到四通道 RAM 配置。届时,RAM 速度可能会超过计算速度,四核将从运行更多线程中受益。

    在我看来,每个内核运行一个线程通常会使您受益,并且会利用系统升级。运行单线程可能会避免少量的同步开销,但以后总会限制程序。

    【讨论】:

    • 感谢您的帮助! (没有足够的代表来支持 - 抱歉。)关于 的任何见解但是在循环期间的任何时候它可以/是否/应该加载到缓存中的数组有多少?一次一个缓存行(64 字节/每个 int 4 字节 = 16 个整数),它的大块,还是一举整个数组? 那是我真的找不到参考的那个。
    • @RevWaldo:您可能找不到参考资料,因为它几乎随每个芯片而变化。 Intel/AMD 一直在尝试改进缓存预取行为。最好忽略它并尝试将内存访问占用空间保持在一个缓存大小的块内。
    • 解释为什么教科书中的人在解释性能结果时使用“我们认为”相当多。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2018-09-12
    • 1970-01-01
    • 2014-02-17
    相关资源
    最近更新 更多