Cuda 要生效的最小GPU线程数

Cuda 要生效的最小GPU线程数,cuda,gpu,Cuda,Gpu,我将在CUDA上对一些优化问题的局部搜索算法进行并行化。这个问题很难解决,所以实际可解问题的规模很小。 我担心的是,计划在一个内核中运行的线程数量不足以在GPU上获得任何加速(即使假设所有线程都合并在一起,没有库冲突、无分支等)。 假设一个内核启动了100个线程。使用GPU有什么好处吗?如果线程数为1000,该怎么办?需要什么额外的信息来分析这个案例?100个线程实际上是不够的。理想情况下,您希望一个大小可以被划分为至少与GPU上的多处理器(SMs)数量相同的线程块,否则您将使处理器处于空闲状态

我将在CUDA上对一些优化问题的局部搜索算法进行并行化。这个问题很难解决,所以实际可解问题的规模很小。 我担心的是,计划在一个内核中运行的线程数量不足以在GPU上获得任何加速(即使假设所有线程都合并在一起,没有库冲突、无分支等)。
假设一个内核启动了100个线程。使用GPU有什么好处吗?如果线程数为1000,该怎么办?需要什么额外的信息来分析这个案例?

100个线程实际上是不够的。理想情况下,您希望一个大小可以被划分为至少与GPU上的多处理器(SMs)数量相同的线程块,否则您将使处理器处于空闲状态。出于同样的原因,每个线程块应不少于32个线程。理想情况下,每个块应该有32个线程的小倍数(比如96-512个线程),如果可能的话,每个SM应该有这些块的倍数

至少,您应该尝试拥有足够的线程来覆盖SMs的算术延迟,这意味着在计算能力为2.0的GPU上,每个SM大约需要10-16个扭曲(32个线程的组)。不过,它们并不都需要来自同一个线程块。这意味着,例如,在一个有14条短信的特斯拉M2050 GPU上,至少需要4480个线程,分为至少14个块

也就是说,比这少的线程也可以提供加速——这取决于许多因素。例如,如果计算是有带宽限制的,并且您可以将数据保存在设备内存中,那么您可以获得加速,因为GPU设备内存带宽高于CPU内存带宽。或者,如果它是计算绑定的,并且存在大量指令级并行(来自同一线程的独立指令),那么就不需要那么多线程来隐藏延迟。弗拉基米尔·沃尔科夫(Vladimir Volkov)在2010年全球技术合作大会(GTC)上对后一点的描述非常好


最重要的是要确保您使用所有的SMs:如果不这样做,您就不会使用GPU所能提供的所有计算性能或带宽。

拥有100个线程可能不会有多大好处-如果您拥有数千个线程,CUDA编程通常会变得实用,特别是如果它们都做相同的事情。为了精确起见,你的意思是相同经线的线程做相同的事情,不是吗?写一个原型,做你需要的正确的,然后担心加速它。如果有类似于您所需要的东西,请查看推力。@AdelNick:嗯,至少,是的,如果这种区别有帮助的话。一般来说,任何类型的分支都是不好的。如果你遇到了一个难题,你能想出的最好办法就是100线程并行化,那么要么(a)你想得不够仔细,要么(b)这不太适合GPU。对于你的问题和环境,唯一能真正回答你问题的方法就是简单的方法。。。编写、测试、分析、修改、重复。@harrism:在编程指南中有没有一个地方,他们讨论了为了使任务有效而要使用的线程数