nvcc: объединить внешнее и постоянное - PullRequest
4 голосов
/ 01 ноября 2011

Я хотел бы организовать свой код 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__ в примере; вопрос относится к обоим.

Ответы [ 3 ]

4 голосов
/ 02 октября 2016

Короче говоря, с недавним инструментарием CUDA (я на v8) и возможностью вычислений по крайней мере 2.0, в Visual Studio перейдите в Свойства проекта -> CUDA C / C ++ -> Общие, найдите «Создать перемещаемое устройство»Код »в списке, установите для него« Да (-rdc = true) ».

Для командной строки эта страница предлагает –dc опция компилятора

3 голосов
/ 20 октября 2015

Начиная с CUDA 5.0, теперь возможно иметь внешние данные с помощью CUDA, если включена отдельная компиляция и связывание.Это сообщение в блоге объясняет это: http://devblogs.nvidia.com/parallelforall/separate-compilation-linking-cuda-device-code/

Если это сделано, его просто используют, как в оригинальном сообщении, и оно «просто работает».

3 голосов
/ 01 ноября 2011

Из Руководства по программированию CUDA C версия 4.0, раздел D.2.1.1:

Определители __device__, __shared__ и __constant__ не допускаются на:

  • члены данных класса, структуры и объединения,
  • формальные параметры,
  • локальные переменные внутри функции, выполняемой на хосте.
Переменные

__shared__ и __constant__ имеют статическое хранилище.

Переменные

__device__ и __constant__ разрешены только в области видимости файла.

Переменные

__device__, __shared__ и __constant__ не могут быть определены как внешние с использованием ключевого слова extern. Единственное исключение - динамически распределяемые __shared__ переменные, как описано в разделе B.2.3.

...