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

Вниз

Как выравнить код и данные на границу 16 байт?   Найти похожие ветки 

 
Тыщ   (2008-04-08 21:54) [0]

В распоряжении есть D7-D2007.
На {$ALIGN 16} ругается, для выравнивания кода вообще нет директив.
Есть ли какие-либо ухищрения, позволяющие это сделать,
или можно только подбирать каждый раз неиспользуемые код и данные для выравнивания?


 
tesseract ©   (2008-04-08 21:59) [1]


> На {$ALIGN 16} ругается, для выравнивания кода вообще нет
> директив.


странно на {$GiveMeBeer} тоже ругаеться. Тебе что именно выровнять ? Это требует понимания. если packed, то {$A8}  нужно - для 64 бит.


 
Тыщ   (2008-04-08 22:03) [2]

tesseract ©   (08.04.08 21:59) [1]

Причем тут {$GiveMeBeer} и packed? Мне нужно именно 128-битное выравнивание для SSE кода и данных под него.


 
Сергей М,   (2008-04-08 22:11) [3]


> Мне нужно именно 128-битное выравнивание для SSE кода


Делфи - среда быстрой разработки бизнес-приложений.
Нахрена бизнес-приложениям твое "выравнивание" ?
Подумай)
Только не надо трындеть про "красоту")


 
Тыщ   (2008-04-08 22:14) [4]

Сергей М,   (08.04.08 22:11) [3]

> Делфи - среда быстрой разработки бизнес-приложений.

Тьфу, терпеть не могу такое высказывание.
Мне надо выравнивание, и все тут. Я не "бизнес-приложение" пишу.


 
tesseract ©   (2008-04-08 22:15) [5]


> Причем тут {$GiveMeBeer} и packed? Мне нужно именно 128-
> битное выравнивание для SSE кода и данных под него.


128 битное выравнивание это к врачу. 64-битное это приемлимо, если понимаешь зачем процессору это нужно. Оно реально нужно только для 64 битных регистров. А про packed - к классикам.


 
Сергей М,   (2008-04-08 22:16) [6]


> Я не "бизнес-приложение" пишу.


А как же "красота" ?)
А как же "исключения" ?)

Что, они теперь уже лесом идут ?)


> терпеть не могу такое высказывание


Экое у тебя нетерпение)
А ведь никуда не деться - придется терпеть)


 
tesseract ©   (2008-04-08 22:17) [7]


> Тьфу, терпеть не могу такое высказывание.


значит полохой из тебя хакер.


 
Тыщ   (2008-04-08 22:19) [8]

tesseract ©   (08.04.08 22:15) [5]

Ты не знал, что SSE работает с 128-битными переменными и таким же выравниванием?
Даже без SSE, если начало функции кратно параграфу, такая функция выполняется быстрей, начиная с Pentum II. Тоже не знал?


 
Сергей М,   (2008-04-08 22:21) [9]


> если начало функции кратно параграфу, такая функция выполняется
> быстрей, начиная с Pentum II


Фцытатник!


 
Тыщ   (2008-04-08 23:52) [10]

Интересно, нормальные ответы будут?


 
Игорь Шевченко ©   (2008-04-09 00:03) [11]

какого ты ждешь нормального ответа ? Что код и без того выровнен на некую границу, определенную в заголовке PE-файла ? Что данные, расположенные в области, выделенной по VirtualAlloc гарантировано выровнены на 64 кило ?


 
Германн ©   (2008-04-09 00:24) [12]


> Тыщ   (08.04.08 23:52) [10]
>
> Интересно, нормальные ответы будут?
>

Нормальные ответы уже были. Например в tesseract ©   (08.04.08 22:15) [5].
Вот нормального вопроса пока не было. Разве
> Мне надо выравнивание, и все тут.
может считаться нормальным вопросом?


 
Тыщ   (2008-04-09 00:27) [13]

Игорь Шевченко ©   (09.04.08 0:03) [11]

Вообще-то я имел ввиду выравнивание самого кода, а не секций в exe-шнике.
Delphi всегда выравнивает код на 4 байта.

Это что ж, мне копировать код нужных функций и статических данных в буфер, выделенный VirtualAlloc? Криво как-то.

Германн ©   (09.04.08 0:24) [12]

См. [2].


 
Германн ©   (2008-04-09 00:52) [14]


> Тыщ   (09.04.08 00:27) [13]
>
> Игорь Шевченко ©   (09.04.08 0:03) [11]
>
> Вообще-то я имел ввиду выравнивание самого кода, а не секций
> в exe-шнике.
> Delphi всегда выравнивает код на 4 байта.
>
> Это что ж, мне копировать код нужных функций и статических
> данных в буфер, выделенный VirtualAlloc? Криво как-то.
>

