告诉gcc具体展开一个循环
我如何告诉GCC展开一个特定的循环? 我已经使用CUDA SDK,可以使用#pragma unroll
手动展开循环。 gcc有类似的function吗? 我GOOGLE了一下,但找不到任何东西。
GCC为您提供了几种不同的处理方法:
-
使用#pragma指令 ,如
#pragma GCC optimize ("string"...)
,如GCC文档中所示 。 请注意,该编译指示使剩余函数的优化成为全局优化。 如果你巧妙地使用了#pragma push_options
和pop_options
macros,你可以用一个函数来定义这个:#pragma GCC push_options #pragma GCC optimize ("unroll-loops") //add 5 to each element of the int array. void add5(int a[20]) { int i = 19; for(; i > 0; i--) { a[i] += 5; } } #pragma GCC pop_options
-
使用GCC的属性语法注释各个函数:检查GCC函数属性文档以获得关于这个主题的更详细的论文。 一个例子:
//add 5 to each element of the int array. __attribute__((optimize("unroll-loops"))) void add5(int a[20]) { int i = 19; for(; i > 0; i--) { a[i] += 5; } }
注意:我不确定GCC在展开反向迭代循环方面的performance有多出色(我这样做是为了让Markdown能和我的代码一起玩)。 但是,这些例子应该编译好。
-funroll-loops
可能会有所帮助(虽然它打开全局循环展开,而不是循环)。 我不确定是否有一个#pragma
做同样的事情…