Как заставить Cuda отдельную компиляцию действительно работать - PullRequest
0 голосов
/ 11 октября 2018

Для хорошего проектирования программного обеспечения я хотел бы поместить код в разные файлы, как на процессоре.В Cuda до Cuda 5.0 это было невозможно, все должно было быть в одном основном файле.Я только начал с Cuda 9 и обнаружил, что здесь описывается, как сохранить файлы в хорошей структуре https://devblogs.nvidia.com/separate-compilation-linking-cuda-device-code/

Я добавил -dc в опции компилятора nvcc.Это должно активировать отдельную компиляцию, чтобы у меня была хорошая файловая структура.

Я в Developer Studio 2015 (и Cuda 9).После добавления -dc Я получаю ошибки:

main.cpp.obj: ошибка LNK2019: неразрешенный внешний символ __cudaRegisterLinkedBinary_51_tmpxft_00005ad4_00000000_12_main_compute_70_cpp1_ii_loc ссылки в функции "недействительным __cdecl __nv_cudaEntityRegisterCallback (недействительными * *)" (__ nv_cudaEntityRegisterCallback @@YAXPEAPEAX @ Z).

Та же ошибка отображается для каждого исходного файла (main.cu.obj, src1.cu.obj src2.cu.obj).

a)Есть ли дополнительная библиотека, которую я должен добавить?

б) Как его зовут?

в) LNK2019 выглядит как предупреждение от компоновщика Visual Studio - нужно ли вместо этого что-то вроде cuda-linker?

Google для этого сообщения об ошибке Я нахожу только случаи, когда люди пытаются поставитьих код в библиотеки.Я просто хочу простой сборник cuda, который запускается.Никаких библиотек для экспорта третьим лицам не предусмотрено.

Редактировать: Моя ошибка заключалась в добавлении -dc непосредственно в командной строке в «дополнительные параметры»Правильный путь в свойствах, в Cuda / C ++ -> Common.Затем измените «Создать код перемещаемого устройства» на Да (-rdc = true).Это работает. Почти .Предупреждение компоновщика устранено.

Все еще есть всплеск.Пример simpleSeperateCompilation в примерах Cuda работает, но не так, как ожидалось.Доступ к внешней функции (multiplyByTwo) осуществляется сложным образом:

// Static device pointers to __device__ functions.
__device__ deviceFunc dMultiplyByTwoPtr = multiplyByTwo;
__device__ deviceFunc dDivideByTwoPtr = divideByTwo;

Затем следует:

deviceFunc hFunctionPtr;
    cudaMemcpyFromSymbol(&hFunctionPtr,
                                 dMultiplyByTwoPtr,
                                 sizeof(deviceFunc));
  transformVector<<<dimGrid, dimBlock>>>
        (dVector, hFunctionPtr, kVectorSize);

Это работает, но для этого нужны дополнительные функции и объявления.

Я искал простой способ вызвать код устройства, который находится в файле из другого файла.Мой обходной путь теперь состоит в том, чтобы сделать это, как другие парни, вставить старые .cpp и .h в .cuh и включить их.Я думаю, что могу жить с этим.Я просто хотел быть уверен, что это правильный / лучший способ структурировать проект в Cuda.

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