小编Dae*_*lus的帖子

CUDA如何阻止/扭曲/线程映射到CUDA核心?

我已经使用CUDA几周了,但我对块/ warps/thread的分配有些怀疑. 我从教学的角度(大学项目)研究建筑,所以达到最佳表现并不是我关注的问题.

首先,我想了解我是否直截了当地得到了这些事实:

  1. 程序员编写内核,并在线程块网格中组织其执行.

  2. 每个块都分配给一个流式多处理器(SM).一旦分配,它就无法迁移到另一个SM.

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

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

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

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

  7. 如果线程在核心上启动,则它会因内存访问或长时间浮点操作而停止,其执行可以在不同的核心上恢复.

他们是对的吗?

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

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

  1. 我创建了8个块,每个48个线程,因此每个SM有1个块来执行.在这种情况下,48个线程将在SM中并行执行(利用它们可用的所有48个内核)?

  2. 如果我推出64个6个线程的块,有什么区别吗?(假设它们将在SM之间平均映射)

  3. 如果我在预定的工作中"淹没"GPU(例如,创建每个1024个线程的1024个块),可以合理地假设所有核心将在某个点使用,并且将执行相同的计算(假设线程永远不会失速)?

  4. 有没有办法使用Profiler检查这些情况?

  5. 这个东西有没有参考?我阅读了"编程大规模并行处理器"和"CUDA应用程序设计与开发"中的CUDA编程指南和专用于硬件架构的章节; 但我无法得到准确的答案.

cuda gpgpu nvidia warp-scheduler

133
推荐指数
2
解决办法
6万
查看次数

标签 统计

cuda ×1

gpgpu ×1

nvidia ×1

warp-scheduler ×1