1

次のWebページで構造へのパディングについて読みました。

http://software.intel.com/sites/default/files/m/2/c/d/3/9/25602-17689_w_spinlock.pdf

それが説明するように:それは同期構造にパディングを行うために次のステートメントを提案します:

struct syn_str { int s_variable; };
void *p = malloc ( sizeof (struct syn_str) + 127 );
syn_str * align_p = (syn_str *)( (((int) p) + 127) & -128 );

私の頭に浮かぶのは、次のようにはるかに簡単に実行できるということです。

 struct syn_str { int s_variable; char padx[124] ; }  in 32-bit OS

また

 struct syn_str { int s_variable; char padx[120] ; }  in 64-bit OS

128バイトでいっぱいの構造体を埋めるだけなので、これでうまくいかないことがありますか?

アップデート:

親切な情報ありがとうございます!! 質問を投稿した後、私は「align structure」をグーグルで検索しましたが、「posix_memalign」は使用するのに非常に適切な関数呼び出しのようです...

4

2 に答える 2

4

これには2つの理由があります。

  1. 構造がキャッシュ境界を越えて2つのキャッシュラインを占有しないようにするには、アクセスごとに2つのフェッチと2つの無効化が必要です。
  2. キャッシュラインごとに構造が1つしかないことを確認し、誤った共有を防ぐため。

キャッシュラインの先頭に揃えると、両方が提供されます。キャッシュラインと同じサイズに構造体をパディングしても、どちらも提供されません。

想像してみてください。4バイトのintと8バイトのOSヒープアラインメントと128バイトのキャッシュライン(非常に一般的)を備えたシステムでの次の構造を想像してみてください。

struct bare
{
    int x, y, z, u, v, w;
};

次のように、単にパディングを追加します。

struct padded
{
    int x, y, z, u, v, w;
    char pad[128 - 6 * sizeof (int)]; // 104
};

オブジェクトがアドレス112に割り当てられるのを妨げません。アドレス112は、x, y, z, u1つのページとv, w2番目のページに分類されます。したがって、最初の目標に違反します。x, yまた、前のオブジェクトと同じキャッシュラインで、アドレス248に別のオブジェクトを割り当てることができますv, w。したがって、2番目の目標に違反しています。

でも、

char* block = malloc(sizeof (bare) + 127);
bare* p = reinterpret_cast<bare*>(reinterpret_cast<intptr_t>(block + 127) & ~127);

各オブジェクトはキャッシュラインの先頭から開始されるため、両方の保証を問題なく実行できます。

于 2012-12-26T05:23:31.477 に答える
0

いいえ、整数変数のsizeof演算子は、64ビットシステムでも4を返します。Bytesizeは実装によって定義されます。

于 2012-12-26T05:00:24.210 に答える