流式多处理器,块和线程(CUDA)

时间:2010-08-19 07:21:40

标签: cuda nvidia

CUDA核心,流式多处理器与块和线程的CUDA模型之间有什么关系?

什么被映射到什么和什么是并行化以及如何?什么更有效,最大化块数或线程数?


我目前的理解是每个多处理器有8个cuda核心。并且每个cuda核心都能够一次执行一个cuda块。并且该块中的所有线程都在该特定内核中串行执行。

这是对的吗?

4 个答案:

答案 0 :(得分:60)

CUDA programming guide中详细描述了线程/块布局。特别是,第4章指出:

  

CUDA架构围绕可扩展的多线程流式多处理器(SM)阵列构建。当主机CPU上的CUDA程序调用内核网格时,将枚举网格块并将其分配给具有可用执行容量的多处理器。线程块的线程在一个多处理器上并发执行,并且多个线程块可以在一个多处理器上并发执行。当线程块终止时,在空出的多处理器上启动新块。

每个SM包含8个CUDA内核,并且在任何时候它们都执行32个线程的单个warp - 因此需要4个时钟周期才能为整个warp发出单个指令。您可以假设任何给定warp中的线程以锁定步骤执行,但要在warp之间同步,您需要使用__syncthreads()

答案 1 :(得分:32)

对于GTX 970,有13个流式多处理器(SM),每个处理器有128个Cuda核心。 Cuda Cores也称为流处理器(SP)。

您可以定义将块映射到GPU的网格。

您可以定义将线程映射到流处理器的块(每个SM的128个Cuda核心)。

一个warp总是由32个线程组成,warp的所有线程都是同时执行的。

要使用GPU的全部功能,每SM需要比SM具有SP更多的线程。对于每个计算能力,有一定数量的线程可以一次驻留在一个SM中。您定义的所有块都排队等待SM拥有资源(SP的数量空闲),然后加载它。 SM开始执行Warps。由于一个Warp只有32个线程而SM有例如128个SP,因此SM可以在给定时间执行4个Warp。问题是如果线程进行内存访问,线程将阻塞,直到满足内存请求。在数字上:SP上的算术计算具有18-22个周期的延迟,而非缓存的全局内存访问可能需要300-400个周期。这意味着如果一个warp的线程正在等待数据,则只有128个SP的子集可以工作。因此,调度程序切换到执行另一个warp(如果可用)。如果这个warp阻塞它会执行下一个等等。这个概念称为延迟隐藏。 warp的数量和块大小决定占用率(从SM可以选择执行的warp数量)。如果占用率很高,则SP不太可能没有工作。

您声明每个cuda核心一次执行一个块是错误的。如果您谈论流式多处理器,他们可以从驻留在SM中的所有线程执行warp。如果一个块的大小为256个线程,并且您的GPU允许每个SM驻留2048个线程,则每个SM将有8个块,SM可以从中选择warp来执行。执行的warp的所有线程并行执行。

您可以在此处找到不同计算功能和GPU架构的数字: https://en.wikipedia.org/wiki/CUDA#Limitations

您可以从Nvidia Occupancy Calculation sheet (by Nvidia)下载占用率计算表。

答案 2 :(得分:4)

只有当SM有足够的资源用于线程块(共享内存,warp,寄存器,屏障......)时,Compute Work Distributor才会在SM上安排线程块(CTA)。分配线程块级资源,例如共享存储器。 allocate为线程块中的所有线程创建了足够的warp。资源管理器使用round robin将warp分配给SM子分区。每个SM子分区包含一个warp调度程序,寄存器文件和执行单元。一旦将warp分配给子分区,它将保留在子分区上,直到它完成或被上下文切换(Pascal体系结构)预先占用。在上下文切换恢复时,warp将恢复到相同的SM相同的warp-id。

当warp中的所有线程都完成后,warp调度程序等待warp发出的所有未完成指令完成,然后资源管理器释放包含warp-id和register file的warp level资源。

当线程块中的所有warp都完成后,块资源被释放,SM通知计算工作分配器块已完成。

一旦将warp分配给子分区并且分配了所有资源,warp就被认为是活动的,这意味着warp调度程序正在主动跟踪warp的状态。在每个循环中,warp调度程序确定哪些活动warp被停止以及哪些有资格发出指令。 warp调度程序选择符合优先级的最高优先级warp并从warp发出1-2个连续指令。双重问题的规则特定于每个体系结构。如果warp发出内存加载,它可以继续执行独立的指令,直到它到达依赖指令。然后,warp将报告停滞,直到加载完成。从属数学指令也是如此。 SM架构旨在通过在warp之间切换每个周期来隐藏ALU和内存延迟。

这个答案没有使用术语CUDA核心,因为这会引入一个不正确的心智模型。 CUDA内核是流水线单精度浮点/整数执行单元。问题率和依赖性延迟特定于每个体系结构。每个SM子分区和SM都有其他执行单元,包括加载/存储单元,双精度浮点单元,半精度浮点单元,分支单元等。

为了最大限度地提高性能,开发人员必须了解块与warps与寄存器/线程之间的权衡。

术语占用率是SM上活动经线与最大经线的比率。 Kepler - Pascal架构(GP100除外)每个SM有4个warp调度程序。每个SM的最小warp数应该至少等于warp调度程序的数量。如果体系结构的依赖执行延迟为6个周期(Maxwell和Pascal),则每个调度程序至少需要6个warp,即每SM 24个(24/64 = 37.5%占用率)以覆盖延迟。如果线程具有指令级并行性,那么这可以减少。几乎所有内核都会发出可变延迟指令,例如可能需要80-1000个周期的内存负载。这需要每个warp调度程序使用更多活动warp来隐藏延迟。对于每个内核,在经线数和其他资源(例如共享存储器或寄存器)之间存在折衷点,因此不建议优化100%占用率,因为可能会做出其他牺牲。 CUDA分析器可以帮助识别指令发布率,占用率和停顿原因,以帮助开发人员确定平衡。

线程块的大小会影响性能。如果内核具有大块并且使用同步障碍,则障碍停顿可能是失速原因。这可以通过减少每个线程块的warp来缓解。

答案 3 :(得分:0)

一台设备上有多个流式多处理器。
一个SM可能包含多个块。每个块可能包含多个线程。
一个SM具有多个CUDA核心(作为开发人员,您不必在意,因为它是通过warp抽象的),它将在线程上工作。 SM始终在线程扭曲上起作用(始终为32)。扭曲只会在同一块的线程上起作用。
SM和block都对线程数,寄存器数和共享内存数都有限制。