我正在一个支持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-optimizations
或no-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
}
然后,您可以使用所需的任何编译器选项来编译单独的文件,并将生成的目标文件链接到程序的其余部分。