Russian Qt Forum
Ноябрь 25, 2024, 04:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Не масштабится :-(  (Прочитано 14082 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #30 : Март 12, 2021, 16:44 »

Написал пример С++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

Возможно и ошибся где-то. А так-то, сразу тестовая программка сильно помогла бы вникнуть в вопрос.
Попытки сделать лучше/аккуратнее были много раз, с тем же успехом. Это повторяется всякий раз с "слишком мелкими" задачами. Это пройденный этап

но для поставленных амбициозных целей явно не подходит).
Цитировать
Если не строить амбициозных планов - не будет выполнено никаких
Улыбающийся

В любом случае спасибо за пример современного кода.
« Последнее редактирование: Март 12, 2021, 16:59 от Igors » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Март 12, 2021, 16:57 »

Что функция рассчетов то делает?
Может она весь кэш процессора вышибает? Есть тулзы (по памяти не скажу) которые профилируют промахи кэша.
Может размер итерации не подогнан под размер кэшей?
Ещё подумать в сторону векторных операций, раза в 4 могут ускорить
CalcFaceNormal вычисляет нормаль к полигону как векторное произведение 3 вертексов (точек, позиций). Если полигон имеет 4 вертекса (как в данном случае) то вычисляются 2 нормали и осредняются (поэтому оформлено методом).

А можно поподробнее в сторону векторных операций? (сам просто сейчас занимаюсь вычислениями собственных значений и собственных векторов)   
В Bullet есть базовые векторные операции с использованием SIMD и.т.п. Насколько помню только для float (не double). Пробовал вкл/выкл, какого-то ощутимого эффекта не наблюдал. Вообще последние неск лет (если не больше) Bullet озабочен поддержкой OpenCL. Ну когда в последний раз обновлялся было "только для крутых карт"
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #32 : Март 12, 2021, 20:07 »

Цитировать
В Bullet есть базовые векторные операции с использованием SIMD и.т.п. Насколько помню только для float (не double). Пробовал вкл/выкл, какого-то ощутимого эффекта не наблюдал. Вообще последние неск лет (если не больше) Bullet озабочен поддержкой OpenCL. Ну когда в последний раз обновлялся было "только для крутых карт"
Я Armadillo  http://arma.sourceforge.net/ использую.. Она под капотом тоже ядрами шуршит.. Правда проблема в том, что нужно каждый раз убеждаться/гарантировать, что матрица эрмитова.. И во-вторых встречаются тройные циклы.. а это сразу ставит крест на распараллеливании..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #33 : Март 12, 2021, 22:52 »

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

Ну я не настоящий сварщик, но кажется что вот этот кусок
Код:
for (size_t j = 0; j < mNumVerPerFace; ++j)
dst[mNorIndex[i + j]] += faces[ i / mNumVerPerFace ];

можно делать векторно сразу чанками. другое дело что там как я понимаю даблы, а в регистр влезает только 2 дабла, так что с 4кратным ускорением я погорячился, кол-во операций только вдвое сократиться
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #34 : Март 13, 2021, 10:18 »

Цитировать
можно делать векторно сразу чанками. другое дело что там как я понимаю даблы, а в регистр влезает только 2 дабла, так что с 4кратным ускорением я погорячился, кол-во операций только вдвое сократиться

Боюсь, так просто не получится.. Там же ещё оператор += лочить нужно..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #35 : Март 13, 2021, 12:33 »

Она под капотом тоже ядрами шуршит..
Ну SIMD (sse, avx и.т.п.) это типа "мульти-команды", все в рамках одного ядра.

можно делать векторно сразу чанками. другое дело что там как я понимаю даблы, а в регистр влезает только 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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #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]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.109 секунд. Запросов: 23.