我的GPU有2个多处理器,每个处理器有48个CUDA核心。这是否意味着我可以并行执行96个线程块?
答案 0 :(得分:3)
不,不。
从CUDA C编程指南的第4章开始:
在给定内核的多处理器上可以驻留和一起处理的块和warp的数量取决于内核使用的寄存器和共享内存的数量以及多处理器上可用的寄存器和共享内存的数量。每个多处理器还有最大驻留块数和最大驻留warp数。这些限制以及多处理器上可用的寄存器和共享存储器的数量是设备计算能力的函数,并在附录F中给出。如果每个多处理器没有足够的寄存器或共享存储器来处理至少一个块,内核将无法启动。
获取指南:http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_C_Programming_Guide.pdf
要检查特定设备的限制,请编译并执行SDK中的cudaDeviceQuery示例。
到目前为止,每个多处理器的最大驻留块数在所有计算能力上都相同,并且等于8.
答案 1 :(得分:3)
这归结为语义。 “执行”和“并行运行”究竟意味着什么?
在基本级别上,拥有96个CUDA核心实际上意味着每个核心时钟周期的潜在吞吐量为96个计算结果。
核心主要是算术逻辑单元(ALU),它执行基本的算术和逻辑运算。除了访问ALU之外,线程还需要其他资源,例如寄存器,共享内存和全局内存来运行。 GPU将保持许多线程“在飞行中”以充分利用所有这些资源。 “飞行中”的线程数通常远高于核心数。一方面,这些线程可以被视为“并行执行”,因为它们同时在GPU上消耗资源。但另一方面,它们中的大多数实际上都在等待某些事情,例如数据从全局内存到达,或者算术结果通过内核中的管道。 GPU将等待某些东西的线程放在“后烧器”上。他们正在消耗一些资源,但他们实际上在运行吗? :)
答案 2 :(得分:0)
并发执行的线程数取决于您的CUDA设备的代码和类型。例如,Fermi为每个流多处理器提供2个线程调度程序,并且对于当前CPU时钟将调度2个半warp用于计算或内存加载或超越函数计算。当一个半warp等待加载或执行超越函数CUDA核心可以执行任何其他操作。所以你可以在内核上获得96个线程但是如果你的代码可以得到它。当然,你必须有足够的记忆力。