Для хорошего проектирования программного обеспечения я хотел бы поместить код в разные файлы, как на процессоре.В 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.