А при чём тут директива компилятора ALIGN? Ты справку по этой директиве читал?

> Германн ©   (09.04.08 0:24) [12]
>
> См. [2].
>

Смотрел. Опять "Мне нужно"!
Опять вместо may/can использовано must.


 
Тыщ   (2008-04-09 01:06) [15]

Германн ©   (09.04.08 0:52) [14]

> А при чём тут директива компилятора ALIGN?

Еще в сабже было написано: "Как выравнить код и данные на границу 16 байт?"
Соответственно первой попыткой было установить ALIGN в 16.

> Ты справку по этой директиве читал?

Я что, как-то "новичковато" выгляжу что-ли? Конечно читал.

> Смотрел. Опять "Мне нужно"!

Естественно, нужно. Если бы не нужно было, не спрашивал бы.


 
Германн ©   (2008-04-09 01:37) [16]


> Тыщ   (09.04.08 01:06) [15]
>
> Германн ©   (09.04.08 0:52) [14]
>
> > А при чём тут директива компилятора ALIGN?
>
> Еще в сабже было написано: "Как выравнить код и данные на
> границу 16 байт?"
> Соответственно первой попыткой было установить ALIGN в 16.
>
>
> > Ты справку по этой директиве читал?
>
> Я что, как-то "новичковато" выгляжу что-ли? Конечно читал.
>
>
>

Хм. Плохо читал.


 
Тыщ   (2008-04-09 01:43) [17]

Германн ©   (09.04.08 1:37) [16]

> Плохо читал.

Ну да, конечно, любой незарегистрированный пользователь по умолчанию ни черта не знает и плохо читал.


 
Германн ©   (2008-04-09 01:56) [18]


> Тыщ   (09.04.08 01:43) [17]
>
> Германн ©   (09.04.08 1:37) [16]
>
> > Плохо читал.
>
> Ну да, конечно, любой незарегистрированный пользователь
> по умолчанию ни черта не знает и плохо читал.

И всё равно - плохо читал. Примите и прочь.


 
Тыщ   (2008-04-09 02:03) [19]

Германн ©   (09.04.08 1:56) [18]

Странный ты. Заладил "плохо читал", "плохо читал". Твое утверждение голословно.


 
Германн ©   (2008-04-09 02:11) [20]


> Тыщ   (09.04.08 02:03) [19]
>
> Германн ©   (09.04.08 1:56) [18]
>
> Странный ты. Заладил "плохо читал", "плохо читал". Твое
> утверждение голословно.
>

Я не "странный". Я - Германн.
Из справки Д6: "The $A directive controls alignment of fields in record types."


 
Тыщ   (2008-04-09 02:17) [21]

Германн ©   (09.04.08 2:11) [20]

Согласись, если бы record"ы могли выравниваться на 16 байт, это бы решило часть моей проблемы.


 
Германн ©   (2008-04-09 02:29) [22]


> Тыщ   (09.04.08 02:17) [21]
>
> Германн ©   (09.04.08 2:11) [20]
>
> Согласись, если бы record"ы могли выравниваться на 16 байт,
>  это бы решило часть моей проблемы.
>

Не соглашусь. Пока ты не объяснишь смысл фразы "если начало функции кратно параграфу".


 
DrPass ©   (2008-04-09 02:33) [23]


> Согласись, если бы record"ы могли выравниваться на 16 байт,
>  это бы решило часть моей проблемы.

Сделай 8-байтное выравнивание, и засунь между элементами "заглушки" int64. Будет тебе 128 бит.


 
Тыщ   (2008-04-09 02:41) [24]

Германн ©   (09.04.08 2:29) [22]

Объясняю. "начало функции кратно параграфу" означает, что адрес, с которого начинается функция, кратен 16 байтам.
Но это относится к выравниванию кода, а [20] решило бы выравнивание данных.

DrPass ©   (09.04.08 2:33) [23]

Так все равно не будет гарантии, что record начнется на 16-байтной границе.
Вот я и говорю,
[0] > "или можно только подбирать каждый раз неиспользуемые код и данные для выравнивания?"


 
Германн ©   (2008-04-09 02:46) [25]


> DrPass ©   (09.04.08 02:33) [23]

Это уже подразумевалось в tesseract ©   (08.04.08 21:59) [1]


 
Германн ©   (2008-04-09 02:51) [26]


> Тыщ   (09.04.08 02:41) [24]
>
> Германн ©   (09.04.08 2:29) [22]
>
> Объясняю. "начало функции кратно параграфу" означает, что
> адрес, с которого начинается функция, кратен 16 байтам.
>

