英特尔 Parallel Studio XE 在腾讯云上的实践:使用英特尔 C++ 编译器开发和优化

  • 4 课时
  • 796 学过
  • 8 分
GPU 云服务器高性能计算

课程概述

本次课程将介绍英特尔C++ 编译器的主要功能,如何使用英特尔编译器,英特尔编译器的向量优化与实践以及英特尔编译器的高级优化功能。

【课程目标】

1 英特尔C++编译器介绍

2 开始使用英特尔编译器

3 向量化优化与实践

4 英特尔编译器高级优化

机构简介

英特尔(Intel Corporation)

英特尔是半导体行业和计算创新领域的全球领先厂商,以智能互联技术奠定全球创新基石。英特尔创始于1968年,拥有50余年推动技术创新和耕耘产业生态的成功经验。如今,英特尔正转型为一家以数据为中心的公司。英特尔的战略愿景聚焦于三个方面:一是致力于生产世界上最好的半导体芯片;二是引领人工智能与“自能”革命;三是做全球领先的端到端技术平台提供者。英特尔正与合作伙伴一起,共推人工智能、自动驾驶、 5G及物联网等领域的技术创新与应用突破,驱动智能互联世界,从而解决人类面临的重大挑战。 英特尔于1985年进入中国,是在华高科技领域最大的外国投资企业之一,协议总投入约130亿美元。中国是英特尔全球战略之重点,英特尔在中国拥有美国总部之外最为全面的业务部署,覆盖了前沿研究、产品技术开发、精尖制造、产业生态合作、市场营销、客户服务、风险投资和企业社会责任等。英特尔中国现有员工约9,500人。扎根中国三十四年,英特尔见证并深度参与了中国的改革开放,从浦东开发、西部开发到振兴东北等,英特尔一直跟随改革开放的步伐,积极带动区域经济发展,为高端制造持续注入新动力。 2014年12月,英特尔宣布在未来15年将为成都工厂投资16亿美元,首次引入英特尔最先进的高端测试技术( ATT),使成都工厂在原有的芯片封装与测试业务之外进一步升级为英特尔在美国境外唯一的ATT技术工厂;该技术已于2016年11月18日正式投产。 2015年10月,英特尔宣布投资55亿美元,将英特尔大连工厂升级为非易失性存储技术制造基地;该项目已经于2016年7月正式投产, 2017年发布了两款全新的基于3D NAND的数据中心级固态盘;其二期项目已经在2018年9月投产英特尔最先进的96层3D NAND产品。英特尔中国研究院是英特尔全球五大创新中枢之一,而英特尔亚太研发中心已发展成为英特尔在亚洲最大的综合性研发基地之一。 英特尔中国积极履行企业社会责任,涵盖了人才培养、员工关爱、多元化和包容、环境可持续、供应链建设、志愿服务等领域。英特尔连续20多年被教育部评为最佳合作伙伴。我们持续支持英特尔杯嵌入式大赛、英特尔杯软件创新大赛和人工智能人才培养等项目,开展丰富多彩的校园活动,每年都有上万名学生的直接参与,受益青少年数以十万计。英特尔中国员工在2018年参与志愿活动人数达8,636人,贡献志愿服务时间超过12万小时,参与比例为69%; 10年来累计志愿服务时间超过72 万小时。我们把公司运营与环境可持续发展协调并进,积极减少碳足迹;还和政府、产业链以及公益组织深入合作,共同推动绿色可持续发展。全球独立机构声望研究院发布的“中国最具声望的公司”( RepTrak? 100) 2018年百强排行榜中,英特尔荣登榜首。

讲义

英特尔® C++编译器介绍

为什么使用英特尔® 编译器 ?

