VS2010的C++优化是否进行了循环展开?

3
我有以下一段简单的代码,可能会被执行数亿次;
for (int i = 0; i < 8; i++)
    if (((p[i].X >= x) && (p[i].X <= x + d))
        &&((p[i].Y >= y) && (p[i].Y <= y + d))
        &&((p[i].Z >= z) && (p[i].Z <= z + d)))
      return 1;

Visual C++ 2010编译器中的优化器是否会为我展开此循环,还是我最好手动进行展开?我查看了其他类似问题,但没有看到具体结果。


1
如果你不确定循环是否太长,而且没有太大的影响,那么自己展开循环也没有太大的问题——当然,前提是它是一个瓶颈,并且你想在可能降低可读性的情况下获得更好的性能。虽然我想VS2010会自动展开循环。 - Rapptz
1
你知道这段代码将在哪些硬件平台上运行吗?那么我建议手动展开它并测量发生的情况,而不是根据编译器的猜测来进行猜测。 - Philipp
我希望VS2010可以为我完成这个任务,但我可能会尝试对两个版本进行分析。也许可以查看汇编输出。 - SmacL
2
请问这个问题的更高层次含义是什么?(你有8个3D坐标,并且想知道它们中是否有任何一个与某个d大小的立方体对齐。)这种事件的概率是多少?它可以向量化吗? - Aki Suihkonen
@AkiSuihkonen,是的,更高级别的问题是计算任意视锥体与轴对齐立方体之间的交集,这也包含了上述代码之前和之后的许多优化。我没有考虑过矢量化,但一定会进行调查。感谢您的反馈。 - SmacL
显示剩余6条评论
1个回答

1

真正的问题是,展开循环能为你带来什么?

每次“展开”可以删掉一个分支(if i >= 8 stop)。

你的循环体已经包含了6个分支(if * 1,|| * 2,&& * 3);所以展开它是否会有很大的收益呢?

看看代码如何优化可能很有趣;但我不太确定“展开”是否应该是你的主要关注点,我更担心复杂条件的处理方式!


条件是检查在笛卡尔空间内的轴对齐立方体内是否有一个由8个点组成的集合中的任何一个点。在展开过程中,我想知道是否将[i]替换为常量[n]也会去除索引操作。 - SmacL
@ShaneMacLaughlin:那么要优化的方程应该先被固定 :) - Aki Suihkonen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接