代码之家  ›  专栏  ›  技术社区  ›  einpoklum

CUDA流设备是否关联?如何获取流的设备?

  •  5
  • einpoklum  · 技术社区  · 11 年前

    我有一条CUDA流,有人递给我 cudaStream_t 价值这个 CUDA Runtime API 似乎没有指示我如何获取与此流关联的设备的索引。

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

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

    2 回复  |  直到 3 年前
        1
  •  2
  •   einpoklum    3 年前

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

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

    现在,使用运行时API,您不会“看到”上下文——每个设备只使用一个上下文。但如果您考虑驱动程序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());
    

    并且不必担心它(+它不会触发额外的API调用,因为在构建时,我们知道当前上下文是什么以及它的设备是什么)。

    注意:上面的代码片段适用于至少有两个CUDA设备的系统,否则没有索引为1的设备。。。

        2
  •  0
  •   Iman    11 年前

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

    通过使用 cudaStream查询 ,如果返回 cuda成功 cuda错误未就绪 这意味着流确实存在于该设备上,如果它返回 cudaErrorInvalidResourceHandle ,这意味着它没有。