我有一个使用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
答案 0 :(得分:0)
(之所以要回答,是因为评论太久了。)
我不知道pcl,但这也许是因为您传递了主机端std::vector
,而不是设备端的数据。
...什么是“主机端”和“设备端”? std
是什么?
好吧,std
只是C ++标准库使用的namespace。 std::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”可能对此具有自己的便利性)。