Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2

Опкоды 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 раз медленнее.
Ну да ладно. Не лень - так не лень, что я буду уговаривать.


имя   (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


Страницы: 1 2 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо