我有一段使用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/分段示例的实现:pcl/seg.cpp
发布于 2019-02-15 18:36:15
(这是一个答案,因为它太长了,无法发表评论。)
我不知道pcl,但可能是因为您传递的是主机端的std::vector,而不是设备端的数据。
..。你会问什么是“主机端”和“设备端”?什么是std?
std只是C++标准库使用的一个namespace。std::vector是C++标准库中的一个(模板化)类,它为放入其中的元素动态分配内存。
问题是,std::vector使用的内存是您的主系统内存,与图形处理器没有任何关系。但很可能你的PCL库需要你传递GPU内存中的数据--这不可能是std::vector中的数据。您需要分配设备端内存并将数据从主机端内存复制到设备端内存。
另请参阅:
Why we do not have access to device memory on host side?
并咨询CUDA programming guide,了解如何执行分配和复制(至少,如何在可能的最低级别执行;您的"pcl“可能有自己的工具。)
https://stackoverflow.com/questions/54705053
复制相似问题