CUDA块/扭曲/线程如何映射到CUDA内核上?

我一直在使用CUDA几个星期,但是我对块/线程/线程的分配有一些疑问。 我正在从教学的angular度 (大学项目) 研究这个build筑 ,所以达到高峰的performance并不是我所关心的。

首先,我想了解一下,如果我直接得到这些事实:

  1. 程序员编写一个内核,并在一个线程块的网格中组织它的执行。

  2. 每个块被分配给一个stream式多处理器(SM)。 一旦分配,它就不能迁移到另一个SM。

  3. 每个SM将其自己的块分成Warps(当前最大大小为32个线程)。 在一个warp中的所有线程同时在SM的资源上执行。

  4. 线程的实际执行由SM中包含的CUDA Cores执行。 线程和内核之间没有特定的映射。

  5. 如果一个warp包含20个线程,但是目前只有16个内核可用,warp将不会运行。

  6. 另一方面,如果一个块包含48个线程,则它将被分成2个线程,并且如果有足够的内存可用,它们将并行执行。

  7. 如果一个线程在一个内核上启动,那么对于内存访问或长时间的浮点操作来说,它的执行可能会在另一个内核上恢复。

他们是对的吗?

现在,我有一个GeForce 560 Ti,根据规格,它配备了8个SM,每个包含48个CUDA核心(共384个核心)。

我的目标是确保架构的每个核心执行相同的指令。 假设我的代码不需要比每个SM中可用的更多的寄存器,我想到了不同的方法:

  1. 我创build了8块每块48个线程,以便每个SM有1个块要执行。 在这种情况下,48个线程将在SM中并行执行(利用所有可用的48个内核)?

  2. 如果我启动64个6线程块,有没有什么区别? (假设它们将在SM之间均匀地映射)

  3. 如果我在调度工作中“淹没”GPU(例如,创build1024个1024线程的每个线程),假设所有内核将在某个点上使用并且将执行相同的计算是合理的(假设线程从不停止)?

  4. 有什么办法可以使用profiler来检查这些情况吗?

  5. 有没有这个东西的参考? 阅读“编程大规模并行处理器”和“CUDA应用程序devise与开发”中的CUDA编程指南和专用于硬件体系结构的章节。 但我无法得到确切的答案。

两个最好的参考是

  1. NVIDIA®(英伟达™)费米计算架构白皮书
  2. GF104评论

我会尽力回答你的每一个问题。

程序员将工作分为线程,线程分成线程块,线程块分为网格。 计算工作分配器将线程块分配给stream式多处理器(SM)。 一旦一个线程块被分配给一个SM,线程块的资源就被分配(warp和共享内存),线程被分成32个线程的组,称为warps。 一旦分配了经纱,就称为主动扭曲。 两个warp调度程序每个循环select两个活动warp,并将warp发送到执行单元。 有关执行单元和指令调度的更多细节,请参阅1 p.7-10和2 。

4' 。 laneid(warp中的线索索引)和一个核心之间有映射关系。

5' 。 如果一个warp包含less于32个线程,那么在大多数情况下,它将被执行,就像它有32个线程一样。 由于以下几个原因,Warp可以有less于32个活动线程:每个块的线程数不能被32整除,程序执行一个发散块,所以没有使用当前path的线程被标记为非活动状态,或者在warp中退出一个线程。

6' 。 一个线程块将被分成WarpsPerBlock =(ThreadsPerBlock + WarpSize – 1)/ WarpSize。warp调度器不需要从同一个线程块中select两个warp。

7' 。 执行单元不会在内存操作上停顿。 如果某个资源在指令准备好发送时不可用,那么指令将在资源可用时再次分派。 经线可能会在障碍,内存操作,纹理操作,数据依赖性等方面停顿。失败的warp不适合warp调度程序select。 在Fermi上,每个周期至less有两个合格的warp是很有用的,这样warp调度器就可以发出指令。

关于GTX480与GTX560的区别,请参阅参考资料2 。

如果你阅读参考资料(几分钟),我想你会发现你的目标是没有意义的。 我会尽量回应你的观点。

1“ 。 如果你启动内核<<< 8,48 >>>你将得到8块,每块有32个和16个线程的2个warp。 不能保证这8个块将被分配给不同的SM。 如果将2个块分配给SM,则每个变形调度程序可以select变形并执行变形。 你只能使用48个内核中的32个。

2' 。 48个线程的8个块和6个线程的64个块之间有很大的区别。 假设你的内核没有分歧,每个线程执行10条指令。

  • 8个块,48个线程= 16个经线* 10个指令= 160个指令
  • 64个块,6个线程= 64个经线* 10个指令= 640个指令

为了获得最佳的效率,分工应该是32个线程的倍数。 硬件不会合并来自不同经线的线程。

3' 。 如果内核没有最大化寄存器或共享内存,GTX560一次可以有8个SM * 8块= 64个块,或者8个SM * 48个warps = 512个wargs。 在任何时候,部分工作将在SMs上进行。 每个SM都有多个执行单元(多于CUDA内核)。 在任何给定时间使用哪些资源取决于应用程序的warp调度程序和指令组合。 如果你不做TEX操作,那么TEX单元就会空闲。 如果你不做特殊的浮点操作,SUFU单元将空闲。

4' 。 Parallel Nsight和Visual Profiler显示

一个。 执行IPC

湾 发布IPC

C。 每个活跃周期的活跃经纱

d。 每个活动周期合格的弯曲(仅适用于Nsight)

即 经纱失速原因(仅适用于Nsight)

F。 每个指令执行的活动线程

分析器不显示任何执行单元的利用率。 对于GTX560来说,粗略估计是IssuedIPC / MaxIPC。 对于MaxIPC假设GF100(GTX480)是2 GF10x(GTX560)是4,但是目标是3是更好的目标。

“E.如果一个warp包含20个线程,但目前只有16个内核可用,warp将不会运行。

是不正确的。 你们通常意义上的核心(也用在CPU中)是GPU的“多处理器”数量,nVIDIA营销部门的核心人员说:“我们的卡拥有数千个CUDA核心”。

一个warp本身只能在单个核心(= multiprocessor)上进行调度,并且最多可以同时运行32个线程; 它不能使用多于一个核心。

数字“48经线”是在具有计算能力2.x的nVIDIA GPU上,每个多处理器的最大有效经纱数量(在任何给定的周期中可以select安排在下一个周期工作的经纱) 这个数字对应于1536 = 48 x 32个线程。

根据这个networking研讨会回答