Использование кода библиотеки на основе CUDA в проекте C++

Я использовал пример создать библиотеку 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);

но это вызывает ошибку компиляции в основном проекте, потому что он не распознает ключевое слово устройство в 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.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
140
3

Ответы 3

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

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

CudaImage имеет указатели устройств и указатели узлов и предназначен для использования метода addHistoToArray для элементов указателей устройств. Сначала я создал метод, как вы предложили, но у него было ~ 10 параметров, и я подумал, что лучше всего объявить его как член, где он уже имеет доступ ко всем необходимым параметрам.

Cristi 09.11.2018 13:22

CudaImage берет указатель на изображение с хоста, выделяет память на устройстве и копирует его в графический процессор. Кроме того, он инициализирует другие структуры данных в устройстве. Функция addToHistoArray должна работать с этими функциями. Смотрите здесь полный код github.com/xxxcucus/gPb/blob/master/cudaMPbTools/cudaimage.c‌ u. Как лучше поступить в этом случае?

Cristi 09.11.2018 13:28

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

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

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

  • в 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)

Другие вопросы по теме