我正在尝试复制这篇文章的第一段代码
http://www.drdobbs.com/parallel/cache-friendly-code-solving-manycores-ne/240012736
即:
static volatile int array[Size];
static void test_function(void)
{
for (int i = 0; i < Iterations; i++)
for (int x = 0; x < Size; x++)
array[x]++;
}我在OS上运行,使用的是常春藤之桥处理器,因此有64KiB的L1缓存。但是,无论我对数组大小做了多少更改,都需要相同的时间。下面是我的代码:
#define ARRAY_SIZE 16 * 1024
#define NUM_ITERATIONS 200000
volatile int array[ARRAY_SIZE];
int main(int argc, const char * argv[])
{
for (int i = 0; i < NUM_ITERATIONS; i++)
for (int x = 0; x < ARRAY_SIZE; x++)
array[x]++;
return 0;
}现在,根据本文提出的逻辑,array应该是64KiB,并使用我所有的L1缓存。然而,我已经尝试了许多不同的ARRAY_SIZE组合(高达160x1024),并相应地设置了NUM_ITERATIONS,但每种组合都需要相同的时间。
我使用gcc -o cachetest cachetest.c进行编译,没有其他选择。即使使用了volatile,是否有一些我不知道的优化正在进行?或者是有太多的并行进程和上下文切换,我甚至无法分辨?这里发生了什么事?我真的很困惑。
谢谢,所以!
发布于 2013-12-21 11:25:09
有两件事:
array,它只会在循环中增加数组值,因此编译器可能会通过将您的程序更改为不执行任何操作(只返回0)来对其进行更多优化,这仍然是正确的。我建议:
-O0选项编译时关闭所有编译器优化使用-S选项编译由编译器生成的代码的程序集文件
https://stackoverflow.com/questions/20173548
复制相似问题