Tag: warp scheduler

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

我一直在使用CUDA几个星期,但是我对块/线程/线程的分配有一些疑问。 我正在从教学的angular度 (大学项目) 研究这个build筑 ,所以达到高峰的performance并不是我所关心的。 首先,我想了解一下,如果我直接得到这些事实: 程序员编写一个内核,并在一个线程块的网格中组织它的执行。 每个块被分配给一个stream式多处理器(SM)。 一旦分配,它就不能迁移到另一个SM。 每个SM将其自己的块分成Warps(当前最大大小为32个线程)。 在一个warp中的所有线程同时在SM的资源上执行。 线程的实际执行由SM中包含的CUDA Cores执行。 线程和内核之间没有特定的映射。 如果一个warp包含20个线程,但是目前只有16个内核可用,warp将不会运行。 另一方面,如果一个块包含48个线程,则它将被分成2个线程,并且如果有足够的内存可用,它们将并行执行。 如果一个线程在一个内核上启动,那么对于内存访问或长时间的浮点操作来说,它的执行可能会在另一个内核上恢复。 他们是对的吗? 现在,我有一个GeForce 560 Ti,根据规格,它配备了8个SM,每个包含48个CUDA核心(共384个核心)。 我的目标是确保架构的每个核心执行相同的指令。 假设我的代码不需要比每个SM中可用的更多的寄存器,我想到了不同的方法: 我创build了8块每块48个线程,以便每个SM有1个块要执行。 在这种情况下,48个线程将在SM中并行执行(利用所有可用的48个内核)? 如果我启动64个6线程块,有没有什么区别? (假设它们将在SM之间均匀地映射) 如果我在调度工作中“淹没”GPU(例如,创build1024个1024线程的每个线程),假设所有内核将在某个点上使用并且将执行相同的计算是合理的(假设线程从不停止)? 有什么办法可以使用profiler来检查这些情况吗? 有没有这个东西的参考? 阅读“编程大规模并行处理器”和“CUDA应用程序devise与开发”中的CUDA编程指南和专用于硬件体系结构的章节。 但我无法得到确切的答案。