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