首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >CUDA流是否与设备关联?我如何得到一个流的设备?

CUDA流是否与设备关联?我如何得到一个流的设备?
EN

Stack Overflow用户
提问于 2015-07-17 19:28:19
回答 2查看 1.4K关注 0票数 4

我有一个CUDA流,有人给了我--一个cudaStream_t值。CUDA Runtime API似乎没有指明如何获取与此流关联的设备的索引。

现在,我知道cudaStream_t只是一个指向驱动程序级流结构的指针,但是我不太愿意深入研究这个驱动程序。有没有一种惯用的方法来做到这一点?或者是一些不想做的好理由?

CUDA:这个问题的另一个方面是,流是否真的与设备相关联,在这种方式下,驱动程序本身可以在给定指向结构的情况下确定设备的身份。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-18 02:51:21

是的,流是特定于设备的。

在CUDA中,流特定于环境,而环境特定于设备。

现在,使用运行时API,你不会“看到”上下文--你只需要在每个设备上使用一个上下文(这是一个好主意,因为上下文是昂贵的)。但是,如果考虑到驱动程序接口,您可以使用have

CUresult cuStreamGetCtx ( CUstream hStream, CUcontext* pctx );

CUstreamcudaStream_t是同一个东西--一个指针。因此,您可以获得上下文。然后,将该上下文设置或推送为当前上下文(请阅读其他地方的相关内容),最后,您可以使用:

CUresult cuCtxGetDevice ( CUdevice* device ) 

来获取当前上下文的设备。

所以,这有点麻烦,但很可行。

轻松确定流的设备的方法

我对这个问题的解决方法是让the (C++'ish) stream wrapper class将设备保留为成员变量,这意味着您可以这样写:

auto my_device = cuda::device::get(1);
auto my_stream = my_device.create_stream(); /* using some default param values here */
assert(my_stream.device() == my_device());

不用担心这个问题。(当然,上面的代码片段适用于至少有2个CUDA设备的系统,否则没有索引为1的设备...)

票数 1
EN

Stack Overflow用户

发布于 2015-07-17 23:14:39

关于显式流,这取决于实现(据我所知)没有API向用户提供这种潜在的查询功能;我不知道驱动程序在这方面可以为您提供的功能,但是,您总是可以查询流。

通过使用cudaStreamQuery,您可以查询所选设备上的目标流,如果返回cudaSuccess或cudaErrorNotReady,则表示该设备上确实存在该流,如果返回cudaErrorInvalidResourceHandle,则表示该设备上不存在该流。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31474784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档