【问题标题】:How to prevent optimization of busy-wait如何防止忙等待的优化
【发布时间】:2012-12-17 20:35:13
【问题描述】:

我需要一个忙等待函数。

for(long int j=0; j<50000000; ++j)
  ;

当我在发布模式下编译时,这会得到优化。除了在调试模式下编译之外,还有什么方法可以让它得到优化吗?我并不特别关心循环的实际数量,但它必须是一个明显的忙延迟。

【问题讨论】:

标签: compiler-optimization


【解决方案1】:

我不知道你为什么需要让 CPU 保持忙碌,但我们假设你确实有充分的理由,比如确保让 CPU 保持忙碌,这样它就不会考虑上周经历的崩溃变得很沮丧,但我离题了......

您看到的问题是编译器执行“死代码消除”:它看到循环什么都不做(即没有副作用),因此将其删除。所以你可以让它产生副作用。

一个简单的解决方案是这个函数:

void busywait(long iterations)
{
    for(volatile long i = 0; i != iterations; i++)
        ;
}

通过将i 标记为volatile,您可以确保循环具有副作用,因为存储到易失性对象(即我们执行的递增)被视为具有副作用。

【讨论】:

  • 它现在被优化为相当于i += iterations;
  • 您始终可以选择性地禁用该特定功能的优化。但说真的,您可以调整循环的代码,使其具有编译器无法优化的副作用。
  • 作为旁注(事实发生四个月后),我发现很难相信符合标准的编译器会将循环优化到相当于i += iterations,因为每个+= 都会有一个侧面-标准要求可见的效果,并将它们合并为一个 += 错过了 iterations - 1 的副作用。
猜你喜欢
  • 2011-11-24
  • 1970-01-01
  • 2019-05-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2015-07-04
  • 1970-01-01
相关资源
最近更新 更多