我正在一个支持gcc47,gcc48,clang33,icc13和icc14编译的项目中实现Kahan summation

作为该算法的一部分,我想禁用利用实数相加的关联性的优化。 (浮点运算没有关联。)

我只想在相关功能中禁用这些优化。我已经知道如何使用''no-associative-math''属性在gcc下执行此操作。如何在icc或clang中做到这一点?我没有运气了。

class KahanSummation
{
  // GCC declaration
  void operator()(float observation) __attribute__((__optimize__("no-associative-math")))
  {
    // Kahan summation implementation
  }
};

其他可能暗示no-associative-math的GCC属性是no-unsafe-math-optimizationsno-fast-math

查看一个Intel presentation (PDF, slide 8)或另一个or another (PDF, slide 11),我只想为此功能在ICC中设置“fp-model precision”。我关心的编译器是ICC 13和ICC 14。
class KahanSummation
{
  // ICC or clang declaration
  void operator()(float observation) __attribute__((????))
  {
    // Kahan summation implementation
  }
};

最佳答案

__attribute__是GCC扩展名。 Clang也支持该语法以保持某些GCC兼容性,但是似乎唯一支持的与优化相关的属性是 optnone ,它会关闭所有优化。 ICC具有a few optimization pragmas,但是据我所知,没有任何事情可以做您想要做的事情。 appears to support用于VC++兼容性的#pragma float_control,尽管我无法找到有关ICC文档中应如何使用该编译指示的确切信息,所以您必须使用VC++

不过,您可以做的是在单独的翻译单元(即cpp文件)中定义所需的功能:

// Your header
class KahanSummation
{
  // Declaration
  void operator()(float observation);
};
// Separate cpp file - implements only this function
void KahanSummation::operator()(float observation)
{
    // Kahan summation implementation
}

然后,您可以使用所需的任何编译器选项来编译单独的文件,并将生成的目标文件链接到程序的其余部分。

09-10 01:39
查看更多