【发布时间】:2012-04-26 16:34:43
【问题描述】:
我正在学习有关空间局部性的缓存操作。 (到目前为止,我的参考文献是 Lin 和 Snyder 的 Principles of Parallel Programming,this 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