65.9K
CodeProject 正在变化。 阅读更多。
Home

英特尔Henry Gabb访谈录

starIconstarIconstarIconstarIconstarIcon

5.00/5 (8投票s)

2017年11月5日

CPOL

12分钟阅读

viewsIcon

9402

一次关于并行化、向量化、Intel® Parallel Studio XE以及有时你确实需要信任你所使用工具的随意聊天。

引言

我有幸采访了英特尔的Henry Gabb。Henry是英特尔软件和服务部的高级首席工程师,他是一位聪明得令人望而生畏但又极其友善的人,你可以和他聊上好几个小时,喝上好几杯啤酒。他目前的工作,以及他多年来的热情,是高性能计算。基本上,就是通过代码并行化和向量化来提高代码的速度。

代码并行化简单来说就是以一种允许工作负载同时分布到多个CPU核心的方式编写代码。而不是让所有工作都在1个核心上完成,而其余核心闲置,而是编写代码让负载分布到所有核心上。

向量化是指在一个操作中对数组中的每个元素应用一个操作,而不是单独迭代数组的每个元素。

在英特尔工作,并行计算和当今工具的现状。

Chris:您最初在英特尔的工作是推动英特尔内部的并行计算。这项工作旨在利用并行计算帮助英特尔的设计和制造工作,还是旨在为公司外部的开发者提供硬件和软件工具,使并行计算更易于使用?

Henry:我是在一个有趣的时期加入英特尔的。当时我在计算机科学公司的高性能计算部门工作,试图引诱Kuck & Associates的一名员工加入我。他们巧妙地反过来,让我去他们那里面试。然而,当我到那里的时候,英特尔已经收购了Kuck & Associates,所以有人告诉我,我正在面试英特尔。这是“诱饵和转换”。

当时Kuck & Associates拥有一些惊人的计算技术:并行编程工具和运行时以及一个优秀的C++编译器。并行编程工具Assure和Guide是KAP/Pro工具集的一部分,我的CSC团队正在使用它将遗留代码从即将退役的Cray矢量超级计算机迁移到我们的新并行计算机。英特尔刚刚发布了他们的第一个双处理器主板,Assure和Guide是Intel Inspector和Intel Advisor工具在Intel Parallel Studio XE中的早期祖先。

我当时在英特尔的工作是帮助我们的用户采用和使用这些工具来利用并行性。

一个有趣的插曲是,1993年我做博士后研究时,法国国家科学研究中心(CNRS)刚刚购买了一套Cray PVP系统供所有法国CNRS研究所共享。由于Cray系统非常繁忙,CNRS对在该系统上运行的代码要求非常严格。如果代码没有利用向量架构,并且至少有93%的计算在向量寄存器中完成,那么该任务就会被终止。

编者按: 如果你从未在Cray上编程过,那你就没有真正活过。你会编写FORTRAN或C代码,通过分析器运行,分析器会非常礼貌地(像英国管家一样)建议这里可能需要做些改动,那里可能需要循环展开,甚至可能把整个函数搬到后面去“毙掉”。

Chris:我怀念Cray嘲笑我的代码的那些日子。那是一种非常高水平的嘲笑,但你从分析器那里得到的报告简直是魔法。

Henry:这就是 Intel® Parallel Studio 为你做的。

Chris:你在英特尔芯片上能获得矢量化报告吗?我承认我对此一无所知,但我不知道英特尔芯片支持矢量化。

Henry:当然。SIMD扩展以及AVX2和AVX-512指令都支持向量化。Intel编译器可以为你完成大量的向量化工作。

编者按:原来SIMD自奔腾III以来就已存在于英特尔芯片中。Chris,欢迎来到1999年。

Henry:还记得Cray HPM*工具的报告吗?它本质上是一份报告,会告诉你你的代码离理论峰值性能有多近。Intel® Parallel Studio中的Intel® Advisor工具有一个新的功能,称为“缓存感知屋脊线分析”,它能显示你的循环离处理器的理论峰值性能有多近。屋脊线显示会指出性能关键路径上的循环,并能从优化中获得最大的收益。Intel Advisor,顾名思义,会提供优化代码的建议,使其更接近峰值性能。

