Неопределенная ссылка на cudaRegisterLinkedBinary - ошибка связывания в CMake? - PullRequest
1 голос
/ 18 июня 2020

Я запускаю CentOS 7.8 через двойную загрузку на 64-разрядной версии Ma c 2013 года с графическим процессором GT 650M. Я использую CMake 3.17, CUDA 10.0 и G CC 4.8.5. Все образцы CUDA были протестированы и работают нормально, и я могу идеально скомпилировать другой стандартный код C ++.

Я сократил свой полный проект до простого тестового примера, как показано ниже, где файл CMakeLists:

CMAKE_MINIMUM_REQUIRED(VERSION 3.8)

PROJECT(test LANGUAGES CUDA CXX C)

SET(CMAKE_VERBOSE_MAKEFILE ON)

MESSAGE(STATUS "Setting to Release mode")
SET(CMAKE_BUILD_TYPE "Release")

# Set CUDA flags
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -arch=sm_30 -rdc=true")

# Set flags
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -ffast-math")
MESSAGE(STATUS "Setting g++ flags for Release configuration")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")   ## Optimize
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ")  ## Strip binary

ADD_SUBDIRECTORY( src )

В папке / sr c у меня есть еще один файл CMake для сбора исходных файлов:

INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} )
INCLUDE_DIRECTORIES( ${CMAKE_BINARY_DIR} )

SET(test_SRCS
   rsmain.cu
   SGP4.cu
   SGP4.cuh
)

 function(my_add_executable TargetName)
   set(Files ${ARGV})
   list(REMOVE_AT Files 0)
   add_executable(${TargetName} ${Files})
   set_target_properties(${TargetName} PROPERTIES
                             RUNTIME_OUTPUT_DIRECTORY
                                 "${CMAKE_SOURCE_DIR}/build")
 endfunction()

my_add_executable(test ${test_SRCS})
INSTALL( TARGETS test DESTINATION bin)

Как показано, есть три основных исходных файла - оба SGP4. cu и SGP4.cuh пусты, а rsmain.cu просто:

/// Main function
int main(int argc, char *argv[])
{
    return 0;
}

При попытке сборки я получаю следующий результат:

[me@localhost build]$ cmake3 ..
-- The CUDA compiler identification is NVIDIA 10.0.130
-- The CXX compiler identification is GNU 4.8.5
-- The C compiler identification is GNU 4.8.5
-- Check for working CUDA compiler: /usr/local/cuda-10.0/bin/nvcc
-- Check for working CUDA compiler: /usr/local/cuda-10.0/bin/nvcc - works
-- Detecting CUDA compiler ABI info
-- Detecting CUDA compiler ABI info - done
-- Detecting CUDA compile features
-- Detecting CUDA compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- No build configuration specified, defaulting to Release
-- Setting general compiler flags for detected compiler: gnu-g++
-- Setting g++ flags for Release configuration
-- Configuring done
-- Generating done
-- Build files have been written to: /home/me/Documents/test/build
[me@localhost build]$ make
/usr/bin/cmake3 -S/home/me/Documents/test -B/home/me/Documents/test/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake3 -E cmake_progress_start /home/me/Documents/test/build/CMakeFiles /home/me/Documents/test/build/CMakeFiles/progress.marks
make  -f CMakeFiles/Makefile2 all
make[1]: Entering directory `/home/me/Documents/test/build'
make  -f src/CMakeFiles/test.dir/build.make src/CMakeFiles/test.dir/depend
make[2]: Entering directory `/home/me/Documents/test/build'
cd /home/me/Documents/test/build && /usr/bin/cmake3 -E cmake_depends "Unix Makefiles" /home/me/Documents/test /home/me/Documents/test/src /home/me/Documents/test/build /home/me/Documents/test/build/src /home/me/Documents/test/build/src/CMakeFiles/test.dir/DependInfo.cmake --color=
Scanning dependencies of target test
make[2]: Leaving directory `/home/me/Documents/test/build'
make  -f src/CMakeFiles/test.dir/build.make src/CMakeFiles/test.dir/build
make[2]: Entering directory `/home/me/Documents/test/build'
[ 33%] Building CUDA object src/CMakeFiles/test.dir/rsmain.cu.o
cd /home/me/Documents/test/build/src && /usr/local/cuda-10.0/bin/nvcc   -I/home/me/Documents/test/src -I/home/me/Documents/test/build/src -I/home/me/Documents/test/build  -arch=sm_30 -rdc=true -O3 -DNDEBUG   -std=c++03 -x cu -c /home/me/Documents/test/src/rsmain.cu -o CMakeFiles/test.dir/rsmain.cu.o
[ 66%] Building CUDA object src/CMakeFiles/test.dir/SGP4.cu.o
cd /home/me/Documents/test/build/src && /usr/local/cuda-10.0/bin/nvcc   -I/home/me/Documents/test/src -I/home/me/Documents/test/build/src -I/home/me/Documents/test/build  -arch=sm_30 -rdc=true -O3 -DNDEBUG   -std=c++03 -x cu -c /home/me/Documents/test/src/SGP4.cu -o CMakeFiles/test.dir/SGP4.cu.o
[100%] Linking CUDA executable ../test
cd /home/me/Documents/test/build/src && /usr/bin/cmake3 -E cmake_link_script CMakeFiles/test.dir/link.txt --verbose=1
/usr/bin/g++  -s  CMakeFiles/test.dir/rsmain.cu.o CMakeFiles/test.dir/SGP4.cu.o -o ../test  -lcudadevrt -lcudart_static  -L"/usr/local/cuda-10.0/targets/x86_64-linux/lib/stubs" -L"/usr/local/cuda-10.0/targets/x86_64-linux/lib" -lcudadevrt -lcudart_static -lrt -lpthread -ldl
CMakeFiles/test.dir/rsmain.cu.o: In function `__sti____cudaRegisterAll()':
tmpxft_00004eed_00000000-5_rsmain.cudafe1.cpp:(.text.startup+0x25): undefined reference to `__cudaRegisterLinkedBinary_41_tmpxft_00004eed_00000000_6_rsmain_cpp1_ii_main'
CMakeFiles/test.dir/SGP4.cu.o: In function `__sti____cudaRegisterAll()':
tmpxft_00004f02_00000000-5_SGP4.cudafe1.cpp:(.text.startup+0x15): undefined reference to `__cudaRegisterLinkedBinary_39_tmpxft_00004f02_00000000_6_SGP4_cpp1_ii_71922fcb'
collect2: error: ld returned 1 exit status
make[2]: *** [test] Error 1
make[2]: Leaving directory `/home/me/Documents/test/build'
make[1]: *** [src/CMakeFiles/test.dir/all] Error 2
make[1]: Leaving directory `/home/me/Documents/test/build'
make: *** [all] Error 2

