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

c++ - clang でのループ展開

次のプログラムで 2 番目のループを選択的に展開しようとしています。

次のオプションを指定して clang (3.5) を実行すると、両方のループが 4 回展開されます。

私は何を間違っていますか?また、フラグを追加-fno-unroll-loopsまたはスキップすると、-unroll-count=4ループが展開されません。

また、プラグマエラーをデバッグする方法に関するヒントはありますか?

0 投票する
5 に答える
33717 参照

c++ - C/C++ での自己展開マクロ ループ

私は現在、すべてのサイクルが重要なプロジェクトに取り組んでいます。アプリケーションのプロファイリング中に、一部の内部ループのオーバーヘッドが非常に高いことがわかりました。これは、それらがほんの数個のマシン命令で構成されているためです。さらに、これらのループの反復回数はコンパイル時にわかります。

そこで、コピー & ペーストで手動でループを展開する代わりに、後で簡単に変更できるように、マクロを使用してコンパイル時にループを展開できると考えました。

私がイメージするのは次のようなものです:

私が置き換えることができるようにfor (int i = 0; i < N, ++i) { do_stuff(); }

そして、次のように展開します。

ほとんどの場合、C プリプロセッサはまだ謎に包まれているため、これを達成する方法はわかりませんが、Boost にはBOOST_PP_REPEATマクロがあるように見えるので、それが可能であるに違いないことはわかっています。残念ながら、このプロジェクトでは Boost を使用できません。

0 投票する
2 に答える
18111 参照

c++ - g++ でループをベクトル化するには?

検索中に見つけた紹介リンク:

  1. 6.59.14 ループ固有のプラグマ
  2. 2.100 プラグマ Loop_Optimize
  3. ループ回数について gcc にヒントを与える方法
  4. ループを具体的にアンロールするように gcc に指示する
  5. C++ でベクトル化を強制する方法

ご覧のとおり、ほとんどが C 用ですが、C++ でも動作する可能性があると思いました。これが私のコードです:

上記でコメントされているすべてのヒントを使用しましたが、サンプル出力が示すように、スピードアップは得られませんでした (最初の実行でコメントを外した場合#pragma GCC ivdep Unroll Vector:

希望はありますか?それとも、最適化フラグO3だけでうまくいくのでしょうか? このコード (foo関数) を高速化するための提案は大歓迎です!

g++ の私のバージョン:


ループの本体がランダムであることに注意してください。私はそれを別の形で書き直すことに興味がありません。


編集

これ以上は仕方がないという回答もOK!

0 投票する
1 に答える
3792 参照

c - 誰でも簡単に説明できますか?

私は 1 年前にコンピューター編成コースを受講しましたが、現在は「コンピューター アーキテクチャー」としてフォローアップしています。ジョン ヘネシーの著書「コンピューター アーキテクチャーへの定量的アプローチ」の第 3 版を使用しています。MIPS ISA を受けました。まだ助けが必要ですが、このコード行をさらに詳しく説明していただけますか

ソースコード:

アセンブリ コード:

これは ILP を悪用するためのループ展開の例として示されていますが、私にはいくつか疑問があります。配列が Mem[0+R1] から始まり、 Mem[R+8] (テキストに示されているように) まで逆行することがわかります。これには何らかの理由がありますか、それともランダムにこの場所を取りましたか?

また、符号付きの数値 (-8) を追加するときに DADDUI (unsigned) を使用するのはなぜですか?

残りのトピックに沿ってフォローできるように、これの詳細な概要を教えてください。ありがとう

0 投票する
2 に答える
3529 参照

c - ネストされた for ループの展開 - C

ネストされたforループの展開に問題があります。私は概念を理解しています。私はそれを実践しようとしていforますが、展開に合わせてループ内のステートメントを編集することにつまずいています。

誰かが私に効率的なアンロールを見せて、それを順を追って説明してくれたら、それは大きな助けになるでしょう.

展開したいループセクションは次のとおりです。

更新: これは正しいでしょうか?

0 投票する
1 に答える
1236 参照

c++ - テンプレート メタプログラミングを使用したループ展開のさまざまな方法の長所と短所

コンパイル時のループ展開の一般的なソリューションに興味があります (各関数呼び出しが特定の数のクロック サイクルを取り、複数の呼び出しを並行して実行できる SIMD 設定でこれを使用しているため、数を調整する必要があります無駄なサイクルを最小限に抑えるためのアキュムレータの数 - アキュムレータを追加して手動で展開すると、大幅な改善が得られますが、面倒です)。

理想的には、次のようなものを書きたいと思います

そして、以下を生成します。

これまでのところ、私は 3 つの異なるテンプレート メタプログラム ソリューションを使用しており、特にコンパイラが関数呼び出しをインライン化する方法に関して、異なるアプローチの利点/欠点は何か疑問に思っています。

アプローチ1(再帰関数)

呼び出し構文の例:

アプローチ 2 (再帰コンストラクター)

呼び出し構文はかなり醜いです:

また、無名ラムダを使用する場合は、関数の型を明示的に指定する必要がありますが、これは厄介です。

アプローチ 3 (再帰的な静的メンバー関数)

呼び出し構文の例:

構文に関しては、この 3 番目のアプローチが最もクリーンで明確に見えますが、コンパイラによる 3 つのアプローチの処理方法に違いがあるのではないかと考えています。