简单来说,英特尔编译器可以从三个方面为开发人员带来更高的附加值。

  • 性能 Intel编译器充分利用最新的硬件特性,生成更高效的代码让我们的应用程序能更快速的执行
  • 开发效率 Intel编译器支持最新的语言标准,能够帮助开发人员充分利用新的语言特性更高效的开发应用程序
  • 可扩展性 通过编译器自动实现的面向处理器架构的优化可以在很大程度上,不需要修改源代码就可以在新的一代的处理器推出的时候自动的获取最佳的性能
  • 兼容性 编译器支持多个操作系统,包括Windows、Linux和MacOS,英特尔编译器从源码和二进制代码上与GCC和微软的编译器保持兼容,可以集成到主流的IDE环境中使用。英特尔编译器支持最新的语言标准和并行规范

英特尔®编译器与Visual Studio的集成

在Windows平台上,Intel编译器可以与微软的Visual Studio集成使用。在Visual Studio开发环境中,我们可以很方便的在Intel编译器和Visual Studio编译器之间进行切换。

Intel® C++ Compilers Performance advantage as measured by SPEC*

Intel提供业界领先的C++编译器,如图显示的是Intel编译器基准测试对比。

我们可以看到在CPU2017的基准测试中,无论是浮点计算还是整数计算,英特尔编译器相比其他的编辑器都有非常明显的性能优势。

如何获取英特尔®编译器

Intel® 编译器是Intel® Parallel Studio XE的一部分。访问 https://software.intel.com/en-us/parallel-studio-xe 获取Intel(R) Parallel Studio XE。

开始使用英特尔编译器

通用优化选项

这里我们列出了使用Intel编译器的一些常用选项。

大家可以访问Intel编译器的在线文档来获取更多关于编译器选项的资料https://software.intel.com/en-us/intel-compilers-quick-reference-guide

基本优化 –O<val>

基本的优化等级是由-O选项来指定的。

编译器优化报告

编译器在编译的时候可以做很多优化有些优化可以成功,有些优化由于种种原因而不能正常实施。英特尔编译器提供了优化报告来帮助我们查看编译时候的优化情况。大家可以通过Qopt-report编译选项来触发编译器的优化报告。Qopt-report可以使用不同的等级,等级越高,编译器报告的信息越多,也越详细。我们可以通过Qopt-report-phase选项来指定报告的内容,默认编译器会报告所有的优化阶段的信息,报告的内容会非常多,但是如果我们只关心某个阶段的优化,则可以可以通过Qopt-report-phase来指定特定相关的报告。

编译器默认会生成报告到一个.optrpt文件,每一个编译文件都会生成一个优化报告文件。这个文件可以用文本文件查看器打开直接查看,也可以通过Qopt-report-file选项来指定生成的报告文件名。更多的关于编译优化报告的使用可以参考在线文档https://software.intel.com/en-us/articles/getting-the-most-out-of-your-intel-compiler-with-the-new-optimization-reports查看。

Hello World 命令行编译

Hello World Makefile 编译

  • 默认使用gcc编译
  • $make
  • 使用icc编译,修改Makefile中对应环境变量,或者$CC=icc CXX=icpc make

向量化优化与实践

单指令多数据(SIMD)

SIMD是指使用单条指令处理多个数据。SMID指令是进行数据并行处理的关键。

Intel® 架构的SIMD类型

对不同的SIMD类型中能并行处理的数据大小也是不一样的。SSE矢量长度是128位,这就意味着对于32位的浮点类型,一个SIMD的指令人同时处理4个浮点计算。而在AVX中,矢量长度是256位,能同时处理8个32位的浮点类型。在AVX512中,并行处理的数据长度再次增加一倍,能支持16个32位的浮点计算。能同时处理的数据大小除了和矢量长度有关,和数据类型的大小也有关系。我们用为Vector length来表示某个数据类型能同时被并行处理的数量。

英特尔处理器SIMD的演进

这里显示了Intel处理器在SIMD上的演进过程。SIMD功能是向后兼容的,新的处理器会支持所有已有的SIMD的指令的版本。

对于开发人员的代码,编译器会自动识别代码中能并行处理的循环。根据指定的编译选项,选择合适的SIMD的指令进行并行处理。

向量化方法

