Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];

Вниз

Запись в память и "выравнивание".   Найти похожие ветки 

 
Riply ©   (2007-10-10 21:17) [0]

Здравствуйте !
Допустим, у нас выделен большой кусок памяти и мы собрались
последовательно туда писать ну очень много маленьких блоков
переменной длинны, примерно такого вида:
type
_OBJECT_BLOCK = packed record
  NextEntryOffset : Word;
  //......
  ObjNameLength   : Word;
  ObjName         : array[0..0] of WideChar;
 end;

До какой границы стоит выравнивать это безобразие (вместе с именем) ?
Разбирая подобные "записи", возвращаемые разными функциями,
я сталкмвалась и с выравниванием до 4 байт и до 8,
но закономерности в выборе границы не увидела.
А может вообще, ну его к черту это выравнивание ? :)


 
Ins ©   (2007-10-10 21:23) [1]

А зачем выравнивать?


 
Riply ©   (2007-10-10 21:31) [2]

> [1] Ins ©   (10.10.07 21:23)
> А зачем выравнивать?
Затем, что очень часто вижу, что так поступают Nt ф-ии,
с возвращаемыми данными. Вот и хочу понять основные цели
этого их шага и (заодно) с какого места потолка они берут границу для выравнивания ?


 
oxffff ©   (2007-10-10 21:31) [3]

А может почитать для начала?

CODE OPTIMIZATION
14.4. ALIGNMENT RULES AND GUIDELINES
The following section gives rules and guidelines for aligning of code and data for optimum code
execution speed.
14.4.1. Alignment Penalties
The following are common penalties for accesses to misaligned data or code:
• On a Pentium® processor, a misaligned access costs 3 clocks.
• On a P6 family processor, a misaligned access that crosses a cache line boundary costs 6 to
9 clocks.
• On a P6 family processor, unaligned accesses that cause a data cache split stall the
processor. A data cache split is a memory access that crosses a 32-byte cache line
boundary.
For best performance, make sure that data structures and arrays greater than 32 bytes, are 32-
byte aligned, and that access patterns to data structures and arrays do not break the alignment
rules.
14.4.2. Code Alignment
The P6 family and Pentium® processors have a cache line size of 32 bytes. Since the prefetch
buffers fetch on 16-byte boundaries, code alignment has a direct impact on prefetch buffer efficiency.
For optimal performance across the Intel Architecture family, it is recommended that:
• A loop entry label should be 16-byte aligned when it is less than 8 bytes away from that
boundary.
• A label that follows a conditional branch should not be aligned.
• A label that follows an unconditional branch or function call should be 16-byte aligned
when it is less than 8 bytes away from that boundary.
14.4.3. Data Alignment
A misaligned access in the data cache or on the bus costs at least 3 extra clocks on the Pentium®
processor. A misaligned access in the data cache, which crosses a cache line boundary, costs 9
to 12 clocks on the P6 family processors. It is recommended that data be aligned on the
following boundaries for optimum code execution on all processors:
• Align 8-bit data on any boundary.
• Align 16-bit data to be contained within an aligned 4-byte word.
• Align 32-bit data on any boundary that is a multiple of 4.
• Align 64-bit data on any boundary that is a multiple of 8.
14-10
CODE OPTIMIZATION
• Align 80-bit data on a 128-bit boundary (that is, any boundary that is a multiple of 16
bytes).
• Align 128-bit SIMD floating-point data on a 128-bit boundary (that is, any boundary that is
a multiple of 16 bytes).


 
oxffff ©   (2007-10-10 21:34) [4]

И для этого
The Intel386™, Intel486™, Pentium®, and P6 family processors guarantee that the following
basic memory operations will always be carried out atomically:
• Reading or writing a byte.
• Reading or writing a word aligned on a 16-bit boundary.
• Reading or writing a doubleword aligned on a 32-bit boundary.
The P6 family processors guarantee that the following additional memory operations will
always be carried out atomically:
• Reading or writing a quadword aligned on a 64-bit boundary. (This operation is also
guaranteed on the Pentium® processor.)
• 16-bit accesses to uncached memory locations that fit within a 32-bit data bus.
• 16-, 32-, and 64-bit accesses to cached memory that fit within a 32-Byte cache line.
7-3
MULTIPLE-PROCESSOR MANAGEMENT
Accesses to cacheable memory that are split across bus widths, cache lines, and page boundaries
are not guaranteed to be atomic by the Intel486™, Pentium®, or P6 family processors. The P6
family processors provide bus control signals that permit external memory subsystems to make
split accesses atomic; however, nonaligned data accesses will seriously impact the performance
of the processor and should be avoided where possible.


 
oxffff ©   (2007-10-10 21:38) [5]


> Riply ©   (10.10.07 21:31) [2]
> > [1] Ins ©   (10.10.07 21:23)
> > А зачем выравнивать?
> Затем, что очень часто вижу, что так поступают Nt ф-ии,
> с возвращаемыми данными. Вот и хочу понять основные цели
> этого их шага и (заодно) с какого места потолка они берут
> границу для выравнивания ?


Надеюсь переводить не потребуете? :)


 
Инс   (2007-10-10 21:40) [6]


> [2] Riply ©   (10.10.07 21:31)

