好的,我知道相关问题已经被一遍又一遍地提出,我阅读了几乎所有我发现的关于此的内容,但事情仍然不清楚。可能也是因为我发现并阅读了相互矛盾的东西(可能是因为来自不同的时代,他们提到了具有不同计算能力的设备,它们之间似乎有很大的差距)。我希望提高效率,以减少我的执行时间,因此我需要确切地知道有多少线程/warp/blocks 可以同时并行运行。此外,我正在考虑对此进行概括,并仅根据我知道我必须执行的操作数量(对于更简单的程序)和系统规范来计算要传递给我的内核的线程和块的最佳数量。
我有一个 GTX 550Ti,顺便说一句,计算能力为 2.1。4 个 SM x 48 个内核 = 192 个 CUDA 内核。
好的,所以我不清楚的是:
可以在多处理器 (SM) 上一次(并行)运行 1 个以上的块吗?我读到最多可以将 8 个块分配给一个 SM,但没有关于它们是如何运行的。从我每个 SM 的最大线程数(1536)几乎不大于我每个块的最大线程数(1024)这一事实,我认为这些块不是并行运行的(可能是 1 个半?)。或者如果我有最大数量的线程,至少不会。此外,如果我将块数设置为 4(我的 SM 数),它们会分别发送到不同的 SM 吗?或者我无法真正控制所有这些在硬件上的分布方式,然后这是一个有争议的问题,我的执行时间将根据我的设备的突发奇想而有所不同......
其次,我知道一个块会将它的线程分成并行运行的 32 个线程组,称为 warp。现在这些扭曲(假设它们彼此没有关系)也可以并行运行?因为在 Fermi 架构中,它声明 2 个 warp 是同时执行的,从每个 warp 发送一条指令到一组 16 个(?)核心,而在其他地方我读到每个核心处理一个 warp,这可以解释 1536 个最大线程( 32 * 48)但似乎有点多。1 个 CUDA 内核可以同时处理 32 个线程吗?
更简单地说,我要问的是:(例如)如果我想在第三个向量中求和 2 个向量,我应该给它们多长(操作数)以及我应该如何将它们分成块和线程我的设备以满容量同时(并行)工作(没有空闲内核或 SM)。
很抱歉,如果之前有人问过这个问题,但我没有得到它或没有看到它。希望您能够帮助我。谢谢!