8

少し前に、コンパイラが通常の関数とは異なる方法で処理するため、SSE組み込み関数が効率的なマシンコードにコンパイルされることをどこかで読みました。私は実際にコンパイラーがそれをどのように行うのか、そしてCプログラマーがプロセスを容易にするために何ができるのかをさまよっています。効率的なマシンコードを生成するコンパイラの仕事を容易にする方法で組み込み関数を使用する方法に関するガイドラインはありますか?

ありがとう。

4

2 に答える 2

7

Necrolisが書いたこととは反対に、組み込み関数は、それらが表す命令にコンパイルされる場合とされない場合があります。_mm_load_pdこれは、組み込み関数を使用する場合でもコンパイラがレジスタの割り当てと割り当てを担当するため、などのコピーまたはロード命令に特に当てはまります。これは、2つの場所を同じレジスタで表すことができる場合、ある場所から別の場所に値をコピーする必要がまったくない可能性があることを意味します。その場合、コンパイラはコピーを削除することを選択できます。結果が使用されない場合は、他の命令を削除することもできます。

さまざまなコンパイラの動作が実際に比較されているこのブログ投稿を確認してください。2009年以降であるため、詳細が適用されなくなる可能性があります。ただし、新しいコンパイラは、コードをより多く最適化する可能性があります。

組み込み関数を実際に効率的に使用することに関しては、答えは他のすべてのパフォーマンス最適化と同じです:測定、測定、測定。あなたが実際にホットなコードを扱っていることを確認し、それが遅い理由を見つけて、それを改善してください。組み込み関数を使用するよりも、メモリアクセスパターンを改善することが重要であることに気付く可能性が非常に高くなります。

于 2013-05-09T14:44:38.203 に答える
6

組み込み関数は、これが効率的であるかどうかは、それらがどのように使用されるかに依存するかどうかを表す命令にコンパイルされます。

また、各コンパイラは組み込み関数を少し異なる方法で処理しますが(別名、実装固有)、GCCはオープンソースであるため、SSEのものをどのように処理するかを確認できます。OpenWatcom*、LCC、PCC、およびTCC*はすべてオープンソースのCコンパイラです。 thweyにはSSE組み込み関数はありませんが、それでも組み込み関数が必要であり、それらがどのように処理されるかを確認できます。

あなたが読んだものは、コードの自動ベクトル化に関連していると思います。GCC(これを参照)とICCは非常に優れていますが、少なくともまだ、手作業で最適化されたコードほど優れていません。

* SSEのサポートで更新されている可能性がありますが、最近チェックされていません...

于 2011-04-15T15:59:36.820 に答える