cuCtxGetApiVersion 值不同于其他版本管理调用
cuCtxGetApiVersion value differs from other version management calls
我是运行以下代码:
cuCtxCreate(&context, CU_CTX_SCHED_YIELD, device);
int driverVersion = -1;
int driverVersionRt = -1;
int rtVersion = -1;
unsigned int ctxVersion = 1;
cuDriverGetVersion(&driverVersion);
cudaDriverGetVersion(&driverVersionRt);
cudaRuntimeGetVersion(&rtVersion);
cuCtxGetApiVersion(context, &ctxVersion);
std::cout << "cuDriverGetVersion: " << driverVersion << std::endl;
std::cout << "cudaDriverGetVersion: " << driverVersionRt << std::endl;
std::cout << "cudaRuntimeGetVersion: " << rtVersion << std::endl;
std::cout << "cuCtxGetApiVersion: " << ctxVersion << std::endl;
这是输出:
cuDriverGetVersion: 10010
cudaDriverGetVersion: 10010
cudaRuntimeGetVersion: 10000
cuCtxGetApiVersion: 3020
从文档中,我可以看到 cudaDriverGetVersion
、cuDriverGetVersion
和 cudaRuntimeGetVersion
return 形式的值 (1000 * major + 10 * minor)。文档没有指定cuCtxGetApiVersion
应该return,但我认为它应该与其他三个功能相同。
我的问题是为什么上下文的版本号是 3020,而其他所有版本都使用 10000 和 10010?这是应该的吗?
我有另一个问题,我创建的新线程需要手动共享它们的上下文,否则我会收到 201(无效上下文)错误。这很奇怪,因为我知道过去的 CUDA 4.0 所有进程每个进程每个设备都有一个上下文。所以我不必为我在同一进程中创建的新线程设置上下文。因为 cuCtxGetApiVersion
正在生成 3020,这让我相信我创建的上下文使用的是旧的错误版本,它不具备跨线程共享的功能。
有这种可能吗?
事实证明 cuCtxGetApiVersion 工作正常。
This answer 帮助我理解了发生了什么。我的 cuCtxGetApiVersion 使用的是 "v2"。上下文版本是最新的,尽管它看起来很旧。
关于我的第二个问题,我发现我得到的行为是意料之中的。以前我通过传入流来执行异步调用,但我玩过没有指定流的同步调用。创建的新线程将没有与之关联的上下文。
我是运行以下代码:
cuCtxCreate(&context, CU_CTX_SCHED_YIELD, device);
int driverVersion = -1;
int driverVersionRt = -1;
int rtVersion = -1;
unsigned int ctxVersion = 1;
cuDriverGetVersion(&driverVersion);
cudaDriverGetVersion(&driverVersionRt);
cudaRuntimeGetVersion(&rtVersion);
cuCtxGetApiVersion(context, &ctxVersion);
std::cout << "cuDriverGetVersion: " << driverVersion << std::endl;
std::cout << "cudaDriverGetVersion: " << driverVersionRt << std::endl;
std::cout << "cudaRuntimeGetVersion: " << rtVersion << std::endl;
std::cout << "cuCtxGetApiVersion: " << ctxVersion << std::endl;
这是输出:
cuDriverGetVersion: 10010
cudaDriverGetVersion: 10010
cudaRuntimeGetVersion: 10000
cuCtxGetApiVersion: 3020
从文档中,我可以看到 cudaDriverGetVersion
、cuDriverGetVersion
和 cudaRuntimeGetVersion
return 形式的值 (1000 * major + 10 * minor)。文档没有指定cuCtxGetApiVersion
应该return,但我认为它应该与其他三个功能相同。
我的问题是为什么上下文的版本号是 3020,而其他所有版本都使用 10000 和 10010?这是应该的吗?
我有另一个问题,我创建的新线程需要手动共享它们的上下文,否则我会收到 201(无效上下文)错误。这很奇怪,因为我知道过去的 CUDA 4.0 所有进程每个进程每个设备都有一个上下文。所以我不必为我在同一进程中创建的新线程设置上下文。因为 cuCtxGetApiVersion
正在生成 3020,这让我相信我创建的上下文使用的是旧的错误版本,它不具备跨线程共享的功能。
有这种可能吗?
事实证明 cuCtxGetApiVersion 工作正常。
This answer 帮助我理解了发生了什么。我的 cuCtxGetApiVersion 使用的是 "v2"。上下文版本是最新的,尽管它看起来很旧。
关于我的第二个问题,我发现我得到的行为是意料之中的。以前我通过传入流来执行异步调用,但我玩过没有指定流的同步调用。创建的新线程将没有与之关联的上下文。