Я хотел бы организовать свой код CUDA в отдельные объектные файлы, которые будут связаны в конце компиляции, как в C ++. Для этого я хотел бы иметь возможность объявить внешний указатель на __constant__
память в заголовочном файле и поместить определение в один из файлов .cu, также следуя шаблону из C ++. Но кажется, что когда я это делаю, nvcc игнорирует 'extern' - он принимает каждое объявление как определение. Есть ли способ обойти это?
Чтобы быть более точным в отношении кода и ошибок, у меня есть это в заголовочном файле:
extern __device__ void* device_function_table[];
с последующим указанием в файле .cu:
void* __device__ device_function_table[200];
, которая выдает эту ошибку при компиляции:
(path).cu:40: error: redefinition of ‘void* device_function_table [200]’
(path).hh:29: error: ‘void* device_function_table [200]’ previously declared here
Мое текущее решение - использовать магию Makefile, чтобы собрать воедино все мои файлы .cu и, по сути, иметь одну большую единицу перевода, но некоторое подобие организации файлов. Но это уже заметно замедляет компиляцию, поскольку изменение любого из моих классов означает перекомпиляцию всех из них; и я ожидаю добавить еще несколько классов.
Редактировать: я вижу, я поставил __constant__
в тексте и __device__
в примере; вопрос относится к обоим.