Можно ли определить структуру, объекты которой всегда будут находиться в отдельных строках кэша


Я знаю, что вы можете выровнять переменные по строке кэша, например, с помощью атрибут ((align(64))) в ССАГПЗ. Однако я заинтересован в выравнивании (или вы можете назвать это заполнением) во время объявления структуры. Так, например, для следующей структуры я хочу попросить компилятор создать необходимое заполнение так, чтобы любой объект этой структуры всегда был выровнен по строке кэша.

typedef struct
{
 int a;
 int b;
 // I want the compiler to create a padding here for cache alignment
} my_type;
2 3

2 ответа:

Да. Я не могу вспомнить, откуда у меня этот код. Я думаю, что это мог быть блог Херба Саттера:

    #define CACHE_LINE_SIZE 64 // Intel Core 2 cache line size.

    template<typename T>
    struct CacheLineStorage {

    public:

       [[ align(CACHE_LINE_SIZE) ]] T data;

    private:

       char pad[ CACHE_LINE_SIZE > sizeof(T)
            ? CACHE_LINE_SIZE - sizeof(T)
            : 1 ];
    };

Это просто. Вы, вероятно, просто пропустили "ed" в aligned.

typedef struct
{
 int a __attribute__((aligned(64)));
 int b;

} my_type;

Результирующая структура будет иметь 56-байтовое заполнение после b, Если вы создадите переменные или массив из него.