gpt4 book ai didi

c - ARM编译器中的__promise是如何提高效率的

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:54 25 4
gpt4 key购买 nike

我读了here (第 14 页)提高 ARM 设备代码效率的一种方法是使用 ARM_compiler 特定关键字,如 __promise,并提到了以下示例代码:

void f(int *x, int n)
{
int i;
__promise((n > 0) && ((n & 7) == 0)); /* My Question: How this line improves efficiency */

for(i = 0; i < n; i++)
{
x[i]++;
}
}

但我不明白这些额外信息(循环索引为正且可被 8 整除)如何提高效率!

有人能解释一下吗?

最佳答案

__promise((n > 0) && ((n & 7) == 0));

7 的二进制表示是0b111。这告诉您 n 的最后 3 位将始终为零。因此 n 必须是 8 的倍数。此外,n 也将大于 0

因此,您向编译器保证,它可以安全地将循环展开为 8 block ,并且它至少会进行一次迭代。

因此,编译器可以选择将您的代码重写为:

int i = 0;
do
{
x[i+0]++;
x[i+1]++;
x[i+2]++;
x[i+3]++;
x[i+4]++;
x[i+5]++;
x[i+6]++;
x[i+7]++;
} while ((i+=8) != n);

这将跳过一堆比较。

NEONs VADD 指令甚至允许您进一步优化:vaddq_s32 允许您将 vector (1,1,1,1) 添加到组中一次数组的四个元素。因此,您的编译器可以用两条 vadd 指令替换该 block (如果它觉得您可以从中受益)。

关于c - ARM编译器中的__promise是如何提高效率的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50168013/

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