Russian Qt Forum
Ноябрь 25, 2024, 04:14
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Многопоточное программирование, процессы
>
Не масштабится :-(
Страниц:
1
2
[
3
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Не масштабится :-( (Прочитано 14082 раз)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Не масштабится :-(
«
Ответ #30 :
Март 12, 2021, 16:44 »
Цитата: ssoft от Март 12, 2021, 12:43
Написал пример С++17. Ускорение есть какое-то в пару раз,
У меня
Цитировать
thread_count = 4
CPolySDS
Elapsed time: 0.227074
Elapsed time: 0.227558
Elapsed time: 0.225033
Elapsed time: 0.222763
Elapsed time: 0.222815
Elapsed time: 0.222428
Elapsed time: 0.22306
Elapsed time: 0.224589
Elapsed time: 0.224249
Elapsed time: 0.224587
Full elapsed time: 2.2442
Elapsed time per iter: 0.22442
AsyncPolySDS
Elapsed time: 0.236807
Elapsed time: 0.237081
Elapsed time: 0.238491
Elapsed time: 0.237987
Elapsed time: 0.237772
Elapsed time: 0.237463
Elapsed time: 0.240055
Elapsed time: 0.238495
Elapsed time: 0.237988
Elapsed time: 0.238507
Full elapsed time: 2.3807
Elapsed time per iter: 0.23807
ThreadPoolPolySDS
Elapsed time: 0.247039
Elapsed time: 0.219629
Elapsed time: 0.21941
Elapsed time: 0.24533
Elapsed time: 0.215234
Elapsed time: 0.21727
Elapsed time: 0.233359
Elapsed time: 0.219943
Elapsed time: 0.216455
Elapsed time: 0.231909
Full elapsed time: 2.26561
Elapsed time per iter: 0.226561
Цитата: ssoft от Март 12, 2021, 12:43
Возможно и ошибся где-то. А так-то, сразу тестовая программка сильно помогла бы вникнуть в вопрос.
Попытки сделать лучше/аккуратнее были много раз, с тем же успехом. Это повторяется всякий раз с "слишком мелкими" задачами. Это пройденный этап
Цитата: ssoft от Март 12, 2021, 12:43
но для поставленных амбициозных целей явно не подходит).
Цитировать
Если не строить амбициозных планов - не будет выполнено никаких
В любом случае спасибо за пример современного кода.
«
Последнее редактирование: Март 12, 2021, 16:59 от Igors
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Не масштабится :-(
«
Ответ #31 :
Март 12, 2021, 16:57 »
Цитата: Авварон от Март 12, 2021, 11:54
Что функция рассчетов то делает?
Может она весь кэш процессора вышибает? Есть тулзы (по памяти не скажу) которые профилируют промахи кэша.
Может размер итерации не подогнан под размер кэшей?
Ещё подумать в сторону векторных операций, раза в 4 могут ускорить
CalcFaceNormal вычисляет нормаль к полигону как векторное произведение 3 вертексов (точек, позиций). Если полигон имеет 4 вертекса (как в данном случае) то вычисляются 2 нормали и осредняются (поэтому оформлено методом).
Цитата: m_ax от Март 12, 2021, 12:59
А можно поподробнее в сторону векторных операций? (сам просто сейчас занимаюсь вычислениями собственных значений и собственных векторов)
В Bullet есть базовые векторные операции с использованием SIMD и.т.п. Насколько помню только для float (не double). Пробовал вкл/выкл, какого-то ощутимого эффекта не наблюдал. Вообще последние неск лет (если не больше) Bullet озабочен поддержкой OpenCL. Ну когда в последний раз обновлялся было "только для крутых карт"
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Не масштабится :-(
«
Ответ #32 :
Март 12, 2021, 20:07 »
Цитировать
В Bullet есть базовые векторные операции с использованием SIMD и.т.п. Насколько помню только для float (не double). Пробовал вкл/выкл, какого-то ощутимого эффекта не наблюдал. Вообще последние неск лет (если не больше) Bullet озабочен поддержкой OpenCL. Ну когда в последний раз обновлялся было "только для крутых карт"
Я Armadillo
http://arma.sourceforge.net/
использую.. Она под капотом тоже ядрами шуршит.. Правда проблема в том, что нужно каждый раз убеждаться/гарантировать, что матрица эрмитова.. И во-вторых встречаются тройные циклы.. а это сразу ставит крест на распараллеливании..
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Не масштабится :-(
«
Ответ #33 :
Март 12, 2021, 22:52 »
Цитата: m_ax от Март 12, 2021, 12:59
А можно поподробнее в сторону векторных операций? (сам просто сейчас занимаюсь вычислениями собственных значений и собственных векторов)
Ну я не настоящий сварщик, но кажется что вот этот кусок
Код:
for (size_t j = 0; j < mNumVerPerFace; ++j)
dst[mNorIndex[i + j]] += faces[ i / mNumVerPerFace ];
можно делать векторно сразу чанками. другое дело что там как я понимаю даблы, а в регистр влезает только 2 дабла, так что с 4кратным ускорением я погорячился, кол-во операций только вдвое сократиться
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Не масштабится :-(
«
Ответ #34 :
Март 13, 2021, 10:18 »
Цитировать
можно делать векторно сразу чанками. другое дело что там как я понимаю даблы, а в регистр влезает только 2 дабла, так что с 4кратным ускорением я погорячился, кол-во операций только вдвое сократиться
Боюсь, так просто не получится.. Там же ещё оператор += лочить нужно..
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Не масштабится :-(
«
Ответ #35 :
Март 13, 2021, 12:33 »
Цитата: m_ax от Март 12, 2021, 20:07
Она под капотом тоже ядрами шуршит..
Ну SIMD (sse, avx и.т.п.) это типа "мульти-команды", все в рамках одного ядра.
Цитата: Авварон от Март 12, 2021, 22:52
можно делать векторно сразу чанками. другое дело что там как я понимаю даблы, а в регистр влезает только 2 дабла, так что с 4кратным ускорением я погорячился, кол-во операций только вдвое сократиться
Ну программировать на уровне этих команд - это верный путь в дурдом
Там много всяких фокусов что надо знать (наблюдал в исходниках Embree). Чисто из общих соображений думаю на ощутимый "выйгрышь" рассчитывать не приходится. Ну да, += сделаем одной командой, там кстати 4-байтовые флоты. Так ведь на каждой итерации надо обратиться по (другому) индексу. Вот если бы весь вектор впарить одной командой - то была бы моща. Но так обычно удается лишь при совсем уж тупой работе с пыкселями. Да и локер та еще PITA.
На всякий случай расскажу алгоритм/данные. Банальное (или самое простое) "data per vertex". Вектор pos содержит тройки флотов (x, y, z координаты). Вектор индексов, пример
((0, 1, 3, 2), (4, 5, 1, 0) ...)
Хранятся (сплошняком) индексы в массиве pos. Первый фейс ссылается на первую четверку индексов, второй на вторую и.т.д. Индексы могут повторяться, напр выше первые 2 фейса шарят ребро 0,1. Считаем нормаль к фейсу и тут же добавляем ее ко всем выходным вертексным нормалям этого фейса.
Заметим что такой (самый простой) расчет - не единственный, напр нормали могут осредняться и с разными весами. Не то чтобы это "надо тоже делать", нет, но подумать перед тем как начинать "большую войну за скорость"
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Не масштабится :-(
«
Ответ #36 :
Март 15, 2021, 11:43 »
Ну ладно, так как же все-таки задействовать GPU? Глянем в дусте: есть boost::compute. Бегло глянул, прочел
статейку
на хабре
Насколько понял, обертка над OpenCL. Смысл тот же что и в тыцнутом thrust. Есть достаточно удобные ф-ции для обмена векторами между GPU <-> CPU. Конечно они не бесплатны по скорости, а если данных мало - может ничего и не ускорим, а наоборот. Ну ладно, считаем что это нормальная, неизбежная проблема.
А вот что собсно с самими расчетами? Тут мрачно. В примерах показывается вызов стандартных built-in ф-ций. Остается вызов кастомной ф-ции (что-то типа шейдера в OpenGL). В бусте такое есть, упомянутая статья приводит охренительный пример
Цитировать
BOOST_COMPUTE_FUNCTION(float,
add,
(float x, float y),
{ return x + y; });
И по сути все, управился. Вот же гад
А по индексу как? В OpenGL это возможно, нужно загнать данные в текстуру, а потом texelFetch (точно не помню). Стало быть, и здесь должно быть. Но пока не нашел. Возможно лучше юзать просто OpenCL
Да, а почему же никто не горит желанием овладевать "новыми технологиями"?
Может все ими давно уже владеют, только старый ретроград все не сообразит что и как
Записан
Страниц:
1
2
[
3
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...