問題タブ [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 投票する
8 に答える
19615 参照

c# - if の代替、else if

if、else ifステートメントがたくさんあり、これを行うためのより良い方法が必要であることはわかっていますが、stackoverflowを検索した後でも、特定のケースでそうする方法がわかりません。

テキスト ファイル (請求書) を解析し、特定の文字列が請求書に表示されるかどうかに基づいて、サービス プロバイダーの名前を変数 (txtv​​ar.Provider) に割り当てています。

これは私がやっていることの小さなサンプルです (笑わないでください、面倒なことはわかっています)。全部で約300のif、else ifがあります。

switch ステートメントのようなものを使用して、より効率的で読みやすくしたいと考えていますが、BillText をどのように比較すればよいかわかりません。私はこのようなものを探していますが、それを機能させる方法がわかりません。

私は間違いなくアイデアに対してオープンです。

値が評価される順序を決定する機能が必要です。ご想像のとおり、わずかに異なる何百ものレイアウトを解析するときに、請求書がどのサービス プロバイダーに属しているかについて明確に一意のインジケーターがないという問題に遭遇することがあります。

0 投票する
3 に答える
974 参照

haskell - Is there an optimization similar to loop unroll for functional programming?

Disclaimer: I know little about ghc compiling pipeline, but I hope to learn some more about it with this post, for example, if comparing imperative vs functional is relevant to code compilation.

As you know, loop unrolling reduces the number of iterations over a loop by duplicating the code inside it. This improves performance since it reduces the number of jumps (and penalities associated with it) and AFAIR, creates bigger blocks of code, leaving room for better Register renaming optimization.

I was wondering, could there be an equivalent to Loop Unrolling for functional programming? Could we 'unroll' a function, open/expand it's definition, to first reduce the number of calls to said function and/or creating bigger chunks of code -- then leaving room for more code rewrite optimizations (like register renaming, or some FP equivalent)?

Something that would 'unroll' or 'expand' a function definition, using for example function evaluation (maybe mixed with some tactic) in order to have a trade-off between space vs time.

An example of what I had in mind:

Would unroll to

Once more:

Two things are at play: multiple cases of map4 (and consequent tests on list) could degrade performance, or the reduced number of calls of map4 would improve performance. Maybe this could reduce some constant overhead created by lazy evaluation?

Well that doesn't seems to hard to code a test for, so after putting criterion to roll this out, this is what I've got:

ImgUr album

Well, it seems that unrolling had some effect^1! map4 appears to be 16% faster.

Time for the questions then:

  1. Have this been discussed before? Is something like that already implemented?
  2. Is it really the reduced number of evaluations of map4 that improves speed?
  3. Can this be automated?
  4. Could I evaluate by chunks? ie.: if (f x) is fully evaluated, fully evalute everything up to (f x4).
  5. Any other form this sort of unrolling come at play?
  6. How inflation on the function size could this lead to?
  7. Any short-commings on why this is not a good idea?

1: I`ve also unrolled fib, since this sort of optimization would also happen in that form, but the performance gain is cheating a (very) bad algorithm.

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) が得られます。ただし、CODE BLOCK #2 は CODE BLOCK #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 のフラグメント シェーダーでのループとアンロール

私のフラグメント シェーダーの 1 つは、基本的な OpenGL ES 1.1 マルチテクスチャリング機能の一部をエミュレートします。

その一環として、次の GLSL 関数を宣言しています。

k_GL_XXX定数は#definedシェーダーの上部にあります。

マルチテクスチャリングを実行するには、この関数を複数回呼び出します。iOS の SGX GPU の場合、これは for ループを使用して正常に実行されます。

u_cc3TextureCountint ユニフォームで、MAX_TEXTURES#definedです2

奇妙なことに、このループを手動で展開しようとしても機能せず、何も描画されません。

さらに奇妙なことに、さらに基本的なこともできません。

控えめに言っても、これは完全に予期しない動作です。

u_cc3TextureCountの値がであることを確認した2ので、これら 3 つのアプローチはすべて同じ結果になるはずです。

ループを展開しようとしている理由は、一部の Android GPU を含む複数の GPU と、iPad Air の新しい Apple A7 GPU がループで正しく動作しないためです。applyTexture()すべての GPU で機能する関数を複数回呼び出す方法を見つけようとしています。

このような基本的なループ展開が機能しない理由を説明できる人はいますか?

0 投票する
0 に答える
1723 参照

loop-unrolling - 行列乗算のループ展開

ここでの単純な方法よりも優れた行列乗算の適切な実装を行う必要があります。使用した方法は次のとおりです。1-誤った依存関係を削除して、パフォーマンスを大幅に向上させました展開中。問題は、私がそれを使用するたびに、パフォーマンスが最悪になることです。説明が見つかりません。助けが必要です。ここにコードがあります

0 投票する
4 に答える
557 参照

c++ - C++: ループの最適化とループの巻き戻し (ループするかしないか)

アップデート:

この議論は予想以上に進んだので、この質問が頭に浮かんだときに実際に取り組んでいたコードでこれを更新しています。C++ 入門コースの三目並べゲームの勝者を決定するのは、8 行から 16 行のコードの決定でした。

注:これは、コースと同じレベルになるように設計されています。

注 2:トークンは、x または o または ' ' のいずれかの文字です)

これは最適化の問題です。これが繰り返しの場合は申し訳ありませんが、他の場所で答えを見つけることができませんでした.

基本的には、次のコードをループしたほうがよいかどうかにかかっていました。

これは、単に 100 行の cout を入力するだけで、システムに多かれ少なかれ負担がかかりますか?

100 の cout 行を実行するだけでなく、新しい変数をメモリに割り当て、コンピュータに 100 の数式を処理させてデータを出力させるように見えるので、興味深いです。

コンパイラがある程度の最適化を提供する可能性があることは理解できますが、より一般的なレベルで知りたいと思います。主に、VisualStudio 2012 または MingGW (g++) を使用してコンパイルします。