Об этом действительно не так много информации, но вы переоцениваете эффект.
Весь код ядра загружается в GPU только один раз (в худшем случае один раз для вызова ядра, но выглядит такфактически выполняется один раз для каждого приложения (см. ниже), а затем выполняется полностью на GPU без какого-либо вмешательства со стороны CPU.Таким образом, весь код ядра копируется в один фрагмент где-то перед вызовом ядра.Чтобы оценить размер кода, размер .cubin
всего кода GPU нашего самодельного пакета MD (52 ядра, некоторые из которых> 150 строк кода) составляет всего 91 КиБ, поэтому можно предположить, что практически во всехВ случаях, когда время передачи кода незначительно.
Вот что я нашел в официальных документах:
В API драйвера CUDA ,код загружается на устройство во время вызова cuModuleLoad
функция
API драйвера CUDA не пытается лениво распределять ресурсы, необходимые модулю;если память для функций и данных (постоянных и глобальных), необходимых для модуля, не может быть выделена, cuModuleLoad () завершается ошибкой
Теоретически, вам может потребоваться выгрузить модуль и затем загрузить его снова, если выесть несколько модулей, которые используют слишком много постоянной (или статически распределенной глобальной) памяти для одновременной загрузки, но это довольно редко, и вы обычно вызываете cuModuleLoad
только один раз при запуске приложения, сразу после создания контекста.
CUDA Runtime API не обеспечивает каких-либо мер контроля загрузки / выгрузки модуля, но похоже, что весь необходимый код загружается на устройство во время его инициализации.
Спецификации OpenCL не столь специфичны, как API драйвера CUDA, но код, вероятно (с использованием диких догадок), скопирован на устройство на этапе clBuildProgram
.