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





__device__ void CudaImage::addToHistoArray(int val, int i, int j) вызывает большие подозрения. Вся суть функции-члена в том, что у нее есть указатель this, то есть CudaImage*. Это, конечно, указатель хоста (CudaImage живет в ЦП). Итак, что ваша функция __device__ (GPU) пытается сделать с указателем хоста ?!
То, что он не компилируется, - счастливый побочный эффект. Предположительно, для addToHistoArray не нужен CudaImage*, так что это могла быть бесплатная функция внутри cudaimage.cu.
CudaImage берет указатель на изображение с хоста, выделяет память на устройстве и копирует его в графический процессор. Кроме того, он инициализирует другие структуры данных в устройстве. Функция addToHistoArray должна работать с этими функциями. Смотрите здесь полный код github.com/xxxcucus/gPb/blob/master/cudaMPbTools/cudaimage.c u. Как лучше поступить в этом случае?
Как сказал MSalters, проблема в том, что методы устройство предназначены для вызова из графического процессора для выполнения на графическом процессоре. Я не уверен, что вы хотели это сделать. Если нет, прочтите это: Разница между глобальными функциями и функциями устройства
(извините, я пока не могу комментировать сообщения)
Я нашел решение, при котором мой проект компилируется. Для этого требуется следующее:
Файлы 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)
CudaImage имеет указатели устройств и указатели узлов и предназначен для использования метода addHistoToArray для элементов указателей устройств. Сначала я создал метод, как вы предложили, но у него было ~ 10 параметров, и я подумал, что лучше всего объявить его как член, где он уже имеет доступ ко всем необходимым параметрам.