问题标签 [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 投票
1 回答
8107 浏览

opengl - GLSL着色器在需要时不展开循环

我的 9600GT 讨厌我。

片段着色器:

如果a=25程序以 3000 fps 运行。
如果a=26程序以 20 fps 运行。
如果aa不出现 <=32 的大小问题。
视口大小为 1000x1000。
仅当大小aa大于 32 时才会出现问题。
作为阈值a的值随循环内对数组的调用而变化(aa[i]=aa[i+1]+aa[i-1]给出不同的截止日期)。
我知道gl_FragColor已弃用。但这不是问题。

我的猜测是,如果 a>25 和 size(aa)>32,GLSL 不会自动展开循环。为什么。之所以取决于阵列的大小,是人类不知道的。

这里解释了一个非常相似的行为:
http ://www.gamedev.net/topic/519511-glsl-for-loops/

手动展开循环确实可以解决问题(3000 fps),即使aa大小>32:

0 投票
8 回答
19615 浏览

c# - 替代 if, else if

我有很多 if,else if 语句,我知道必须有更好的方法来做到这一点,但即使在搜索 stackoverflow 之后,我也不确定如何在我的特定情况下这样做。

我正在解析文本文件(账单)并根据账单上是否出现某些字符串将服务提供商的名称分配给变量(txtvar.Provider)。

这是我正在做的一个小样本(不要笑,我知道这很乱)。总而言之,大约有 300 个 if 和 else if。

我想使用类似 switch 语句的东西来提高效率和可读性,但我不确定如何比较 BillText。我正在寻找这样的东西,但不知道如何使它工作。

我绝对对想法持开放态度。

我需要能够确定评估值的顺序。可以想象,在解析数百个略有不同的布局时,我偶尔会遇到一个问题,即没有明确唯一的指标来说明账单属于哪个服务提供商。

0 投票
3 回答
974 浏览

haskell - 是否有类似于函数式编程的循环展开的优化?

免责声明:我对 ghc 编译管道知之甚少,但我希望通过这篇文章了解更多信息,例如,比较命令式与函数式是否与代码编译相关。

如您所知,循环展开通过复制其中的代码来减少循环的迭代次数。这提高了性能,因为它减少了跳转次数(以及与之相关的惩罚)和 AFAIR,创建了更大的代码块,为更好的寄存器重命名优化留出了空间。

我想知道,对于函数式编程,是否有等效于循环展开的方法?我们能否“展开”一个函数,打开/扩展它的定义,以首先减少对所述函数的调用次数和/或创建更大的代码块——然后为更多代码重写优化留出空间(如寄存器重命名或一些 FP相等的)?

可以“展开”或“扩展”函数定义的东西,例如使用函数评估(可能与某种策略混合)以便在空间与时间之间进行权衡。

我想到的一个例子:

将展开到

再一次:

有两件事在起作用:map4 的多个案例(以及列表上的后续测试)可能会降低性能,或者减少 map4 的调用次数会提高性能。也许这可以减少惰性评估造成的一些持续开销?

好吧,编写测试代码似乎并不难,所以在提出标准来推出它之后,这就是我所拥有的:

相册

嗯,展开似乎有一些效果^1!map4 似乎快了 16%。

那么问题的时间:

  1. 以前讨论过这个吗?类似的东西已经实施了吗?
  2. 真的是减少map4的评估次数提高了速度吗?
  3. 这可以自动化吗?
  4. 我可以按块评估吗?即:如果 (fx) 被完全评估,则完全评估 (f x4) 之前的所有内容。
  5. 这种展开的任何其他形式都在起作用吗?
  6. 这会导致函数大小的膨胀如何?
  7. 为什么这不是一个好主意?

1:我也展开了 fib,因为这种优化也会以这种形式发生,但是性能增益是在欺骗一个(非常)糟糕的算法。

0 投票
3 回答
4432 浏览

c - 使用 gcc 展开循环的正确方法

我想使用 gcc 对此代码进行循环展开,但甚至使用标志。

我得到的汇编代码包含一个 10000 次迭代的循环

有人能告诉我如何在 gcc 中正确实现循环展开吗

0 投票
2 回答
233 浏览

c++ - C++ 循环展开性能差异(Project Euler)

我有一个关于 Project Euler 问题和使用循环展开进行优化的问题。

问题描述:2520是可以被1到10中的每一个数字整除而没有余数的最小数字。能被 1 到 20 的所有数整除的最小正数是多少?

解决方案:

现在,注释掉 CODE BLOCK #1 或 CODE BLOCK #2 会给我正确的答案 (232792560)。但是,代码块#2 比代码块#1 快得多。

代码块 #1:3,580,000 个周期(我刚刚在代码块 #1 中添加了中断,它运行得更快。但是仍然比复合 IF 语句慢得多。)

代码块 #2:970,000 次循环

有谁知道为什么会出现这种巨大的性能差异?

0 投票
2 回答
1111 浏览

c - 循环展开多维数组

我最近尝试在这个多维数组中展开内部 i 和 j 循环,但是 filter->get(i,j) 总是弄乱图像的纹理。谁能帮助我展开 i 和 j 循环?谢谢。

我的尝试:

原来的:

0 投票
1 回答
1622 浏览

c - C中的非递归阶乘

我有一个简单的问题要问你。我编写了这段代码来计算一个数字的阶乘,而无需递归。

如您所见,我的代码使用循环展开来优化执行中的时钟周期。现在我被要求在同一代码中添加双向并行性,知道怎么做吗?

0 投票
0 回答
976 浏览

ios - 在 iOS 的片段着色器中循环与展开

我的片段着色器之一模拟了一些基本的 OpenGL ES 1.1 多纹理特性。

作为其中的一部分,我声明了以下 GLSL 函数:

k_GL_XXX常量位于着色器的#defined顶部。

为了执行多重纹理,这个函数被多次调用。对于 iOS 下的 SGX GPU,这是使用 for 循环成功完成的:

哪里u_cc3TextureCount是 int 制服并且MAX_TEXTURES是。#defined2

奇怪的是,尝试手动展开此循环不起作用,并且不会绘制任何内容:

更奇怪的是,更基本的也没有:

至少可以说,这是完全出乎意料的行为!

我已经确认 is 的值u_cc3TextureCount2因此所有这三种方法都应该产生相同的结果。

我试图展开循环的原因是几个 GPU,包括一些 Android GPU,以及 iPad Air 中的新 Apple A7 GPU 不能与循环正常工作。我正在尝试找到一种applyTexture()多次调用该函数的方法,该方法适用于所有 GPU。

有人能向我解释为什么这种基本的循环展开不起作用吗?

0 投票
0 回答
1723 浏览

loop-unrolling - 矩阵乘法的循环展开

我需要比天真的方法更好地实现矩阵乘法 这里是我使用的方法:1-删除了使性能更好的错误依赖项 2-使用了递归方法,然后我需要尝试循环展开。问题是每次我使用它时,它都会使性能最差我找不到它的解释我需要帮助这里是代码

0 投票
4 回答
557 浏览

c++ - C++:循环优化和循环展开(循环或不循环)

更新:

这个讨论比我预期的更深入,所以当这个问题突然出现在我脑海中时,我正在使用我实际正在处理的代码来更新它。在我的 C++ 入门课程中,决定谁是井字游戏的赢家需要 8 到 16 行代码。

注意:这旨在与课程保持一致,

注 2: token 是 x 或 o 或 ' ' 的字符

这是一个优化问题。如果这是重复,我很抱歉,但我无法在其他地方找到答案。

基本上,它归结为以下代码是否会更好地循环:

这对他们只需键入 100 行 cout 行的系统是否或多或少会造成负担?

我很好奇,因为看起来我们不仅执行了 100 行计算,而且还为内存分配了一个新变量,并强制计算机处理 100 个数学方程并输出数据。

我可以理解编译器可能会提供某种程度的优化,但我有兴趣在更一般的层面上了解。首先,我使用 VisualStudio 2012 或 MingGW (g++) 进行编译。