联合编译OpenCV+PCL+CUDA时需要注意的问题

2023-11-05

最近在写tsdf的程序,同时使用了OpenCV,PCL和CUDA。在编译工程的时候发现了不少问题,在这里整理一下。


1. cu和cpp文件
__global__,__host__,__device__这样开头的cuda程序只能写在cu文件中。
kernal<<< i,j >>> 这样的核函数只能写在cu文件中。如果想在cpp文件中调用,可以将核函数封装在cu文件中,再调用。
其余的一些cuda命令如cudaMalloc,cudaMemcpy可以在cpp文件中使用。

2. include头文件在引用pcl的头文件前,要添加CUDACC宏定义下的boost内容
因为pcl/io/boost.h这个文件中做了关于宏CUDACC的编译选项,使用CUDA编译时,很多boost的头文件不包含了。所以在引用pcl头文件前添加:

#ifndef __CUDACC__
#ifndef Q_MOC_RUN
#include <boost/version.hpp>
#include <boost/numeric/conversion/cast.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition.hpp>
#include <boost/thread.hpp>
#include <boost/thread/thread.hpp>
#include <boost/filesystem.hpp>
#include <boost/bind.hpp>
#include <boost/cstdint.hpp>
#include <boost/function.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/inherit.hpp>
#include <boost/mpl/inherit_linearly.hpp>
#include <boost/mpl/joint_view.hpp>
#include <boost/mpl/transform.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/algorithm/string.hpp>
#ifndef Q_MOC_RUN
#include <boost/date_time/posix_time/posix_time.hpp>
#endif
#if BOOST_VERSION >= 104700
#include <boost/chrono.hpp>
#endif
#include <boost/tokenizer.hpp>
#include <boost/foreach.hpp>
#include <boost/shared_array.hpp>
#include <boost/interprocess/sync/file_lock.hpp>
#if BOOST_VERSION >= 104900
#include <boost/interprocess/permissions.hpp>
#endif
#include <boost/iostreams/device/mapped_file.hpp>
#define BOOST_PARAMETER_MAX_ARITY 7
#include <boost/signals2.hpp>
#include <boost/signals2/slot.hpp>
#endif
#endif

3. 在c++11下使用cudaMalloc需要添加在导入变量前添加(void**)。如:

cudaMalloc((void**)&gpu_voxel_grid_TSDF, voxel_grid_dim_x * voxel_grid_dim_y * voxel_grid_dim_z * sizeof(float));

gpu_voxel_grid_TSDF 是float型变量。若不添加(void**),则会报错: error: invalid conversion from ‘float**’ to ‘void**’ [-fpermissive]

4. cuda是可以和cpp文件进行联合编译的。 CMakelists里要注意添加:
gpu部分的包和路径

#GPU
option(USE_CUDA "Use CUDA" ON)
find_package(CUDA REQUIRED)
find_package(CUDA 8.0)
include_directories(${CUDA_INCLUDE_DIRS})
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};--disable-warnings;--ptxas-options=-v;-use_fast_math;-lineinfo;-std=c++11)

解决pcl和cuda冲突的vtk问题

get_directory_property(dir_defs DIRECTORY ${PROJECT_SOURCE_DIR} COMPILE_DEFINITIONS)
set(vtk_flags)
foreach(it ${dir_defs})
    if(it MATCHES "vtk*")
    list(APPEND vtk_flags ${it})
    endif()
endforeach()

foreach(d ${vtk_flags})
    remove_definitions(-D${d})
endforeach()

使用CUDA_ADD_EXECUTABLE联合编译cpp和cu文件

CUDA_ADD_EXECUTABLE(mytsdf src/mytsdf.cpp ${cpu_source_files} src/tsdf_gpu.cu)

否则会警告:

CMake Warning (dev) in cuda_gpu_generated_test.cu.o.cmake:
  Syntax Warning in cmake code at

    /home/xxx/mytsdf-fusion/build/mytsdf/CMakeFiles/cuda_gpu.dir/src/cuda_gpu_generated_test.cu.o.cmake:79:137

  Argument not separated from preceding token by whitespace.
This warning is for project developers.  Use -Wno-dev to suppress it.

并且报错:

nvcc fatal   : A single input file is required for a non-link phase when an outputfile is specified
CMake Error at cuda_gpu_generated_test.cu.o.cmake:207 (message):
  Error generating
  /home/xxx/mytsdf-fusion/build/mytsdf/CMakeFiles/cuda_gpu.dir/src/./cuda_gpu_generated_test.cu.o


mytsdf/CMakeFiles/cuda_gpu.dir/build.make:63: recipe for target 'mytsdf/CMakeFiles/cuda_gpu.dir/src/cuda_gpu_generated_test.cu.o' failed

目前就发现了这些问题,后面如有发现再继续补充。


参考:
[1] https://www.jianshu.com/p/6bf114685a6a

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

