вызов времени выполнения cuda после вызова api драйвера, чрезмерные накладные расходы

Я пытался добавить вызов внешней функции cuda (с большим количеством вызовов api времени выполнения) в программу, которая включает только вызов api драйвера cuda, используя отдельную связь, описанную в , в основном компилируйте их в статическую https://developer.nvidia.com/blog/separate-compilation-linking-cuda-device-code /библиотеку и связывайте вместе с программой

Однако, когда я профилирую внешнюю библиотеку, я обнаружил, что первый вызов API-интерфейса среды выполнения, то есть cudamalloc, занимает слишком много времени, так как эта функция вызывается много раз, чрезмерные накладные расходы снижают ее производительность.

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

Простую иллюстрацию можно описать ниже:

      cuCtxGetCurrent(&current_ctx)
//driver current_ctx=0x5641b9aac1a0

checkCudaErrors(cuMemAlloc(&d_C1, 4));
//driver api call time: 6.724us*

cuCtxGetCurrent(&current_ctx);
//driver current_ctx=0x5641b9aac1a0, same as above

cudaMalloc(&d_D, 4);
//runtime api call time: 5896.57us, great overhead

cuCtxGetCurrent(&current_ctx);
//runtime current_ctx1=0x5641b9aac1a0 same as above

cudaMalloc(&d_E, 4);
//runtime call2 time: 10.655us, this time the overhead is much less

Первый cudaMalloc занимает много времени. Если это в цикле, накладные расходы значительны.

Любой совет будет принят во внимание.

0 ответов

Другие вопросы по тегам