我们曾有一个客户,拥有1400万行C++代码。新员工通常需要大约2年时间才能被信任来修改代码。Intel® Parallel Studio甚至能让不熟悉代码的人立即获得关于并行正确性和性能的可操作建议。

能够通过工具运行代码并显示并发错误,这简直是魔法。想象一下,一个线程在代码的一部分写入一个变量,而10000行之外的另一个线程正在读取同一个变量。手动调试这类数据竞争既繁琐又困难,但Intel® Inspector会自动发现它们。点击错误,你就会直接跳转到发生数据竞争的源代码位置。英特尔工具让并行调试和调优变得如此简单。

Chris:您能简单介绍一下您目前正在做些什么吗?

Henry:我与Intel Parallel Studio团队合作,确保它能满足我们用户的需求。我扮演着一个用户的角色,确保我们添加的功能是有意义的,并且如果客户需要某个功能,我也会与团队合作,如果它有意义,就将其添加进去。这确实是我的主要重点:确保Intel® Parallel Studio始终有用且相关。我还是英特尔致力于软件创新的季度杂志《并行宇宙》的编辑。

Chris:团队规模有多大?

Henry:这是一个由开发人员和工程师组成的大团队。还有一些技术咨询工程师帮助客户现代化他们的代码。

Chris:我理解将计算负载同时分散到多个CPU核心(并行化)以及将单个操作一次应用于数组所有成员(向量化)的好处。如果有些核心闲置着,那么让它们工作起来是件好事。

但是,对我来说,这就像吃蔬菜。我知道我应该这样做,但懒惰更容易,我更喜欢巧克力蛋糕和啤酒。所以我为什么要费心呢?

Henry:之所以要费心,唯一的原因是它能给你带来竞争优势。有些人不需要它。但很多应用程序确实需要它,特别是如果他们的竞争对手能更快地完成计算。例如,如果你每周只能构建2个模型,而你的竞争对手每周能构建5个,那么他们就会击败你。

这就是我最初接触并行计算的方式。我的每个研究项目都需要越来越强大的计算能力。在合理的时间内完成计算的唯一方法是使代码现代化,这意味着向量化和并行化。

Chris:您认为并行计算会成为主流吗?

Henry:它已经是主流,而且已经有一段时间了。我们已经进入多核时代。对于许多开发者来说,通常有一种“足够好”的性能概念。许多开发者会使用Python等生产力语言,但会达到一个性能突然成为问题点。Julia这样的语言就是为了满足这种对类似C语言性能的生产力编程的渴望而出现的。

核心概念是领域专家和调优专家之间的职责分离。领域专家希望专注于他们需要解决的问题,无论是研发、工程、设计、数字音乐、金融等等。他们关心性能,但认为代码优化会分散他们的主要目标。此外,他们可能不太擅长代码优化。低级代码优化需要不同的技能组合,因此最好留给调优专家。

Intel Parallel Studio XE旨在使领域专家更容易进行代码现代化。但是,它还包含封装常见计算的性能库:Intel® Math Kernel Library、Intel Integrated Performance Primitives和Intel Data Analytics Acceleration Library。这些库由专家进行调优。如果您的代码利用了这些库,您将获得所有调优专业知识的益处。这就是职责分离的实际应用。

最终目标是将并行性抽象为API,以便开发人员可以专注于他们试图解决的问题,而不是代码调优。这正是我们试图通过Intel Parallel Studio中的性能库来实现的。

Chris:除了Python和FORTRAN,你们还支持其他哪些语言?

