-
>компилятору никто не говорил, что там можно применить SIMD >(цикл vmovupd/vcmpltpd), но он сам догадался.
Delphi тоже про SIMD знает. Вплоть до 4.2. AVX на стадии разработки. В планах Embarcadero вроде есть. Ручная оптимизация по любому лучше. Я все оптимизирую сам. Мне не лень.
-
Сам компилятор Дельфи использует максимум SSE2 в скалярном режиме, сишные - до AVX-512 в векторном. Вся эта ветка наглядно показывает "прелести" ручной оптимизации, когда не хватает 3-х инструкций - и в 20 раз медленнее. Ну да ладно. Не лень - так не лень, что я буду уговаривать.
-
Причину в итоге нашли?
-
>Причину в итоге нашли? Неа. Объяснение только одно - работает эмулятор, а не железо. У многих тормоза с авэиксом. Куча аналогичных вопросов на интеле. Я их спросил, но пока молчат.
-
Я же выкладывал исправленную версию в (15). Правда, она все равно медленнее sse, но в разумных пределах медленнее.
-
invis © (16.06.18 04:02) [24] Эх Шаман Петрович! Счастья Вам! Учитывая, что объем данных в AVX больше в 2 раза, то получается AVX слегка быстрее читает из памяти, но в целом чуть медленнее XMM. Но думаю, что оптимизация это просто вопрос времени. В будущих поколениях CPU будет шустрее. Возможно ;)
-
В общем VZEROUPPER не очень помогает. Она что-то рушит, что нарушает вычисления. Без нее все считается правильно, а с ней быстро, но расчеты неправильные.
-
Переделай всю процедуру на AVX-команды, VZEROUPPER только в конце. Сишные компиляторы так делают, даже если работают со 128-битными векторами (xmm регистры), команды всё равно с префиксом "v". https://godbolt.org/g/8267vi
-
Всю процедуру невозможно переделать на 256 бит к сожалению. Эта процедура часть большей процедуры. Цикл отрисовки 3D-треугольника. В XMM-регистрах данные не рушатся, а у меня куча переменных в регистрах. VZEROUPPER трет их, а это значит, что нужна новая загрузка из памяти. Получаются AVX-тормоза. Кроме того некоторых AVX-команд просто нет в «природе». Это дополнительная конверсия данных из 256 бит в 128. Получается жуть и очень медленно. Разница по скорости в разы в пользу XMM.
Сейчас у меня есть новая XMM-версия с упакованными Double. По скорости приближается к Single.
Сцена XMM-Single ~150 fps (но тут не хватает точности) Еще бы пару бит :) Сцена XMM-Double ~100 fps (точности хватает) Сцена AVX ~25 fps (точности хватает)
В общем AVX пока отменяется.
-
Я думаю, все нужные команды в AVX есть, компиляторы же как-то справляются. Если есть рисование треугольника на Дельфи, без ассемблера - выкладывай, посмотрю.
-
>все нужные команды в AVX есть К сожалению нет. Есть только в AVX+AVX-2. У меня нет AVX-2 компилятора, чтобы опкоды взять.
>без ассемблера Без ассемблера в Delphi нельзя, т.к. в Delphi есть баг. Конверсия single-double автоматическая, что очень напрягает. Из-за этого расчеты неверные. Опция компилятора отключающая эту конверсию не работает. Все равно конвертит.
>выкладывай, посмотрю В паблик ни за что.
-
> У меня нет AVX-2 компилятора
FPC же, с параметрами -O4 -Opcoreavx2 -Cfavx2 -Cpcoreavx2
> Конверсия single-double автоматическая, что очень напрягает. > Из-за этого расчеты неверные. Опция компилятора отключающая > эту конверсию не работает.
Из single в double отключается. Или он ещё наоборот конвертит?
-
-
Ан нет. Извиняюсь. Все таки удалось заставить его чисто в 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
|