私は、G ++でレジスタ割り当てを制御することはできますか?
-
22-08-2019 - |
質問
私は非常にCの部分を最適化++、20%程度の性能を打つことができる遠くのホットスポットからの場所でも、小さな変更を加えるしています。より深い調査の後、それは(おそらく)ホットスポットで使用される、わずかに異なるレジスタであることが判明しました。 私はalways_inline属性でinlineing制御することができますが、私は、レジスタ割り当てを制御することができますか?
解決
あなたが本当にレジスタalloationを台無しにしたい場合は、あなたが特定のレジスタ内のローカルおよびグローバル変数を割り当てるためにGCCを強制することができます。
あなたはこのような特別な変数宣言でこれを行います。
register int test_integer asm ("EBX");
ちょうどターゲットの特定のレジスタ名とEBXを置き換え、同様に他のアーキテクチャで動作します。
これに関する詳細情報については、私はあなたがgccのドキュメントを見てみましょうお勧めします:
のhttp://gcc.gnu .ORG / onlinedocs / GCC-4.3.3 / gccを/ローカル-REG-Vars.htmlする
あなたはそれのためののの非常に良い理由がある場合を除き、私の提案は、しかし、レジスタ割り付けと混乱しないことです。あなたには、いくつかのレジスタを割り当てた場合、自分はアロケータがで動作するように以下のレジスタを持っており、あなたがで開始コードよりも悪いコードで終わることがあります。
あなたの関数を使用すると、インラインアセンブラでその事を書くことは良い考えかもしれコンパイルします。
の間で20%の性能の違いを得ることを、パフォーマンスが重要な場合 <時間>EDIT:stragerが指摘したように、コンパイラは変数のレジスタを使用するように強制されていません。唯一の変数がまったく使用されている場合はレジスタを使用することを余儀なくされます。例えば。それは、最適化を乗り切るない変数が合格した場合、それは使用されません。また、レジスタは、他の変数に使用することができます。
他のヒント
は、一般的にはregisterキーワードは、単純にすべての近代的なコンパイラによって無視されます。あなたはregisterキーワードを付けた変数のアドレスを取得しようとすると、唯一の例外は、エラーの(比較的)最近追加されます。
私も痛みのこの種を経験し、そして、それは試してみて、deependをオフに行くためにはgccを引き起こしているかを決定するために、出力アセンブリを見ていたの周りに最終的に唯一の現実的な方法を見つけました。そこを行うことができます他のものがありますが、それはあなたのコードがやろうとしている正確に何に依存します。私はマイナー(一見無害な)変更が壊滅的なパフォーマンスヒットを引き起こす可能性があるで計算後藤騒乱大量の非常に非常に大規模な機能で働いていました。あなたが問題を試してみて、軽減するために行うことができますいくつかのものがある同様のやっているが、詳細はやや不快されている場合ので、私はそれが実際には関連性のない限り、ここではそれらを議論見送るよ。
これは、使用しているプロセッサによって異なります。または私はそうあなたがregisterキーワードでできる、と言うべきですが、これはあなたがいないパイプライニングとシングルコアを持つ単純なプロセッサを使用していない限り、ひんしゅくを買うされます。あなたはレジスタ割り付けを持つことができるよりも、これらの日は、GCCはずっといい仕事をすることができます。それを信じています。