Henry:我们目前专注于FORTRAN、C和C++,因为这些语言的应用程序通常需要高性能。Intel Python发行版大约在一年前发布,以响应客户的需求,我们积极关注趋势,因为事情总是在变化。几年前,许多工作都用PERL进行原型设计,期望之后用C重写。但从未实现。Python也发生了同样的事情,所以我们努力提供工具,这意味着不需要重写。其中很大一部分是确保Python模块利用Intel性能库。

Chris:我全身心地投入到Visual Studio和Visual Studio Code中,这样我就可以在Windows、macOS和Linux上编写应用程序,而且我刚刚开始在iOS和Android上进行开发。当然,我很乐意让我的代码“现代化”,但我不想离开Visual Studio这个舒适的扶手椅。我的印象中Intel Parallel Studio是一个独立的工具,你必须进出。现在还是这样吗?

Henry:不再是了。Intel Parallel Studio已完全集成到Visual Studio中。它以前是独立的,但现在完全集成,安装后您会在Visual Studio界面中获得一系列新的按钮和选项。现在您可以在Visual Studio界面中访问所有Parallel Studio工具。Visual Studio无疑是舒适的扶手椅,所以我们与客户合作,使其变得简单有用。

另外一点是,微软和英特尔编译器是对象兼容的。你可以混搭使用。

假设您编译了代码,并且您的分析器说它发现了一个性能热点。如果您想测试英特尔编译器如何处理此代码,只需右键单击文件并选择“使用英特尔编译器编译”。您可以获得矢量化报告并尝试不同的优化标志。

如果你不想,你不需要用英特尔编译器编译整个应用程序。也许只是一小部分组件,无论是项目还是单个源文件。你可以用英特尔编译器编译任意多或任意少的代码。

重要的是,您编译的代码将具有多条代码路径,以允许代码在不同的处理器上以不同的方式执行。Intel 编译器允许您将可执行文件锁定到特定处理器,或者您可以让它提供一个默认代码路径,该路径在大多数处理器上提供良好的性能,并为特定处理器提供优化的代码路径。

Chris:回到您身上。您最喜欢哪些编程挑战?

Henry:我周末和晚上仍然做相当多的业余编程。我目前正在进行一个研究项目,测量和分类日常消费品中的化学暴露。框架主要用Python编写,但也有大量的SQL以及零星的R、awk、sed和shell脚本。我也是正则表达式的忠实粉丝。

以前我用 FORTRAN 编程,而且非常熟悉,可以盲写代码,在编译之前就能凭直觉知道代码的性能。现在我需要互联网来帮助我在不同语言之间切换。没有问答网站,我几乎无法编程。至少,有时感觉是这样。即便如此,我业余时间还是用 Python。数据整理、清理和操作是我喜欢做的事情。数据科学涉及许多有趣的东西,比如机器学习,但真正的工作是确保数据干净并为建模做好准备。这就是我喜欢做的事情,因为数据整理提供了大量的创造性机会。等你到了机器学习阶段,基本上就是死记硬背了。

其他人可能不同意。

Chris:最不喜欢什么?

Henry:调试。

Chris:什么给了你最大的成就感?

Henry:当我把现在的Intel® Parallel Studio与15年前的它进行比较时,你会发现它有了巨大的飞跃和改进,拥有简单的选项、向导和集成。我喜欢向量化再次变得重要。显然,我个人对这一切并不完全负责,但能参与其中,是极其有益的。

Chris:最后一个问题:您会给想要成为软件开发者的人什么建议?

Henry:标准的答案是“去学习算法和数据结构”,但我从未在学校接受过正式的计算机科学教育。我在学习算法和数据结构之前很久就开始编写代码了,所以我真正的建议是:当你开始学习编程时,尽量心中有一个应用程序。思考你正在尝试解决的问题。在你开始编码之前把它规划好,并思考你将如何解决它。

学习编程最好的方法就是亲自动手。

 

* 这是硬件性能监视器 (hpm) 的文档和一份HPM 报告示例。hpm 报告显示了应用程序的 FLOPS,它告诉您距离系统理论峰值性能有多近。

© . All rights reserved.