我说的是具有计算能力3.5(GK110)的nvidia GPU:
在每个GPU核心上,最多有64个活动warp,硬件如何处理warp退役?可以从不同的网格块甚至流中转换同时在GPU的单个核心上工作(核心是指多处理器,因为它们可能是多核GPU的核心)?
核心退役是否可以从流中快速完成扭曲并将其他扭曲从其他流加载到同一个核心?
我之所以这么说是因为做出了艰难的决定:
(1)我可以编写代码来启动来自不同流的许多线程,并且大约2/3的warp将基本上什么都不做并且快速退役。
OR:
(2)我可以编写代码来准确启动所需的线程数,但是每个线程都将包含非常繁重的索引计算(通过求解几个索引方程式,计算正确索引所涉及的计算量将只是(如果不是更多),(1)中的实际计算。
因此,如果GK110可以快速退出空扭曲并用新扭曲替换它们,则(1)将优于(2)因为它可以完全避免不必要的索引计算。
到目前为止,琐碎的案例测试显示两个作品大致相同,但我不确定(1)在非繁琐案件中是否会更好。
答案 0 :(得分:2)
在每个GPU核心上,最多有64个活动warp。硬件如何处理warp退役?可以在不同的网格块甚至流上进行扭曲,同时在GPU的单个核心上工作(核心是指多处理器,因为它们可能是多核GPU的核心)?
是的,来自不同线程块的warp可以共存并准备在单个SM上执行。这些不同的线程块可以来自相同的内核或不同的内核,来自不同的流。来自不同内核的并发执行的线程块描述为here。
核心退役是否可以从流中快速完成扭曲并将其他扭曲从其他流加载到同一个核心?
是。在分配warp之前,首先通过threadblock处理分工。首先在SM上调度线程块,然后选择要执行的warp的过程发生。只要SM上有可用的线程块插槽(并且没有其他限制器可以进行调度,例如共享内存或寄存器使用),任何可用内核的新线程块都可以在cc 3.5 SM上进行调度。