問題タブ [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.
c - GCC 5.1 ループ展開
次のコードを考えると
GCC 5.1 以降を使用する
ループ展開を部分的に行い、ループを 10 回展開してから条件付きジャンプを実行します。
しかし、4.9.2 などの古いバージョンの GCC を使用すると、目的のアセンブリが作成されます
それ以降のバージョンの GCC で同じ出力を生成するように強制する方法はありますか?
https://godbolt.org/g/D1AR6iを使用してアセンブリを生成する
編集: GCC の新しいバージョンでループを完全に展開する問題はまだ解決されていないため、重複する質問はありません。パス--param max-completely-peeled-insns=1000 --param max-completely-peel-times=10000
は、GCC >= 5.1 を使用して生成されたアセンブリには影響しません
c - 速度が最適化された複数レジスタの複数ビット アクセスのための C のインライン関数でのループ展開
マイクロコントローラーのディスクリート IO チェックに関連する次の問題を最もエレガントに解決する方法について質問があります。
.c ファイルの内容:
N_USED が 7 に定義され、REGx_ADDR も有効なレジスタ アドレスであると定義されている場合、 --O3 --funroll-loops を使用してコンパイルした後に期待される結果は、testfunction の次の同等の C コードのように速度が最適化されます。
ARM v7 用の GCC コンパイラを使用しています。これは、testfunction によって呼び出される上記のインライン関数 Dinputs を使用すると、最適化されたマシン コード出力で期待どおりに機能しますか? Dinputs 関数の展開とインライン化を強制する可能性はありますか? あまり重要ではありませんが、念のため: 上記の例の構造体転送 DIO は、展開されたインライン関数によってのみ使用されるため、コンパイラがこのデータをオブジェクト ファイルのデータ セクションに引き継ぐ必要はありません。予想される動作は何ですか。これ?
私のプロジェクトで同等のコードを使用したくない理由は、コンパイル時に N_USED が 0 から 7 の範囲 (この例では) である場合、多くの追加のプリプロセッサ コマンドが必要になり、他の DIO を使用するバリアントが必要になるためです。テーブルは、コードではなくテーブルを交換するだけで、より簡単に定義できます。
c++ - GCC でのループ展開動作
この質問は、GCC 5.1 Loop unrollingへのフォローアップの質問の一部です。
GCC のドキュメントによると、上記の質問に対する私の回答で述べたように、「完全なループ ピーリング (つまり、小さな一定回数の反復でループを完全に削除する)」-funroll-loops
などのフラグをオンにします。したがって、このようなフラグが有効になっている場合、コンパイラは、これが特定のコードの実行を最適化すると判断した場合に、ループを展開することを選択できます。
それにもかかわらず、私のプロジェクトの 1 つで、関連するフラグが有効になっていない場合でも、 GCC がループをアンロールすることがあることに気付きました。たとえば、次の単純なコードを考えてみましょう。
でコンパイルすると-O1
、ループが展開され、最新バージョンの GCC で次のアセンブリ コードが生成されます。
-fno-unroll-loops -fno-peel-loops
フラグが無効になっていることを確認するために追加でコンパイルした場合でも、GCC は予期せず、上記の例でループ展開を実行します。
この観察は、次の密接に関連した質問に私を導きます。この動作に対応するフラグが無効になっているにもかかわらず、GCC がループ展開を実行するのはなぜですか? アンロールは、無効になっている場合でも、コンパイラがループをアンロールする可能性がある他のフラグによっても制御され-funroll-loops
ますか? GCC でループのアンローリングを完全に無効にする方法はあり-O0
ますか?
興味深いことに、Clangコンパイラはここで期待どおりの動作をしており、-funroll-loops
有効な場合にのみ展開を実行し、それ以外の場合は実行しないようです。
事前に感謝します。この問題に関する追加の洞察をいただければ幸いです。
c - C 関数の最初の呼び出しは、後続の呼び出しより遅い
C で関数呼び出しのオーバーヘッドを概算しようとしています。そのため、GCC によって最適化されないように、属性((optimize("O0")))を持つ空の関数があります。
論文http://www.intel.com/content/www/us/en/embedded/training/ia-32-ia-64-benchmark-code-execution-paper.htmlに記載されている方法を使用し て判断しています時間なので、かなり正確です。
そのため、関数をループで複数回呼び出し、実行時間を測定します。
関数が最初に呼び出されたとき (i=0)、後続の呼び出しよりも多くのサイクル (~10x) がかかることに気付きました。なぜこれが起こるのですか?
metaprogramming - ループ展開?Julia でメタプログラミングを使用
次の構造を持つコードのブロックを「メタプログラムで」取得する方法はありますか?
ありがとう!
c - Cループの最適化
係数を計算する次の関数があります。
私はループを最適化しようとしています。ループの展開を試みましたが、あまり効果がありませんでした。他に何ができますか?
c - C コンパイラのループ展開の明確化
MSVC コンパイラが次のループを展開する方法を理解できません (アセンブリ言語の理解が不十分で申し訳ありません)。
生成されたアセンブリは次のとおりです。
この部分(ループの始まり)を理解しています:
しかし、アドレスを見ると、後続のジャンプ命令が次の命令をスキップするように見える方法がわかりませんlea
(これは、ジャンプが行われることを前提としています)-上記のリストから、ジャンプ間の命令を省略したことに注意してください:
各ジャンプが行われる場合、次の値をロードせずに、交互test r8d,r8d
に命令するだけのようです。test edx,edx
ここで何を間違って解釈していますか?
assembly - y86 ループの展開
y86 コードでループを展開しようとしていますが、テスト プログラムを実行しようとすると、2 つの異なる値が返されます。reg。コードは次のとおりです。
そして、私が作成した展開版は次のとおりです。
取得する必要がある結果は 2 ですが、アンロールされた結果から返される結果は 3 を返します。余分な処理iaddq
が実行されていることはわかっていますが、どこにあるのかわかりません。代わりに 2 つの値をチェックするように、ループを 2 回展開しました。