API драйвера CUDA cuMemAlloc память одного контекста1 и освобождение другого контекста, почему это удается?

Я создаю 2 контекста cuda «ctx1» и «ctx2», устанавливаю текущий контекст на «ctx1», выделяю 8 байт памяти и переключаю текущий контекст на ctx2. Затем освободите выделение памяти в ctx1. Почему это возвращает CUDA_SUCCESS?

И когда я уничтожу ctx1, а затем освобожу память, это вызовет CUDA_INVALID_VALUE. На мой взгляд, каждый контекст содержит свои уникальные ресурсы и не имеет доступа к другому контексту. Может кто-нибудь объяснить такое поведение?

      int main() {
CUresult answer;
CUdeviceptr dptr = 4;
int device_enum = 0;
CUcontext ctx1,ctx2;``
cuInit(0);
CUdevice able_dev = 0;
CUresult create_ctx1 = cuCtxCreate(&ctx1,CU_CTX_SCHED_AUTO,able_dev);
CUresult create_ctx2 = cuCtxCreate(&ctx2,CU_CTX_SCHED_AUTO,able_dev);
assert(cuCtxSetCurrent(ctx1) == CUDA_SUCCESS);
answer = cuMemAlloc(&dptr,8);
cout<<"maloc result1 = "<<answer<<endl;
assert(cuCtxSetCurrent(ctx2) == CUDA_SUCCESS);
cout<<"free in ctx2 result = "<< cuMemFree(dptr)<<endl;
return 0;
}

1 ответ

Почему это возвращает CUDA_SUCCESS?

Почему он не должен возвращать CUDA_SUCCESS? Я не вижу нигде в документации, где говорится, что свободная операция действительна только в том случае, если указатель, на который ссылаются, связан с текущим контекстом. Это кажется совершенно верным, и ваш тестовый пример, кажется, подтверждает это.

И когда я уничтожу ctx1, а затем освобожу память, это вызовет CUDA_INVALID_VALUE.

Это ожидаемое поведение. Вы выделили dptrв . Когда ты уничтожаешь ctx1, все состояния, связанные с этим контекстом, включая любые связанные распределения, уничтожаются. Попытка освободить указатель, который уже был освобожден посредством уничтожения контекста, недопустима.

На случай, если вы подумали, как кто-то другой указал в комментариях, что контекст будет «необходим» для бесплатной операции:

  1. Это не задокументировано
  2. В настройках UVA это не обязательно . Указатель является интроспективным в настройке UVA отчасти потому, что настройка UVA гарантирует, что релевантные адресные пространства не перекрываются.
Другие вопросы по тегам