Ошибка связи с кодом CUDA: множественные определения `__cudaRegisterLinkedBinary_

У меня есть некоторый код 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

Я фактически начал удалять файлы из того, что скомпилировано в двоичный файл, который делает вызовы кода библиотеки — и только если я удаляю все из них, связывание будет успешным.

Мои вопросы:

  • При каких обстоятельствах возможно такое противоречивое поведение?
  • Может ли это быть результатом «второго связывания» как для библиотеки, так и для двоичного файла?
  • Что я могу сделать, чтобы точно определить, что на самом деле конфликтует (например, какие символы искать)?
  • Если на самом деле ничего не противоречит, что я должен сделать, чтобы избежать этого?

Заметки:

  • На одной машине я использую CUDA 7.5, на другой машине это CUDA 8.0 RC.

-3

Решение

  • При каких обстоятельствах возможно такое противоречивое поведение?

Если вы пытаетесь подключить несколько устройств в одном приложении.

  • Может ли это быть результатом «второй ссылки» для библиотеки и для двоичного файла?

Почти нет сомнений.

  • Что я могу сделать, чтобы точно определить, что на самом деле конфликтует (например, какие символы искать)?

Конфликт является множественными определениями эталонного образца, который среда выполнения генерирует во время фаз соединения устройства и который используется для загрузки кода устройства в контекст посредством API времени выполнения.

  • Если на самом деле ничего не противоречит, что я должен сделать, чтобы избежать этого?

Конфликты реальны. А избегание подразумевает правильное связывание отдельно соблюдаемого кода устройства. Кроме того, я не могу сказать вам точно, как это исправить, потому что вы решили не говорить нам точно, что вы делали.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]