gpt4 book ai didi

C循环: Why doesn't this work?的缓存优化

转载 作者:太空宇宙 更新时间:2023-11-04 03:51:42 24 4
gpt4 key购买 nike

我正在尝试复制本文的第一段代码

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]++;
}

我在带有 Ivy Bridge 处理器的 OS X 上运行,因此有 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 的许多不同组合(最多 160 * 1024),相应地设置 NUM_ITERATIONS,但每种组合大约需要相同的时间。

我正在使用 gcc -o cachetest cachetest.c 进行编译,没有其他选项。是否有某种我不知道的优化正在进行,即使使用了 volatile?还是有那么多我都分不清的并行进程和上下文切换?这里发生了什么?我很困惑。

非常感谢!

最佳答案

有两件事:

  • 编译器可能会对您的代码进行一些默认优化
  • 您的代码不在任何其他代码/函数中使用 array,它只会在循环内递增数组值,因此编译器可能会通过将您的程序更改为不执行任何操作(仅返回 0)来进一步优化它, 这仍然是正确的。

我建议:

  • 在循环内添加更多代码,这样编译器就不会删除您的代码,例如:printf 数组值,或将数组值添加到 sum 变量,然后在循环结束时打印 sum 变量。
  • 使用 -O0 选项编译时关闭所有编译器优化。
  • 使用-S选项检查编译器生成的代码的汇编文件

关于C循环: Why doesn't this work?的缓存优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20173548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com