不要在 GCC 中使用 -O3 标志优化特定循环 [关闭]

Posted

技术标签:

【中文标题】不要在 GCC 中使用 -O3 标志优化特定循环 [关闭]【英文标题】:Don't optimize an specific loop using -O3 flag in GCC [closed] 【发布时间】:2013-01-05 19:25:01 【问题描述】:

在我的代码中,我使用一个简单的 int 变量(名为 counter)来同步 4 个线程。

这是我的代码的 sn-p:

int counter = 0;
#pragma omp parallel shared(counter) num_threads(4) 

    while(counter != thread_id)
        // What should I put here?
    
    // Actions needed to be performed 'in order'
    counter++;
    // The rest of the code

我面临的问题是,如果我使用 -O3 优化标志,则编译代码中的 while 循环“消失”...例如,如果我在循环中放置了 printf 行,则会发生 while 和一切工作正常...

我应该在我的 while 循环中放什么,这样 -O3 才不会影响它的行为?

--- 编辑---

抱歉缺少上下文...我需要创建在特定处理器上工作的线程团队,因为我正在使用 NUMA 系统,所以我需要“团队创建”部分以便我可以使用处理器亲和力......请看这个相关的问题: Specific thread order in C using GCC and OMP

【问题讨论】:

您是否正在尝试同步/加入您的线程? OpenMP 已经有结构可以做到这一点。不要试图自己动手;这完全违背了重点! 如果您尝试以这种方式同步线程,我会否决所有告诉您如何操作的答案 作为一般规则,如果一个循环似乎没有产生任何后果,那么如果它被优化器简单地删除,您应该不会感到惊讶。 对,但是我正在循环中做一些事情......这是一个积极的等待......有没有办法告诉编译器我需要那个循环而不包含一些虚拟函数?跨度> 我对 Oli/Luchian cmets 投了赞成票。为什么?因为他们是对的。 【参考方案1】:

如前所述,这是一种糟糕的线程同步方式。由于我不希望我的回答被否决,我将解释您应该使用其他形式的同步。通常,信号量用于计算事物,因此这可能是正确的做法,但由于我们没有您的所有代码,因此没有特别好的方法来判断。

【讨论】:

以上是关于不要在 GCC 中使用 -O3 标志优化特定循环 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 gcc 中启用单个优化标志?

GCC 优化标志

不可见的 GCC 优化标志?

O2 中导致未定义符号的 gcc 优化标志

嵌入式 GCC 优化魔法

是否可以使用 GCC 编译具有特定编译器标志的代码文件的一部分?