Почему мой код pcl cuda работает в CPU, а не в GPU? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть код, в котором я использую пространство имен pcl / gpu:

pcl::gpu::Octree::PointCloud clusterCloud;
clusterCloud.upload(cloud_filtered->points);

pcl::gpu::Octree::Ptr octree_device (new pcl::gpu::Octree);
octree_device->setCloud(clusterCloud);
octree_device->build();

/*tree->setCloud (clusterCloud);*/

// Create the cluster extractor object for the planar model and set all the parameters
std::vector<pcl::PointIndices> cluster_indices;
pcl::gpu::EuclideanClusterExtraction ec;
ec.setClusterTolerance (0.1);
ec.setMinClusterSize (2000);
ec.setMaxClusterSize (250000);
ec.setSearchMethod (octree_device);
ec.setHostCloud (cloud_filtered);

ec.extract (cluster_indices);

Я установил CUDA и включил необходимые pcl / gpu ".hpp" для этого.Он компилируется (у меня есть рабочее пространство с ROS), и когда я запускаю, он работает очень медленно.Я использовал nvidia-smi, и мой код работает только в ЦП, и я не знаю, почему и как его решить.

Этот код является реализацией примера gpu / сегментации здесь: ПКЛ / seg.cpp

1 Ответ

0 голосов
/ 15 февраля 2019

(Делая это ответом, потому что это слишком долго для комментария.)

Я не знаю pcl, но, возможно, это потому, что вы передаете на стороне хоста std::vector, а не данные, которые находятся на устройствеside.

... что такое "сторона хоста" и "сторона устройства", спросите вы?А что такое std?

Ну, std - это просто пространство имен , используемое стандартной библиотекой C ++.std::vector - это (шаблонный) класс в стандартной библиотеке C ++, который динамически распределяет память для элементов, которые вы в него помещаете.

Дело в том, что память, используемая std::vector, являетсяваша основная системная память (RAM), которая не имеет никакого отношения к графическому процессору.Но, вероятно, ваша библиотека pcl требует, чтобы вы передавали данные, находящиеся в памяти GPU, которые не могут быть данными в std::vector.Вам нужно было бы выделить память на стороне устройства и скопировать туда свои данные из памяти хоста.

См. Также:

Почему у нас нет доступа к памяти устройства на стороне хоста?

и обратитесь к руководству по программированию CUDA относительно того, как выполнить это распределение и копирование (по крайней мере, как выполнить это на самом низком возможном уровне; ваш "pcl" может иметьсвои возможности для этого.)

...