测量GPU上下文切换的开销

8

有很多方法可以衡量 CPU 上下文切换开销。似乎没有太多资源来测量 GPU 上下文切换开销。CPU 上下文切换和 GPU 上下文切换非常不同。

GPU 调度基于 Warp 调度。要计算 GPU 上下文切换的开销,需要知道上下文切换的 Warp 时间和未经上下文切换的 Warp 时间,并进行相减得出开销。

我对如何测量带上下文切换时间的 Warp 时间感到困惑。是否有人有一些想法可以测量?


4
CUDA有多个不同级别的上下文切换。进行完整GPU上下文切换的成本为25-50微秒。启动CUDA线程块的成本是100个周期。启动CUDA线程束的成本小于10个周期。在分配给线程束调度器的线程束之间切换的成本为0个周期,可以每个周期发生一次。在CC >= 3.5的情况下,CDP SW抢占的成本更高,并且会随着GPU工作负载的变化而变化。 - Greg Smith
非常感谢。根据 Fermi 白皮书,它说“Fermi 管道被优化以将应用程序上下文切换的成本降至 25 微秒以下”。这个 25 微秒是您所说的完整 GPU 上下文切换吗?我对切换 warp 的成本感到困惑。假设 warp A 访问全局内存,并且它有数百个周期的延迟。此时,warp 调度程序切换另一个 warp 以使 ALU 忙碌。warp 切换是否为 0 个周期,或者调度程序进行 warp 切换可能需要一些周期? - LongY
1
对于warp而言,不存在上下文切换。当一个块被光栅化成warp时,这些warp会被分配给warp调度器,并且所有寄存器都会被分配。warp调度器维护一个合格的warp列表(未停顿)。在每个时钟周期内,它可以从任何合格的warp中发出,而不需要额外开销。没有数据需要进行上下文切换。所有硬件资源已经被分配给了warp,因此没有需要切换的数据。 - Greg Smith
谢谢,Greg。你的回答非常详细且纠正了一些错误观念。虽然我们确信Warp切换时间为0,但我想知道是否可以设计一个测试来检测Warp切换时间,并自行测试时间是否为零。 - LongY
1
如果在紧密循环中执行依赖算术操作(例如value *= iteration,其中value是一个浮点数),则会创建一系列依赖指令。如果循环迭代是恒定的,则可以展开循环。使用4个warp/SM,然后8个warp/SM执行此内核,调度程序将被强制在指令之间切换warp。您应该发现每个warp调度程序可以每个周期发出一条指令。或者,您可以编写一个程序,进行一长串clock()读取,然后将结果写入每个warp的不同地址,然后对warp ID进行排序。 - Greg Smith
Greg,感谢您的宝贵评论。我想知道您是否可以将您的评论发布为答案。这样我就可以接受您的答案并标记问题已解决。 - LongY
1个回答

7

我认为在GPU上谈论“上下文切换”的“开销”没有太多意义。

在CPU上,上下文切换是通过内核中的“调度程序”函数在软件中完成的。调度程序是普通代码,是一系列处理器必须运行的机器指令,而运行调度程序所花费的时间不是用于执行“有用”的工作。

另一方面,GPU在硬件上进行上下文切换,没有调度程序,并且速度足够快,以至于当一个任务遇到管道停滞时,可以引入另一个任务来利用否则空闲的管道阶段。这被称为“隐藏延迟”-一个任务的延迟被其他任务的进展所隐藏。实际上,上下文切换允许在给定时间内完成更多的“有用”工作。

有关更多信息,请参见我在SuperUser上针对相关问题写的此答案


非常感谢。GPU使用上下文切换来隐藏延迟以获得更高的吞吐量。更具体地说,我想测量将一个任务切换到另一个任务所需的时间。假设任务A(或warp A)存在管道停顿或长时间内存访问,GPU会调度任务B(或warp B)以隐藏由任务A引起的延迟。我的问题是如何在GPU上测量将任务A切换到任务B所需的时间。即使上下文切换时间非常短,它肯定有一些值。这就是我想要测量的。 - LongY
1
当以GPU时钟周期计量时,上下文切换时间为零。 - Robert Crovella
1
GPU的有趣的“上下文切换”时间是在CUDA上下文之间,而不是线程上下文。 - ArchaeaSoftware
1
我想提一下,CPU上的超线程与GPU上的warp调度有些相似:如果一个线程在内存读取时被阻塞,那么另一个线程可以利用核心的其余部分来进行自己的进展。这种细粒度的“上下文切换”也由硬件维护,没有额外的开销。 - Yakov Galka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接