cuCtxGetApiVersion值不同于其他版本管理调用

时间:2019-04-01 21:46:37

标签: cuda

我正在运行以下代码:

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

从文档中,我可以看到cudaDriverGetVersioncuDriverGetVersioncudaRuntimeGetVersion返回的格式为(1000 * major + 10 * minor)。该文档没有指定cuCtxGetApiVersion应该返回什么,但是我认为它应该与其他三个函数相同。

我的问题是,当所有其他版本都使用10000和10010时,为什么上下文2030的版本号是多少?这是应该的吗?

我遇到另一个问题,即我创建的新线程需要手动共享其上下文,否则会出现201(无效的上下文)错误。这很奇怪,因为我知道在过去的CUDA 4.0中,每个进程每个设备每个设备都有一个上下文。因此,我不必为在同一进程中创建的新线程设置上下文。由于cuCtxGetApiVersion的生产时间是3020,这使我相信我创建的上下文使用的是旧的错误版本,该版本不具有跨线程共享的功能。

这有可能吗?

1 个答案:

答案 0 :(得分:0)

事实证明cuCtxGetApiVersion正常运行。

This answer帮助我了解发生了什么。我的cuCtxGetApiVersion使用的是“ v2”。上下文版本是最新版本,即使它看起来很旧。

关于第二个问题,我发现我的行为是可以预期的。以前,我传递流以执行异步调用,但是我一直在未指定流的情况下进行同步调用。创建的新线程将没有与之关联的上下文。