|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 4, 2003 21:10:05 Где чаще всего применяется выравнивание? где доку почитать? |
|
|
Дата: Сен 4, 2003 22:04:58 Выравнивание помогает увеличить скорость кода. Здесь на WASM есть статейка: "Pentium глазами программиста". Очень неплохое чтиво... |
|
|
Дата: Сен 4, 2003 23:27:46 дайте ссылочку!!! Но если это АГНЕР ФОГ!!!! То лучше не надо!!! Там про выравнивание смутно написано! |
|
|
Дата: Сен 5, 2003 01:11:08 |
|
|
Дата: Сен 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 Я это просто не разу не пробывал! Вот-вот :((( |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.038 |