Как скопировать kd-дерево с хоста на драйвер в cuda - PullRequest
0 голосов
/ 16 января 2020

У меня есть структура данных дерева kd, подобная этой

class KDTree{
   KDNode *root;
}
class KDNode{
   std::vector<Triangle*> triangles;//if isLeaf then triangles.size()=0
   AABB aabb;
   KDNode *left,*right;
   bool isLeaf;
}
class Triangle{
   Point3D p1,p2,p3;
}
class AABB{
   Point3D mins,maxs;
}

Я могу использовать эту структуру данных в CPU, теперь я хочу скопировать это дерево в GPU (построил дерево на CPU).

Я не совсем уверен, как этого добиться.

1 Ответ

1 голос
/ 16 января 2020

У вас есть две проблемы:

  1. Поскольку вы (вероятно) выделяете узлы по отдельности и по отдельности, у вас есть большое количество разрозненных областей памяти, которые вам нужно скопировать, то есть большое количество API CUDA требует выполнения.
  2. Даже когда вы копируете разные узлы - они указывают на узлы на хосте, а не на копии - так что вам придется везде менять указатели. Много времени и усилий.

Возможные решения:

  1. Измените ваше представление дерева так, чтобы все узлы были в одном большом массиве узлов (который вы выращиваете как необходимо); и вместо указателей вы используете индексы в этом массиве. Теперь вам просто нужно скопировать некоторые root данные и этот один (большой) массив; и обновить адрес массива в версии на стороне устройства.
  2. Используйте средства выделения CUDA для выделения управляемой памяти - доступной по одному и тому же адресу как из устройства CUDA (GPU), так и из хост. Таким образом, вам не нужно ничего явно копировать, и вы можете сохранить указатели с одинаковым значением. Конечно, это снижает производительность.

Примечание: древовидные структуры довольно неэффективны для использования в CUDA: как правило, разные потоки расходятся, и много времени тратится на "отслеживание указателя" - сделать один косвенный доступ за другим, а другой и так далее. Поэтому не ясно, получите ли вы большую пользу от использования графического процессора с такой структурой.

...