Сейчас на форуме: -Sanchez- (+8 невидимых)

 eXeL@B —› Основной форум —› Использование инструкций новых процессоров в Delphi
Посл.ответ Сообщение

Ранг: 6.7 (гость)
Активность: 0=0
Статус: Участник

Создано: 31 мая 2006 13:26
· Личное сообщение · #1

Можно ли в Delphi 2006 использовать инструкции типа mmx sse sse2 итд без использование ассемблера?



Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 31 мая 2006 13:38
· Личное сообщение · #2

Хороший вопрос ;)
А как ты себе это представляешь без ассемблера ? Тем более инструкции fpu
Компилятор сам решает - какие из них использовать, какие нет..

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels




Ранг: 34.9 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 31 мая 2006 23:11
· Личное сообщение · #3

Интересно, программировать на ассемблере без использования асемблера;) Возможно выбор есть в настройках компилятора...



Ранг: 160.1 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 31 мая 2006 23:50
· Личное сообщение · #4

Smonback_analys
ну например в intel c++ есть т.н. intrinisc операторы - именно для этой цели - без ассемблера.




Ранг: 116.9 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 01 июня 2006 00:36
· Личное сообщение · #5

имхо нет, во всяком случае не слышал о таком

-----
Nothing just happens. You choose it to happen.




Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 01 июня 2006 08:10
· Личное сообщение · #6

infern0 пишет:
ну например в intel c++

Никто и не спорит про c++, к тому же intel

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels




Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 01 июня 2006 13:47
· Личное сообщение · #7

по-моему это называется intrinsic и это нечто другое



Ранг: 20.3 (новичок)
Активность: 0.010
Статус: Участник

Создано: 01 июня 2006 14:25
· Личное сообщение · #8

Проверил "Delphi 10 Lite" . Настроек компилятора на использование mmx sse sse2 и т.д. нет. Хотя что там делаеться на самом низу - неизвестно. Хотя по опыту отладки скажу, что не используються.

Но есть компоненты, которые при работе определяют тип процессора и оптимизируют свою работу под конкретный тип проца. Для ускорения своих трудоемких вычислений.



Ранг: 6.7 (гость)
Активность: 0=0
Статус: Участник

Создано: 01 июня 2006 14:52
· Личное сообщение · #9

А кто!нибудб знает чем отличаются sse, sse2, sse3, sse4 и тд



Ранг: 145.8 (ветеран)
Активность: 0.070
Статус: Участник
www.int3.net

Создано: 01 июня 2006 15:34
· Личное сообщение · #10

Hellfire пишет:
А кто!нибудб знает чем отличаются sse, sse2, sse3, sse4 и тд

жжошь. SSEx - это названия новых групп команд. чем они могут отличаться? =)
и хватит уже от дельфи ожидать хорошего кода. не для этого оно предназначено.



Ранг: 6.7 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 июня 2006 16:30
· Личное сообщение · #11

Кстати FreePascal неплохая замена- с открытыми исходниками, мультиплатформенная и все такое...



Ранг: 78.3 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 02 июня 2006 16:34
· Личное сообщение · #12

Hellfire пишет:
А кто!нибудб знает чем отличаются sse, sse2, sse3, sse4 и тд

кто-нить знает ...



Ранг: 15.3 (новичок)
Активность: 0.020
Статус: Участник

Создано: 02 июня 2006 16:45
· Личное сообщение · #13

Hellfire пишет:
А кто!нибудб знает чем отличаются sse, sse2, sse3, sse4 и тд

sse - набор векторных команд для одновременной обработки(сложение итп) нескольких операндов
а в sse2, sse3 итд добавки новых команд к sse
вроде так
открой нормальную книгу по асму и посмотри если хочешь знать точнее




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 30 июня 2016 17:13 · Поправил: Isaev
· Личное сообщение · #14

Есть 2 буфера с данными одинакового размера, нужно их максимально быстро проXORить
можно это сделать ассемблерной вставкой с использованием SSE?
Или чем лучше? Главное по скорости оптимизировать. Просто XOR без ассемблера в цикле чисел размерности UInt64 не устраивает, нужно как-то ускорить.
Может кто-то то-то предложить?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 2.8 (гость), 3thx
Активность: 0=0
Статус: Участник

Создано: 30 июня 2016 17:20 · Поправил: dsrabot
· Личное сообщение · #15

Isaev
Да, я бы в делфи асм-вставкой сделал (если именно в делфи надо). А так вообще компили (та же студия) сами должны сделать это за тебя, помню смотрел защиту Sim Aquarium или как-то так, там помню сначала ксорилось по 128 бит через xmm-регистры, а остаток уже побайтно "добивался".
Делфи... ну по-моему не очень оптимально




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 30 июня 2016 17:26 · Поправил: Isaev
· Личное сообщение · #16

dsrabot остаток не важен, дешевле наверное мусор в конце заодно отксорить, чем добивать по-байтно. Просто выровняю их по границе и всё
dsrabot пишет:
ксорилось по 128 бит через xmm-регистры

примерчик можно как это выглядит на асме? Допустим на входе 2 указателя и размер

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 3.8 (гость), 2thx
Активность: 0.010
Статус: Участник

Создано: 30 июня 2016 17:45 · Поправил: Electric Wind
· Личное сообщение · #17

Isaev, проксорить об че? А так суть в movdqu(a)/movu(a)ps - pxor/xorps/xorpd и лучше чтоб буффер кратный 16-и был.
Code:
  1. procedure PackedXor(var A,B;const Size:Integer);
  2. asm
  3.   //rcx - A
  4.   //rdx - B
  5.   //r8d - Size
  6.   movdqa xmm0,dqword ptr [@@xordata]
  7.  
  8. @@loop:
  9.   movdqu    xmm1,[rcx]
  10.   movdqu    xmm2,[rdx]
  11.   pxor      xmm1,xmm0
  12.   pxor      xmm2,xmm0
  13.   movdqu    [rcx],xmm1
  14.   movdqu    [rdx],xmm2
  15.   add       rcx,16
  16.   add       rdx,16
  17.   sub       r8d,16
  18.   jg         @@loop
  19.   ret
  20.  
  21.   .ALIGN 16
  22. @@xordata: dd 123,123,123,123
  23. end;
Если размер небольшой лучше развернуть полностью.




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 30 июня 2016 18:05
· Личное сообщение · #18

Electric Wind пишет:
проксорить об че?

Допустим есть два массива...нужно получить first := first XOR second;
Electric Wind пишет:
Если размер небольшой лучше развернуть полностью.

развернуть не выйдет, т.к. размер плавающий до 11кб
в чем различие xorps и pxor? И ещё есть там команды в sse с использованием кеша и без, в данном случае это важно?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 3.8 (гость), 2thx
Активность: 0.010
Статус: Участник

Создано: 30 июня 2016 18:23 · Поправил: Electric Wind
· Личное сообщение · #19

Isaev пишет:
first := first XOR second;

Code:
  1. procedure PackedXor(const A,B:Pointer;const Size:Integer);
  2. asm
  3.   mov       r9d,r8d
  4.   shr       r9d,4      //div 16
  5.   jz        @@tail
  6.  
  7. @@large:
  8.   movdqu    xmm1,[rcx]
  9.   movdqu    xmm2,[rdx]
  10.   pxor      xmm1,xmm2
  11.   movdqu    [rcx],xmm1
  12.   add       rcx,16
  13.   add       rdx,16
  14.   sub       r9d,1
  15.   jg        @@large
  16.   mov       r9d,r8d
  17.   and       r9d,16
  18.   sub       r8d,r9d
  19.   jz        @@exit
  20.  
  21. @@tail:
  22.   mov       al,[rdx]
  23.   xor       [rcx],al
  24.   add       rdx,1
  25.   add       rcx,1
  26.   sub       r8d,1
  27.   jg        @@tail
  28.  
  29. @@exit:
  30. end;
Как пример с хвостом, но багнутый скорей всего давно не кодил
Isaev пишет:
в чем различие xorps и pxor?