Это оптимизация, которая зависит от конкретного процессора. Некоторые, например, не могут прочесть четыре байта, расположенные по нечетному адресу, они прочтут две тетрады, которые захватывают эти данные, и уже оттуда выдернут нужный кусок. Вот для них применяется выравнивание по границе слова. Для других нужно выравнивание по границе двойного слова, для третьих - четверного. Но если у вас поля записи не выравнены, то смысла в этом мало. Так как при обращении к невыровненным полям будет происходить тот же неприятный эффект. Смысл выравнивать ради этого начала записи? Да и выйгрыш там не сильно существенный, лучше начать с высокоуровневой оптимизации.


 
Ins ©   (2007-10-10 21:41) [7]

Ух блин, долго писал :) Да и снова ник старый, блин, непривычно...


> Надеюсь переводить не потребуете? :)

Да я то понимаю, я хотел удостоверится, что автор знает что и зачем делает. ;-)


 
Riply ©   (2007-10-10 21:43) [8]

> [5] oxffff ©   (10.10.07 21:38)
Спасибо.
А это единственные "мотивировки" выравнивания,
или есть и еще какие-то причины ?

> Надеюсь переводить не потребуете? :)
А Вам это доставило бы удовольствие ? :)


 
oxffff ©   (2007-10-10 21:43) [9]


> Инс   (10.10.07 21:40) [6]
>
> > [2] Riply ©   (10.10.07 21:31)
>
> Это оптимизация, которая зависит от конкретного процессора.
>  Некоторые, например, не могут прочесть четыре байта, расположенные
> по нечетному адресу, они прочтут две тетрады, которые захватывают
> эти данные, и уже оттуда выдернут нужный кусок. Вот для
> них применяется выравнивание по границе слова. Для других
> нужно выравнивание по границе двойного слова, для третьих
> - четверного. Но если у вас поля записи не выравнены, то
> смысла в этом мало. Так как при обращении к невыровненным
> полям будет происходить тот же неприятный эффект. Смысл
> выравнивать ради этого начала записи? Да и выйгрыш там не
> сильно существенный, лучше начать с высокоуровневой оптимизации.
>


Все же не хотим мы читать.

A misaligned access in the data cache or on the bus costs at least 3 extra clocks on the Pentium®
processor. A misaligned access in the data cache, which crosses a cache line boundary, costs 9
to 12 clocks on the P6 family processors.

however, nonaligned data accesses will seriously impact the performance
of the processor and should be avoided where possible.


 
oxffff ©   (2007-10-10 21:53) [10]


> А это единственные "мотивировки" выравнивания,
> или есть и еще какие-то причины ?


Это основные.


 
oxffff ©   (2007-10-10 21:53) [11]


> Ins ©   (10.10.07 21:41) [7]
> Ух блин, долго писал :) Да и снова ник старый, блин, непривычно.
> ..
>
>
> > Надеюсь переводить не потребуете? :)
>
> Да я то понимаю, я хотел удостоверится, что автор знает
> что и зачем делает. ;-)


Да ты реально долго отвечал. ;)


 
Riply ©   (2007-10-10 22:14) [12]

Всем спасибо !


 
Anatoly Podgoretsky ©   (2007-10-10 22:55) [13]

> Riply  (10.10.2007 22:14:12)  [12]

Тут еще влияет ширина шины памяти по отношению к кешу. А кеш для Р4+ составляет 128 и 256 бит (P4 D и выше).
Если на материнке с двух канальной шиной стоит только одна линейка 64 бита, то получается 2/4 операции заполнения кеша. Для двухканальной в два раза меньше. Не знаю появились ли уже 256 битные шины.


 
Anatoly Podgoretsky ©   (2007-10-10 22:58) [14]

> Anatoly Podgoretsky  (10.10.2007 22:55:13)  [13]

А если данные окажутся на границе двух операций чтения, то количество удвоится.
После этого вступают в силу операции чтения из кеша в регистры CPU и пенальти, если данные не выровнены соответственно.


 
Riply ©   (2007-10-11 01:01) [15]

> [14] Anatoly Podgoretsky ©   (10.10.07 22:58)
> Anatoly Podgoretsky  (10.10.2007 22:55:13)  [13]

Нда... уж... Как там было в орешнеке ?
А я-то хотела всего-навсего написать маленький "файловый менеджер" :)
Начинаю уважать того автора, за его смелость :)


 
Германн ©   (2007-10-11 03:27) [16]


> Нда... уж... Как там было в орешнеке ?

Нда. И орешник тоже умер.


 
Германн ©   (2007-10-11 03:49) [17]


> Германн ©   (11.10.07 03:27) [16]
>
>

Не,.не умер. "Жив курилка"!



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.042 c
4-1178095614
NeyroSpace
2007-05-02 12:46
2007.11.04
Как узнать что ползунок ScrollBar дошел до конца прокрутки?


2-1191930542
ффф
2007-10-09 15:49
2007.11.04
фастрепорт


4-1178286129
White Barsik
2007-05-04 17:42
2007.11.04
LoadLibrary, GetProcAddress и пр.


2-1192106025
Ega23
2007-10-11 16:33
2007.11.04
Поясните про TTreeNode.StateIndex


2-1192187209
kyn66
2007-10-12 15:06
2007.11.04
Окно не раскрывается полностью





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский