如果每个块中的线程数量已经超过CUDA核心的数量,那么同时启动一个块网格与一次启动一个块相比,是否有任何性能优势?
发布于 2012-08-08 22:23:19
我认为是有的;一个线程块被分配给一个流式多处理器( SM ),SM进一步将每个块的线程划分为32个线程(较新的体系结构可以处理更大的warps),这些线程被调度为按顺序(多-少)执行。考虑到这一点,将每个计算分成块会更快,以便它们占用尽可能多的SMs。构建是卡支持的每个经线的线程的倍数的块也意味着已满(对于SMs使用32线程经线的情况,是32或64个线程的块,而不是40个线程的块)。
发布于 2012-08-09 13:54:58
启动延迟
启动延迟(对工作的API调用在GPU上启动)是一个网格,在Linux上为3-8µs,在Windows Vista/Win7上为30-80µs。
将数据块分发到SM的时间为10-100s ns。
在一个块(32个线程)中启动一个warp需要几个周期,并且在每个SM上并行发生。
资源限制
并发内核-特斯拉N/A一次仅1个网格-费米16个网格-开普勒16个网格(Kepler2 32个网格)
最大块数(不考虑占用限制)- Tesla SmCount *8 (gtx280 = 30 *8= 240) -费米SmCount * 16 (gf100 = 16 * 16 = 256) -开普勒SmCount * 16 (gk104 =8* 16 = 128)
请参阅占用计算器,了解每个块的线程、每个SM的线程、每个SM的寄存器、每个线程的寄存器的限制。
Warps调度和Cores
CUDA核心是浮点/ALU单元。每个SM都有其他类型的执行单元,包括加载/存储、特殊功能、分支等。CUDA核心相当于x86处理器中的单指令多路复用单元。它不等同于x86核心。
占用率是衡量每个SM的翘曲数到每个SM的最大翘曲数的指标。每SM的warp越多,则warp调度器具有合格的warp进行调度的机会越高。但是,占用率越高,每个线程可用的资源就越少。作为一个基本目标,你想要达到的目标不仅仅是
特斯拉上的25% 8次翘曲50%费米上的24次翘曲50%或开普勒上的32次翘曲(通常更高)
您将注意到,在这些计算中与CUDA核心没有真正的关系。
为了更好地理解这一点,请阅读Fermi白皮书,如果您可以使用Nsight Visual Studio Edition CUDA Profiler,请查看问题效率实验( CUDA Profiler或Visual Profiler中尚未提供),以了解您的内核隐藏执行和内存延迟的情况。
https://stackoverflow.com/questions/11865145
复制相似问题