【问题标题】:GCC and Clang: Turn off pure optimizationsGCC 和 Clang:关闭纯优化
【发布时间】:2014-05-09 21:28:43
【问题描述】:

我正在运行一组比较不同 libc 字符串函数的基准测试。问题是 GCC 和 Clang 正在优化循环中的计算,因为这些函数被标记为“纯”和“常量”。有什么方法可以关闭优化或绕过它?

【问题讨论】:

  • clang 让你选择要执行的传球,用 gcc 我不太确定
  • 对这些东西进行基准测试的最佳方法是使用结果。通常只需从输出中打印出一个数字就足够了。
  • 对于纯/常量函数,您希望使用结果,但您还希望确保每次都使用不同的参数调用它们,否则编译器可能会执行一次调用。禁用编译器通道(@Marco 当然 gcc 允许它)太脆弱了(除非你选择 -O0)。您可以尝试自己声明这些 libc 函数(而不是包含标准头文件)并使用 -fno-builtin 进行编译,这样编译器就不会知道这些函数是纯/常量,但最好遵循 Mysticial 的建议。
  • 谢谢马克。老实说,从来不需要那个。但很高兴知道。

标签: gcc optimization constants clang pure-function


【解决方案1】:

我解决了!解决方案很糟糕,但它有效:

volatile int x;
for (...)
{
    // ...
    x = (int)f(args);
}

我从不使用 x 的值,所以转换不会有问题。更好的是,现在我没有收到关于不使用 return value of function declared with pure attribute 的错误。

【讨论】:

  • 您的解决方案中没有任何内容可以阻止编译器的下一版本或当前版本将循环转换为int i = (int)f(args); for (...) x = i;
  • @PascalCuoq:我将x 声明为volatile,所以编译器知道它不应该被触及。
  • 您将x 声明为volatile,因此编译器知道在目标代码中对它的访问应该与在源代码中一样多。 volatile 限定符不适用于(int)f(args),因此编译器可以将其提升出循环。这是一个经典的优化,如果至少有一个现有的编译器能够将它应用到您的代码中,我不会感到惊讶。不这样做的编译器根本没有实现与纯函数相关的全部优化范围。
  • 见“5.期望 volatile 通过非易失性访问强制排序”blog.regehr.org/archives/28
  • @PascalCuoq:啊,废话。我可以尝试将演员表更改为(volatile int)。这有帮助吗?
猜你喜欢
  • 2013-12-30
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
相关资源
最近更新 更多