【发布时间】:2013-04-07 23:47:34
【问题描述】:
我在 ARM 处理器上运行以下循环。
// pin here is pointer to some part of an array
for (i = 0; i < v->numelements; i++)
{
pe = pptr[i];
peParent = pe->parent;
SPHERE *ps = (SPHERE *)(pe->data);
pin[0] = FLOAT2FIX(ps->rad2);
pin[1] = *peParent->procs->pe_intersect == &SphPeIntersect;
fixifyVector( &pin[2], ps->center ); // Is an inline function
pin = pin + 5;
}
通过循环的缓慢性能,我可以判断编译器无法展开这个循环,因为当我手动展开时,它变得非常快。我认为编译器被pin 指针弄糊涂了。我们可以在这里使用restrict关键字来帮助编译器,还是restrict只保留给函数参数?一般来说,我们如何告诉编译器展开它而不用担心pin 指针。
【问题讨论】:
-
您是否测量了调试或发布版本的执行时间?
-
使用 -O3 优化发布构建。
-
您是否尝试将
v->numelements分配给本地并在 for 循环中使用它?可能是编译器无法展开循环,因为它必须假设v->numelements的值将在fixifyVector中更改。 -
gcc 还有 -funroll-loops 优化标志,查看 docs 它必须与 -O3 分开启用
-
我在该代码中看不到任何可以通过展开循环得到显着帮助的内容。您将不得不查看为这两种情况生成的目标代码,以了解发生了什么。
标签: c gcc arm loop-unrolling