2

1024000+1 バイト離れた 2 つの配列間でデータをコピーしているとします。オフセットはワード サイズの倍数ではないため、ロードまたはストアのいずれかの位置合わせされていないアクセスを実行する必要があります (現時点では、論理和演算とビット シフトによって位置合わせされていないアクセスを完全に回避できることを忘れておきましょう)。ミスアライメントされたロードまたはミスアライメントされたストアのどちらがより高価になりますか?

これは架空の状況であるため、ベンチマークを行うことはできません :-) パフォーマンスの違いにつながる要因があるとすれば、どのような要因が影響するかについてもっと興味があります。さらなる読書へのポインタは素晴らしいでしょう。

ありがとう!

4

3 に答える 3

2

実際には、使用している CPU に大きく依存します。新しい Intel CPU では、アラインされていない単語をロードおよび保存してもペナルティはありません (少なくとも、気付くことはありません)。16 バイトまたは 32 バイトのアラインされていないチャンクをロードして保存する場合にのみ、わずかなパフォーマンスの低下が見られる場合があります。

于 2013-06-11T07:08:55.680 に答える
2

ミスアライメント書き込みでは、2 つのデスティネーション ワードを読み取り、新しいデータをマージして、2 つのワードを書き込む必要があります。これは、アライメントされた読み取りと組み合わされます。つまり、3R+2W。

ミスアライメント読み取りでは、2 つのソース ワードを読み取り、データをマージする必要があります (シフトおよびビター)。これは、アライメントされた書き込みと組み合わされます。つまり、2R + 1W です。

したがって、位置合わせされていない読み取りは明らかに勝者です。

もちろん、あなたが言うように、これを行うには、配列の最後を除いて位置合わせの誤りを避けるより効率的な方法があります。

于 2013-06-10T22:20:07.040 に答える