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应用程序设计和开发”中致力于硬件体系结构的章节。 但我无法得到确切的答案。


  • 两个最好的参考是

  • NVIDIA®(英伟达™)费米计算架构白皮书
  • GF104评论
  • 我会尽力回答你的每一个问题。

    程序员将工作分为线程,线程分为线程块,线程块分为网格。 计算工作分配器将线程块分配给流式多处理器(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条指令。

  • 带有48个线程的8个块= 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本身只能在单个核心(=多处理器)上进行调度,并且可以同时运行多达32个线程; 它不能使用多于一个核心。

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

    根据这个网络研讨会回答

    链接地址: http://www.djcxy.com/p/80099.html

    上一篇: How do CUDA blocks/warps/threads map onto CUDA cores?

    下一篇: CUDA Kernel register size