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

Ext*_*der 67 cuda nvidia

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

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


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

它是否正确?

Edr*_*ric 63

线程/块布局在CUDA编程指南中有详细描述.特别是,第4章指出:

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

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

  • 只需添加一个:在较新的设备上,每个SM有32个(Compute Capability 2.0)或48个(2.1)CUDA核心.实际数字对编程没有太大影响,warp大小为32并且具有相同的含义(即以锁定步骤执行). (12认同)
  • 事实上,Compute Capability 3.0(Kepler)现在极大地增加了内核/ SM - 达到192! (8认同)
  • 我还是不明白.因此,每个核心始终为1个warp,每个SM的warp数等于每个SM的核心数?线程块如何映射到warp?块总是由整数经线组成吗?例如,如果每个块包含3个warp,这是否意味着我在给定的SM上使用3个内核? (3认同)
  • SM 中的 cuda 核心数量取决于 GPU,例如在 gtx 1060 中,我有 9 个 SM 和 128 个处理器(cuda 核心),每个 SM 总共有 1152 个 CUDA 核心。 (2认同)

Joe*_*Fox 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 占用计算表(由Nvidia)下载占用计算表.


Gre*_*ith 5

仅当SM具有足够的线程块资源(共享内存,扭曲,寄存器,屏障等)时,Compute Work Distributor才会在SM上调度线程块(CTA)。线程块级资源(如共享内存)已分配。分配为线程块中的所有线程创建足够的扭曲。资源管理器使用循环机制向SM子分区分配扭曲。每个SM子分区都包含一个扭曲调度程序,寄存器文件和执行单元。将扭曲分配给子分区后,它将保留在子分区上,直到完成或被上下文切换(Pascal架构)抢占为止。在上下文切换恢复时,扭曲将恢复为相同的SM相同的扭曲ID。

当warp中的所有线程都已完成时,warp调度程序将等待warp发出的所有未完成指令完成,然后资源管理器将释放warp级别的资源,其中包括warp-id和注册文件。

当线程块中的所有扭曲均完成时,则释放块级资源,并且SM通知Compute Work Distributor该块已完成。

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

此答案未使用术语CUDA核心,因为这会引入错误的心理模型。CUDA内核是流水线式单精度浮点/整数执行单元。发行率和依赖性等待时间特定于每种体系结构。每个SM子分区和SM都有其他执行单元,包括加载/存储单元,双精度浮点单元,半精度浮点单元,分支单元等。

为了使性能最大化,开发人员必须了解块与扭曲与寄存器/线程之间的权衡。

占用率是指SM上活动翘曲与最大翘曲的比率。开普勒-Pascal架构(GP100除外)每个SM具有4个warp调度程序。每个SM的最小经纱数量应至少等于经纱调度程序的数量。如果架构具有6个周期(麦克斯韦和帕斯卡)的相关执行延迟,则每个调度程序至少需要6个扭曲,每个SM为24(24/64 = 37.5%占用),以覆盖延迟。如果线程具有指令级并行性,则可以减少并行度。几乎所有内核都发出可变的延迟指令,例如可能需要80-1000个周期的内存负载。这需要每个warp调度程序更多活动的warp以隐藏延迟。对于每个内核,在扭曲数量和其他资源(例如共享内存或寄存器)之间存在一个折衷点,因此不建议对100%的占用进行优化,因为可能会做出其他牺牲。CUDA探查器可以帮助确定指令的发出率,占用率和停顿原因,以帮助开发人员确定平衡。

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