【问题标题】:What is the context switching mechanism in GPU?GPU中的上下文切换机制是什么?
【发布时间】:2011-07-07 13:04:59
【问题描述】:

据我所知,GPU 在扭曲之间切换以隐藏内存延迟。但我想知道在什么情况下,扭曲会被关闭?例如,如果一个 warp 执行加载,并且数据已经在缓存中。那么warp是关闭还是继续下一个计算?如果有两个连续添加会发生什么? 谢谢

【问题讨论】:

    标签: cuda opencl gpu gpgpu


    【解决方案1】:

    首先,一旦一个线程块在多处理器 (SM) 上启动,它的所有 warp 都会驻留,直到它们全部退出内核。因此,直到有足够的寄存器用于该块的所有扭曲,并且直到有足够的空闲共享内存用于该块,才会启动一个块。

    因此,warp 永远不会“切换出去”——没有传统意义上的 warp 上下文切换,其中上下文切换需要将寄存器保存到内存并恢复它们。

    然而,SM 确实会从所有常驻经线中选择要发布的指令。事实上,SM 更有可能从不同的 warp 连续发出两条指令,而不是从同一个 warp,无论它们是什么类型的指令,无论有多少 ILP(指令级并行度)。不这样做会使 SM 暴露于依赖停顿。即使像加法这样的“快速”指令也具有非零延迟,因为算术流水线是多个周期长。例如,在 Fermi 上,硬件每个周期(峰值)可以发出 2 条或更多条扭曲指令,算术流水线延迟约为 12 个周期。因此,您需要在飞行中使用多个扭曲来隐藏算术延迟,而不仅仅是内存延迟。

    一般来说,warp 调度的细节取决于架构,没有公开记录,并且几乎可以保证随着时间的推移而改变。 CUDA 编程模型独立于调度算法,您不应在软件中依赖它。

    【讨论】:

    • 感谢您的回答。我同意其中的大部分。但很少有事情需要讨论。首先,我的意思是这里的切换不是典型的带有寄存器保存的切换。我的意思是,在一个 warp 从内存中请求一些不在缓存中的东西之后,它就会停止或切换——不管你怎么称呼它(但在 SM 中仍然处于活动状态),然后另一个 warp 进入并占据 SM。所以我想知道是否存在另一种情况,即扭曲占用 SM 超过一个周期(例如,执行添加指令直到完成)。
    • 不要考虑“切换。考虑发布。SM有一个常驻warp池,它可以从中发出指令。它从哪个warp发出在任何给定的周期都是无关紧要的,只要它总是发出指令。
    • 别把它当成切换,它是发行。 SM 有一个常驻 warp 池,它可以从中发出指令。在任何给定的周期它发出什么扭曲并不重要,重要的是它总是有可以发出的指令。 SM 是否会从同一个 warp 连续发出两条指令会影响您对 CUDA 的编程方式吗?没有。
    • 达蒙,让我解释一下我的理解。我认为基本上这些想法根本没有反对。切换一个 warp 仅仅意味着 SM 只是不发出该 warp 的下一条指令,并且该 warp 被停止,直到属于它的所有线程完成当前指令。在一个扭曲被切换出来的时候,我认为它的一些线程仍然可以由于指令流水线而占据一些执行单元。他们在这里切入和切出的真正含义只是一条经线指令是否已开始同步执行。
    • “飞行中”,意思是居住在 SM 上。只要它们是常驻的,它们就不会被“切换”——它们的寄存器集、共享内存、程序计数器等都被维护。 “切换”只是从一组驻留经纱中选择要发出的指令。我试图防止与传统的 CPU 线程上下文“切换”混淆,在执行线程之间切换的位置需要将分配的寄存器值、程序计数器等保存和恢复到片外内存(或缓存),因此更多重量级操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    相关资源
    最近更新 更多