好的,我知道之前已经有很多关于这个问题的相关提问,并且我已经阅读了大部分与此相关的内容,但情况仍然不太清楚。可能也是因为我找到并阅读了一些相互矛盾的东西(也许是因为它们来自不同的时间,涉及具有不同计算能力的设备,它们之间似乎存在相当大的差距)。我想要更加高效,减少执行时间,因此我需要知道在并行环境下可以同时运行多少个线程/线程束/块。此外,我正在考虑将其泛化,并基于我所知道的操作数量(对于简单程序)和系统规格计算传递给我的内核的最佳线程和块数。
我有一张 GTX 550Ti 显卡,它的计算能力为 2.1。 4 个 SM 每个拥有 48 个核心 = 192 CUDA 核心。
那么对我来说不清楚的是:
是否可以有多个块在一个多处理器(SM)上同时运行(并行)?我读到最多可以分配 8 个块给一个 SM,但没有关于它们如何运行的信息。从每个 SM 上的最大线程数(1536)几乎与每个块上的最大线程数(1024)相差无几这一事实来看,我认为块并不是并行运行的(也许只有一个半?)。或者至少不会在每个块上都有最大线程数的情况下运行。另外,如果我将块的数量设置为,比如 4(我的 SM 数量),它们会被发送到不同的 SM 上吗? 或者我实际上无法控制所有这些硬件上的分布,那么这就是一个无意义的问题,我的执行时间将根据我的设备的心情而变化…
其次,我知道一个块会将其线程分成32个并行运行的组,称为warp。现在这些warp(假设它们彼此没有关系)也可以并行运行吗?因为在Fermi架构中它指出同时执行2个warp,从每个warp发送一条指令到一组16(?)个核心,而我在其他地方读到每个核心处理一个warp,这将解释1536最大线程(32 * 48),但似乎有点过多。1个CUDA核心能同时处理32个线程吗?
更简单地说,我的问题是:(例如)如果我想将两个向量相加得到第三个向量,我应该给它们什么长度(操作数)和如何将它们分割成块和线程,以使我的设备以全容量并发(并行)工作(没有空闲的核心或SMs)。
很抱歉如果之前已经问过这个问题,我没有理解或看到它。希望你能帮助我。谢谢!