· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› SSE2

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Мар 26, 2003 16:40:15

Народ, видел кто-нить примеры по использованию сабжа (именно примеры а не доки)?
Было бы интересно посмотреть на примеры реализации простейших функций типа скалярного произведения 2D/3D векторов и т.п.
А то я вот попробовал написать ради интереса, и не знаю, оптимально или нет.


Дата: Мар 31, 2003 17:20:26

Если кому интересно, дописал я эту хреновину (см. выше). Взял достаточно типичную задачу:
Есть массив 2D треугольников. Определить, в какой треугольник попадает заданная 2D точка.

Результаты следующие:
1. На Delphi - 260 мс.
2. На FPU - 90 мс
3. На SSE2 - 60 мс.

Если кому интересно, могу дать исходники.
Имеющийся код далеко не претендует на образец оптимизации... пока. Вообще, было бы хорошо, общими усилиями оптимизировать это дело.
А то, IMHO, хреновиной занимаетесь - то "Hello world в 12 байт", то еще че :((
Нет, чтобы че нить полезное сделать...


Дата: Апр 1, 2003 14:52:42

после 6 часов ночной оптимизации получено следующее:
1. Делфи - 100 мс + компиляция с оптимизацией
2. FPU - 40 мс
3. SSE2 - 50 мс

может кто объяснить в чем же прелесть SSE2?
самое смешное, что код для SSE2 короче, чем для FPU, а работает дольше.
кто нибудь тут вообще оптимизацией занимался?


Дата: Июл 15, 2003 17:06:01

Я тоже занимаюсь оптимизацией на SSE!!!
Но результаты тоже довольно скромные!!! что на написано на C - сделал с SSE и работает в 2 раза быстрее!! Задумки есть что нужно буфер научиться использовать!! Команда prefetcht и поспотреть все инструкции в микрооперациях!! Если кто знает подскажите плиз!!


Дата: Июл 15, 2003 17:50:42

Аноним
А что такое Edmond@wasm.ru -- и ваши исходники плиз...
Я всегда рад хорошим исходникам.


Дата: Июл 15, 2003 17:55:24

А в коллекции уже есть подобные исходники??? чтобы посмотреть как люди делают??? На сайте я не видел??


Дата: Июл 15, 2003 17:59:11

Я тоже -- это будет первый!!!


Дата: Июл 15, 2003 18:17:00

Ну наконец-то хоть кто-то заинтересовался...
Осталось только найти исходники - я давно забил на это дело.
На днях кину Эдмонду (если найду), может общими усилиями научимся чему нибудь...


Дата: Июл 15, 2003 18:23:43

Я готов!! Только побыстрее бы!!!!


Дата: Июл 15, 2003 19:18:23

Вопрос админам...
Почему данная тема не появляется у меня (про других незнаю) в списке "Последние обсуждения"?
Жал рефреш, нифига :(


Дата: Июл 15, 2003 19:25:39

Ну что там с исходниками??? надо КЭШ ботанить!!!


Дата: Июл 16, 2003 12:46:17

Max
Очень странно. А вы уверены, что рефрешь верно сработал?


Дата: Июл 16, 2003 13:09:24

Edmond
Абсолютно, и такое уже давно. Данную ветку приходится искать через поиск.

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

Для себя я изначально сформулировал следующую задачу:
Дано: массив 2D треугольников
Найти: индекс треугольника, в который попадает заданная 2D точка.
Прим.:
а) значения координат - целочисленные (32 бит), при вычислениях использовать double (64 бит) для избежания потери точности.
б) при попадании точки на ребро треугольника, считать, что точка принадлежит треугольнику.

Типа фичи:
1. Написано на паскале ;).
2. Компилить под Делфи7 - более ранние версии не понимают SSE2 мнемоник, а писАть в байт-кодах - это мазохизм.
3. Уж не помню, как это называется по научному, но для представления данных используется отдельно массив X и Y координат (а не array of record), просто мне показалось, что так будет алгоритмически проще.
4. Не используется выравниваение памяти на 16 байт (а соответсвенно и команд типа movdqa) - выравнивание троек координат на 16 байт увеличивает расход памяти существенно, а выйгрыш по скорости очччень небольшой (порядка единиц процентов).
5. Под массив координат выделяется на 4 байта больше, т.к. фактически координаты грузятся в XMM регистр четверками а не тройками.
6. Для ускорения развернут цикл вычисления знака расстояния от точки до прямой, совпадающей с ребром треугольника.

Алгоритмически все три процедуры (Find_SSE2, Find_FPU, Find) эквивалентны. Для SSE2 дан подробный комментарий происходящего, для чистого паскаля и так все ясно.
Отлаживать это дело было весело, т.к. делфя не показывает состояние xmm регистров.
После каждой асмовской строчки шел вызов типа call SaveXmm, где все xmm регистры перегонялись в глобальные переменные, наблюдаемые в окне Watch.
Эти куски кода я давно грохнул физически, так что если кому надо - придется повторить самостоятельно.
Да и делфевый отладчик постоянно глючит при работе с SSE.
В экзампле тестируется худший вариант, когда точка не попадает ни в один из треугольников.
На моем P4, 2.4 MHz, RAM 512 Mb 533 MHz, 1Е6 треугольников, результаты следующие:

1. SSE2 = 48 ms
2. FPU = 35 ms
3а. PAS с оптимизацией = 89 ms
3б. PAS без оптимизации = 203 ms

З.Ы. У кого нету Делфи7, в комплекте идет екзешник откомпилированный с оптимизацией.

З.Ы.Ы. Хотелось бы увидеть/услышать идеи или примеры оптимизации всего этого дела.

868726695__sse2demo.zip


Дата: Июл 16, 2003 13:21:31

Max
Спасибо поглядим


Дата: Июл 16, 2003 13:54:14

ошибочку там нашел...
в методах Get/SetTriangles стоит ofs:=Index shl 2. Это осталось со старых времен, когда записи были выровнены.
Надо поставить ofs:=Index*3. В примере это не используется, так что и так работать будет.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.046