CUDA块/扭曲/线程如何映射到CUDA内核上?
我一直在使用CUDA几个星期,但是我对块/线程/线程的分配有些疑问。 我从教学的角度 (大学项目) 研究建筑 ,所以达到高峰表现并不是我关心的问题。
首先,我想了解,如果我直接得到这些事实:
程序员编写一个内核,并在一个线程块的网格中组织它的执行。
每个块被分配给一个流式多处理器(SM)。 一旦分配,它就不能迁移到另一个SM。
每个SM将自己的块分成Warps(当前最大尺寸为32个线程)。 变形中的所有线程都同时在SM的资源上执行。
线程的实际执行由SM中包含的CUDA Cores执行。 线程和内核之间没有特定的映射。
如果一个warp包含20个线程,但目前只有16个内核可用,warp将不会运行。
另一方面,如果一个块包含48个线程,它将被分成2个线程,并且它们将并行执行,只要有足够的内存可用。
如果一个线程在一个内核上启动,那么对于内存访问或长时间的浮点操作来说,它的执行可能会在另一个内核上恢复。
他们是否正确?
现在,我有一台GeForce 560 Ti,根据规格配备了8个SM,每个SM包含48个CUDA核心(共384个核心)。
我的目标是确保架构的每个核心都执行相同的指令。 假设我的代码不需要比每个SM中可用的代码更多的寄存器,我想到了不同的方法:
我创建了8个由48个线程组成的块,每个SM都有1个块来执行。 在这种情况下,48个线程将在SM中并行执行(利用所有可用的48个内核)?
如果我启动64个6线程块,有什么区别吗? (假设它们将在SM之间均匀映射)
如果我在计划工作中“淹没”GPU(例如,创建1024个1024线程的每个线程),假设所有内核都将在某个点使用并且将执行相同的计算(假设线程永不停止)?
有什么方法可以使用探查器来检查这些情况吗?
有没有这个东西的参考? 我阅读了CUDA编程指南以及“编程大规模并行处理器”和“CUDA应用程序设计和开发”中致力于硬件体系结构的章节。 但我无法得到确切的答案。
两个最好的参考是
我会尽力回答你的每一个问题。
程序员将工作分为线程,线程分为线程块,线程块分为网格。 计算工作分配器将线程块分配给流式多处理器(SM)。 一旦一个线程块被分配给一个SM,线程块的资源就被分配(warp和共享内存),并且线程被分成32个线程的组,称为warps。 一旦分配了经纱,它就被称为主动扭曲。 两个warp调度程序在每个循环中选择两个活动warp,并将warp发送到执行单元。 有关执行单元和指令调度的更多细节,请参阅1 p.7-10和2。
4' 。 laneid(warp中的线索索引)和一个核心之间有映射关系。
5' 。 如果一个warp包含少于32个线程,那么在大多数情况下,它将被执行,就像它有32个线程一样。 由于以下几个原因,Warps可能有少于32个活动线程:每个块的线程数量不能被32整除,程序执行一个发散块,以使未采用当前路径的线程被标记为非活动状态,或者退出线程。
6' 。 一个线程块将被分成WarpsPerBlock =(ThreadsPerBlock + WarpSize - 1)/ WarpSize不需要warp调度器从同一个线程块中选择两个warp。
7' 。 执行单元不会在内存操作中停顿。 如果某个资源在指令准备好分派时不可用,那么指令将在资源可用时再次分派。 经线可能会在屏障,内存操作,纹理操作,数据依赖性等方面停顿。失败的warp不适合warp调度程序选择。 在Fermi上,每个周期至少有2个符合条件的warp是有用的,这样warp调度器就可以发出指令。
关于GTX480和GTX560之间的差异,请参阅参考资料2。
如果你阅读参考资料(几分钟),我想你会发现你的目标没有意义。 我会尽力回应你的观点。
1' 。 如果你启动内核<<< 8,48 >>>,你将得到8个块,每块有32个和16个线程的2个warp。 不能保证将这8个块分配给不同的SM。 如果将2个块分配给SM,那么每个warp调度程序可以选择warp并执行warp。 您只能使用48个内核中的32个。
2' 。 48个线程的8个块和6个线程的64个块之间存在很大差异。 假设你的内核没有分歧,每个线程执行10条指令。
为了获得最佳效率,工作分配应该是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本身只能在单个核心(=多处理器)上进行调度,并且可以同时运行多达32个线程; 它不能使用多于一个核心。
数字“48经线”是在具有计算能力2.x的nVIDIA GPU上,每个多处理器的最大有效经纱数量(可以选择安排在下一个周期中工作的经纱,在任何给定的周期中) 并且这个数字对应于1536 = 48 x 32个线程。
根据这个网络研讨会回答
链接地址: http://www.djcxy.com/p/80099.html