IBM XL C/C++ 等效于#pragma GCC 优化

Posted

技术标签:

【中文标题】IBM XL C/C++ 等效于#pragma GCC 优化【英文标题】:IBM XL C/C++ equivalent to #pragma GCC optimize 【发布时间】:2017-09-16 10:17:38 【问题描述】:

我们正在通过bad code generation 在 PowerPC 平台上使用 IBM XL C/C++ 在-O3 遇到源文件。它的表面是一个挂起,看起来一个特定的循环没有被打破。

该问题仅在 XL C/C++ 下出现。我们的测试制度表明源文件没有未定义的行为、内存错误和其他勘误。对于源文件,我们也不会收到来自编译器的 strict/nostrict 警告。

我们希望在-O2 而不是-O3 编译源文件。我们想在源文件中添加工具,如编译指示,以便编译器可以适当地保护它。该仪器允许其他人连接其他构建系统,如 Cmake 和 Autotools,并且事情将为他们“正常工作”。 (必要的信息在源代码而不是我们的 makefile 中可用)。

编译器的 IBM 手册位于 IBM XL C/C++ for AIX, V13.1,但该死的,如果我能找到该选项。

#pragma GCC optimize 等效的IBM XL C/C++ 是什么?我们如何检测源代码以告诉 XL C/C++ 使用 -O2 而不是 -O3

【问题讨论】:

【参考方案1】:

一个 IBM XL C/C++ for AIX V13.1 选项可用于编译 -O2 处的一个源文件是 #pragma options optimize=2。有关它的信息可以在网上找到here 或 PDF here。如果你想覆盖已经在命令行中指定的-O3,并在函数级别控制它,你可以使用#pragma option_override(<your function name>, "opt(level, 2)")。有关它的信息可以在线找到here 或PDF here。您也可以通过修改您的 Makefile 来实现相同的目的,以便在 -O2 而不是 -O3 编译一个源文件。

另外,您确定您报告的以 tea.cpp:27:26 开头的错误消息来自 IBM XL C/C++ for AIX V13.1?它看起来不像该产品的诊断消息格式。

我们将继续在 Stack Overflow 上监控您的 cmets(使用 xlc 标记有助于我们找到它),但是如果您在我们的论坛 http://ibm.biz/xl-power-compilers-forum 上发布您的问题,您可能会发现您可以获得更快的响应时间,其中IBM 编译器开发团队更积极地监控。

【讨论】:

谢谢@trudeun。我认为您对编译器诊断是正确的。它看起来像一条 GCC 消息。关于-O2,我们找到了痛处。它在Issue 503 被清除。我想这就是 "As If" 规则 C++ 规则 - 编译器编写者可以将一个正常运行的程序变成一个不正常运行的程序:) 关于 Stack Overflow 与 IBM 论坛,感谢您的关注。我没有讨论帐户,也不会加入另一个社交网络,所以我不能使用该场地。如果 IBM 接受 Google、Facebook 等就好了。但我知道大多数公司都想成为收集信息的服务提供商;他们不想成为不得不放弃信息的依赖方。 再次感谢@trudaun。我看到手动参考发生了什么。您指出的信息在手册中。但是,我从另一端开始工作:我在第 441 页的手册中找到了option_override,然后我去寻找第 441-445 页的优化选项。问题是,"opt(level, 2)" 没有在手册的那个区域讨论。其他优化包括unrollnounroll,但不是"opt(level, 2)"。我想我还在学习使用手册。 谢谢@jww。 IBM Compilers 确实有一个 Facebook account,如果您更喜欢这种方式进行交流,但 Stack Overflow 对以后可能遇到这些相同问题的其他人来说会更好,因为响应是公开的并且可以搜索。 我有另一个源文件被错误编译。它是一个名为sm3.cpp 的中文散列函数。我在 makefile 中使用-O2 将其隔离。然后我恢复了makefile并添加了#pragma options optimize=2。这是必要的,因为有些人使用其他构建系统(而不是我们的 makefile)。但是,错误编译仍然存在。我不知道这12个函数中哪个是问题,所以我不能使用#pragma option_override。任何想法如何进行?

以上是关于IBM XL C/C++ 等效于#pragma GCC 优化的主要内容,如果未能解决你的问题,请参考以下文章

IBM编译器开发团队(上海)招募实习生

复合赋值运算符

等效于 Julia 中的 c\c++ 编译器指令

Android Studio 中的 #pragma 标记等效项

#pragma once 等价于 c++builder

支持 C/C++ 代码生成 (MATLAB) 的函数等效于“bwareaopen”和“bwconhull”