2010-05-10 2 views
0

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

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

В случае Nbody задачи вычисления для каждого взаимодействия тела тела точно так же (страница 682):

bodyBodyInteraction(float4 bi, float4 bj, float3 ai) 

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

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

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

ответ

2

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

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

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

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

  • это нормально, чтобы иметь некоторое расхождение

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

+0

Ну, я думаю, просто зайдите на sciencedirect.com и введите cuda - хорошее начало. По крайней мере, я прочитал несколько интересных статей, задав эти вопросы. Thx для вашего ответа. – Nils

Смежные вопросы