问题标签 [loop-unrolling]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
46945 浏览

performance - 什么时候,如果有的话,循环展开仍然有用吗?

我一直在尝试通过循环展开来优化一些对性能至关重要的代码(一种在蒙特卡罗模拟中被调用数百万次的快速排序算法)。这是我试图加速的内部循环:

我尝试展开到类似的内容:

这完全没有区别,所以我把它改回更易读的形式。其他时候我也有过类似的经历,我尝试过循环展开。考虑到现代硬件上分支预测器的质量,循环展开何时(如果有的话)仍然是一种有用的优化?

0 投票
6 回答
713 浏览

c++ - 在具有部分特化的 C++ 中使用模板展开循环

我正在尝试使用模板在 C++ 中展开循环,如下所示。

当我在 Cygwin 中编译 w/g++ 3.4.4 时,出现以下错误。

tmp.cpp:12:错误:类型T' of template argument0' 取决于模板参数

我究竟做错了什么?我是否需要以某种方式注释 0 以说明它是 T 类型?

提前致谢。

0 投票
1 回答
180 浏览

performance - BASIC 中的循环展开

我有一个运行精简版 BASIC(Parallax BASIC Stamp)的嵌入式处理器。在一个循环中,我通过 SPI 总线写入 1024 个值。

在编译语言中,通过展开循环可以获得更快的速度(将更多语句放入循环,降低开销与语句的比率)。但是,我不确定 BASIC,因为它是一种解释性语言,并且每个语句在执行之前都会被解释。

分析很困难,因为我必须找到一个可用的引脚,向它写入一个脉冲,然后用示波器进行测量。

从理论的角度来看,BASIC 中的循环展开是否提供任何速度优势?

0 投票
2 回答
614 浏览

gcc - 在 x86 上分析为 SPARC v8 编译的基准

我正在尝试对 leon3 处理器(指令集是 SPARC v8)进行(小)改进,以进行学术练习。在我决定要改进什么之前,我想介绍几个我想定制改进的基准程序。

我无权访问 SPARC v8 机器。

目前,我正在使用“tsim”(一个 leon3 模拟器)的评估版本,它在功能级别进行分析。这并不是那么有用。

我尝试过一些奇怪的东西,比如在启用循环展开的情况下进行编译,然后计算汇编代码中有趣的指令,但 gcc 拒绝展开循环,可能是因为其中一些循环太深(例如 4 个嵌套的“for”循环)。

理想情况下,我正在寻找的是一个 SPARC v8 模拟器,它运行基准测试并在指令级别对其进行分析(例如:'smul' 执行 x 次),以便我可以决定从哪里开始尝试改进。当然,如果不是分析器,如果有其他方法可以做到这一点,我不会介意。

有任何想法吗?

0 投票
3 回答
2637 浏览

c++ - 编译时内的模板参数展开for循环?

维基百科(这里)给出了 for 循环的编译时间展开......我想知道我们是否可以使用类似的 for 循环,其中包含模板语句......例如......

以下循环是否有效

SubDomain 是一个接受模板参数 int 的类,这里是用一个作为 Device 类成员的参数构造的。

谢谢大家的回答......现在你知道我想要什么......无论如何我是否实现了我想要的?

我终于得到了我想要的............而不是直接使用 for 循环......可以改为使用Boost::MPL for_each 构造。我还没有实现它,但我猜这提供了一种方法来做我想做的事.....

我在这里从另一个堆栈溢出问题中得到了答案......但是对同一问题的评论拒绝使用它,因为它会非常慢(当然对于大型 for 循环)......但是.. 对于不是大的循环 i不要认为应该有任何腹胀......我会尝试代码并让你知道结果......

示例中很好地说明了用法

0 投票
2 回答
4185 浏览

java - Java JIT循环展开策略?

JIT 的循环展开策略是什么?或者,如果没有简单的答案,那么有什么方法可以检查循环展开的位置/时间?

基本上,我上面有一段代码,它有一个静态的迭代次数(八次),当我离开 for 循环时它会很糟糕。但是当我手动展开循环时,它的效果要好得多。我有兴趣找出 JIT 是否真的展开循环,如果没有,那么为什么。

0 投票
1 回答
1265 浏览

cuda - 执行循环展开时出现“资源不足”错误

当我将内核中的展开从 8 个循环增加到 9 个循环时,它会因out of resources错误而中断。

我阅读了如何诊断由于资源不足而导致的 CUDA 启动失败?参数不匹配和寄存器的过度使用可能是一个问题,但这里似乎不是这种情况。

我的内核计算n点和m质心之间的距离,并为每个点选择最接近的质心。它适用于 8 个维度,但不适用于 9 个维度。当我dimensions=9为距离计算设置并取消注释两条线时,我得到一个pycuda._driver.LaunchError: cuLaunchGrid failed: launch out of resources.

您认为什么可能导致这种行为?还有哪些其他问题会导致out of resources*?

我使用 Quadro FX580。这是最小的(ish)示例。为了展开真实代码,我使用模板。

0 投票
4 回答
3112 浏览

c++ - 优化编译器如何决定何时展开循环以及展开循环的程度?

当编译器执行循环展开优化时,它如何确定展开循环或是否展开整个循环?由于这是空间性能的权衡,平均而言,这种优化技术在使程序性能更好方面的效果如何?此外,建议在什么条件下使用这种技术(即某些操作或计算)?

这不必特定于某个编译器。它可以是任何解释,概述该技术背后的想法以及在实践中观察到的内容。

0 投票
1 回答
162 浏览

objective-c - 在一个文件中展开循环

我正在用 LLVM 编写 Objective-C 代码。我有一个文件,其中包含对性能非常关键的代码。是否可以仅针对这个文件打开编译器优化(特别是循环展开),而无需设置项目范围的值?

0 投票
1 回答
1840 浏览

performance - 我应该研究 PTX 来优化我的内核吗?如果是这样,怎么做?

您是否建议阅读内核的 PTX 代码以进一步优化内核?

一个例子:我读到,可以从 PTX 代码中找出自动循环展开是否有效。如果不是这种情况,则必须在内核代码中手动展开循环。

  • PTX 代码还有其他用例吗?
  • 您查看您的 PTX 代码吗?
  • 在哪里可以找到如何读取 CUDA 为我的内核生成的 PTX 代码?