如何解决C++ __restrict 是什么以及如何正确使用它?
下面代码中的 __restrict
完全展开循环并将程序集缩短了一半以上。但它是什么意思,应该如何正确使用?
我在问之前做了研究...我找到了 this。但是,唉,我不明白。
// Compile with -O3 -march=native to see autovectorization
void maxArray(double* __restrict x,double* __restrict y) {
for (int i = 0; i < 65536; i++) {
if (y[i] > x[i]) x[i] = y[i];
}
}
解决方法
假设您声明了一些 static double array[100000];
,然后您的 main
正在调用 maxArray(array,array + 17);
如果没有restrict
注解(或GCC extension),编译器不允许强 unroll the loop(因为两个数组切片是重叠的) >
使用 restrict
注释,您作为程序员承诺这永远不会发生(因此您不会在这样的 maxArray(array,array + 17);
中执行 main
),然后编译器可以{{ 3}} 更积极
optimize 和 memcpy 之间存在类似的差异(对于 C),并且优化编译器会为它们生成不同的代码。
请注意 memmove,其中说明了与这些问题相关的理论限制。激进优化的理论框架可能是 Rice's theorem。
如果您使用 abstract interpretation(您可以查看使用 g++ -Wall -O3 -S -fverbose-asm
生成的汇编代码)您可以使用您的 GCC 和 大量努力改进优化。您也可以使用 GCC GCC plugin 来了解各种优化,并且由于 GCC 是 developer options,您可以研究和改进其源代码。为此预算数月的努力。
考虑对 C 或 C++ 代码使用静态分析工具(如果允许),例如 free software 或 Frama-C。
除了您的调试器(例如 Clang static analyzer 及其 GDB)之外,如果允许,请考虑使用动态检测技术,例如 watchpoints 和 valgrind。它们确实会减慢您的可执行文件的速度!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。