Решение проблем, связанных с более сложными структурами данных, с помощью CUDA - PullRequest
0 голосов
/ 11 мая 2010

Итак, я прочитал немного о программировании на CUDA и GPU. Я заметил несколько вещей, таких как медленный доступ к глобальной памяти (поэтому следует использовать общую память) и то, что путь выполнения потоков в деформации не должен расходиться.

Я также рассмотрел пример умножения (плотной) матрицы, описанный в руководстве для программистов, и проблему nbody . И хитрость с реализацией кажется такой же: организовать вычисления в сетке (что уже происходит в случае матрицы mul); затем разделите сетку на меньшие плитки; извлекайте плитки в общую память и позволяйте потокам рассчитывать как можно дольше, пока не потребуется перезагрузить данные из глобальной памяти в общую память.

В случае проблемы nbody расчеты для каждого взаимодействия тело-тело абсолютно одинаковы (стр. 682):

bodyBodyInteraction(float4 bi, float4 bj, float3 ai) 

Требуется два тела и векторы ускорения. Вектор тела имеет четыре составляющих: его положение и вес. При чтении статьи расчет легко понять.

Но что, если у нас есть более сложный объект с динамической структурой данных? А пока предположим, что у нас есть объект (похожий на объект body, представленный в статье), у которого есть список других прикрепленных объектов, а количество прикрепленных объектов различно в каждом потоке. Как я могу реализовать это без различий между путями выполнения потоков?

Я также ищу литературу, которая объясняет, как различные алгоритмы, использующие более сложные структуры данных, могут быть эффективно реализованы в CUDA.

1 Ответ

2 голосов
/ 11 мая 2010

Ваш вопрос несколько общий, поэтому здесь пара общих подходов:

  • дополняет ваши данные таким образом, чтобы все объекты одного размера (например, нули)

  • реорганизовать ваши аналогичные данные, чтобы они поместились в деформации, расхождение происходит только внутри деформации, а не в нескольких деформациях

  • поток в деформации всегда синхронизирован. Если возможно и необходимо, разделите ваши данные на степени 2, меньшие 33, чтобы избежать явной синхронизации.

  • нормально иметь некоторое расхождение

  • использовать шаблоны C ++, если это помогает, для управления потоком ядра.

...