Конференция "Основная" » Как выравнить код и данные на границу 16 байт?
 
  • Германн © (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]