编译器的自动向量化是最简单的向量化方法。除了编译器的自动向量化,我们也可以使用其它方法,比如通过intrinsic函数来手工实现数据的并行处理,或者使用复杂度更高的汇编代码直接编程。我们一般建议直接通过编译器的自动向量化来实现数据的并行处理。使用编译器的自动向量化可以大大的减小程序员的开发难度。

如图是编译器自动向量化的例子。

基础向量化编译选项

我们可以通过编译选项来控制编译器生成特定版本的SIMD的指令。通过-x选项,编译器会生成面向指定类型的架构和指令集的优化代码。需要注意的是,通过-x编译选项编译的二进制文件无法在其它不支持指定SIMD类型的机器上运行。

如何让编译器既面向特定处理器架构优化,又能兼容任何Intel其它处理器类型?可以使用-ax编译选项。-ax会增加指定处理器SIMD的类型的优化路径,同时也保持默认的代码执行路径,也就是SSE2的路径。

向量化优化实践 – 代码

生成并查看编译器向量化报告

修改代码解决问题

  1. 添加 restrict关键字消除相关性
  2. 使用正确的浮点表示和相应的函数调用

重新编译

按照处理器类型向量化

1. 通过/proc/cpuinfo 或者lscpu 查看处理器类型以及相应支持的指令集

2. 重新编译:

$ icc func.c –c -O2 -o func.o -qopt-report=5 -qopt-report-phase=vec –xCORE_AVX512

$ icc main.c -c -O2 -o main.o

$ icc main.o func.o -O2 -o test_opt

3. 运行并验证性能 $ time ./test_opt

更多的关于编译器优化的资料请查看https://software.intel.com/en-us/cpp-compiler-developer-guide-and-reference-programming-guidelines-for-vectorization

编译器高级优化

Interprocedural Optimizations

IPO是一种跨文件优化。编译器的编译本质是从.c到.o的转换过程,在这个处理过程中进行优化。单个文件分别编译生成多个.o,最终链接在一起生成可执行程序。编译器在编译.c到.o的时候完成了大部分的优化工作,在链接的时候已经很少有优化的机会了。但是现在的工程项目大部分都很复杂,每个项目都有很多源文件,源文件和源文件之间存在很多的类型定义和函数调用关系,这些文件之间其实存在很多的优化机会。Intel编译器使用文件间优化,也就是IPO来创造跨文件的优化机会。在编译每个源文件的时候,编译器会在其中加入特定的中间语言,在链接阶段结合这些中间语言进行整体优化。

IPO优化通过编译选项选项-ipo进行。使用IPO优化使得文件之间的优化变成可能。IPO的优化也可以帮助编译器更好的完成其它的优化工作。因为是文件整体的优化,使用IPO会增加编译时间和编译时的内存需求,大家可以根据自己的项目的实际需要来使用该优化。一般来说,当我们的程序里面有很多跨文件的函数调用的时候,使用IPO可能会有比较好的优化效果。

Profile-Guided Optimizations (PGO)

PGO是一种通过运行时数据来指导编译器优化的方法。编译器在静态编译的时候,很多时候,因为有些数据的不确定性,导致了编译时的优化不能很好地完成。如果编译器在编译的时候,知道这些数据的大致范围,那么就可以用来指导做更好的优化。通过PGO可以帮助编译器更好的完成很多优化,比如更好的分析预测、更好的指令基本块的优化等等。

PGO 的使用: Three Step Process

分三个步骤如图所示。

更多Intel® 编译器的使用示例

推荐大家访问Intel产品代码示例网站https://software.intel.com/en-us/product-code-samples获得更多的代码示例来帮助大家的学习。

更多在线资源

  • Product page – overview, features, FAQs… http://software.intel.com/en-us/intel-compilers
  • Training materials and support – C++, Fortran movies, tech briefs, documentation, evaluation guides…

https://software.intel.com/en-us/c-compilers/ipsxe-support

https://software.intel.com/en-us/fortran-compilers-support/

  • Case studies https://software.intel.com/en-us/articles/sdp-case-studies
  • Discussion forums https://software.intel.com/en-us/forum

课程评价(0)

感谢你参加本课程,请你作出评价:
0/300

以下选自学员评价

暂无精选评价