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

问题描述 投票:0回答:1

我有一个代码,我使用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的catkin工作区),当我运行它时工作真的很慢。我使用了nvidia-smi,我的代码只在CPU中运行,我不知道为什么以及如何解决它。

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

cmake gpu ros point-cloud-library
1个回答
0
投票

(这是一个答案,因为评论太长了。)

我不知道pcl,但也许是因为你通过主机端std::vector而不是设备端的数据。

什么是“主机端”和“设备端”,你问?什么是std

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

问题是,std::vector使用的内存是你的主系统内存(RAM),它与GPU没有任何关系。但是你的pcl库很可能要求你传递GPU内存中的数据 - 这不能是std::vector中的数据。您需要分配设备端内存并从主机端内存中复制数据。

也可以看看:

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

并咨询CUDA programming guide关于如何执行此分配和复制(至少,如何在最低级别执行它;您的“pcl”可能有自己的设施。)

© www.soinside.com 2019 - 2024. All rights reserved.