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

这些代码尖晶石是否具有相同的对齐方式?

不完全的。你的两个例子实际上是非常不同的。

在您的第一个示例中,您将获得一个对象数组sse_t。一个sse_t对象只保证 4 字节对齐。但由于整个数组对齐到 64 字节,每个sse_t对象都将正确对齐以进行 SSE 访问。

在您的第二个示例中,您强制每个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

我很确定第二种情况不是你想要的。

于 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 回答