Ну и ?
А дальше то что?
Или ты надыбал функцию, а она не не работает?


 
MBo ©   (2008-04-09 05:19) [27]

Не так давно, в пределах месяца, наверно, эта тема обсуждалась, приводились функции для получения указателя на блок данных с нужным выравниванием.


 
oxffff ©   (2008-04-09 09:06) [28]

>Тыщ   (08.04.08 22:03) [2]

Из документации Intel

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
...................
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).


В итоге, тебе нужно выравнивание DATA на 128-bit boundary.
И выравнивание кода циклов и переходов согласно.

• A loop entry label should be 16-byte aligned when it is less than 8 bytes away from that
boundary.

• 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.

P.S. Напиши перемещаемый ASM код. Далее VirtualAlloc и Copymemory + Reloc FIXING на метках.


 
oxffff ©   (2008-04-09 10:07) [29]


> Тыщ   (09.04.08 02:41) [24]
> Германн ©   (09.04.08 2:29) [22]
>
> Объясняю. "начало функции кратно параграфу" означает, что
> адрес, с которого начинается функция, кратен 16 байтам.
> Но это относится к выравниванию кода, а [20] решило бы выравнивание
> данных.
>
> DrPass ©   (09.04.08 2:33) [23]
>
> Так все равно не будет гарантии, что record начнется на
> 16-байтной границе.
> Вот я и говорю,


Делай выравнивание на стеке сам

procedure TForm1.Button1Click(Sender: TObject);
var AlignedData:pointer;
begin
asm
mov ecx,esp;
and cl,$F0;
sub ecx,esp;
mov eax,DWORD PTR sizeof(Trect);
and al,$F0;
add eax,$10;
sub ecx,eax;
mov edx,esp;
lea esp,[esp+ecx];
mov AlignedData,esp;
mov esp,edx;
end;
end;


 
tesseract ©   (2008-04-09 10:15) [30]


> Ты не знал, что SSE работает с 128-битными переменными и
> таким же выравниванием?


Я знаю, что в MMX и 170-битные значения может пользовать. Вот только какое это оношения имеет к {$ALING 16}  и тому что DELPHI не поддерживает SSE, это не имеет. SSE пишуться чаще всего на ASM-е, так что смотри, как тебе нужно всё обравнять.


 
Dimaxx ©   (2008-04-09 13:16) [31]


> Ты не знал, что SSE работает с 128-битными переменными и
> таким же выравниванием?

Не с переменными, а со 128-битными регистрами и данными. Переменные для SSE филькина грамота.


 
Anatoly Podgoretsky ©   (2008-04-09 15:23) [32]

> Dimaxx  (09.04.2008 13:16:31)  [31]

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

Выравнивание на 16 байт нужно не столько для SSE, сколько для Extended (80 бит), это то есть во многих программах и есть во всех на Дельфи работающих с плающеей запятой, она вся основана на Extended


 
Johnmen ©   (2008-04-09 16:11) [33]


> tesseract ©   (08.04.08 22:15) [5]
> 128 битное выравнивание это к врачу. 64-битное это приемлимо,
>  если понимаешь зачем процессору это нужно. Оно реально
> нужно только для 64 битных регистров.

Это тебе надо к врачу. М.б. он научит прежде чем постить, изучить предмет.


 
Sapersky   (2008-04-09 19:31) [34]

Не так давно, в пределах месяца, наверно, эта тема обсуждалась

Ага, вот она:
http://delphimaster.net/view/2-1206039059/

По поводу SSE - телепатор мне подсказывает, что автору вопроса следует для начала заглянуть сюда:
http://www.fastcode.dk/fastcodeproject/fastcodeproject/index.htm


 
tesseract ©   (2008-04-09 20:57) [35]


>  М.б. он научит прежде чем постить, изучить предмет.


Я имел в виду программирование в Delphi.  Тема про SSE/MMX/вариации float не поднималась. В виду новых данных пост считьть как основанный на неверных вводных данных.


 
Тыщ   (2008-04-10 16:11) [36]

oxffff, Sapersky, спасибо!



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

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

Наверх





Память: 0.6 MB
Время: 0.005 c
15-1229869312
DillerXX
2008-12-21 17:21
2009.02.22
А правда что


3-1215427949
REA
2008-07-07 14:52
2009.02.22
Вложенный запрос с 2мя параметрами


2-1231609162
gulya
2009-01-10 20:39
2009.02.22
расчет остатка как приход-расход


15-1230205417
тимохов
2008-12-25 14:43
2009.02.22
Почему в русской WinXP меню могут показываться кракозяблами?


15-1230072261
Мазут Береговой
2008-12-24 01:44
2009.02.22
Нелинейные функции





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский