Почему double в C выравнивается по 8 байт?

Я читал статью о выравнивании типов данных в памяти (здесь), и я не могу понять одну точку i.e.

Обратите внимание, что двойная переменная будет выделена на 8-байтовой границе на 32 бит и требует двух циклов считывания памяти. На 64-битной машине, основанный на количестве банков, двойная переменная будет выделена на 8 байт и требует только одного цикла считывания памяти.

Я сомневаюсь: почему двойные переменные необходимо распределять по 8-байтовой границе, а не по 4 байтам? Если он выделен на границе 4 байта, нам нужно всего 2 цикла чтения памяти (на 32-битной машине). Исправьте меня, если я ошибаюсь.

Кроме того, если у кого-то есть хороший учебник по выравниванию элементов/памяти, добро пожаловать.

Ответы

Ответ 1

Причина выравнивания значения данных размером 2 ^ N на границе 2 ^ N заключается в том, чтобы избежать возможности разделения значения по границе строки кэша.

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

Свободное следствие этой схемы выравнивания состоит в том, что такие значения также не пересекают границы страниц. Это позволяет избежать ошибки страницы в середине выборки данных.

Итак, вы должны выровнять удвоения по 8-байтным границам по соображениям производительности. И компиляторы знают это и просто делают это за вас.

Ответ 2

Выравнивание значения на нижней границе, чем его размер, заставляет его подвергать раздроблению по двум линиям кэширования. Разделение значения в двух cachlines означает дополнительную работу при выводе кешлин в хранилище резервных копий (две линии кэша будут выселены, а не одна), что является бесполезной нагрузкой на шины памяти.

Ответ 3

8-байтовое выравнивание для двойной по 32-битной архитектуре не уменьшает чтение памяти, но по-прежнему повышает производительность системы с точки зрения уменьшения доступа к кешу. Пожалуйста, прочитайте следующее: fooobar.com/questions/347505/...

Ответ 4

Обратитесь к этой статье wiki о формате двойной точности с плавающей запятой

Количество циклов памяти зависит от вашей аппаратной архитектуры, которая определяет, сколько у вас банков RAM. Если у вас есть 32-битная архитектура и 4 банка RAM, вам нужно всего 2 цикла памяти для чтения. (Каждый банк RAM, вносящий 1 байт)