Итак, я немного прочитал о программировании CUDA и GPU. Я заметил несколько таких вещей, что доступ к глобальной памяти медленный (поэтому следует использовать общую память) и что путь выполнения потоков в warp не должен расходиться.Решение проблем, связанных с более сложными структурами данных с CUDA
Я также рассмотрел пример плотного матричного умножения, описанный в руководстве для программистов и nbody problem. И трюк с реализацией кажется одинаковым: упорядочить вычисление в сетке (которая уже есть в случае матрицы mul); затем разделите сетку на более мелкие плитки; извлеките плитки в разделяемую память и дайте потокам вычислять как можно дольше, пока не потребуется перезагрузить данные из глобальной памяти в общую память.
В случае Nbody задачи вычисления для каждого взаимодействия тела тела точно так же (страница 682):
bodyBodyInteraction(float4 bi, float4 bj, float3 ai)
Он принимает два тела и векторы ускорения. Вектор тела имеет четыре компонента: его положение и вес. При чтении бумаги расчет легко понимается.
Но что, если у нас есть более сложный объект с динамической структурой данных? Пока просто предположим, что у нас есть объект (похожий на объект тела, представленный в документе), который имеет список других прикрепленных объектов, а количество прикрепленных объектов в каждом потоке отличается. Как я мог реализовать это без отклонения путей выполнения потоков?
Я также ищу литературу, в которой объясняется, как различные алгоритмы, включающие более сложные структуры данных, могут быть эффективно реализованы в CUDA.
Ну, я думаю, просто зайдите на sciencedirect.com и введите cuda - хорошее начало. По крайней мере, я прочитал несколько интересных статей, задав эти вопросы. Thx для вашего ответа. – Nils