4

簡単な質問の人...これらのコードスピネットは同じ配置になっていますか?

struct sse_t {
     float sse_data[4];
};

// the array "cacheline" will be aligned to 64-byte boundary
struct sse_t alignas(64) cacheline[1000000];

または

// every object of type sse_t will be aligned to 64-byte boundary
struct sse_t {
     float sse_data[4];
} __attribute((aligned(64)));

struct sse_t cacheline[1000000];
4

2 に答える 2

6

これらのコードスピネットは同じ配置になっていますか?

完全ではありません。2つの例は実際には非常に異なります。

最初の例では、sse_tオブジェクトの配列を取得します。オブジェクトは、4バイトのsse_tアラインメントのみが保証されます。ただし、配列全体が64バイトにsse_t整列されるため、各オブジェクトはSSEアクセス用に適切に整列されます。

2番目の例では、各sse_tオブジェクトを64バイトに強制的に整列させています。ただし、各sse_tオブジェクトはわずか16バイトです。したがって、配列は4倍大きくなります。sse_t(各オブジェクトの最後に48バイトのパディングがあります)。


struct objA {
     float sse_data[4];
};
struct objB {
     float sse_data[4];
} __attribute((aligned(64)));

int main(){
    cout << sizeof(objA) << endl;
    cout << sizeof(objB) << endl;
}

出力:

16
64

2番目のケースはあなたが望むものではないと私はかなり確信しています。

于 2012-08-19T05:12:26.027 に答える
1

しかし、なぜ64バイトにアラインしたいのですか? http://ideone.com/JNEIBR

#include <iostream>
using namespace std;

struct sse_t1 {
     float sse_data[4];
};

// the array "cacheline" will be aligned to 64-byte boundary
struct sse_t1 alignas(64) cacheline1[1000000];

// every object of type sse_t will be aligned to 64-byte boundary
struct sse_t2 {
     float sse_data[4];
} __attribute((aligned(64)));

struct sse_t2 cacheline2[1000000];

int main() {
    cout << "sizeof(sse_t1) = " << sizeof(sse_t1) << endl;
    cout << "sizeof(sse_t2) = " << sizeof(sse_t2) << endl;  

    cout << "array cacheline1 " << (((size_t)(cacheline1) % 64 == 0)?"aligned to 64":"not aligned to 64") << endl;
    cout << "array cacheline2 " << (((size_t)(cacheline2) % 64 == 0)?"aligned to 64":"not aligned to 64") << endl;    

    cout << "cacheline1[0] - cacheline1[1] = " << (size_t)&(cacheline1[1]) - (size_t)&(cacheline1[0]) << endl;
    cout << "cacheline2[0] - cacheline2[1] = " << (size_t)&(cacheline2[1]) - (size_t)&(cacheline2[0]) << endl;  

    return 0;
}

出力:

sizeof(sse_t1) = 16
sizeof(sse_t2) = 64
array cacheline1 aligned to 64
array cacheline2 aligned to 64
cacheline1[0] - cacheline1[1] = 16
cacheline2[0] - cacheline2[1] = 64
于 2013-11-16T16:26:44.967 に答える