12

https://web.archive.org/web/20170227190422/http://hilbert-space.de/?p=22

かなり古いこのサイトでは、手書きの asm が組み込み関数よりもはるかに大きな改善をもたらすことを示しています。2012年の今でもこれが真実なのか疑問です。

では、gnu クロス コンパイラを使用した組み込み関数のコンパイルの最適化は改善されましたか?

4

4 に答える 4

14

私の経験では、組み込み関数はそれほど苦労する価値はありませんでした。コンパイラが組み込み関数間に追加のレジスタ アンロード/ロード ステップを挿入するのは簡単すぎます。それをやめる努力は、単に生の NEON で何かを書くよりも複雑です。私はかなり最近のコンパイラ (clang 3.1 を含む) でこの種のものを見てきました。

このレベルでは、何が起こっているのかを正確に制御する必要があることがわかりました. かろうじて間違った順序で物事を行うと、あらゆる種類の屋台ができます。組み込みでそれを行うことは、溶接機の手袋をはめた手術のように感じます。コードのパフォーマンスが非常に重要であり、組み込み関数が必要な場合、組み込み関数は十分ではありません。たぶん、他の人はここで異なる経験をしています。

于 2012-03-22T19:36:38.733 に答える
9

移植性のために、いくつかのプロジェクトで NEON 組み込み関数を使用する必要がありました。真実は、GCC が NEON 組み込み関数から適切なコードを生成しないということです。これは組み込み関数を使用することの弱点ではなく、GCC ツールの弱点です。Microsoft の ARM コンパイラは、NEON 組み込み関数から優れたコードを生成します。その場合、アセンブリ言語を使用する必要はありません。携帯性と実用性によって、どちらを使用するかが決まります。アセンブリ言語を書くことができるなら、asm を書いてください。私の個人的なプロジェクトでは、タイム クリティカルなコードを ASM で書くことを好みます。これにより、バグのある/劣ったコンパイラが私のコードを台無しにすることを心配する必要がなくなります。

更新: Apple LLVM コンパイラは、GCC (最悪) と Microsoft (最良) の中間に位置します。命令のインターリーブや最適なレジスタの使用法ではうまく機能しませんが、少なくとも合理的なコードを生成します (状況によっては GCC とは異なります)。

Update2: ARMv8 用の Apple LLVM コンパイラが大幅に改善されました。現在、C および組み込み関数から ARMv8 コードを生成する優れた仕事をしています。

于 2012-03-28T23:39:33.267 に答える