· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› ВЫРАВНИВАНИЕ

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Сен 4, 2003 21:10:05

Где чаще всего применяется выравнивание? где доку почитать?


Дата: Сен 4, 2003 22:04:58

Выравнивание помогает увеличить скорость кода.
Здесь на WASM есть статейка: "Pentium глазами программиста".
Очень неплохое чтиво...


Дата: Сен 4, 2003 23:27:46

дайте ссылочку!!! Но если это АГНЕР ФОГ!!!! То лучше не надо!!! Там про выравнивание смутно написано!


Дата: Сен 5, 2003 01:11:08

http://www.wasm.ru/publist.php?list=11

Первая статья...


Дата: Сен 5, 2003 12:13:54

emergenter
Смутно?

А в мануале Intel тоже смутно?

1. Однобайтные данные --
2. 2 --
3. 4 --

Всё там чётко.


Дата: Сен 5, 2003 16:23:28

ТАК ЗАЧЕМ???? если можно и без выравнивания! В чем выйгрышь?


Дата: Сен 5, 2003 16:57:26

emergenter
Вы на мне что тренеруетесь? %())))

Во первых по скорости. Когда вы обращаетесь к невыровненному dword, то процу приходится считать два dword, ибо он умеет считывать из памяти данные только по адресу кратному 4.


Дата: Сен 5, 2003 17:48:21

Не не подумайте ничего плохого!! Я же к Вам обращаюсь как к специалисту в этой сфере! И тут нет ничего зазорного если к примеру вы выполняли боьше задач чем допустим я! Я хочу понять как делать правильно а как нет... И вы зря обижаетесь.
так если ЭТО МАССИВЫ то можно адрес прибавлять и все +4!!! А при чем тут выравнивание?? Я наверное не понимаю...


Дата: Сен 5, 2003 18:13:42

Адрес в памяти должен быть выровнен хотя бы на 4, иначе происходят stalls, т.е. так процессор за один проход заполнит кеш, а так ему возвращаться и дозаполнять приходится. Очень ощущается при копировании блоков памяти. Сравни и посмотришь.


Дата: Сен 5, 2003 18:29:38

masquer
СПАСИБО за разъяснение!
т.е. нужно применить волшебную команда ALIGN 4?
Где лучше всего делать выравниваниеmasquer


Дата: Сен 5, 2003 18:30:16

emergenter
Объясняю раз 4 :(((
Вы не хотите думать :(((
Просто не хотите..

masquer
Кеш, да и он так же. Конечно ОН.

Но не забывайте о том, как данные читаюстя из памяти. А читаются они по словам.. А что слово для I32? Правильно это 32 бита.

emergenter
Что касается выравнивания.
Вот те тупой пример. У тебя есть структура размеров 32 байта.
Про кешь ты уже слышал.
А теперь представь себе, что хочешь ты её поместить в стек...
Ну временная переменная.

Структура должны быть выровнена по 32 байтной границе.

Зачем?

Вот смотри:

Пусть скобочками [] показаны адреса кратные 32

[.......][.......]

Ты читаешь с адреса не кратного 32
[.......][.......]
   ^- тут

[.......][.......]
   ^- тут


Что делает проц? Он заносит в кешь не память с адреса откуда ты прочитал, а блок 32 байтов, что к скобках.
[========][.......]
   ^- тут


Если часть элементов структуры находится в другом блоке 32 байт, то кешь выбрасит первый блок и запихнёт второй.

Теперь о стеке. Если ты просто так размештишь в нём эту 32 байтную структуру, то есть БОЛЬШАЯ вероятность что она не будет выровнена, ибо esp значение тебе не известно.

Понятно?


Дата: Сен 5, 2003 18:43:15

СПАСИБО! за столь понятные разъяснения!! Но это честно говоря я зналEdmond

про это я прочитал в АГНЕРЕ ФОГе!!

Тут вопрос в другом!! Неужели нужно применять команду ALIGN 32 ??? Что разве компьютер не автоматически заносит 32 байта?
Ну например! Я читаю из массива элемент! В массиве 35 значений по 4 байта!
соответственно когда я читаю [mas+16]!! Комп заносит в КЕШ именно от 0 до 32!!!!????


Дата: Сен 5, 2003 18:52:54

0                           4                           8
|                           |                           |
+------+------+------+------+------+------+------+------+
| BYTE | BYTE | BYTE | BYTE | BYTE | BYTE | BYTE | BYTE |
+------+------+------+------+------+------+------+------+
|           DWORD           |           DWORD           |
+------+------+------+------+------+------+------+------+
| BYTE | BYTE | BYTE |           DWORD           | BYTE |
+------+------+------+------+------+------+------+------+
                     |
                     3

Процессору важен адрес данных как физическое значение. Например, из рисунка видно, как самый последний DWORD лежит по адресу 3. Адрес этот на 4 не делится, поэтому процессор прочитает этот DWORD с перезаполнением кэша. Даже если массив лежит по адресу, скажем, 7 - прибавим 4, получим 11. Очевидно, сколько не прибавляй, а все DWORD-ы в этом массиве не будут выравнены.

Для максимальной скорости кода, все данные и метки (процедуры) должны лежать на адресах кратных 32. 4 это хорошо, но это не максимум, но лучше - по сравнению с совсем не выровнеными данными. Конечно, если следовать этому правилу без оглядки, код раздуется непомерно, так что только наиболее часто проходимые CPU места должны быть выровнены: быстрые циклы, часто вызываемые процедуры, часто читаемые данные, и т.п.

В заключение добавлю, что в IDE, который я разрабатываю будет включен класс для выделения блоков памяти выровненых на 32. Я думаю базировать этот класс на Heap_xxx API.


Дата: Сен 5, 2003 19:16:42

AsmGuru62
СПАСИБО!
Блин! Я это просто не разу не пробывал! Так вот как лучше всего в коде это все дело выровнять!


Дата: Сен 5, 2003 19:42:05

Я это просто не разу не пробывал!

Вот-вот :(((

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.038