【问题标题】:CUDA: what does a stream abstract?CUDA:流抽象了什么?
【发布时间】:2019-03-21 21:55:44
【问题描述】:

在 cuda C 编程指南中,流的定义非常抽象:一系列 cuda 操作,按照代码发出的顺序执行。

我对 Nvidia GPU 中指令如何执行的理解是:当内核启动时,块被分发到设备中的 SM。然后,经线(32 个线程的组)由 SM 中的经线调度程序调度,以便按经线方式处理指令。

  1. 因此,如果两个内核在同一个流中启动,则第一个内核会在第二个内核之前处理(因为指令按照它们放入流中的顺序进行处理)。这是否意味着两个内核最终只使用一个内核的硬件资源?还是每个内核都有自己的资源,但第二个内核等待第一个内核完成?

  2. 一般来说,流是如何在硬件中实现的?我假设它为 warp 调度程序提供了排序(但随后一个 warp 调度程序是基于每个 SM 的,那么这将如何允许多 SM 内核使用流?)。

【问题讨论】:

  • 流不抽象任何东西。它们只是主机端机制
  • @talonmies:嗯,有个硬件队列,不是吗?流并没有完全抽象它们,但仍然如此。

标签: cuda


【解决方案1】:

CUDA 流只是一个队列,由 GPU 执行的操作。 通过 API 的每个函数都可以以异步方式发出 - CPU 代码继续执行,而指令等待独立于主机代码执行。尽管如此,它相对于队列/流中的其他指令同步执行。

如果您希望在 GPU 上异步执行多个操作,则需要两个或更多队列/流。例如,CUDA 手册中有一章介绍了如何将内核执行(第一个流)与内存传输(第二个流)混合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2021-11-13
    • 2021-11-04
    • 2013-06-26
    • 2012-11-29
    • 2015-09-26
    • 1970-01-01
    相关资源
    最近更新 更多