联合编译OpenCV+PCL+CUDA时需要注意的问题 的相关文章

  • 如何实现设备端CUDA虚拟功能?

    我发现 CUDA 不允许将具有虚拟函数的类传递到内核函数中 对于这个限制有什么解决方法吗 我真的很希望能够在内核函数中使用多态性 Thanks 罗伯特 克罗维拉评论中最重要的部分是 只需在设备上创建对象即可 所以记住这一点 我正在处理我有一
  • 估计 GPU 的 FLOPS 效率(CUDA 示例)

    在我看来 我并不完全理解 FLOPS 的概念 在CUDA SAMPLES中 有矩阵乘法示例 0 Simple matrixMul 在此示例中 每个矩阵乘法的 FLOP 浮点运算 数量通过以下公式计算 double flopsPerMatri
  • cuda简单应用程序适用于32位而不适用于64位

    我的简单 cuda helloworld 应用程序在 Windows 10 上使用 Visual Studio 2015 社区构建 32 位时运行良好 但是 如果我在 64 位中构建它 则不会执行 GPU 特斯拉K40c 工具包 CUDA
  • CUDA __syncthreads() 编译正常,但带有红色下划线

    我已经使用 CUDA 4 2 一周了 但遇到了一些问题 当我编写 syncthreads 函数时 它会带有下划线 看起来是错误的 然后 如果我将鼠标放在该函数上 则会出现一条消息 标识符 syncthreads 未定义 但是当我编译我的项目
  • CUDA全局内存事务的成本

    根据 CUDA 5 0 编程指南 如果我同时使用 L1 和 L2 缓存 在 Fermi 或 Kepler 上 则所有全局内存操作都使用 128 字节内存事务完成 但是 如果我仅使用 L2 则使用 32 字节内存事务 第 F 4 2 章 让我
  • 如何在 Linux 中分析 PyCuda 代码?

    我有一个简单的 经过测试的 pycuda 应用程序 正在尝试对其进行分析 我尝试过 NVidia 的 Compute Visual Profiler 它运行该程序 11 次 然后发出以下错误 NV Warning Ignoring the
  • 无法从静态初始化代码启动 CUDA 内核

    我有一个在其构造函数中调用内核的类 如下所示 标量场 h include
  • CUDA:如何检查计算能力是否正确?

    使用较高计算能力编译的 CUDA 代码将在计算能力较低的设备上完美执行很长一段时间 然后有一天在某些内核中默默地失败 我花了半天时间追寻一个难以捉摸的错误 结果发现构建规则已经sm 21而该设备 Tesla C2050 是2 0 是否有任何
  • 在新线程中调用支持 CUDA 的库

    我编写了一些代码并将其放入它自己的库中 该库使用 CUDA 在 GPU 上进行一些处理 我正在使用 Qt 构建 GUI 前端 作为加载 GUI 的一部分 我调用 CUresult res CUdevice dev CUcontext ctx
  • cudaMallocManaged() 返回“不支持的操作”

    在 CUDA 6 0 中尝试托管内存给了我operation not supported打电话时cudaMallocManaged include cuda runtime h include
  • “计算能力”是什么意思? CUDA?

    我是CUDA编程新手 对此了解不多 您能告诉我 CUDA 计算能力 是什么意思吗 当我在大学服务器上使用以下代码时 它向我显示了以下结果 for device 0 device lt deviceCount device cudaDevic
  • 同时使用 2 个 GPU 调用 cudaMalloc 时性能较差

    我有一个应用程序 可以在用户系统上的 GPU 之间分配处理负载 基本上 每个 GPU 都有一个 CPU 线程来启动一个GPU处理间隔当由主应用程序线程定期触发时 考虑以下图像 使用 NVIDIA 的 CUDA 分析器工具生成 作为示例GPU
  • 为什么numba cuda调用几次后运行速度变慢?

    我正在尝试如何在 numba 中使用 cuda 然而我却遇到了与我预想不同的事情 这是我的代码 from numba import cuda cuda jit def matmul A B C Perform square matrix m
  • Nvcc 的版本与 CUDA 不同

    我安装了 cuda 7 但是当我点击 nvcc version 时 它打印出 6 5 我想在 GTX 960 卡上安装 Theano 库 但它需要 nvcc 7 0 我尝试重新安装cuda 但它没有更新nvcc 当我运行 apt get i
  • 无法在 CUDA 中执行设备内核

    我正在尝试在全局内核中调用设备内核 我的全局内核是矩阵乘法 我的设备内核正在查找乘积矩阵每列中的最大值和索引 以下是代码 device void MaxFunction float Pd float max int x threadIdx
  • CUDA 常量内存是否应该被均匀地访问?

    我的 CUDA 应用程序的恒定内存小于 8KB 既然它都会被缓存 我是否需要担心每个线程访问相同的地址以进行优化 如果是 如何确保所有线程同时访问同一地址 既然它都会被缓存 我是否需要担心每个线程访问相同的地址以进行优化 是的 这缓存本身每
  • 加速Cuda程序

    要更改哪一部分来加速此代码 代码到底在做什么 global void mat Matrix a Matrix b int tempData new int 2 tempData 0 threadIdx x tempData 1 blockI
  • Cuda 6.5 找不到 - libGLU。 (在 ubuntu 14.04 64 位上)

    我已经在我的ubuntu上安装了cuda 6 5 我的显卡是 GTX titan 当我想要制作 cuda 样本之一时 模拟 粒子 我收到这条消息 gt gt gt WARNING libGLU so not found refer to C
  • 在 cudaFree() 之前需要 cudaDeviceSynchronize() 吗?

    CUDA 版本 10 1 帕斯卡 GPU 所有命令都发送到默认流 void ptr cudaMalloc ptr launch kernel lt lt lt gt gt gt ptr cudaDeviceSynchronize Is th
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知

随机推荐