2015-06-11 2 views
2

Язык CUDA C++ - это производный язык C++, но он не поддерживается стандартными компиляторами, но может быть скомпилирован nvcci-компилятором nVidia. Это может привести к многоязычным проектам, в которых модули GPU скомпилированы с nvcc и модулями без GPU, скомпилированными с gcc.Включает ли CUDA настоящую библиотеку C++?

Например, синтаксис kernel<<<dims>>>(params) не является частью C++.

Включает ли nVidia библиотеку GPU (как часть CUDA), которая фактически может использоваться со стандартным компилятором C++, таким как gcc?

+2

API-интерфейс драйвера CUDA выполняет то, о чем вы (я думаю) спрашивают. Код API-драйвера не требует создания nvcc вообще, а ядра могут быть JIT, скомпилированные драйвером во время выполнения (albiet только тогда, когда ядра записаны в PTX) – talonmies

ответ

8

Для графических процессоров CUDA требуется компиляция кода устройства для графического процессора, что не совпадает с машинным кодом x86, который вы найдете в типичной библиотеке, скомпилированной для цели x86.

Итак, чтобы использовать графический процессор, вам понадобится компилятор nvidia для генерации машинного кода.

Существуют различные способы, чтобы выполнить эту задачу:

  1. Использование библиотек. Библиотеки, которые поставляются с CUDA, такими как CUBLAS, CUSPARSE, CUSOLVER и CUFFT, включают в себя предварительно скомпилированные GPU-процедуры, которые можно вызывать и связывать с обычным хост-кодом. Все эти библиотеки могут использоваться со стандартным компилятором C++, таким как g ++.

  2. Большинство процедур из cuda driver API и cuda runtime API являются вызываемыми и связаны с обычным кодом хоста, используя стандартный компилятор C++. Однако это не касается вопроса о том, что делать с кодом устройства. Если код устройства поставляется в PTX form с использованием API-интерфейса драйвера (который не включает синтаксические элементы, такие как kernel<<<...>>>), тогда nvcc не требуется, и приложение может быть полностью построено с использованием стандартного компилятора, такого как g ++.

  3. Если код устройства поставляется в исходной форме C/C++ (то есть CUDA C/C++), тогда обычно требуется nvcc для преобразования кода в PTX (чтобы можно было использовать метод 2 выше) или конвертировать непосредственно в двоичный скомпилированный формат, который можно использовать либо API-интерфейс драйвера, либо API-интерфейс выполнения.

  4. В будущем вы также можете следить за развивающимися возможностями CUDA runtime compilation mechanism.

  5. Поскольку вы упоминаете gcc, вы также можете следить за меняющимися способностями OpenACC support in gcc.

Смежные вопросы