我有一个CUDA流,有人给了我--一个cudaStream_t
值。CUDA Runtime API似乎没有指明如何获取与此流关联的设备的索引。
现在,我知道cudaStream_t
只是一个指向驱动程序级流结构的指针,但是我不太愿意深入研究这个驱动程序。有没有一种惯用的方法来做到这一点?或者是一些不想做的好理由?
CUDA:这个问题的另一个方面是,流是否真的与设备相关联,在这种方式下,驱动程序本身可以在给定指向结构的情况下确定设备的身份。
发布于 2018-06-18 02:51:21
是的,流是特定于设备的。
在CUDA中,流特定于环境,而环境特定于设备。
现在,使用运行时API,你不会“看到”上下文--你只需要在每个设备上使用一个上下文(这是一个好主意,因为上下文是昂贵的)。但是,如果考虑到驱动程序接口,您可以使用have
CUresult cuStreamGetCtx ( CUstream hStream, CUcontext* pctx );
CUstream
和cudaStream_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的设备...)
发布于 2015-07-17 23:14:39
关于显式流,这取决于实现(据我所知)没有API向用户提供这种潜在的查询功能;我不知道驱动程序在这方面可以为您提供的功能,但是,您总是可以查询流。
通过使用cudaStreamQuery,您可以查询所选设备上的目标流,如果返回cudaSuccess或cudaErrorNotReady,则表示该设备上确实存在该流,如果返回cudaErrorInvalidResourceHandle,则表示该设备上不存在该流。
https://stackoverflow.com/questions/31474784
复制相似问题