Передача команд между процессором и графическим процессором - PullRequest
4 голосов
/ 16 февраля 2012

Я ищу информацию о том, как процессор перемещает программный код в графический процессор при работе с вычислениями GPGPU.В Интернете есть множество руководств по передаче данных, но не по инструкции / загрузке программы.

Вопрос в том, что программа обрабатывается ЦП, который «настраивает» графический процессор на соответствующие флаги на каждом вычислительном блоке для выполнения.данная операция.После этого данные передаются и обрабатываются.Как выполняется первая операция?Как выдаются инструкции в ГПУ?Являются ли инструкции каким-то образом пакетными, чтобы использовать преимущества полосы пропускания шины?Возможно, я игнорировал что-то фундаментальное, поэтому любая дополнительная информация приветствуется.

1 Ответ

3 голосов
/ 28 февраля 2012

Об этом действительно не так много информации, но вы переоцениваете эффект.

Весь код ядра загружается в GPU только один раз (в худшем случае один раз для вызова ядра, но выглядит такфактически выполняется один раз для каждого приложения (см. ниже), а затем выполняется полностью на GPU без какого-либо вмешательства со стороны CPU.Таким образом, весь код ядра копируется в один фрагмент где-то перед вызовом ядра.Чтобы оценить размер кода, размер .cubin всего кода GPU нашего самодельного пакета MD (52 ядра, некоторые из которых> 150 строк кода) составляет всего 91 КиБ, поэтому можно предположить, что практически во всехВ случаях, когда время передачи кода незначительно.

Вот что я нашел в официальных документах:

В API драйвера CUDA ,код загружается на устройство во время вызова cuModuleLoad функция

API драйвера CUDA не пытается лениво распределять ресурсы, необходимые модулю;если память для функций и данных (постоянных и глобальных), необходимых для модуля, не может быть выделена, cuModuleLoad () завершается ошибкой

Теоретически, вам может потребоваться выгрузить модуль и затем загрузить его снова, если выесть несколько модулей, которые используют слишком много постоянной (или статически распределенной глобальной) памяти для одновременной загрузки, но это довольно редко, и вы обычно вызываете cuModuleLoad только один раз при запуске приложения, сразу после создания контекста.

CUDA Runtime API не обеспечивает каких-либо мер контроля загрузки / выгрузки модуля, но похоже, что весь необходимый код загружается на устройство во время его инициализации.

Спецификации OpenCL не столь специфичны, как API драйвера CUDA, но код, вероятно (с использованием диких догадок), скопирован на устройство на этапе clBuildProgram.

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