我有一个for循环,其中每个步骤i,它处理一个数组元素pf(i),其中f(i)是从1...n到1...m (m > n)的内射(一对一)映射。因此,在循环中没有数据耦合,并且可以使用所有的编译器优化技术,如流水线。但是我怎么才能告诉g++ f(i)的内射性呢?或者我甚至需要这样做( g++能搞清楚这一点吗)?
发布于 2010-10-14 21:47:41
假设f
不依赖于任何全局状态,并且不产生任何副作用,您可以用const
attribute对其进行标记
int f(int i) __attribute__((const));
如果f
确实依赖于全局状态,但仍然具有它是输入和全局状态的纯函数的属性(并且不会产生任何副作用),您可以使用稍弱的pure
attribute。
这些属性让gcc进行了比其他方式更多的优化,尽管我不知道这些属性对您的情况是否有帮助。看一下生成的汇编代码,看看它们是否有帮助。
发布于 2010-10-14 22:27:14
您还可以尝试使用临时存储阵列处理循环,例如:
temp[i]= process(p[f(i)]);
然后将结果复制回来:
p[f(i)]= temp[i];
假设您将p
和temp
声明为受限指针,编译器就有足够的信息来更积极地进行优化。
发布于 2010-10-14 23:58:21
如果f()的定义在作用域中并且是可内联的,那么几乎任何好的编译器都应该首先将其内联到函数中,那么下一次优化应该能够重写代码,就好像函数调用不在那里一样。
https://stackoverflow.com/questions/3937806
复制相似问题