我有一些代码在g ++ 4.8.5下编译~6秒,但在icpc 17.0.1下编译需要很长时间。就像30分钟,虽然我没有准确测量。我想知道为什么icpc需要这么长时间,但是我找不到任何可能会向我显示编译icpc停止的阶段的标记或选项。
对于g ++我发现了很好的选项“-ftime-report”,但我找不到类似于intel编译器的任何东西。有没有什么?或者是否有其他方法可以尝试和诊断此问题?
编辑:我通过一些非常简单的源文件搜索找到了问题,注释掉了所有内容,然后将其添加回去,直到我找到了减速,但是知道是否有任何标志或工具仍然会很好英特尔编译器可以帮助解决这类问题。对于那些可能很好奇或看到类似内容的人来说,我的问题与我正在使用的一些BOOST可变参数宏有关,所以我想这是预处理器以某种方式结束了。我已经附上了罪魁祸首宏。这是相当丑陋的,但它只是为了一些自动调试输出。它所做的外部产品最多只有6x6,所以它确实不应该是一个严重的负担(并且g ++处理它没问题),但它似乎以某种方式破坏了英特尔预处理器。
#define GET_M2_MATRIX_EL(r, PRODUCT) \
{ \
str label = BOOST_PP_SEQ_ELEM(0, PRODUCT); \
str block = BOOST_PP_SEQ_ELEM(1, PRODUCT); \
int i = BOOST_PP_SEQ_ELEM(2, PRODUCT); \
int j = BOOST_PP_SEQ_ELEM(3, PRODUCT); \
std::ostringstream echo1; \
try { \
std::ostringstream echo2; \
echo1 << " spec.get(Par::mass2,"<<label<<","<<i<<","<<j<<") = "; \
double value1 = spec.get(Par::mass2,label,i,j); \
echo2 << " SLHAea::to<double>( slhaea.at("<<block<<").at("<<i<<","<<j<<").at(2) ) = "; \
double value2 = SLHAea::to<double>( slhaea.at(block).at(i,j).at(2) ); \
cout << echo1.str() << value1 <<endl; \
cout << echo2.str() << value2 <<endl; \
cout << endl; \
} catch (const std::exception& e) \
{ add_error(report,e,label+": "+block); } \
}
#define GET_M2_MATRIX(NAME,BLOCK,__IND1,__IND2) BOOST_PP_SEQ_FOR_EACH_PRODUCT(GET_M2_MATRIX_EL, ((NAME))((BLOCK))(BOOST_PP_TUPLE_TO_SEQ(__IND1))(BOOST_PP_TUPLE_TO_SEQ(__IND2)))