Performance 如何计算GPU程序的加速比?

Performance 如何计算GPU程序的加速比?,performance,cuda,gpgpu,metrics,Performance,Cuda,Gpgpu,Metrics,动机:我的任务是测量CUDA C代码的和,这需要计算加速比。特别是,我需要将所有这些指标绘制为处理器数量的函数p 定义:指并行算法比相应的顺序算法快多少,定义为: 问题:我已经在CUDA C中实现了我的算法,并对其计时以获得Tp。但是,在确定Sp时仍存在一些问题: 如何观察T1而不完全从头重写代码? 我可以串行执行CUDA代码吗 当我用不同的线程数运行不同的内核时,p是什么? 它是指整个运行时使用的线程数还是处理器数 由于这两个数量在整个运行期间也会发生变化,所以使用的是最大值还是平均

动机:我的任务是测量CUDA C代码的和,这需要计算加速比。特别是,我需要将所有这些指标绘制为处理器数量的函数
p

定义:指并行算法比相应的顺序算法快多少,定义为:

问题:我已经在CUDA C中实现了我的算法,并对其计时以获得
Tp
。但是,在确定
Sp
时仍存在一些问题:

  • 如何观察
    T1
    而不完全从头重写代码?
    • 我可以串行执行CUDA代码吗
  • 当我用不同的线程数运行不同的内核时,
    p
    是什么?
    • 它是指整个运行时使用的线程数还是处理器数
    • 由于这两个数量在整个运行期间也会发生变化,所以使用的是最大值还是平均值
    • 我甚至如何限制我的代码在处理器子集上运行,或者使用更少的线程

非常感谢。

要获得合理的加速比,您需要实际的顺序程序。如果没有,则需要编写尽可能最好的顺序版本,因为将高度调优的并行代码与垃圾串行实现进行比较是不合理的

您也无法合理地将并行程序的单处理器版本与N处理器版本进行比较,以获得真实的加速比度量。这样的比较告诉你,对于同一个程序,从P=1到P=N的加速比,但加速比曲线的要点是说明为什么要构建一个并行程序(这通常更难amd需要更复杂的硬件[GPU]和工具[OpenCL])与使用更广泛可用的硬件和工具编码最佳顺序版本相比,这是有意义的


换句话说,没有作弊。

在大多数情况下,测量加速比时,必须从头开始完整地编写串行和并行算法。没有特别的理由认为P=1的最佳并行算法与最佳串行算法有任何共同之处。在大多数情况下,并行算法需要做大量额外的工作,与最佳串行算法相比效率很低。

如果我没记错(来自OpenCL背景),如果您将内核数设置为1,这和串行运行程序不一样吗?@ChaseWalden假设block dim>1,你仍然在GPU上使用多个内核,唯一的方法是使用一个大小为一个线程的内核,但这有点毫无根据,因为GPU和CPU太多样化了。实现CPU限制的算法并进行比较会更有意义。@ks6g10因此,如果我理解正确,您想计算从CPU上串行运行的程序到GPU上多内核运行的程序的加速比吗?@ChaseWalden对我来说,这似乎是您想要尝试的域,如果CPU的速度明显加快(例如2倍),那么为什么要在GPU上进行呢?至少这是我为我的研究所做的。@ks6g10我不完全确定你想要做什么。回答得好,但你认为,将最好的CPU与最好的GPU进行排名有意义吗?或者,你应该也会考虑硬件成本吗?你说“这样的比较告诉你加速从P=1到P=N对于同一个程序”,好像这缺少计算加速的要点——这不是加速测量的整个点吗?而且,关于GPGPU,加速比定义中使用的
p
是指线程数还是处理器数?事实上,由于这两个数量在整个运行过程中也会有所不同,是最大使用量还是平均使用量?@MiloChen我认为他是在建议您具有运行多线程代码的能力,这在大多数情况下都是有益的(并且可能比GPU更快),懒惰和不评估可能性是错误的。@ksg6g10:“多线程”代码是另一种并行程序。为了获得顺序程序上并行加速比的真实测量值,他必须与顺序程序进行比较。他可以做另一个与多线程、非GPU应用程序的比较,以表明这样做的回报。但最终的加速是根据标准资源和努力编写的简单内容,以及通过额外资源和努力可以获得的内容来判断的。如果编写一个多线程应用程序很简单(对于C和C++来说并不总是这样),那么这可能是一个有趣的比较。