Comments 4
Отличная статья!
Спасибо за ссылку на космиков ) кстати, в них уже можно поиграть
Динамическое формирование связей и валентности — одна из самых интересных задач, с которыми сталкиваешься в GPGPU, особенно интересно найти способ обеспечить максимальную производительность
По опыту — все упирается именно в проверку «нет ли уже связи с этой частицей» — цикл который сверяет id'шники в разы снижает FPS по сравнению с обычным particles collider'ом
Лучшее по производительности решение видел в Jelly in the Sky (которые танки на видеокарте) — путем хардкода максимального количества связей и организации проверки на «уже есть связь» развертыванием цикла в if (id != conn.x && id != conn.y && id != conn.z &&… )
конечно, ломается вся красота — но очень круто оптимизирует
второй момент — это блокировки атомов для совершения операции, это дорого в коллайдере, без этого почти можно обойтись, если всегда формировать связь ОТ атома с меньшим id К атому с большим id (исключаем A->B B->A гонку), и отдельно атомарно счетчик валентностей обрабатывать
ну и, формирование связей чаще всего выгодно обрабатывать реже чем каждый кадр — раз в N шагов симуляции
Спасибо за ссылку на космиков ) кстати, в них уже можно поиграть
Динамическое формирование связей и валентности — одна из самых интересных задач, с которыми сталкиваешься в GPGPU, особенно интересно найти способ обеспечить максимальную производительность
По опыту — все упирается именно в проверку «нет ли уже связи с этой частицей» — цикл который сверяет id'шники в разы снижает FPS по сравнению с обычным particles collider'ом
Лучшее по производительности решение видел в Jelly in the Sky (которые танки на видеокарте) — путем хардкода максимального количества связей и организации проверки на «уже есть связь» развертыванием цикла в if (id != conn.x && id != conn.y && id != conn.z &&… )
конечно, ломается вся красота — но очень круто оптимизирует
второй момент — это блокировки атомов для совершения операции, это дорого в коллайдере, без этого почти можно обойтись, если всегда формировать связь ОТ атома с меньшим id К атому с большим id (исключаем A->B B->A гонку), и отдельно атомарно счетчик валентностей обрабатывать
ну и, формирование связей чаще всего выгодно обрабатывать реже чем каждый кадр — раз в N шагов симуляции
+1
Отличная статья!
спасибо
По опыту — все упирается именно в проверку «нет ли уже связи с этой частицей»
В моих задачах пока достаточно решения с массивом parents, связываем две частицы:
parents[i] = j;
parents[j] = i;
Этого хватает, если у одного из связанных атомов не больше двух связей. В оксидных системах это выполняется. При попытке связывания выполняем проверку
if ((parents[i] != j) && (parents[j] != i))
второй момент — это блокировки атомов для совершения операции, это дорого в коллайдере, без этого почти можно обойтись, если всегда формировать связь ОТ атома с меньшим id К атому с большим id (исключаем A->B B->A гонку), и отдельно атомарно счетчик валентностей обрабатывать
не совсем понял, о чём речь
ну и, формирование связей чаще всего выгодно обрабатывать реже чем каждый кадр — раз в N шагов симуляции
У меня нет визуализации и вряд ли будет.
+1
Sign up to leave a comment.
Перенос молекулярной динамики на CUDA. Часть III: Внутримолекулярное взаимодействие