问题描述
下面代码中的 __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。它们确实会减慢您的可执行文件的速度!