Size: a a a

Compiler Development

2020 February 10

E

EgorBo in Compiler Development
оно то понятное дело где-то там наступало на кэшлайн границу и пенальтилось, но в целом на результаты не сказалось.
+ оверхед от ручного выравнивания
источник

IN

Ilya Neganov in Compiler Development
Ну и на жирных микроархитектурах типа десктопных интелов этот пенальти может быть смазан дофига умным префетчером и длиииинным окном для спекуляции, да. Но на домашнем роутере, например, это уже не прокатит :)
источник

AS

Aleksey Shipilev in Compiler Development
Nikolay
Зачем в java используется выравние объектов , что бы размер их стал кратен 8 байтам ?
Потому что иначе сложно гарантировать выровненный доступ к содержимому объектов. Для байтов -- не страшно, а вот если есть поле типа volatile long или хедер объекта, то для атомарного доступа к нему, его мало положить на офсет, кратный 8 внутри объекта, надо ещё и сам объект на 8 выровнять.
источник

K

Konstantin in Compiler Development
Aleksey Shipilev
Потому что иначе сложно гарантировать выровненный доступ к содержимому объектов. Для байтов -- не страшно, а вот если есть поле типа volatile long или хедер объекта, то для атомарного доступа к нему, его мало положить на офсет, кратный 8 внутри объекта, надо ещё и сам объект на 8 выровнять.
А зачем сам объект?
источник

K

Konstantin in Compiler Development
А, я понял, оффсет-то у поля от начала объекта
источник

N

Nikolay in Compiler Development
Вот ту не пойму. Процессор же в память ходит не по 8 байтов , а целую кэш линию загружает , которая вроде 256 байтов ?
источник

E

EgorBo in Compiler Development
Nikolay
Вот ту не пойму. Процессор же в память ходит не по 8 байтов , а целую кэш линию загружает , которая вроде 256 байтов ?
64
источник

E

EgorBo in Compiler Development
на армах 128
источник

AS

Aleksey Shipilev in Compiler Development
Nikolay
Вот ту не пойму. Процессор же в память ходит не по 8 байтов , а целую кэш линию загружает , которая вроде 256 байтов ?
Ну дак невыровненное поле может лежать двумя ногами на разных кешлайнах, и привет атомарности.
источник

E

EgorBo in Compiler Development
кстати, 64байтный кэш я так понимаю делает бессмысленным авх-1024 -_-
источник

AS

Aleksey Shipilev in Compiler Development
EgorBo
кстати, 64байтный кэш я так понимаю делает бессмысленным авх-1024 -_-
Ослабят требования к консистенстности памяти на широкие доступы :) Портов-то побольше запихать, чтобы можно было ещё больше кеш-линий в полёте держать, и всё, готово. Программируйте! 😁
источник

N

Nikolay in Compiler Development
Понял. Значит ходим в память по 64 байта. А почему объекты выравние не по 64 байта ?
источник

AS

Aleksey Shipilev in Compiler Development
Nikolay
Понял. Значит ходим в память по 64 байта. А почему объекты выравние не по 64 байта ?
Зачем, если хватает выравнивать на 8? Выровняете на 64, будете в 8х больше памяти жрать.
источник

N

Nikolay in Compiler Development
Aleksey Shipilev
Зачем, если хватает выравнивать на 8? Выровняете на 64, будете в 8х больше памяти жрать.
А может ли такое получится ,что long , например попадет на 2 линии ? Например идёт сначала заголовок объекта в 4+4 байта ,а потом 55 байтовых полей , а за ними long?
источник

AT

Alexander Tchitchigin in Compiler Development
Aleksey Shipilev
Зачем, если хватает выравнивать на 8? Выровняете на 64, будете в 8х больше памяти жрать.
Это же виртуальной памяти "жрать", а не физической? 😊
источник

E

EgorBo in Compiler Development
Nikolay
А может ли такое получится ,что long , например попадет на 2 линии ? Например идёт сначала заголовок объекта в 4+4 байта ,а потом 55 байтовых полей , а за ними long?
естественно, но структуры обычно паддингами равняют
источник

E

EgorBo in Compiler Development
а потом эти паддинги выстреливают тебе в ногу если ты сравниваешь их через memcmp -_-
источник

N

Nikolay in Compiler Development
Aleksey Shipilev
Ну дак невыровненное поле может лежать двумя ногами на разных кешлайнах, и привет атомарности.
Ах. Наверное я понял. Выравниваем мы по размеру long и это не зависит от ширина кэш линии
источник

AS

Aleksey Shipilev in Compiler Development
Nikolay
А может ли такое получится ,что long , например попадет на 2 линии ? Например идёт сначала заголовок объекта в 4+4 байта ,а потом 55 байтовых полей , а за ними long?
long выравняется внутри объекта на 8. Сам объект выравняется тоже на 8. Итого, long будет выравнен на 8.
источник

AS

Aleksey Shipilev in Compiler Development
Alexander Tchitchigin
Это же виртуальной памяти "жрать", а не физической? 😊
Ну... С выравниванием на 64 аллоцировали объект в 8 байт по адресу X. Следующий можно аллоцировать по адресу X+64. Продолбали 56 байт. Это какой памяти продолбали -- виртуальной или физической? Ответ: и той, и другой, потому что страницы куда жирнее ;)
источник