所以我正在学习算法课程,对于我的最终项目,我决定采用我在工作中学到的一些Cuda的东西,并将一些GPGPU排序算法放在一起,评估它们在不同对象上的增长。但是后来我已经离开了,并且在同一时间实际运行了多少线程时感到困惑...如果我理解这种情况,请告诉我。
所以我有一台GeForce GT 650M。 Cuda Capable 3.0卡。
它有2个多处理器,因此每个处理器一次占用1个块。那部分我得到了...但除此之外,它开始变得模糊不清。
并发运行的最大线程数为384:2 MPU * 192核心/ MPU,或2 MPU * 6 Warps / MPU *
每个MPU都有一组192个Cuda核心,这意味着无论维护的线程数是多少,每个处理器一次最多可以执行192次操作(是吗?不是?)。那么parellization因子< = 384,正确吗?
每个块一次运行n< = 1024个线程,warp调度程序将选择哪些线程占用192个核心。一个warp(32个线程,我相信,但我可能是错的)是设置的并发组。
当调用内核时,GPU会平均分配块。如果您有奇数个块,那么将有一段时间您有192个线程。
但是,如果warp中的单个线程提前完成,那么它必须等到warp中的所有其他线程完成才跳到下一个warp。
在移动到下一个区块之前,将完成一个经线块。在MPU上允许最多16个块同时运行。 (为什么这会发生,顺便说一句?)。但是,所有块必须在调用下一个内核之前完成。
这是对的吗?
答案 0 :(得分:2)
您最好每个问题提出一个问题。此外,SO上有很多这样的问题。您可以尝试搜索并阅读其中的一些。
每个处理器一次占用1个块。
对于特定代码可能是这样,但通常不是这样。 SM(MPU)可以有多个“开放”的线程块,并且在逐个周期的基础上,从其中任何一个选择warp以安排执行。
每个处理器一次最多可以执行192次操作
这取决于操作。单精度浮点加/乘操作,可能是。其他人,probably not。
无论维护的线程数
什么?不。如果您没有运行完整的线程,实际上通常情况下,如果您没有超额订阅线程(即经线),机器将无法满负荷运行。
所以parellization因子< = 384,正确?
你想定义并行化因素,它不是很明显吗?我们已经确定,对于某些类型的操作,您可以获得例如在单个时钟周期中退出的384 SP浮点运算。但您的里程可能会有所不同,具体取决于操作。 (整数操作通常会更少。)
(为什么这会发生,顺便说一句?)。
因为实际上我们通常想要超额认购SM。如果SM有192个cuda“核心”,那并不意味着我们想要考虑该SM的192个线程(或6个warp)。这是GPU编程中常见的误解。 GPU通过从停滞的扭曲(可能由于内存引用)到未停顿的扭曲进行快速上下文切换来隐藏延迟。如果没有其他(未停止的)warp可用,则SM将停止等待warp准备好执行,并且您的性能将受到影响。准备好了许多“额外”的扭曲有助于防止SM失速。
这是对的吗?
你的一些断言是正确的。我试图解决那些似乎不正确的问题,但总的来说你的理解并不清楚(正如你所说,“模糊”)。在我看来,你的问题写得不好。有一个或很少的“清晰”问题可以回答,这很好。这个问题感觉你想要一个对话或论文,而SO并不是为此而设计的。如果您想要全面了解CUDA,请阅读可用的documentation或使用一些可用的webinars。