Cuda中的warp调度和warp上下文切换之间的关系

时间:2014-06-22 16:36:46

标签: cuda gpu scheduling context-switch

据我所知,ready warp是一种可以在warp调度中执行的warp。等待warp正在等待获取或计算源操作数,以便不能执行它。 Warp调度程序选择一个准备好的warp来执行" warp scheduling"。

另一方面,当warp具有管道停滞或长全局内存延迟时,将执行另一个warp以隐藏延迟。这是" warp context switching"的基本思想。在cuda。

我的问题是:Cuda中的warp调度和warp上下文切换之间的关系是什么。为了详细说明我的问题,下面是一个例子。

E.g。当warp A停止,并且warp A是要获取全局内存的等待warp时,一旦获取了该元素,warp A将被调度或切换到ready warp pool。基于此,warp上下文切换是warp调度的一部分。这是对的吗?

任何人都可以提供关于Cuda中的warp上下文切换和warp调度的任何参考吗?似乎Nvidia没有公开这些文件。

提前感谢您的回复。

1 个答案:

答案 0 :(得分:4)

准备好的经线是可以在下一个周期安排的经线。停滞不前的经线无法安排。

要通过一个极其简化的示例来回答有关延迟的问题,假设主内存的延迟是8个执行周期,让我们忽略机器是流水线的事实。如果数据准备好,我们假设所有指令都可以在一个周期内执行。

现在假设我有这样的C代码:

int idx = threadIdx.x+blockDim.x*blockIdx.x;

int myval = global_data[idx]*global_data[idx];

也就是说,myval应该包含代码完成时全局内存中项的平方。这将被分解为汇编语言指令序列。让我们假设他们看起来像这样:

I0: R0 = global_data[idx];
I1: R1 = R0 * R0;
I2: ...

每个线程都可以执行第一行代码(最初没有停顿);还没有依赖,并且读取本身不会导致停顿。但是,每个线程都可以转到第二行代码,现在R0的值必须正确,因此会发生停顿,等待检索读取。如前所述,假设延迟为8个周期,并且使用32的warp和512的线程块大小,我们总共有16个warp。让我们假设为了简单起见,我们有一个只有32个执行单元的Fermi SM。序列将如下所示:

cycle:     ready warps:   executing warp:     instruction executed:     Latency:
    0            1-16                   0            I0 -> I1 (stall)    --
    1            2-16                   1            I0 -> I1 (stall)     | --
    2            3-16                   2            I0 -> I1 (stall)     |  |
    3            4-16                   3            I0 -> I1 (stall)     |  |
    4            5-16                   4            I0 -> I1 (stall)     |  |
    5            6-16                   5            I0 -> I1 (stall)     |  |
    6            7-16                   6            I0 -> I1 (stall)     |  |
    7            8-16                   7            I0 -> I1 (stall)     |  |
    8          0,9-16                   8            I0 -> I1 (stall)    <-  |
    9          1,9-16                   0            I1 -> I2            <----

我们看到的是,在通过执行来自其他warp的指令来完成延迟之后,之前的停止&#34; warp将重新进入就绪warp池,并且调度程序可以在停止条件之后的下一个周期再次调度该warp(即执行I1中包含的乘法运算)。除去。

延迟隐藏和warp调度之间没有矛盾。他们一起工作,为一个有足够工作要做的代码,隐藏与各种操作相关的延迟,例如从全局内存中读取。

上面的示例是与实际行为相比的简化,但它充分代表了延迟隐藏和扭曲调度的概念,以演示如何在存在足够的工作的情况下进行扭曲调度,#34;隐藏延迟。