Конференция "Начинающим" » Опкоды AVX
 
  • dmk © (11.06.18 23:32) [20]
    >компилятору никто не говорил, что там можно применить SIMD
    >(цикл vmovupd/vcmpltpd), но он сам догадался.

    Delphi тоже про SIMD знает. Вплоть до 4.2. AVX на стадии разработки.
    В планах Embarcadero вроде есть. Ручная оптимизация по любому лучше.
    Я все оптимизирую сам. Мне не лень.
  • invis © (12.06.18 00:46) [21]
    Сам компилятор Дельфи использует максимум SSE2 в скалярном режиме, сишные - до AVX-512 в векторном.
    Вся эта ветка наглядно показывает "прелести" ручной оптимизации, когда не хватает 3-х инструкций - и в 20 раз медленнее.
    Ну да ладно. Не лень - так не лень, что я буду уговаривать.
  • DevilDevil_ © (16.06.18 01:00) [22]
    Причину в итоге нашли?
  • dmk © (16.06.18 02:39) [23]
    >Причину в итоге нашли?
    Неа. Объяснение только одно - работает эмулятор, а не железо.
    У многих тормоза с авэиксом. Куча аналогичных вопросов на интеле.
    Я их спросил, но пока молчат.
  • invis © (16.06.18 04:02) [24]
    Я же выкладывал исправленную версию в (15). Правда, она все равно медленнее sse, но в разумных пределах медленнее.
  • dmk © (16.06.18 17:03) [25]
    invis ©   (16.06.18 04:02) [24]
    Эх Шаман Петрович! Счастья Вам! Учитывая, что объем данных в AVX больше в 2 раза, то получается AVX слегка быстрее читает из памяти, но в целом чуть медленнее XMM. Но думаю, что оптимизация это просто вопрос времени. В будущих поколениях CPU будет шустрее. Возможно ;)
  • dmk © (16.06.18 21:40) [26]
    В общем VZEROUPPER не очень помогает. Она что-то рушит, что нарушает вычисления.
    Без нее все считается правильно, а с ней быстро, но расчеты неправильные.
  • invis © (17.06.18 12:50) [27]
    Переделай всю процедуру на AVX-команды, VZEROUPPER только в конце.
    Сишные компиляторы так делают, даже если работают со 128-битными векторами (xmm регистры), команды всё равно с префиксом "v".
    https://godbolt.org/g/8267vi
  • dmk © (17.06.18 21:32) [28]
    Всю процедуру невозможно переделать на 256 бит к сожалению. Эта процедура часть большей процедуры. Цикл отрисовки 3D-треугольника. В XMM-регистрах данные не рушатся, а у меня куча переменных в регистрах. VZEROUPPER трет их, а это значит, что нужна новая загрузка из памяти. Получаются AVX-тормоза. Кроме того некоторых AVX-команд просто нет в «природе». Это дополнительная конверсия данных из 256 бит в 128. Получается жуть и очень медленно. Разница по скорости в разы в пользу XMM.

    Сейчас у меня есть новая XMM-версия с упакованными Double.
    По скорости приближается к Single.

    Сцена XMM-Single ~150 fps (но тут не хватает точности) Еще бы пару бит :)
    Сцена XMM-Double ~100 fps (точности хватает)
    Сцена AVX ~25 fps (точности хватает)

    В общем AVX пока отменяется.
  • invis © (18.06.18 12:55) [29]
    Я думаю, все нужные команды в AVX есть, компиляторы же как-то справляются.
    Если есть рисование треугольника на Дельфи, без ассемблера - выкладывай, посмотрю.
  • dmk © (18.06.18 17:58) [30]
    >все нужные команды в AVX есть
    К сожалению нет. Есть только в AVX+AVX-2. У меня нет AVX-2 компилятора, чтобы опкоды взять.

    >без ассемблера
    Без ассемблера в Delphi нельзя, т.к. в Delphi есть баг. Конверсия single-double автоматическая, что очень напрягает. Из-за этого расчеты неверные. Опция компилятора отключающая эту конверсию не работает. Все равно конвертит.

    >выкладывай, посмотрю
    В паблик ни за что.
  • invis © (18.06.18 23:15) [31]

    > У меня нет AVX-2 компилятора

    FPC же, с параметрами -O4 -Opcoreavx2 -Cfavx2 -Cpcoreavx2


    > Конверсия single-double автоматическая, что очень напрягает.
    >  Из-за этого расчеты неверные. Опция компилятора отключающая
    > эту конверсию не работает.

    Из single в double отключается. Или он ещё наоборот конвертит?
  • dmk © (18.06.18 23:50) [32]
    >Или он ещё наоборот конвертит?
    Он туда-сюда конвертит без спроса. Представление чисел получается разное.
    cvtsd2ss и cvtss2sd ставит везде без спроса.

    Есть такая директива, она на SIMD не распростроняется, только FPU.
    http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Floating_point_precision_control_(Delphi_for_x64)
  • dmk © (19.06.18 00:00) [33]
    Ан нет. Извиняюсь. Все таки удалось заставить его чисто в single считать.

    procedure TestSingle;
    var
     a, b, c: Single;

    begin
     {$EXCESSPRECISION OFF}
     a := 2.52355235;
     b := 3.57235224;
     c := (a + b);
     {$EXCESSPRECISION ON}
    end;


    Получается такой код:
    Wu.pas.1324: a := 2.52355235;
    00000000007858FD C74564E2812140   mov [rbp+$64],$402181e2
    Wu.pas.1325: b := 3.57235224;
    0000000000785904 C745606BA16440   mov [rbp+$60],$4064a16b
    Wu.pas.1326: c := (a + b);
    000000000078590B F30F104564       movss xmm0,dword ptr [rbp+$64]
    0000000000785910 F30F584560       addss xmm0,dword ptr [rbp+$60]
    0000000000785915 F30F11455C       movss dword ptr [rbp+$5c],xmm0


    А вот что без директивы:
    Wu.pas.1324: a := 2.52355235;
    00000000007858FD C74564E2812140   mov [rbp+$64],$402181e2
    Wu.pas.1325: b := 3.57235224;
    0000000000785904 C745606BA16440   mov [rbp+$60],$4064a16b
    Wu.pas.1326: c := (a + b);
    000000000078590B F3480F5A4564     cvtss2sd xmm0,qword ptr [rbp+$64]
    0000000000785911 F3480F5A4D60     cvtss2sd xmm1,qword ptr [rbp+$60]
    0000000000785917 F20F58C1         addsd xmm0,xmm1
    000000000078591B F2480F5AC0       cvtsd2ss xmm0,xmm0
    0000000000785920 F30F11455C       movss dword ptr [rbp+$5c],xmm0
 
Конференция "Начинающим" » Опкоды AVX
Есть новые Нет новых   [118656   +18][b:0][p:0]