Использование кода библиотеки на основе CUDA в проекте C ++ - PullRequest
0 голосов
/ 09 ноября 2018

Я использовал пример создание библиотеки cuda с помощью cmake для создания небольшой библиотеки на основе 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, но сейчас я пытаюсь использовать класс CudaImage внутри main.cpp вне библиотеки:

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

, но это приводит к ошибке компиляции в основном проекте, поскольку он не распознает ключевое слово device в файле cudaimage.h.

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 в основном проекте корректным?

Обновление Я извлек функцию addToHistoArray из класса CudaImage и объявил ее следующим образом:

__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 .

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Как сказал MSalters, проблема в том, что методы device предназначены для вызова из графического процессора для выполнения на графическом процессоре. Я не уверен, что это то, что вы хотели сделать. Если нет, вы должны прочитать это: Разница между глобальными функциями и функциями устройства

(извините, я пока не могу комментировать сообщения)

0 голосов
/ 09 ноября 2018

Я нашел такое решение, что мой проект компилируется. Требуется следующее:

  • в cudaimage.h включает cuda.h и cuda_runtime.h
  • в проекте mPb добавить поддержку cuda
  • используйте метод включения cuda, который использовался до версии 3.9 cmake
  • в коде изменила подпись addToHistoArray, как указано MSalters и L.C.

Файлы 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)
0 голосов
/ 09 ноября 2018

__device__ void CudaImage::addToHistoArray(int val, int i, int j) довольно подозрительно. Весь смысл функции-члена состоит в том, что она имеет указатель this, то есть CudaImage*. Это, конечно, указатель хоста (CudaImage живет на процессоре). Итак, что ваша функция __device__ (GPU) пытается сделать с указателем хоста?!

То, что он не компилируется, является счастливым побочным эффектом. Предположительно addToHistoArray не нужен CudaImage*, поэтому он мог бы быть свободной функцией внутри cudaimage.cu

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...