Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.22;
Скачать: CL | DM;

Вниз

Как выравнить код и данные на границу 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.013 c
9-1177433968
@!!ex
2007-04-24 20:59
2009.02.22
ПРоблемы Z буффера.


2-1231636459
demon
2009-01-11 04:14
2009.02.22
Окно на поверхности


2-1231924532
andreoman
2009-01-14 12:15
2009.02.22
treeview при двойном щелчке менялась пиктограмма узла


15-1230097799
Кое кто
2008-12-24 08:49
2009.02.22
Как играть в малые шахматы(6x6)?


2-1231656525
pavelkq
2009-01-11 09:48
2009.02.22
Пропорциональный ресайз картинки под Imagelist и DrawGrid