为什么我的pcl cuda代码在CPU而不是GPU中运行?

时间:2019-02-15 08:14:01

标签: cmake gpu ros point-cloud-library

我有一个使用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,我的代码仅在CPU中运行,我不知道为什么以及如何解决它。

此代码是此处gpu / segmentation示例的实现: pcl/seg.cpp

1 个答案:

答案 0 :(得分:0)

(之所以要回答,是因为评论太久了。)

我不知道pcl,但这也许是因为您传递了主机端std::vector,而不是设备端的数据。

...什么是“主机端”和“设备端”? std是什么?

好吧,std只是C ++标准库使用的namespacestd::vector是C ++标准库中的一个(模板)类,它为您放入其中的元素动态分配内存。

问题是,std::vector使用的内存是与GPU无关的主系统内存(RAM)。但是您的pcl库可能要求您传递GPU内存中的数据-不能是std::vector中的数据。您需要分配设备侧内存,然后从主机侧内存复制数据。

另请参阅:

Why we do not have access to device memory on host side?

并咨询CUDA programming guide关于如何执行此分配和复制(至少如何以最低的级别执行;您的“ pcl”可能对此具有自己的便利性)。