首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C循环的缓存优化:为什么这不起作用?

C循环的缓存优化:为什么这不起作用?
EN

Stack Overflow用户
提问于 2013-11-24 18:34:47
回答 1查看 167关注 0票数 1

我正在尝试复制这篇文章的第一段代码

http://www.drdobbs.com/parallel/cache-friendly-code-solving-manycores-ne/240012736

即:

代码语言:javascript
运行
复制
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缓存。但是,无论我对数组大小做了多少更改,都需要相同的时间。下面是我的代码:

代码语言:javascript
运行
复制
#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,是否有一些我不知道的优化正在进行?或者是有太多的并行进程和上下文切换,我甚至无法分辨?这里发生了什么事?我真的很困惑。

谢谢,所以!

EN

回答 1

Stack Overflow用户

发布于 2013-12-21 11:25:09

有两件事:

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

我建议:

  • 在循环内添加更多代码,以便编译器不会消除您的代码,例如:打印数组值,或将数组值添加到sum变量,然后在循环末尾打印sum变量。
  • 使用-O0选项编译时关闭所有编译器优化使用-S选项

编译由编译器生成的代码的程序集文件

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20173548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档