eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: daFix (+2 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

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

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

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

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


Ранг: 500.5 (!)
Статус: Участник

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

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

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

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

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

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

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

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


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

Создано: 1 июня 2006 00:36 New!
Цитата · Личное сообщение · #5

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


Ранг: 500.5 (!)
Статус: Участник

Создано: 1 июня 2006 08:10 New!
Цитата · Личное сообщение · #6

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

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

Ранг: 516.1 (!)
Статус: Участник

Создано: 1 июня 2006 13:47 New!
Цитата · Личное сообщение · #7

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

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

Создано: 1 июня 2006 14:25 New!
Цитата · Личное сообщение · #8

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

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

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

Создано: 1 июня 2006 14:52 New!
Цитата · Личное сообщение · #9

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

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

Создано: 1 июня 2006 15:34 New!
Цитата · Личное сообщение · #10

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

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

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

Создано: 2 июня 2006 16:30 New!
Цитата · Личное сообщение · #11

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

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

Создано: 2 июня 2006 16:34 New!
Цитата · Личное сообщение · #12

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

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

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

Создано: 2 июня 2006 16:45 New!
Цитата · Личное сообщение · #13

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

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


Ранг: 752.7 (! !)
Статус: Участник
Student

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

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

Ранг: 2.8 (гость)
Статус: Участник

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

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


Ранг: 752.7 (! !)
Статус: Участник
Student

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

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

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

Ранг: 3.8 (гость)
Статус: Участник

Создано: 30 июня 2016 17:45 · Поправил: 30 июня 2016 17:45 Electric Wind New!
Цитата · Личное сообщение · #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;
Если размер небольшой лучше развернуть полностью.


Ранг: 752.7 (! !)
Статус: Участник
Student

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

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

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

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

Ранг: 3.8 (гость)
Статус: Участник

Создано: 30 июня 2016 18:23 · Поправил: 30 июня 2016 18:38 Electric Wind New!
Цитата · Личное сообщение · #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



Ранг: 752.7 (! !)
Статус: Участник
Student

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

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

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

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

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


Ранг: 752.7 (! !)
Статус: Участник
Student

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

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

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

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

Ранг: 382.5 (мудрец)
Статус: Участник

Создано: 2 июля 2016 20:17 New!
Цитата · Личное сообщение · #22

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

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

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

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

Ранг: 3.8 (гость)
Статус: Участник

Создано: 9 июля 2016 14:31 · Поправил: 9 июля 2016 14:32 Electric Wind New!
Цитата · Личное сообщение · #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

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS