缓存使用,空间局部性和延迟

缓存使用,空间局部性和延迟,第1张

概述我正在学习关于空间局部性缓存 *** 作. (到目前为止,我的参考文献是Lin和Snyder的并行编程原理, this tutorial,当然还有维基百科.) 以下示例使用Intel Core2 Duo CPU(L7500)在Windows 7 Professional上运行gcc编译. #include <stdio.h>#include <stdlib.h>#include <time.h> 我正在学习关于空间局部性的缓存 *** 作. (到目前为止,我的参考文献是lin和Snyder的并行编程原理,this tutorial,当然还有维基百科.)

以下示例使用Intel Core2 Duo cpu(L7500)在windows 7 Professional上运行gcc编译.

#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到缓存延迟,使并行版本比串行版本慢吗?

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

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

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

但是如果你有一个双插槽系统,每个cpu都有自己的RAM,算法会加速.

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

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

@H_404_39@ 总结

以上是内存溢出为你收集整理的缓存使用,空间局部性和延迟全部内容,希望文章能够帮你解决缓存使用,空间局部性和延迟所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1230160.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存