我相信有些人和我有同样的经历, 他/她必须提供(估计)的绩效报告 将程序从顺序移植到与某些程序并行 指定的多核硬件,数量很少 时间给予。
例如,如果给出10K LoC顺序程序并且 如何在100毫秒内在英特尔i7-3770k(未矢量化)上执行 如果将代码并行化为特斯拉,则需要多长时间才能运行 C2075采用NVIDIA CUDA,鉴于各种 并行优化技术完成了吗? (但你是 报告性能仅提供2-4天?假使,假设 你根本不知道算法。或者它可能是 如果我们假设这是一个不可能的情况,那就更安全了 完成这项工作)
因此,我想知道,最有可能是最快的 给出这样的绩效报告的方法?计算是否安全 完全靠硬件的能力,如GFLOPs峰值和 内存带宽率?有数学方法吗? 算吗?如果有,请用你的方法证明 相应的问题描述和算法,以及 也是目标硬件的规格。
或许已经存在这样的工具(粗略地) 估计代码移植?
(请不要回答:'杀死自己是最快的方式。')
答案 0 :(得分:6)
好的,我会咬人,这是我刚刚编写的经验法则:
首先计算当前架构和目标架构可以提供的Gflops数(每秒G浮点运算数)。接下来计算基准代码所需的Gflop(G浮点运算)数量,并测量执行所需的时间。现在计算您的代码消耗的Gflops与计算机交付的Gflops的比率,对于任何长期运行的数字密集型代码(可能值得移植到GPU的那种代码),它可能大约为10%。现在将该比率应用于目标计算机Gflops,看看程序在新架构上的速度有多快。
接下来,这是最重要的一步,扔掉你用于计算的所有材料;在任何情况下,您都不得向管理层,客户甚至您最亲密的关系揭示对假设加速的衡量标准。如果你这样做,你将必须TWEP。
我已经为性能做了很多代码优化,目前正在管理一个并行计算专家团队,以提高大型科学代码的性能。我对管理(等)做出的唯一承诺,也是你唯一能做出的承诺,就是在项目结束时,代码不会比开始时慢 - 所以总是建立你的项目如果新版本的代码实际上更慢,则计划最后一天回滚所做的所有更改。
有很多变量在起作用,能够通过将程序移动到不同的平台来提出有关改进程序性能的可支持预测;唯一可靠的指南是移植和测量。对于科学代码,其中80%的运行时间由20%的代码消耗,您可能只能相对容易地移植20%,并从中获得有用的测量值。
由于@BenC已经注意到移植到GPU可能,为了获得最佳性能,需要完全重写代码,这导致了我的最后一点 - 您的问题忽略了移植的成本。只有当你能够估计这些时,才能开始就是否移植做出明智的决定。但是,在某个阶段,你将不得不说服某人花了3个月的努力(比如说)将一个代码移植到一个新的架构中,并且在工作结束时没有任何好处,黑暗中的飞跃值得一试。