1

我创建了 2 个 cuda 上下文“ctx1”和“ctx2”并将当前上下文设置为“ctx1”并分配 8 字节的内存并将当前上下文切换到 ctx2。然后释放 ctx1 中的内存分配。为什么会返回CUDA_SUCCESS

而当我销毁 ctx1 然后释放内存时,会导致CUDA_INVALID_VALUE. 在我看来,每个上下文都包含其独特的资源,并且不允许其他上下文访问。有人可以解释这种行为吗?

int main() {
    using std::cout;
    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 << '\n';
    assert(cuCtxSetCurrent(ctx2) == CUDA_SUCCESS);
    cout << "free in ctx2 result = " << cuMemFree(dptr) << '\n';
}
4

1 回答 1

1

为什么这会返回 CUDA_SUCCESS?

为什么它不应该返回 CUDA_SUCCESS?我在文档中没有看到任何地方说自由操作仅在引用的指针与当前上下文相关联时才有效。这似乎完全有效,您的测试用例似乎证实了这一点。

而当我销毁ctx1然后释放内存时,会导致CUDA_INVALID_VALUE。

这是预期的行为。你分配dptrctx1. 当您 destroy 时ctx1,与该上下文关联的所有状态,包括任何关联的分配,都将被销毁。试图释放已经通过上下文销毁释放的指针是无效的。

如果您认为,正如其他人在评论中指出的那样,免费操作“需要”上下文:

  1. 它没有记录在案
  2. UVA设置中没有必要。指针在 UVA 设置中是可自省的,部分原因是 UVA 设置确保相关地址空间不重叠。
于 2022-01-20T22:36:54.293 回答