gpt4 book ai didi

C++ __restrict 的用途是什么以及如何正确使用它?

转载 作者:行者123 更新时间:2023-12-02 02:16:17 25 4
gpt4 key购买 nike

下面代码中的 __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];
}
}

Godbolt's Compiler Explorer

最佳答案

假设您声明了一些static double array[100000];,然后您的main正在调用maxArray(array, array + 17);

如果没有 restrict 注释(或 GCC extension ),则不允许编译器强烈 unroll the loop (因为两个数组切片是重叠的)

使用 restrict 注释,作为程序员,您 promise 这种情况永远不会发生(因此您不会在这样的情况下执行 maxArray(array, array + 17); main),然后编译器可以optimize更加积极主动

memcpy 之间也有类似的差异(对于 C)和 memmove优化编译器会为它们生成不同的代码。

请注意Rice's theorem ,其中陈述了与这些问题相关的理论局限性。积极优化的理论框架可能是 abstract interpretation .

如果您使用GCC (您可以查看使用 g++ -Wall -O3 -S -fverbose-asm 生成的汇编代码)您可以使用 GCC plugin 以及大量的努力改进优化。您还可以使用 GCC developer options了解各种优化,并且由于 GCC 是 free software ,你可以研究和完善它的源码。为此预算数月的努力。

如果允许,请考虑对 C 或 C++ 代码使用静态分析工具,例如 Frama-CClang static analyzer .

如果允许的话,除了调试器(例如 GDB 及其 watchpoints )之外,还可以考虑使用动态检测技术,例如 valgrindaddress sanitizer 。它们确实会降低你的可执行文件的速度!

关于C++ __restrict 的用途是什么以及如何正确使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67119978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com