У меня есть некоторый код CUDA, который я собираю в библиотеку .a, и некоторый (связанный с CUDA) код обычного C ++ для приложения, которое его использует. Все проходит промежуточные ссылки.
Теперь на одной машине (с CUDA 8.0 RC) сборка завершается успешно, но на другой машине (с картой Максвелла, а не карты Кеплера, если это имеет значение) я получаю:
/tmp/tmpxft_00001796_00000000-2_ktkernels_intermediate_link.reg.c:25: multiple definition of `__cudaRegisterLinkedBinary_66_tmpxft_00007a5f_00000000_16_cuda_device_runtime_compute_52_cpp1_ii_8b1a5d37'
CMakeFiles/tester.dir/tester_intermediate_link.o:/tmp/tmpxft_0000180b_00000000-2_tester_intermediate_link.reg.c:4: first defined here
collect2: error: ld returned 1 exit status
CMakeFiles/tester.dir/build.make:1766: recipe for target 'bin/tester' failed
make[2]: *** [bin/tester] Error 1
Я фактически начал удалять файлы из того, что скомпилировано в двоичный файл, который делает вызовы кода библиотеки — и только если я удаляю все из них, связывание будет успешным.
Мои вопросы:
Заметки:
- При каких обстоятельствах возможно такое противоречивое поведение?
Если вы пытаетесь подключить несколько устройств в одном приложении.
- Может ли это быть результатом «второй ссылки» для библиотеки и для двоичного файла?
Почти нет сомнений.
- Что я могу сделать, чтобы точно определить, что на самом деле конфликтует (например, какие символы искать)?
Конфликт является множественными определениями эталонного образца, который среда выполнения генерирует во время фаз соединения устройства и который используется для загрузки кода устройства в контекст посредством API времени выполнения.
- Если на самом деле ничего не противоречит, что я должен сделать, чтобы избежать этого?
Конфликты реальны. А избегание подразумевает правильное связывание отдельно соблюдаемого кода устройства. Кроме того, я не могу сказать вам точно, как это исправить, потому что вы решили не говорить нам точно, что вы делали.
Других решений пока нет …