对于gpu并行编程来说,我们第一需要了解的就是流处理器sm,线程块之间的关系,他们基本上决定了并行调度的过程。而具体参数可以参考书上的图。
总结来说,在2.x及之前的架构中,一个sm最多容纳8个线程块,而最多容纳的线程数为1536,因此一个线程块的最大线程数为1024,这是最极端的情况,只能容纳一个线程块。这个而对于一般的情况来说,一个线程块的线程数至少在192以上才能发挥出gpu足够的性能,192和256这两个选择一般来说是比较好的选择。这种选择同样也是一种权衡,更多的线程数似乎能更好的发挥出硬件的能力,但是却很可能出现同一个线程块中许多线程束尽管执行完了,却不得不闲置等到最后一个线程执行完成,因此增加了潜在的闲置时间。
尽管线程束才是gpu真正处理的基本执行单元(因此线程数最好是线程束的整数倍),但是调度时却是以线程块为基本调度单位(这里的调度是指执行与等待的调度,而对于指令调度来说,调度是以半个线程束为基础的,因此也可基于此进行优化分支)。比如一个线程块占据了一个sm的一个槽,在线程块全部执行完成之前,他是不会退出的。因此为了减少闲置时间,同样需要令线程块的数量为sm的整数倍。
今日重拾了当年弃坑的gpgpu,回过头来看,似乎当年觉得很难啃得东西也变得有味道起来了。因此决定最近尽快更新,参考书未cuda编程指南。