что должно быть х в __attribute__ ((выровненный (х))) - PullRequest
3 голосов
/ 04 августа 2011

Я понял, что переменное выравнивание необходимо для эффективности.Чего я не понимаю, так это как правильно определить размер выравнивания.Насколько я понимаю, выровненное значение всегда должно быть установлено на размер слова процессора (то есть 4 байта на 32-битной машине и 8 байтов на 64-битной машине) независимо от типа данных, так что показания процессора выравниваются по адресупеременная.

Например, зачем кому-то делать что-то вроде this .Я понял, что это просто проблема в какой-то книге по программированию.Имеет ли смысл использовать разные значения выравнивания, такие как в ссылке?

1 Ответ

3 голосов
/ 04 августа 2011

Основное правило: типы данных должны быть выровнены.Выравнивание должно быть таким же, как байты, необходимые для хранения типа (округленные до степени 2), например:

type   size   align (bytes)
char     1       1
short    2       2
int      4       4
float    4       4
int64_t  8       8
double   8       8
long double (x87, 80 bit)  10  16
_float128  16    16
int128_t   16    16

Некоторые архитектуры, например SPARC, запрещают доступ к данным, если он не выровнен на 4байты, поэтому один символ будет иметь 4-байтовое выравнивание, и даже на архитектурах, которые допускают такое поведение, он может быстрее получить доступ к данным, сохраненным с таким выравниванием;таким образом, локальные переменные в полях стека и структуры часто имеют заполнение для достижения этого, если у вас есть смесь типов разных размеров, хотя это поведение можно изменить, если это необходимо.

Кэш быстрее с выравниваниембольше, чем просто размер слова (не 32 и 64 бит, но с размером строки кэша, например, 16 байтов, или 32 байта, или 64 байта).

Некоторые более широкие инструкции, такие как SSE2 (шириной 128 бит) или двойной плавающей точкой64-битная ширина) быстрее (или иногда не будет работать) для выравнивания собственной ширины (если вам нужно загрузить 128-битные данные, вы должны выровнять их по 128 битам).

DMA и подкачка памяти требуют еще большего выравнивания,но это обычно получается манипулированием указателем.

OpenCL (GPGPU) иногда требует огромного выравнивания из-за очень широких шин DDR и ограничений доступа к памяти ядра GPU: http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/attributes-variables.html

/* a has alignment of 128 */
 __attribute__((aligned(128))) struct A {int i;} a;
...