2010-12-30 3 views
4

2次元の4x4行列を抽象的に表現しています。私が行列の乗算などのために書いたコードはすべてそのまま "展開"されます - つまり、私は行列を使ってデータエントリにアクセスしたり書き込んだりしません。C:構造体または配列の方が速いのは何ですか?

私の質問がある:Cで、次のような構造体を使用する方が速いだろう:

typedef struct { 
    double e0, e1, e2, e3, e4, ..., e15 
} My4x4Matrix; 

それとも、これは速いのようになります。

私は各行列にアクセスすることを考えると
typedef double My4x4Matrix[16]; 

個別のような要素:

My4x4Matrix a,b,c; 
// (Some initialization of a and b.) 
... 
c.e0=a.e0+b.e0; 
c.e1=a.e1+b.e1; 
... 

それとも

My4x4Matrix a,b,c; 
// (Some initialization of a and b.) 
... 
c[0]=a[0]+b[0]; 
c[1]=a[1]+b[1]; 
... 

まったく同じスピードですか?

答えて

15

まともなコンパイラは、バイトごとに全く同じコードを生成します。ただし、配列を使用すると、より柔軟に対応できます。マトリックス要素にアクセスするときに、固定位置にアクセスするか、変数を使用してアドレス位置にアクセスするかを選択できます。

また、すべての操作を手作業で「巻き戻す」(展開する)ことを強くお伺いします。良いコンパイラであれば、反復回数が一定のループを完全に展開することができ、おそらくSIMDコードを生成したり、命令の順序を最適にスケジュールすることさえできます。手でもっとうまくやっていくのは難しいでしょうし、読みにくいコードで終わるでしょう。あなたがこの質問をしてくれたという事実は、あなたがおそらくナイーブな最適化コンパイラよりもうまくいく経験が十分でないことを示唆しています。

+0

おそらく私の経験については正しいでしょう。それでも、私は自分のために何がうまくいくか見るために巻いて展開してみようと思います。私はその経験を使うことができました。 – Collin

+0

@Collinあなたはhttp://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Optimize-Options.htmlをお読みください。他のコンパイラもありますが、多くの技術は同じです。ループアンローリングは実行時間を遅くする可能性があることに注意してください。 – EnabrenTane

+0

これは(現在のように)おそらくもっと便利ですが、あなたのリンクに感謝します。 http://gcc.gnu.org/onlinedocs/gcc-4.4.5/gcc/Optimize-Options.html – Collin

1

私は両方が同じ速度だと思います。構造体と配列の違いは、人間の言葉による意味だけです。両方ともメモリアドレスとしてコンパイルされます。

1

私は最良の方法は、あなた自身で試してみるためのテストを作成することです。結果は、システム環境およびコンパイラによって異なる場合があります。

+0

これは実際には最高の答えです。 – Davorin

9

構造要素(フィールド)は、プログラムのソースで明示的に指定された名前によってのみアクセスできます。つまり、フィールドにアクセスするたびに、実際のフィールドを選択してコンパイル時にハードコードする必要があります。配列で同じことを実装したいのであれば、(例のように)明示的な定数コンパイル時配列インデックスを使用することになります。この場合、2つのパフォーマンスはまったく同じになり、生成されるコードはまったく同じになります(「悪意のある」コンパイラを除く)。

ただし、配列には自由度があります。必要に応じて、配列要素を実行時インデックスで選択できます。これは構造体では不可能なことです。それがあなたにとって重要かどうかはあなただけが知っています。

一方、Cの配列はコピーできません。つまり、memcpyを使用して、配列ベースのMy4x4Matrixをコピーする必要があります。構造体ベースのバージョンでは、通常の言語レベルのコピーが機能します。配列では、実際の配列を構造体にラップすることでこの問題を回避できます。

+2

配列を構造体の中に置くことができ、次にそれを直接コピーすることができますが、配列のすべての利点もあります。 –

+1

2番目の段落は非常に重要な違いです!いい視点ね! – Nawaz

関連する問題