Parallel processing CUDA并行块的最佳数目

Parallel processing CUDA并行块的最佳数目,parallel-processing,cuda,gpu,gpgpu,Parallel Processing,Cuda,Gpu,Gpgpu,如果每个块中的线程数已经大于CUDA内核数,那么同时启动一个网格块是否比一次启动一个网格块有任何性能优势?我认为有;将线程块分配给流式多处理器(SM),SM进一步将每个块的线程划分为32个线程的扭曲(较新的体系结构可以处理较大的扭曲),这些线程计划按顺序执行(更少)。考虑到这一点,将每个计算分解为块将更快,以便它们占用尽可能多的SMs。这也意味着完全构建卡支持的每个扭曲的线程数的倍数的块(32或64个线程而不是40个线程的块,对于SMs使用32个线程扭曲的情况) 启动延迟 在Linux上,网格的

如果每个块中的线程数已经大于CUDA内核数,那么同时启动一个网格块是否比一次启动一个网格块有任何性能优势?

我认为有;将线程块分配给流式多处理器(SM),SM进一步将每个块的线程划分为32个线程的扭曲(较新的体系结构可以处理较大的扭曲),这些线程计划按顺序执行(更少)。考虑到这一点,将每个计算分解为块将更快,以便它们占用尽可能多的SMs。这也意味着完全构建卡支持的每个扭曲的线程数的倍数的块(32或64个线程而不是40个线程的块,对于SMs使用32个线程扭曲的情况)

启动延迟

在Linux上,网格的启动延迟(API工作调用在GPU上启动)为3-8µs Windows Vista/Win7上的30-80µs

将块分配到SM的时间为10-100s ns

在一个块(32个线程)中启动一个扭曲需要几个周期,并且在每个SM上并行进行

资源限制

并发核 -特斯拉不适用,一次仅1个电网 -费米一次16格 -开普勒16格线(开普勒32格线)

最大街区数(不考虑占用限制) -特斯拉SmCount*8(gtx280=30*8=240) -费米数*16(gf100=16*16=256) -开普勒SmCount*16(gk104=8*16=128)

有关每个块的线程、每个SM的线程、每个SM的寄存器、每个线程的寄存器等的限制,请参阅占用率计算器

翘曲调度和CUDA内核

CUDA内核是浮点/ALU单元。每个SM都有其他类型的执行单元,包括加载/存储、特殊函数、分支等。CUDA核心相当于x86处理器中的SIMD单元。它并不等同于x86内核

占用率是衡量每平方米翘曲数到每平方米翘曲数的最大值。每个SM的扭曲越多,扭曲计划程序有合格扭曲进行计划的可能性越高。但是,占用率越高,每个线程可用的资源就越少。作为一个基本目标,你想要的目标不仅仅是

特斯拉25%的8次翘曲 费米上50%或24次扭曲 开普勒50%或32翘曲(通常更高)

您会注意到,在这些计算中,与CUDA内核没有真正的关系


要更好地理解这一点,请阅读费米白皮书,如果您可以使用Nsight Visual Studio Edition CUDA Profiler,请查看问题效率实验(CUDA Profiler或Visual Profiler中尚未提供),以了解内核隐藏执行和内存延迟的情况。

还请注意,在许多网格上存在限制(块)在SM上同时运行(维基百科上说费米和开普勒为16-我不知道这是否是一个合适的数字)。因此大量的小块不会让应用程序正确地填充硬件。