如果每个块中的线程数已经大于CUDA核心数,那么在一次启动块的同时启动块网格是否有任何性能优势?
答案 0 :(得分:5)
我认为有;线程块被分配给流式多处理器(SM),并且SM进一步将每个块的线程划分为32个线程的warp(较新的体系结构可以处理更大的warp),这些线程被安排(按顺序)执行(更多)。考虑到这一点,将每个计算分解为块将更快,以便它们占用尽可能多的SM。它也意味着完全构建块,这些块是卡支持的每个warp的多个线程(一个32或64个线程的块而不是40个线程,对于SM使用32线程warp的情况)。
答案 1 :(得分:1)
启动延迟
启动延迟(在GPU上启动API调用工作)在Linux上的网格是3-8μs Windows Vista / Win7上30-80μs。
将块分配给SM的时间为10-100s ns。
在块(32个线程)中启动warp是几个周期,并且在每个SM上并行发生。
资源限制
并发内核 - 特斯拉N / A一次只有1格 - 费米16次格栅 - 开普勒16格(Kepler2 32网格)
最大阻止(不考虑占用限制) - 特斯拉SmCount * 8(gtx280 = 30 * 8 = 240) - Fermi SmCount * 16(gf100 = 16 * 16 = 256) - 开普勒SmCount * 16(gk104 = 8 * 16 = 128)
请参阅占用计算器,了解每个块的线程限制,每个SM的线程数,每个SM的寄存器数,每个线程的寄存器数,......
Warps Scheduling和CUDA核心
CUDA核心是浮点/ ALU单位。每个SM都有其他类型的执行单元,包括加载/存储,特殊功能,分支等.CUDA核心相当于x86处理器中的SIMD单元。它不等同于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中尚未提供),以了解内核隐藏执行情况的程度和内存延迟。