CUDA块和变形

use*_*598 18 cuda

好的,我知道相关的问题一再被问到,我几乎读到了我发现的所有内容,但事情仍然不清楚.可能也是因为我发现并阅读了彼此矛盾的事物(可能是因为,从不同时期,他们提到具有不同计算能力的设备,其间似乎存在相当大的差距).我希望更有效率,减少我的执行时间,因此我需要确切知道有多少线程/ warp /块可以并行运行.此外,我正在考虑对此进行概括,并根据我知道必须执行的操作(对于更简单的程序)和系统规范计算传递给我的内核的最佳线程数和块数.

我有一台GTX 550Ti,btw具有2.1的计算能力.4个SM x 48个核心= 192个CUDA核心.

好的,我不清楚的是:

可以在多处理器(SM)上运行AT ONCE(并行)多于1个块吗?我读到最多可以为SM分配8个块,但没有关于它们如何运行的分配.从我每个SM的最大线程数(1536)几乎不大于我每个块的最大线程数(1024)的事实来看,我认为块不是并行运行的(可能是1个半?).或者至少不是如果我有最大线程数.另外,如果我设置块数,比如4(我的SM数量),它们是否会被发送到不同的SM?或者我无法真正控制所有这些如何在硬件上分布然后这是一个没有实际意义的点,我的执行时间将根据我的设备的奇思妙想而变化...

其次,我知道一个块会将它的线程划分为32个并行运行的线程组,称为warps.现在这些经线(假设它们彼此没有关系)可以并行运行吗?因为在Fermi架构中它声明同时执行2个warp,从每个warp向一组16(?)内核发送一条指令,而在其他地方我读到每个内核处理一个warp,这可以解释1536个最大线程( 32*48)但似乎有点多.1个CUDA核心可以同时处理32个线程吗?

更简单的说明,我要问的是:(对于ex)如果我想在第三个向量中求和2个向量,我应该给它们多长(nr个运算)以及如何在块和线程中将它们分开我的设备以满容量(并行)工作(没有空闲核心或SM).

我很抱歉,如果之前被问过,我没有得到它或没有看到它.希望您能够帮助我.谢谢!

Gre*_*ith 16

工作的分配和并行执行由启动配置和设备决定.启动配置指出网格尺寸,块尺寸,每个线程的寄存器和每个块的共享内存.根据此信息和设备,您可以确定可以同时在设备上执行的块数和扭曲数.在开发内核时,您通常会查看SM上可以激活的warp与设备每SM的最大warp数之比.这称为理论占用率.在CUDA占用率计算器,可以用来研究不同的启动配置.

当网格启动时,计算工作分配器将栅格化网格并将线程块分配给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(并行)多于1个块吗?

是的,最大数量取决于设备的计算能力.请参见Tabe 10.每个计算能力的技术规范:每个多处理器的最大居民块数,以确定该值.通常,启动配置会限制运行时值.有关更多详细信息,请参阅占用计算器或其中一个NVIDIA分析工具.

问:由于我每个SM的最大线程数(1536)几乎不大于我每个块的最大线程数(1024),我认为这些块不是并行运行的(可能是1个半?).

启动配置确定每个SM的块数.每个块的最大线程数与每个SM的最大线程数之比设置为允许开发人员在分区工作方式上更加灵活.

问:如果我设置了块数,假设4(我的SM数量),它们是否会被发送到不同的SM?或者我无法真正控制所有这些如何在硬件上分布然后这是一个没有实际意义的点,我的执行时间将根据我的设备的奇思妙想而变化...

您对工作分配的控制有限.您可以通过分配更多共享内存来限制占用率来人为地控制这一点,但这是一种高级优化.

问:其次,我知道一个块会将它的线程划分为32个并行运行的线程组,称为warps.现在这些经线(假设它们彼此没有关系)也可以并行运行?

是的,warp可以并行运行.

问:因为在Fermi架构中它声明同时执行2个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个线程).根据执行的定义,每个周期的飞行总线程数可以从数百到数千.