【问题标题】:Why is my pcl cuda code running in CPU instead of GPU?为什么我的 pcl cuda 代码在 CPU 而不是 GPU 中运行?
【发布时间】:2019-02-15 08:14:01
【问题描述】:

我有一个使用 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

【问题讨论】:

  • 对不起,我是初学者,所以我对主机端或设备端一无所知。您的意思是 std 不是 gpu 变量吗?无论如何,这个例子完全一样,所以我想它应该像那样工作。也许我的配置不好或其他什么,或者我可能忘记了我的 CMakeList 中的某些内容,但我没有找到问题所在。

标签: cmake gpu ros point-cloud-library


【解决方案1】:

(由于评论太长,因此将其作为答案。)

我不知道 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”可能有自己的设施。)

【讨论】:

  • 我不确定这是否是问题所在,因为 pcl::gpu 函数将 std::vector 参数作为输入,这是声明:void pcl::gpu::EuclideanClusterExtraction: :extract (std::vector<:pointindices> &clusters) 使用 std::vector 可以强制我的代码仅使用 CPU 吗?我想它会停止编译或执行,但问题是我的程序只在 CPU 上执行。
  • 我已经看到函数 EuclideanClusterExtraction 创建“DeviceArrays”来将信息复制到设备,就像你说的那样,所以我认为这不是问题。然后这个函数处理这个信息等等,应该是由GPU来处理的,但是我不知道为什么它从不使用它,总是CPU。我有两张显卡,所以我尝试在它们之间进行更改,但没有任何变化,所以我认为它根本没有使用任何 GPU。为什么会发生?
猜你喜欢
  • 2021-08-24
  • 2020-07-26
  • 2020-01-13
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 2022-01-19
  • 2021-12-23
相关资源
最近更新 更多