Конференция "Основная" » Как выравнить код и данные на границу 16 байт?
 
  • Тыщ (08.04.08 21:54) [0]
    В распоряжении есть D7-D2007.
    На {$ALIGN 16} ругается, для выравнивания кода вообще нет директив.
    Есть ли какие-либо ухищрения, позволяющие это сделать,
    или можно только подбирать каждый раз неиспользуемые код и данные для выравнивания?
  • tesseract © (08.04.08 21:59) [1]

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


    странно на {$GiveMeBeer} тоже ругаеться. Тебе что именно выровнять ? Это требует понимания. если packed, то {$A8}  нужно - для 64 бит.
  • Тыщ (08.04.08 22:03) [2]
    tesseract ©   (08.04.08 21:59) [1]

    Причем тут {$GiveMeBeer} и packed? Мне нужно именно 128-битное выравнивание для SSE кода и данных под него.
  • Сергей М, (08.04.08 22:11) [3]

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


    Делфи - среда быстрой разработки бизнес-приложений.
    Нахрена бизнес-приложениям твое "выравнивание" ?
    Подумай)
    Только не надо трындеть про "красоту")
  • Тыщ (08.04.08 22:14) [4]
    Сергей М,   (08.04.08 22:11) [3]

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

    Тьфу, терпеть не могу такое высказывание.
    Мне надо выравнивание, и все тут. Я не "бизнес-приложение" пишу.
  • tesseract © (08.04.08 22:15) [5]

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


    128 битное выравнивание это к врачу. 64-битное это приемлимо, если понимаешь зачем процессору это нужно. Оно реально нужно только для 64 битных регистров. А про packed - к классикам.
  • Сергей М, (08.04.08 22:16) [6]

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


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

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


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


    Экое у тебя нетерпение)
    А ведь никуда не деться - придется терпеть)
  • tesseract © (08.04.08 22:17) [7]

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


    значит полохой из тебя хакер.
  • Тыщ (08.04.08 22:19) [8]
    tesseract ©   (08.04.08 22:15) [5]

    Ты не знал, что SSE работает с 128-битными переменными и таким же выравниванием?
    Даже без SSE, если начало функции кратно параграфу, такая функция выполняется быстрей, начиная с Pentum II. Тоже не знал?
  • Сергей М, (08.04.08 22:21) [9]

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


    Фцытатник!
  • Тыщ (08.04.08 23:52) [10]
    Интересно, нормальные ответы будут?
  • Игорь Шевченко © (09.04.08 00:03) [11]
    какого ты ждешь нормального ответа ? Что код и без того выровнен на некую границу, определенную в заголовке PE-файла ? Что данные, расположенные в области, выделенной по VirtualAlloc гарантировано выровнены на 64 кило ?
  • Германн © (09.04.08 00:24) [12]

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

    Нормальные ответы уже были. Например в tesseract ©   (08.04.08 22:15) [5].
    Вот нормального вопроса пока не было. Разве
    > Мне надо выравнивание, и все тут.
    может считаться нормальным вопросом?
  • Тыщ (09.04.08 00:27) [13]
    Игорь Шевченко ©   (09.04.08 0:03) [11]

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

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

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

    См. [2].
  • Германн © (09.04.08 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.
  • Тыщ (09.04.08 01:06) [15]
    Германн ©   (09.04.08 0:52) [14]

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

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

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

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

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

    Естественно, нужно. Если бы не нужно было, не спрашивал бы.
  • Германн © (09.04.08 01:37) [16]

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

    Хм. Плохо читал.
  • Тыщ (09.04.08 01:43) [17]
    Германн ©   (09.04.08 1:37) [16]

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

    Ну да, конечно, любой незарегистрированный пользователь по умолчанию ни черта не знает и плохо читал.
  • Германн © (09.04.08 01:56) [18]

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

    И всё равно - плохо читал. Примите и прочь.
  • Тыщ (09.04.08 02:03) [19]
    Германн ©   (09.04.08 1:56) [18]

    Странный ты. Заладил "плохо читал", "плохо читал". Твое утверждение голословно.
  • Германн © (09.04.08 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."
  • Тыщ (09.04.08 02:17) [21]
    Германн ©   (09.04.08 2:11) [20]

    Согласись, если бы record'ы могли выравниваться на 16 байт, это бы решило часть моей проблемы.
  • Германн © (09.04.08 02:29) [22]

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

    Не соглашусь. Пока ты не объяснишь смысл фразы "если начало функции кратно параграфу".
  • DrPass © (09.04.08 02:33) [23]

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

    Сделай 8-байтное выравнивание, и засунь между элементами "заглушки" int64. Будет тебе 128 бит.
  • Тыщ (09.04.08 02:41) [24]
    Германн ©   (09.04.08 2:29) [22]

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

    DrPass ©   (09.04.08 2:33) [23]

    Так все равно не будет гарантии, что record начнется на 16-байтной границе.
    Вот я и говорю,
    [0] > "или можно только подбирать каждый раз неиспользуемые код и данные для выравнивания?"
  • Германн © (09.04.08 02:46) [25]

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

    Это уже подразумевалось в tesseract ©   (08.04.08 21:59) [1]
  • Германн © (09.04.08 02:51) [26]

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

    Ну и ?
    А дальше то что?
    Или ты надыбал функцию, а она не не работает?
  • MBo © (09.04.08 05:19) [27]
    Не так давно, в пределах месяца, наверно, эта тема обсуждалась, приводились функции для получения указателя на блок данных с нужным выравниванием.
  • oxffff © (09.04.08 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 © (09.04.08 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 © (09.04.08 10:15) [30]

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


    Я знаю, что в MMX и 170-битные значения может пользовать. Вот только какое это оношения имеет к {$ALING 16}  и тому что DELPHI не поддерживает SSE, это не имеет. SSE пишуться чаще всего на ASM-е, так что смотри, как тебе нужно всё обравнять.
  • Dimaxx © (09.04.08 13:16) [31]

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

    Не с переменными, а со 128-битными регистрами и данными. Переменные для SSE филькина грамота.
  • Anatoly Podgoretsky © (09.04.08 15:23) [32]
    > Dimaxx  (09.04.2008 13:16:31)  [31]

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

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

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

    Это тебе надо к врачу. М.б. он научит прежде чем постить, изучить предмет.
  • Sapersky (09.04.08 19:31) [34]
    Не так давно, в пределах месяца, наверно, эта тема обсуждалась

    Ага, вот она:
    http://pda.delphimaster.net/?id=1206039059&n=18

    По поводу SSE - телепатор мне подсказывает, что автору вопроса следует для начала заглянуть сюда:
    http://www.fastcode.dk/fastcodeproject/fastcodeproject/index.htm
  • tesseract © (09.04.08 20:57) [35]

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


    Я имел в виду программирование в Delphi.  Тема про SSE/MMX/вариации float не поднималась. В виду новых данных пост считьть как основанный на неверных вводных данных.
  • Тыщ (10.04.08 16:11) [36]
    oxffff, Sapersky, спасибо!
 
Конференция "Основная" » Как выравнить код и данные на границу 16 байт?
Есть новые Нет новых   [134487   +52][b:0][p:0.001]