Передача инструкций между CPU и GPU

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

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


person amnl    schedule 16.02.2012    source источник


Ответы (1)


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

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

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

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

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

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

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

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

person aland    schedule 28.02.2012
comment
Меня интересует, как все делается, не обязательно в производительности. В частности, как GPU обрабатывает циклы / if-else внутри каждого ядра. - person amnl; 29.02.2012
comment
Ветвление @amnl описано в разделе 4.1 CUDA. Руководство по программированию на C, и по сути то же самое для графического процессора AMD (без ссылки, извините): деформация [32 последовательных потока] выполняет одну общую инструкцию за раз .... Если потоки деформации расходятся из-за данных -зависимая условная ветвь, деформация последовательно выполняет каждый пройденный путь ветвления, отключая потоки, которые не находятся на этом пути, и когда все пути завершаются, потоки сходятся обратно к одному и тому же пути выполнения. - person aland; 01.03.2012