Кто-нибудь может объяснить, что это Все о cudaRegisterLinkedBinary? Я пробовал кучу вещей, пытаясь решить эту проблему, но пока ничего не помогло. Есть ли проблема с какой-либо из версий пакета? Проблема в CMakeLists? Проблемы совместимости с CUDA и моим оборудованием?

Стоит отметить, что полный код скомпилирован и отлично работал, когда я тестировал его на сервере HP C (также работающем с CentOS 7 и Cuda 10.0) - но на моем личном P C он не работает на этапе связывания. Я даже подтвердил, что файлы .bashr c одинаковы для обеих установок, но ничего не исправил. В настоящее время я также могу без проблем скомпилировать программное обеспечение NVIDIA OptiX (которое также использует CUDA).

Любые советы будут признательны. Пожалуйста, дайте мне знать, если я пропустил какие-либо необходимые данные.

РЕДАКТИРОВАТЬ: Ответ добавлен ниже. Решено.

1 Ответ

2 голосов
/ 18 июня 2020

Наконец-то разобрался. Это был мой основной файл CMakeLists:

CMAKE_MINIMUM_REQUIRED(VERSION 3.8)

PROJECT(test LANGUAGES C CXX CUDA)
SET(CMAKE_BUILD_TYPE "Release")

# Set CUDA flags
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -arch=sm_30 -rdc=true")

# Set flags
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -ffast-math -O3")
MESSAGE(STATUS "Setting g++ flags for Release configuration")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s")  ## Strip binary

ADD_SUBDIRECTORY( src )

И в файле / sr c CMakeLists мне пришлось внести изменения:

INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} )
INCLUDE_DIRECTORIES( ${CMAKE_BINARY_DIR} )

SET(test_SRCS
   rsmain.cu
   SGP4.cu
   SGP4.cuh
)

 function(my_add_executable TargetName)
   set(Files ${ARGV})
   list(REMOVE_AT Files 0)
   add_executable(${TargetName} ${Files})
   set_target_properties(${TargetName} PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON
                             RUNTIME_OUTPUT_DIRECTORY
                                 "${CMAKE_SOURCE_DIR}/build")
 endfunction()

my_add_executable(test ${test_SRCS})
INSTALL( TARGETS test DESTINATION bin)

Установка CUDA_RESOLVE_DEVICE_SYMBOLS на ON - это изменение . В моем основном проекте мне также приходилось повторять это для каждой цели, включающей любые файлы CUDA. Теперь все компилируется и работает отлично.

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