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

Posted

技术标签:

【中文标题】cuCtxGetApiVersion 值与其他版本管理调用不同【英文标题】:cuCtxGetApiVersion value differs from other version management calls 【发布时间】:2019-08-23 03:30:12 【问题描述】:

我正在运行以下代码:

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 * 主要 + 10 * 次要)形式返回值。文档没有指定 cuCtxGetApiVersion 应该返回什么,但我认为它应该与其他三个函数相同。

我的问题是为什么上下文的版本号是 3020,而所有其他人都使用 10000 和 10010?这是应该的吗?

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

这可能吗?

【问题讨论】:

【参考方案1】:

事实证明 cuCtxGetApiVersion 工作正常。

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

至于我的第二个问题,我发现我得到的行为是意料之中的。以前我传入流来执行异步调用,但我玩过没有指定流的同步调用。创建的新线程不会有与之关联的上下文。

【讨论】:

以上是关于cuCtxGetApiVersion 值与其他版本管理调用不同的主要内容,如果未能解决你的问题,请参考以下文章

熊猫将嵌套值与其他列一起切片

熊猫将嵌套值与其他列一起切片

将每个 RDD 值与 Scala 中 RDD 中的所有其他值配对

将不同变量的值与其他组和自我进行比较

从 SQL 获取值与其他列表的关系是啥。 (甲骨文 APEX 21.11)

将递增值与其他值一起添加到 Oracle 数据库中的列中