Как я могу вызвать функцию PTX из CUDA C?
=========================================

Я пытаюсь найти способ вызова функции ptx (.func) из CUDA C.
Скажем, у меня была функция PTX, как это:

Я знаю, что могу назвать это из ptx так:

Но я понятия не имею, как назвать это из CUDA C.
Я знаю, что могу встроить ptx-сборку с помощью asm (), но я не нашел способа встроить функцию.
Надеюсь, кто-то может помочь!

Спасибо!

 представленных в CUDA 5.0. Я не верю, что есть способ сделать это в «целом» режим компиляции программы или в версиях инструментария до CUDA 5.0 или в ревизиях PTX до 3.1.

Вероятно, проще всего проиллюстрировать, как это сделать, на работающем примере. Давайте начнем с простой функции PTX для увеличения указателей, как в вашем примере:

Это может быть скомпилировано в объект перемещаемого устройства с помощью`ptxas` и затем упакован в файл-контейнер. Последний шаг кажется критическим. По умолчанию`ptxas` выход только перемещаемый`elf` объект, жировой контейнер не производится. Кажется, что фаза связывания кода устройства, которую запускает nvcc (по крайней мере, в CUDA 5), ожидает, что весь код устройства присутствует в толстых двоичных контейнерах. В противном случае связь потерпит неудачу. Результат выглядит так:

Вы можете видеть, что fatbinary содержит микрокод из собранного PTX. С подготовленной функцией устройства fatbin вы можете сделать что-то вроде этого в коде CUDA C:

В отдельном режиме компиляции инструментальная цепочка кода устройства будет учитывать`extern` объявление и (если вы получаете контроль над символами), функция устройства fatbinary может быть связана с другим устройством и кодом хоста для создания конечного объекта:

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



 CUDA C поддерживает asm, есть документ, который находится в каталоге doc после установки набора инструментов cuda.