Сейчас на форуме: -Sanchez- (+8 невидимых) |
eXeL@B —› Основной форум —› Использование инструкций новых процессоров в Delphi |
Посл.ответ | Сообщение |
|
Создано: 31 мая 2006 13:26 · Личное сообщение · #1 |
|
Создано: 31 мая 2006 13:38 · Личное сообщение · #2 |
|
Создано: 31 мая 2006 23:11 · Личное сообщение · #3 |
|
Создано: 31 мая 2006 23:50 · Личное сообщение · #4 |
|
Создано: 01 июня 2006 00:36 · Личное сообщение · #5 |
|
Создано: 01 июня 2006 08:10 · Личное сообщение · #6 |
|
Создано: 01 июня 2006 13:47 · Личное сообщение · #7 |
|
Создано: 01 июня 2006 14:25 · Личное сообщение · #8 Проверил "Delphi 10 Lite" . Настроек компилятора на использование mmx sse sse2 и т.д. нет. Хотя что там делаеться на самом низу - неизвестно. Хотя по опыту отладки скажу, что не используються. Но есть компоненты, которые при работе определяют тип процессора и оптимизируют свою работу под конкретный тип проца. Для ускорения своих трудоемких вычислений. |
|
Создано: 01 июня 2006 14:52 · Личное сообщение · #9 |
|
Создано: 01 июня 2006 15:34 · Личное сообщение · #10 |
|
Создано: 02 июня 2006 16:30 · Личное сообщение · #11 |
|
Создано: 02 июня 2006 16:34 · Личное сообщение · #12 |
|
Создано: 02 июня 2006 16:45 · Личное сообщение · #13 |
|
Создано: 30 июня 2016 17:13 · Поправил: Isaev · Личное сообщение · #14 Есть 2 буфера с данными одинакового размера, нужно их максимально быстро проXORить можно это сделать ассемблерной вставкой с использованием SSE? Или чем лучше? Главное по скорости оптимизировать. Просто XOR без ассемблера в цикле чисел размерности UInt64 не устраивает, нужно как-то ускорить. Может кто-то то-то предложить? ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 30 июня 2016 17:20 · Поправил: dsrabot · Личное сообщение · #15 Isaev Да, я бы в делфи асм-вставкой сделал (если именно в делфи надо). А так вообще компили (та же студия) сами должны сделать это за тебя, помню смотрел защиту Sim Aquarium или как-то так, там помню сначала ксорилось по 128 бит через xmm-регистры, а остаток уже побайтно "добивался". Делфи... ну по-моему не очень оптимально |
|
Создано: 30 июня 2016 17:26 · Поправил: Isaev · Личное сообщение · #16 dsrabot остаток не важен, дешевле наверное мусор в конце заодно отксорить, чем добивать по-байтно. Просто выровняю их по границе и всё dsrabot пишет: ксорилось по 128 бит через xmm-регистры примерчик можно как это выглядит на асме? Допустим на входе 2 указателя и размер ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 30 июня 2016 17:45 · Поправил: Electric Wind · Личное сообщение · #17 Isaev, проксорить об че? А так суть в movdqu(a)/movu(a)ps - pxor/xorps/xorpd и лучше чтоб буффер кратный 16-и был. Code:
|
|
Создано: 30 июня 2016 18:05 · Личное сообщение · #18 Electric Wind пишет: проксорить об че? Допустим есть два массива...нужно получить first := first XOR second; Electric Wind пишет: Если размер небольшой лучше развернуть полностью. развернуть не выйдет, т.к. размер плавающий до 11кб в чем различие xorps и pxor? И ещё есть там команды в sse с использованием кеша и без, в данном случае это важно? ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 30 июня 2016 18:23 · Поправил: Electric Wind · Личное сообщение · #19 Isaev пишет: first := first XOR second; Code:
Isaev пишет: в чем различие xorps и pxor? Первая типа для плавающих чисел, а вторая для натуральных. Но это вроде как просто фикция. Isaev пишет: И ещё есть там команды в sse с использованием кеша и без, в данном случае это важно? Хм, prefetchth/prefetchtw которые? Нет, частные случаи это все, редкие. | Сообщение посчитали полезным: Isaev |
|
Создано: 30 июня 2016 19:55 · Поправил: Isaev · Личное сообщение · #20 Electric Wind пишет: Первая типа для плавающих чисел, а вторая для натуральных. для плавающих же xorpd, а эти обе для целых я всегда думал, но разницу не знаю Electric Wind пишет: Как пример с хвостом, но багнутый скорей всего Это не страшно, главное есть что взять за основу... Завтра подправлю-затестю-отпишусь Добавлено спустя 16 часов 17 минут Мда, надо Delphi сначала до XE2 обновить, чтобы попробовать, у меня XE там нет ещё x64 ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 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 |
|
Создано: 02 июля 2016 20:17 · Личное сообщение · #22 |
|
Создано: 03 июля 2016 19:03 · Личное сообщение · #23 |
|
Создано: 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 |