首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不实际移植代码的情况下预测性能的最佳方法是什么?

在不实际移植代码的情况下预测性能的最佳方法是什么?
EN

Stack Overflow用户
提问于 2012-12-20 18:07:59
回答 1查看 214关注 0票数 2

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

例如,如果给定一个10K LoC顺序程序,并在100 ms内在英特尔i7-3770k (未矢量化)上执行,那么如果使用NVIDIA CUDA将代码并行化到特斯拉C2075,在所有并行化优化技术都已完成的情况下,需要多长时间才能运行?(但你只有2-4天的时间来报告绩效?假设你对算法一无所知。或者,如果我们只是假设完成工作是不可能的情况,可能会更安全。)

因此,我想知道,给出这样的性能报告最快的方法是什么?仅按硬件能力计算是否安全,例如GFLOPs峰值和内存带宽率?有没有计算它的数学方法?如果有,请证明你的方法与相应的问题描述和算法,以及目标硬件的规格。

或者可能已经存在这样的工具来(粗略地)估计代码移植?

(请不要这样回答:‘自杀是最快的方法。’)

EN

回答 1

Stack Overflow用户

发布于 2012-12-20 19:01:09

好吧,我会咬人的,这是我刚刚想出来的经验法则:

首先,计算当前架构和目标架构可以提供的Gflops (每秒G个浮点操作)的数量。接下来,计算您的基准测试代码所需的Gflop (G浮点操作)的数量,并测量执行所需的时间。现在计算你的代码消耗的Gflops与你的计算机提供的Gflops的比率,对于任何长时间运行的、数值密集型的代码(这类代码可能值得移植到GPU上),这可能是10%左右。现在将该比率应用于目标计算机Gflops,看看程序在新体系结构上可能会快多少。

接下来,,这是最重要的一步,扔掉你在计算中使用的所有材料;在任何情况下,你都不能向管理层、客户甚至是你最亲密的亲戚透露假设速度的测量结果。如果你这样做,你将不得不他们。

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

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

正如@BenC已经注意到的,为了获得最佳性能,移植到GPU可能需要完全重写代码,这导致了我的最后一点--你的问题忽略了移植的成本。只有当您可以估计这些值时,您才能开始做出关于是否移植的明智决定。然而,在某些阶段,你将不得不说服某人,3个月的努力(比方说)将代码移植(部分)到新的体系结构中,在工作结束时没有任何好处的承诺,是值得冒险的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13969702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档