好的,我知道相关的问题一再被问到,我几乎读了很多关于此事的内容,但事情仍然不清楚。可能也是因为我发现并阅读了彼此矛盾的事物(可能是因为,从不同时期,他们提到具有不同计算能力的设备,其间似乎存在相当大的差距)。我希望更有效率,减少我的执行时间,因此我需要确切知道有多少线程/ warp /块可以并行运行。此外,我正在考虑对此进行概括,并根据我知道必须执行的操作(对于更简单的程序)和系统规范计算传递给我的内核的最佳线程数和块数。
我有一台GTX 550Ti,btw具有2.1的计算能力。 4个SM x 48个核心= 192个CUDA核心。
好的,我不清楚的是:
多处理器(SM)上可以有多于一个块AT ONCE(并行)运行吗?我读到最多可以为SM分配8个块,但没有关于它们如何运行的分配。从我每个SM的最大线程数(1536)几乎不大于我每个块的最大线程数(1024)的事实来看,我认为块不是并行运行的(可能是1个半?)。或者至少不是如果我有最大线程数。另外,如果我设置块数,比如4(我的SM数量),它们是否会被发送到不同的SM? 或者我无法控制所有这些如何在硬件上分配,然后这是一个没有实际意义的点,我的执行时间将根据我的设备的奇思妙想而变化......
其次,我知道一个块会将它的线程划分为32个并行运行的线程组,称为warps。现在这些经线(假设它们彼此没有关系)可以并行运行吗?因为在Fermi架构中它声明同时执行2个warp,从每个warp向一组16(?)内核发送一条指令,而在其他地方我读到每个内核处理一个warp,这可以解释1536个最大线程( 32 * 48)但似乎有点多。 1个CUDA核心可以同时处理32个线程吗?
更简单的说明,我要问的是:(例如)如果我想在第三个中求和2个向量,我应该给它们多长(nr个操作)以及如何将它们分块和设备的线程以满容量(并行)满负荷工作(没有空闲核心或SM)。
我很抱歉,如果之前被问过,我没有得到它或没有看到它。希望您能够帮助我。谢谢!
答案 0 :(得分:16)
工作的分发和并行执行由启动配置和设备决定。启动配置说明网格尺寸,块尺寸,每个线程的寄存器和每个块的共享内存。根据此信息和设备,您可以确定可以同时在设备上执行的块数和扭曲数。在开发内核时,您通常会查看SM上可以激活的warp与设备每SM的最大warp数之比。这称为理论占用率。 CUDA Occupancy Calculator可用于调查不同的启动配置。
当网格启动时,计算工作分配器将栅格化网格并将线程块分配给SM,并且将为线程块分配SM资源。如果SM有足够的资源,则可以在SM上同时执行多个线程块。
为了启动warp,SM将warp分配给warp调度程序并为warp分配寄存器。在这一点上,经线被认为是一个活跃的经线。
每个warp调度程序管理一组warp(费米24,开普勒16)。未停滞的翘曲称为合格翘曲。在每个循环中,warp调度程序为执行单元选择符合条件的warp并发出warp指令,例如int / fp单元,双精度浮点单元,特殊功能单元,分支分辨率单元和加载存储单元。执行单元是流水线的,允许许多warp在每个循环中有一个或多个指令在飞行中。 Warp可能会因指令获取,数据依赖性,执行依赖性,障碍等而停滞不前。
每个内核都有不同的最佳启动配置。 Nsight Visual Studio Edition和NVIDIA Visual Profiler等工具可以帮助您调整启动配置。我建议您尝试以灵活的方式编写代码,以便尝试多种启动配置。我首先使用的配置为您提供至少50%的入住率,然后尝试增加和减少占用率。
每个问题的答案
问:多处理器(SM)上可以有多个块在AT ONCE(并行)运行吗?
是,最大数量取决于设备的计算能力。 See Tabe 10. Technical Specifications per Compute Capability : Maximum number of residents blocks per multiprocessor确定价值。通常,启动配置会限制运行时值。有关更多详细信息,请参阅占用率计算器或NVIDIA分析工具之一。
问:由于我每个SM的最大线程数(1536)几乎不大于我每个块的最大线程数(1024),我认为这些块不是并行运行的(可能是1个)一半?)。
启动配置确定每个SM的块数。设置每个块的最大线程数与每个SM的最大线程数之比,以便开发人员在分区工作方面具有更大的灵活性。
问:如果我设置了块数,假设4(我的SM数量),它们是否会被发送到不同的SM?或者我无法真正控制所有这些如何在硬件上分布然后这是一个没有实际意义的点,我的执行时间将根据我的设备的奇思妙想而变化......
您对工作分配的控制有限。您可以通过分配更多共享内存来限制占用率来人为控制这一点,但这是一项高级优化。
问:其次,我知道一个块会将它的线程划分为32个并行运行的线程组,称为warps。现在这些warp(假设它们彼此没有关系)也可以并行运行?
是的,warps可以并行运行。
问:因为在Fermi架构中它说明了两个warp同时执行
每个Fermi SM都有2个warp调度程序。每个warp调度程序可以在每个周期发送1个warp的指令。指令执行是流水线操作的,因此许多warp每个周期都可以有一个或多个指令。
问:从每个warp向一组16(?)内核发送一条指令,而在其他地方,我读到每个内核处理一个warp,这可以解释1536个最大线程(32x48),但似乎有点许多。 1个CUDA核心可以同时处理32个线程吗?
是。 CUDA核心是整数和浮点执行单元的数量。 SM具有我在上面列出的其他类型的执行单元。 GTX550是CC 2.1设备。在每个周期中,SM有可能每个周期发送最多4条指令(128个线程)。根据执行的定义,每个周期的飞行总线程数可以从数百到数千。
答案 1 :(得分:1)
我希望提高效率,减少执行时间,因此我需要准确知道并行运行多少线程/ warp /块。
简而言之,可以并发运行的线程/ warp /块的数量取决于几个因素。 CUDA C最佳实践指南在Execution Configuration Optimizations上有一个解释,解释了这些因素,并提供了一些推理如何塑造应用程序的提示。
答案 2 :(得分:-2)
对我而言,其中一个需要考虑的概念是CUDA芯片上下文切换的硬件支持效率。
因此,每次访问内存时都会发生上下文切换,允许计算在交替进行多个上下文,而其他内存等待内存访问。除了在多核上进行并行化之外,GPGPU架构实现性能的方式还包括以这种方式并行化的能力。
当没有核心等待内存访问时,可以实现最佳性能,并且通过提供足够的上下文来确保实现这一点,从而实现最佳性能。