在没有实际移植代码的情况下预测性能的最佳方法?

ard*_*u07 2 performance cuda gpgpu parallel-port

我相信有些人与我有相同的经验,他/她必须提供一个(估计的)性能报告,将程序从顺序移植到并行与一些指定的多核硬件,并给出非常少的时间.

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

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

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

(请不要回答:'杀死自己是最快的方式.')

Hig*_*ark 6

好吧,我会咬人,这是我刚刚编写的经验法则:

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

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

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

有太多的变量正在发挥作用,能够通过将程序移动到不同的平台来提出关于改进程序性能的可支持预测; 唯一可靠的指南是移植和测量.对于科学代码,其中80%的运行时间由20%的代码消耗,您可能只能相对容易地移植20%,并从中获得有用的测量.

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

  • 不,我不能详细说明或举一些例子,不,我不会考虑你提出的问题.我的答案中的带回家消息是,或者打算是*,在将代码移植到新架构后,无法准确预测代码的性能*.更确切地说,我的信念是,任何可以精确地进行预测的模型都不会比首先移植代码更复杂,创建成本也更低.如果我有一个工具或技术来产生这样的预测,我就不会在SO上放弃它们:-) (2认同)