17

Pentium などの Intel の 32 ビット プロセッサには 64 ビット幅のデータ バスがあるため、1 回のアクセスで 8 バイトがフェッチされます。これに基づいて、これらのプロセッサがアドレス バスで発行する物理アドレスは常に 8 の倍数であると想定しています。

まず、この結論は正しいですか?

次に、それが正しければ、データ構造メンバーを 8 バイト境界に揃える必要があります。しかし、これらのプロセッサでは、代わりに 4 バイト アラインメントを使用している人を見てきました。

そうすることをどのように正当化できますか?

4

5 に答える 5

18

通常の経験則 (Intel および AMD の最適化マニュアルから直接) は、すべてのデータ型を独自のサイズで揃える必要があるということです。int32は 32 ビット境界、int64は 64 ビット境界などに配置する必要があります。char はどこにでもうまく収まります。

もう 1 つの経験則は、もちろん「コンパイラーはアラインメント要件について通知されている」ことです。コンパイラは、データへの効率的なアクセスを可能にするために適切なパディングとオフセットを追加することを認識しているため、心配する必要はありません。

唯一の例外は、SIMD 命令を使用する場合です。この場合、ほとんどのコンパイラでアライメントを手動で確認する必要があります。

次に、それが正しければ、データ構造メンバーを 8 バイト境界に揃える必要があります。しかし、これらのプロセッサでは、代わりに 4 バイト アラインメントを使用している人を見てきました。

それがどのように違いを生むのかわかりません。CPU は、これらの 4 バイトを含む 64 ビット ブロックの読み取りを発行するだけです。つまり、要求されたデータの前または後に 4 バイト余分に取得されます。ただし、どちらの場合も、読み取りは 1 回だけです。32 ビット幅のデータの 32 ビット アライメントにより、64 ビットの境界を越えないことが保証されます。

于 2009-06-28T11:51:36.533 に答える
8

物理バスは 64 ビット幅 ...8 の倍数 --> はい

ただし、考慮すべき要素がさらに 2 つあります。

  1. 一部の x86 命令セットはバイト アドレスです。一部は 32 ビットにアラインされています (そのため、4 バイトのものがあります)。しかし、(コア)命令は64ビットで整列されていません。CPU は、ミスアライン データ アクセスを処理できます。
  2. パフォーマンスを重視する場合は、メイン メモリではなく、キャッシュ ラインについて検討する必要があります。キャッシュ ラインははるかに広くなります。
于 2009-06-28T10:23:05.933 に答える
1

ランダム アクセスの場合、データがずれていない限り (たとえば、境界を越えるなど)、それはあまり重要ではないと思います。データ内の正しいアドレスとオフセットは、ハードウェアで単純な AND 構造を使用して見つけることができます。1 つの値を取得するのに 1 回の読み取りアクセスでは不十分な場合、速度が低下します。これは、特定のオフセットにある必要がないため、コンパイラが通常小さな値 (バイトなど) をまとめる理由でもあります。short は偶数アドレス、4 バイト アドレスでは 32 ビット、8 バイト アドレスでは 64 ビットである必要があります。

キャッシングが含まれていて線形のデータ アクセスがある場合は、状況が異なることに注意してください。

于 2009-06-28T10:25:06.973 に答える