使用单射函数索引数组时优化 g++

问题描述 投票:0回答:3

我有一个 for 循环,其中每个步骤 i 处理一个数组元素 p[f(i)],其中 f(i) 是从 1...n 到 1.. 的单射(一对一)映射。 .m(m > n)。因此循环中没有数据耦合,并且可以使用所有编译器优化技术(例如流水线)。但是我如何告知 g++ f(i) 的单射性呢?或者我是否需要(g++ 可以解决这个问题)?

c++ optimization g++
3个回答
6
投票

假设

f
不依赖于任何全局状态并且不会产生副作用,您可以使用
const
属性来标记它
:

int f(int i) __attribute__((const));

如果

f
确实依赖于全局状态,但仍然具有其输入和全局状态的纯函数的属性(并且不产生副作用),则可以使用稍弱的
pure
属性

这些属性让 gcc 可以进行比其他方式更多的优化,尽管我不知道这些对您的情况是否有帮助。 查看生成的汇编代码,看看它们是否有帮助。


0
投票

您还可以尝试使用临时存储数组处理循环,即:

temp[i]= process(p[f(i)]);

然后将结果复制回来:

p[f(i)]= temp[i];

假设您将

p
temp
声明为受限指针,编译器有足够的信息来更积极地优化。


0
投票

如果 f() 的定义在范围内并且是可内联的,那么大多数好的编译器都应该首先将其内联到函数中,那么下一个优化过程应该能够重写代码,就好像函数调用不存在一样。

© www.soinside.com 2019 - 2024. All rights reserved.