-
В распоряжении есть D7-D2007.
На {$ALIGN 16} ругается, для выравнивания кода вообще нет директив.
Есть ли какие-либо ухищрения, позволяющие это сделать,
или можно только подбирать каждый раз неиспользуемые код и данные для выравнивания?
-
> На {$ALIGN 16} ругается, для выравнивания кода вообще нет
> директив.
странно на {$GiveMeBeer} тоже ругаеться. Тебе что именно выровнять ? Это требует понимания. если packed, то {$A8} нужно - для 64 бит.
-
tesseract © (08.04.08 21:59) [1]
Причем тут {$GiveMeBeer} и packed? Мне нужно именно 128-битное выравнивание для SSE кода и данных под него.
-
> Мне нужно именно 128-битное выравнивание для SSE кода
Делфи - среда быстрой разработки бизнес-приложений.
Нахрена бизнес-приложениям твое "выравнивание" ?
Подумай)
Только не надо трындеть про "красоту")
-
Сергей М, (08.04.08 22:11) [3]
> Делфи - среда быстрой разработки бизнес-приложений.
Тьфу, терпеть не могу такое высказывание.
Мне надо выравнивание, и все тут. Я не "бизнес-приложение" пишу.
-
> Причем тут {$GiveMeBeer} и packed? Мне нужно именно 128-
> битное выравнивание для SSE кода и данных под него.
128 битное выравнивание это к врачу. 64-битное это приемлимо, если понимаешь зачем процессору это нужно. Оно реально нужно только для 64 битных регистров. А про packed - к классикам.
-
> Я не "бизнес-приложение" пишу.
А как же "красота" ?)
А как же "исключения" ?)
Что, они теперь уже лесом идут ?)
> терпеть не могу такое высказывание
Экое у тебя нетерпение)
А ведь никуда не деться - придется терпеть)
-
> Тьфу, терпеть не могу такое высказывание.
значит полохой из тебя хакер.
-
tesseract © (08.04.08 22:15) [5]
Ты не знал, что SSE работает с 128-битными переменными и таким же выравниванием?
Даже без SSE, если начало функции кратно параграфу, такая функция выполняется быстрей, начиная с Pentum II. Тоже не знал?
-
> если начало функции кратно параграфу, такая функция выполняется
> быстрей, начиная с Pentum II
Фцытатник!
-
Интересно, нормальные ответы будут?
-
какого ты ждешь нормального ответа ? Что код и без того выровнен на некую границу, определенную в заголовке PE-файла ? Что данные, расположенные в области, выделенной по VirtualAlloc гарантировано выровнены на 64 кило ?
-
> Тыщ (08.04.08 23:52) [10]
>
> Интересно, нормальные ответы будут?
>
Нормальные ответы уже были. Например в tesseract © (08.04.08 22:15) [5].
Вот нормального вопроса пока не было. Разве
> Мне надо выравнивание, и все тут.
может считаться нормальным вопросом?
-
Игорь Шевченко © (09.04.08 0:03) [11]
Вообще-то я имел ввиду выравнивание самого кода, а не секций в exe-шнике.
Delphi всегда выравнивает код на 4 байта.
Это что ж, мне копировать код нужных функций и статических данных в буфер, выделенный VirtualAlloc? Криво как-то.
Германн © (09.04.08 0:24) [12]
См. [2].
-
> Тыщ (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.
-
Германн © (09.04.08 0:52) [14]
> А при чём тут директива компилятора ALIGN?
Еще в сабже было написано: "Как выравнить код и данные на границу 16 байт?"
Соответственно первой попыткой было установить ALIGN в 16.
> Ты справку по этой директиве читал?
Я что, как-то "новичковато" выгляжу что-ли? Конечно читал.
> Смотрел. Опять "Мне нужно"!
Естественно, нужно. Если бы не нужно было, не спрашивал бы.
-
> Тыщ (09.04.08 01:06) [15]
>
> Германн © (09.04.08 0:52) [14]
>
> > А при чём тут директива компилятора ALIGN?
>
> Еще в сабже было написано: "Как выравнить код и данные на
> границу 16 байт?"
> Соответственно первой попыткой было установить ALIGN в 16.
>
>
> > Ты справку по этой директиве читал?
>
> Я что, как-то "новичковато" выгляжу что-ли? Конечно читал.
>
>
>
Хм. Плохо читал.
-
Германн © (09.04.08 1:37) [16]
> Плохо читал.
Ну да, конечно, любой незарегистрированный пользователь по умолчанию ни черта не знает и плохо читал.
-
> Тыщ (09.04.08 01:43) [17]
>
> Германн © (09.04.08 1:37) [16]
>
> > Плохо читал.
>
> Ну да, конечно, любой незарегистрированный пользователь
> по умолчанию ни черта не знает и плохо читал.
И всё равно - плохо читал. Примите и прочь.
-
Германн © (09.04.08 1:56) [18]
Странный ты. Заладил "плохо читал", "плохо читал". Твое утверждение голословно.
-
> Тыщ (09.04.08 02:03) [19]
>
> Германн © (09.04.08 1:56) [18]
>
> Странный ты. Заладил "плохо читал", "плохо читал". Твое
> утверждение голословно.
>
Я не "странный". Я - Германн.
Из справки Д6: "The $A directive controls alignment of fields in record types."
-
Германн © (09.04.08 2:11) [20]
Согласись, если бы record'ы могли выравниваться на 16 байт, это бы решило часть моей проблемы.
-
> Тыщ (09.04.08 02:17) [21]
>
> Германн © (09.04.08 2:11) [20]
>
> Согласись, если бы record'ы могли выравниваться на 16 байт,
> это бы решило часть моей проблемы.
>
Не соглашусь. Пока ты не объяснишь смысл фразы "если начало функции кратно параграфу".
-
> Согласись, если бы record'ы могли выравниваться на 16 байт,
> это бы решило часть моей проблемы.
Сделай 8-байтное выравнивание, и засунь между элементами "заглушки" int64. Будет тебе 128 бит.
-
Германн © (09.04.08 2:29) [22]
Объясняю. "начало функции кратно параграфу" означает, что адрес, с которого начинается функция, кратен 16 байтам.
Но это относится к выравниванию кода, а [20] решило бы выравнивание данных.
DrPass © (09.04.08 2:33) [23]
Так все равно не будет гарантии, что record начнется на 16-байтной границе.
Вот я и говорю,
[0] > "или можно только подбирать каждый раз неиспользуемые код и данные для выравнивания?"
-
> DrPass © (09.04.08 02:33) [23]
Это уже подразумевалось в tesseract © (08.04.08 21:59) [1]
-
> Тыщ (09.04.08 02:41) [24]
>
> Германн © (09.04.08 2:29) [22]
>
> Объясняю. "начало функции кратно параграфу" означает, что
> адрес, с которого начинается функция, кратен 16 байтам.
>
Ну и ?
А дальше то что?
Или ты надыбал функцию, а она не не работает?
-
Не так давно, в пределах месяца, наверно, эта тема обсуждалась, приводились функции для получения указателя на блок данных с нужным выравниванием.
-
>Тыщ (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 на метках.
-
> Тыщ (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;
-
> Ты не знал, что SSE работает с 128-битными переменными и
> таким же выравниванием?
Я знаю, что в MMX и 170-битные значения может пользовать. Вот только какое это оношения имеет к {$ALING 16} и тому что DELPHI не поддерживает SSE, это не имеет. SSE пишуться чаще всего на ASM-е, так что смотри, как тебе нужно всё обравнять.
-
> Ты не знал, что SSE работает с 128-битными переменными и
> таким же выравниванием?
Не с переменными, а со 128-битными регистрами и данными. Переменные для SSE филькина грамота.
-
> Dimaxx (09.04.2008 13:16:31) [31]
Это так, но речь идет о переменных, а Интел еще и о переходах. Связано это с шириной кеша. И более того на повестке дня уже выравнивание и на 32 байта, современные процессоры имеют кеш 256 бит и есть материнские платы с 4 каналами памяти, в которых возможно загрузка кеша за одну операцию чтения вместо двух, в них выравнивание на 32 байта может дать реальный выигрыш.
Выравнивание на 16 байт нужно не столько для SSE, сколько для Extended (80 бит), это то есть во многих программах и есть во всех на Дельфи работающих с плающеей запятой, она вся основана на Extended
-
> tesseract © (08.04.08 22:15) [5]
> 128 битное выравнивание это к врачу. 64-битное это приемлимо,
> если понимаешь зачем процессору это нужно. Оно реально
> нужно только для 64 битных регистров.
Это тебе надо к врачу. М.б. он научит прежде чем постить, изучить предмет.
-
-
> М.б. он научит прежде чем постить, изучить предмет.
Я имел в виду программирование в Delphi. Тема про SSE/MMX/вариации float не поднималась. В виду новых данных пост считьть как основанный на неверных вводных данных.
-
oxffff, Sapersky, спасибо!