VIDTAKER.COM

Q&A

パフォーマンスやコードサイズのためのCコーディング - を超えて、コンパイラがないもの


私は、プログラマがC言語で行うことができます参照してくださいには、その性能と判断することができますを探しています/または生成されたオブジェクトファイルのサイズ。

1については例えば、。取得宣言シンプル/ 2)の機能を設定フットプリント大きいとして(での性能をインライン可能性があります増加コストの。は、変数のループの値を使用してループしない自体などの値をゼロにカウントダウン特定の最大の代わりにカウントする

これは、コンパイラ、現在"単純な"トリックレベル(上記の2点)はまったく必要ありませんように進んでいるように見えます。コンパイル時に適切なオプションはとにかく仕事をする。ええ、私もここのコンパイラは、再帰を処理する方法についての記事を見た - それは非常に面白かった!だから私たちは、Cレベルでのして行うには残っている? :)

私の特定の環境は:GCCは再ARMアーキテクチャ(v4)のためのtargetted 4.3.3。しかし、他のコンパイラ/プロセッサ上での応答も歓迎している時に食べたされます。

PSは:鉱山のアプローチは、このアプローチを"行くに対して通常の"コードを最初に!し、ベンチマーク、最適化し、最後に

編集 :だけ発生するようにはとても、私は質問を後に投稿記事を同様のが見つかりました: http://stackoverflow.com/questions/763656/should-we-still-be-optimizing-in-the-smallを



6 Replies

1)

私は、コンパイラは、おそらく最適化されません考えることができる1つの事が"cache -友情"です:あなたは、行の主要な順序で2次元配列を、と言う繰り返している場合は、内側のループは、列のインデックスを介して実行を確認キャッシュのスラッシングを回避する。内側のループが間違ってインデックス上で実行持つ可能性があります巨大なパフォーマンスがヒット。

あなたがC言語でプログラミングしている場合、これはすべてのプログラミング言語に適用されますが、パフォーマンスは、おそらくあなたに重要なので、特に関連することだ。


2)

"常に"時間とアルゴリズムの空間の複雑さを知っている。コンパイラは、同様にすることができますようにその仕事を行うことができることはありません。 :)


3)

事前計算が可能... (ただし、同社は、常にできない残念...私はチェスエンジンの広範な前処理を行った。)ストアがメモリ内のこれらの結果は、維持念頭に置いてキャッシュ..送料メモリ内の事前計算の大きいサイズは、データキャッシュを行う可能性がヒット。最新のハードウェアのほとんどがマルチコア、それをターゲットにアプリケーションを設計することができますので。

いくつかの大きな配列を使用している場合は必ず、それらのグループはお互いに近い彼らが使用される場所に行うと、キャッシュヒットを高める


4)

あなたはまだ多くのアルゴリズムのSIMD実装を自分でしたいと思うので、コンパイラ、これらの日はまだ非常に良いあなたのコードをベクトルではない。

右選択すると、正確な問題のために劇的に(私はkd木からできるだけBVHには、それを行うだろうmoving例を見てきたパフォーマンスを向上できますdatastructures that、特定の場合)。

コンパイラは、可能性がありますパッドはいくつかの/変数をキャッシュが、データの局所性などの他のキャッシュの最適化はまだあなたにさに収まるように構造体。

コンパイラは、まだコードを自動的にマルチスレッドにしないとOpenMPを使用して、私の経験で、本当に多くの問題が解決しない。 (あなたは本当にとにかく劇的)の性能を向上させるOpenMPを理解しなければならない。そこで現在、あなた自身のことマルチスレッドにしている。


5)

どのようなマーティンはキャッシュへの優しさ、上記の意見に追加するには:

  • 並べ替えの構造などは、一般的に一緒に同じキャッシュラインに(例えばちょうど1つのキャッシュラインではなく、2つのロードすることによって助けることができるているアクセスされるフィールド。)あなたは本質的にこれを行うことにより、データキャッシュ内の有用なデータの密度を増加している。そこ]をやっていることができますツールは、Linuxのこの:ドワーフ[1。 http://www.linuxinsight.com/files/ols2007/melo-reprint.pdfは

  • あなたのコード密度の上昇、同様の戦略を使用できます。 gccのでは、ホット、コールドの枝を可能/そうタグを使用してマークすることができます。これはgccを別々にどのicache密度を高めるのに役立ちます寒枝を維持することができます。

そして、何か全く別の今:

  • CPU間の)書いてフィールドかもしれないアクセスを読む(反対の戦略は理にかなって。問題は、コヒーレンスのみを目的として、1つのCPUは、現実と同じキャッシュラインで同じアドレス(への書き込みを許可することができます。)これは、キャッシュラインのピンポンと呼ばれる可能性があります。これはかなり悪いです悪いことができる、キャッシュラインは、他の無関係なデータが含まれる場合。ここでは、パディング、これはキャッシュラインの長さにデータを主張する意味があります。

注:これらは明らかにマイクロ化、唯一の後の段階、あなたのコードからパフォーマンスの最後のビットを絞るとしているで行わされる。


6)

多くの人々はこれを認識されていません:コンパイラによって異なります定義インラインラベル()はインライン、その意図に - 多くのコンパイラは本来の意味から完全に別のコンテキストでキーワードを配置するということです。また、方法はインラインサイズの制限を増やすことで、コンパイラは、行の些細な事が飛び出る開始する前に。人間は)コンパイラは、しばしば保守的な、または十分なプログラムのためのないアカウントですはるかに高速のコードを(生成することができますインライン監督が、それは(簡単に)逆効果になることができるので、正しくそれを使用することを学ぶ必要があります。はい、これは絶対にだけでなく、高速のサイズをコードに適用されます。