繁体   English   中英

在C ++项目中使用基于CUDA的库代码

[英]Using CUDA based library code in C++ project

我使用带有cmake的示例create cuda库创建了一个基于cuda的小型库。 该库包含一个名为CudaImage的类,该类应在图像上运行Cuda内核。

CMakeLists如下:

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(cudaMPbTools LANGUAGES CXX CUDA)

include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/../common
)

add_library(cudaMPbTools STATIC
cudaimage.cu
cudaimage.h
cvector.h
cvector.cpp
)
target_link_libraries(cudaMPbTools libCommon)
target_compile_features(cudaMPbTools PUBLIC cxx_std_11)
set_target_properties( cudaMPbTools
                   PROPERTIES CUDA_SEPARABLE_COMPILATION ON)

cudaimage.h包含以下代码:

class CudaImage {
public:
CudaImage(unsigned char* image_data, int image_width, int image_height, int     scale);

private:
__device__
void addToHistoArray(int val, int i, int j);
};

库可以使用cmake正常编译,但是现在我试图在库外部的main.cpp中使用CudaImage类:

CudaImage cudaImg(img1.data, img1.cols, img1.rows, 10);

但这会在主项目中生成编译错误,因为它无法识别cudaimage.h中的device关键字。

主项目的CMakeLists.txt类似于:

cmake_minimum_required (VERSION 3.10)
project (mPb)
cmake_policy(SET CMP0020 NEW)

include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/../common
${CMAKE_CURRENT_SOURCE_DIR}/../cudaMPbTools
${Qt5Core_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS})

set(MPB_SRCS    
main.cpp
pbdetector.cpp
)

set(MPB_HEADR
pbdetector.h)

add_executable(mPb ${MPB_SRCS} ${MPB_HEADR})
target_link_libraries(mPb
libCommon
${OpenCV_LIBS}
cudaMPbTools)

qt5_use_modules(mPb Core)

任何人都可以对此事提出建议吗? 主项目中的CMakeLists.txt是否正确?

更新我从类CudaImage中提取了函数addToHistoArray,并声明如下:

__device__ void addToHistoArray(struct CVector* dHalfDiscInfluencePoints, int   totalHalfInfluencePoints, unsigned int** dHistograms, int image_width, int image_height, int scale, int arcno, int val, int i, int j);

而且我仍然无法编译我的项目。 我也更新了github中的源代码。

__device__ void CudaImage::addToHistoArray(int val, int i, int j)很可疑。 成员函数的全部要点是它具有this指针,即CudaImage* 那当然是主机指针( CudaImage位于CPU上)。 那么,您的__device__ (GPU)函数试图使用主机指针做什么呢?

它不编译是幸运的副作用。 大概addToHistoArray不需要CudaImage* ,因此它可能是cudaimage.cu内部的一个免费函数。

正如MSalters所说,问题在于设备方法是要从GPU调用并在GPU上执行的。 我不确定这就是您的意思。 如果不是,则应阅读以下内容: 全局功能和设备功能之间的区别

(对不起,我还不能发表评论)

我找到了一个可以编译我的项目的解决方案。 它要求以下内容:

  • 在cudaimage.h中包括cuda.h和cuda_runtime.h
  • 在项目mPb中添加cuda支持
  • 使用包含cmake 3.9版之前使用的cuda的方法
  • 在代码中,如MSalters和LC所示,更改了addToHistoArray的签名

CMake文件的外观适用于该库:

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(cudaMPbTools)
include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/../common
)
find_package(CUDA)
cuda_add_library(cudaMPbTools 
    cudaimage.cu
    cudaimage.h
    cvector.h
    cvector.cpp
    STATIC
)
target_link_libraries(cudaMPbTools libCommon ${CUDA_LIBRARIES}) 
target_compile_features(cudaMPbTools PUBLIC cxx_std_11)

对于项目:

cmake_minimum_required (VERSION 3.10)
project (mPb)
find_package(CUDA)
include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/../common
    ${CMAKE_CURRENT_SOURCE_DIR}/../cudaMPbTools
    ${Qt5Core_INCLUDE_DIRS}
    ${OpenCV_INCLUDE_DIRS}
    ${CUDA_INCLUDE_DIRS})
set(MPB_SRCS    
    main.cpp
    pbdetector.cpp
)
set(MPB_HEADR
pbdetector.h)
cuda_add_executable(mPb ${MPB_SRCS} ${MPB_HEADR})
target_link_libraries(mPb
    libCommon
    ${OpenCV_LIBS}
    cudaMPbTools)
qt5_use_modules(mPb Core)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM