18

メモリ内のデータ型の配置に関する記事を読んでいましたが(ここ)、1つのポイントを理解できません。

ダブル変数は32ビットマシンの8バイト境界に割り当てられ、2つのメモリ読み取りサイクルが必要であることに注意してください。64ビットマシンでは、バンク数に基づいて、double変数が8バイト境界に割り当てられ、必要なメモリ読み取りサイクルは1つだけです。

私の疑問は、なぜダブル変数を4バイトではなく8バイト境界に割り当てる必要があるのか​​ということです。それが4バイト境界に割り当てられている場合でも、必要なメモリ読み取りサイクルは2回だけです(32ビットマシンの場合)。私が間違っている場合は私を訂正してください。

また、誰かがメンバー/メモリの配置に関する優れたチュートリアルを持っている場合は、親切に共有してください。

4

4 に答える 4

19

サイズ 2^N のデータ値を 2^N の境界に揃える理由は、値がキャッシュ ラインの境界を越えて分割される可能性を回避するためです。

x86-32 プロセッサは、最大 2 回の 32 ビット メモリ読み取りで、任意のワード境界 (8 バイト アラインされているかどうかに関係なく) から double をフェッチできます。ただし、値がキャッシュ ラインの境界を越えて分割されている場合は、メモリから 2 番目のキャッシュ ラインをフェッチする必要があるため、2 番目のワードをフェッチする時間が非常に長くなる可能性があります。これにより、プロセッサのパフォーマンスが不必要に低下します。(実際問題として、現在のプロセッサはメモリから一度に 32 ビットをフェッチしません。非常に広いデータ帯域幅を有効にするために、はるかに広いバスでより大きな値をフェッチする傾向があります。両方のワードをフェッチする実際の時間は、同じキャッシュラインにあり、すでにキャッシュされている場合は、わずか 1 クロックである可能性があります)。

この配置スキームの自由な結果は、そのような値もページ境界を越えないことです。これにより、データ フェッチ中にページ フォールトが発生する可能性が回避されます。

したがって、パフォーマンス上の理由から、double は 8 バイト境界に揃える必要があります。そして、コンパイラはこれを知っており、あなたのためにそれを行います.

于 2012-06-06T13:35:14.080 に答える
3

値をそのサイズよりも低い境界に揃えると、2 つのキャッシュラインにまたがって分割されやすくなります。値を 2 つのキャッシュラインに分割すると、キャッシュラインをバッキング ストアに削除する際に余分な作業が発生し (1 つではなく 2 つのキャッシュラインが削除されます)、メモリ バスに無駄な負荷がかかります。

于 2012-06-06T13:51:40.920 に答える
1

8 byte alignment for double on 32 bit architecture doesn't reduce memory reads but it still improve performance of the system in terms of reduced cache access. Please read the following : https://stackoverflow.com/a/21220331/5038027

于 2015-10-28T22:42:25.873 に答える
-2

倍精度浮動小数点形式については、この wiki 記事を参照してください。

メモリ サイクルの数は、RAM バンクの数を決定するハードウェア アーキテクチャによって異なります。32 ビット アーキテクチャと 4 つの RAM バンクを使用している場合、読み取りに必要なメモリ サイクルは 2 つだけです (各 RAM バンクは 1 バイトを提供します)。

于 2012-06-06T11:47:05.910 に答える