Информации об этом действительно немного, но эффект вы переоцениваете.
Весь код ядра загружается в графический процессор только один раз (в худшем случае - один раз на вызов ядра, но похоже, что на самом деле он выполняется один раз на запуск приложения, см. Ниже), а затем полностью выполняется на графическом процессоре без каких-либо вмешательство со стороны 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