2

我相信有些人和我有同样的经历,他/她必须给出一个(估计的)性能报告,将一个程序从顺序移植到并行与一些指定的多核硬件,只给出很少的时间。

例如,如果给出一个 10K LoC 顺序程序并在 100 毫秒内在 Intel i7-3770k(未矢量化)上执行,如果将代码并行化到具有 NVIDIA CUDA 的 Tesla C2075 需要多长时间,假设所有类型并行化优化技术完成了吗?(但你只有 2-4 天的时间来报告性能?假设你根本不知道算法。或者如果我们只是假设完成这项工作是不可能的情况可能会更安全)

因此,我想知道,最有可能提供此类绩效报告的最快方式是什么?仅通过硬件能力(例如 GFLOP 峰值和内存带宽速率)来计算是否安全?有数学方法来计算吗?如果有,请用相应的问题描述和算法,以及目标硬件的规格证明你的方法。

或者也许已经存在这样的工具来(大致)估计代码移植?

(请不要回答:'自杀是最快的方法。')

4

1 回答 1

6

好的,我会咬一口,这是我刚刚制定的经验法则:

首先计算当前架构和目标架构可以提供的 Gflops 数(每秒 G 次浮点运算)。接下来计算基准代码所需的 Gflop(G 浮点运算)数量,并测量执行所需的时间。现在计算您的代码消耗的 Gflops 与您的计算机交付的 Gflops 的比率,对于任何长时间运行的数字密集型代码(可能值得移植到 GPU 的那种),它可能约为 10%。现在将该比率应用于目标计算机的 Gflops,看看程序在新架构上的速度可能有多快。

接下来,这是最重要的一步,扔掉计算时使用的所有材料;在任何情况下,您都不得向管理层、客户甚至您最亲密的关系透露假设加速的衡量标准。如果你这样做,你不得不 TWEP 他们。

我做了很多代码优化性能,目前正在管理一个并行计算专家团队,以提高大型科学代码的性能。我对管理(等)做出的唯一承诺,也是你唯一能做出的承诺,就是在项目结束时,代码不会比开始时慢——所以总是内置到你的项目中如果新版本的代码实际上更慢,请计划最后一天回滚所做的所有更改。

有太多的变量在起作用,无法对通过将程序移动到不同的平台来提高程序的性能做出可支持的预测;唯一可靠的指南是移植和测量。对于科学代码,其中 80% 的运行时间被 20% 的代码消耗,您可能只能相对容易地移植这 20% 并从中得出有用的测量值。

正如@BenC 已经指出的那样,为了获得最佳性能,移植到 GPU 可能需要完全重写代码,这导致了我的最后一点——你的问题忽略了移植的成本。只有当您可以估计这些时,您才能开始就是否移植做出明智的决定。但是,在某个阶段,您将不得不说服某人花费 3 个月的时间(比如说)将(部分)代码移植到新架构,并且在工作结束时没有任何好处的承诺,是黑暗中的飞跃值得一试。

于 2012-12-20T11:01:09.183 回答