Первая типа для плавающих чисел, а вторая для натуральных. Но это вроде как просто фикция.
Isaev пишет:
И ещё есть там команды в sse с использованием кеша и без, в данном случае это важно?
Хм, prefetchth/prefetchtw которые? Нет, частные случаи это все, редкие.

| Сообщение посчитали полезным: Isaev


Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 30 июня 2016 19:55 · Поправил: Isaev
· Личное сообщение · #20

Electric Wind пишет:
Первая типа для плавающих чисел, а вторая для натуральных.

для плавающих же xorpd, а эти обе для целых я всегда думал, но разницу не знаю
Electric Wind пишет:
Как пример с хвостом, но багнутый скорей всего

Это не страшно, главное есть что взять за основу... Завтра подправлю-затестю-отпишусь

Добавлено спустя 16 часов 17 минут
Мда, надо Delphi сначала до XE2 обновить, чтобы попробовать, у меня XE там нет ещё x64

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 02 июля 2016 17:10 · Поправил: Isaev
· Личное сообщение · #21

Electric Wind на счёт багнутого тебя чуйка не подвела ) Но подправил, довёл до рабочего состояния.
Стало работать в 2 раза быстрее, чем на Delphi без асма.
Ещё вопросик, если счётчики циклов влезают в 32 бита лучше 32битные регистры использовать или выиграешь по памяти, но по скорости проиграешь?

и проверку бита в байте быстрее через bt или через сдвиг через rcr делать? установка, наверно, через bts в любом случае будет быстрее?

ps: передача параметров почему-то не в RCX, RDX, R8 а в RDX, R8, R9 прошла... вроде везде написано, что первые три параметра в RCX, RDX, R8 должны передаваться... Никто не в курсе причины?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 431.7 (мудрец), 389thx
Активность: 0.730.32
Статус: Участник

Создано: 02 июля 2016 20:17
· Личное сообщение · #22

Было бы интересно узнать о реальных результатах такой оптимизации.



Ранг: 4.5 (гость)
Активность: 0.020
Статус: Участник

Создано: 03 июля 2016 19:03
· Личное сообщение · #23

Легче на си перейти там все можно!!



Ранг: 3.8 (гость), 2thx
Активность: 0.010
Статус: Участник

Создано: 09 июля 2016 14:31 · Поправил: Electric Wind
· Личное сообщение · #24

Isaev пишет:
передача параметров почему-то не в RCX, RDX, R8 а в RDX, R8, R9 прошла... вроде везде написано, что первые три параметра в RCX, RDX, R8 должны передаваться... Никто не в курсе причины?

Если процедура/функция это метода объекта/класса/интерфейса, то в rcx сначала всегда идет Self, и только затем реальные аргументы. Получится rdx(xmm1),r8(xmm2),r9(xmm3), а остальное через стек.

Isaev пишет:
и проверку бита в байте быстрее через bt или через сдвиг через rcr делать? установка, наверно, через bts в любом случае будет быстрее?

Я лично всегда через test/or проверяю/ставлю, до тех пор пока операнд регистр разницы быть не должно, а если вдруг память то bt-подобные в 10 раз медленней, грубо так. Есть таблица, нужно смотреть: www.agner.org/optimize/instruction_tables.pdf

Isaev пишет:
Ещё вопросик, если счётчики циклов влезают в 32 бита лучше 32битные регистры использовать или выиграешь по памяти, но по скорости проиграешь?
Скорость не теряется и проблем точно меньше будет с огромными массивами данных.
Я тут недельку покодил вектор из банальных int64, при определенном огромном индексе в Get я никогда не получил бы значения того элемента, т.к. компилятор накодил вычисление дельты для указателя на элемент на основе 32-битных регистров из-за того, что у меня кол-во хранится в Integer и сам индекс соответственно Integer. Пофиксить можно, переведя все на NativeInt, либо привести все integer к int64 вручную, но у меня под асмом ради фана, было проще))

| Сообщение посчитали полезным: Isaev
 eXeL@B —› Основной форум —› Использование инструкций новых процессоров в Delphi
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати