4

我有一个 CUDA 流,有人交给我 - 一个cudaStream_t值。CUDA 运行时 API似乎没有指示我如何获取与此流关联的设备的索引。

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

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

4

2 回答 2

1

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

在 CUDA 中,流特定于上下文,而上下文特定于设备。

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

CUresult cuStreamGetCtx ( CUstream hStream, CUcontext* pctx );

CUstream并且cudaStream_t是相同的东西- 一个指针。所以,你可以得到上下文。然后,您将该上下文设置或推送为当前上下文(阅读其他地方的相关信息),最后,您使用:

CUresult cuCtxGetDevice ( CUdevice* device ) 

获取当前上下文的设备。

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


我轻松确定流设备的方法

我对这个问题的解决方法是让(C++'ish)流包装类将设备保留为成员变量,这意味着您可以编写:

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 的设备...)

于 2018-06-17T18:51:21.263 回答
0

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

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

于 2015-07-17T15:14:38.553 回答