《Intel Xeon Phi协处理器高性能编程指南》第一章读书笔记

一、什么是Xeon Phi

Xeon(音标 /'zi:on/) Phi是由intel2012年11月12日正式推出的首款60核处理器,中文名叫至强融核。Xeon Phi是Intel为HPC专门推出的协处理器,插在PCI-E上,进行高性能计算的。Xeon Phi并非传统意义上的英特尔处理器(CPU),但Xeon Phi当中使用的确实是X86核心,原型为Intel的集成众核MIC。它更像是与CPU协同工作的GPU,其基于英特尔消费级GPU技术Larrabee,不过该项目已经于2009年被取消。但英特尔仍然需要Larrabee技术,从而在超级计算机市场与NVIDIA竞争,因为更简单、更专业的GPU处理器可以更有效地处理某些超级计算任务,从而提高性能并减少能耗。

Xeon Phi和Nvidia Tesla本质上都是并行计算加速器,Phi和Tesla最大的不同就是在于其内部是含有指令集的,以前在服务器集群中编写的程序,几乎不用修改,或者进行小规模的修改,即可在Phi上运行。Phi的性能大概可以达到Tesla的80%—90%,而代码量也只有Tesla的80%。 工作原理……和Tesla一样,都是通过高度并行化提高运算密度。GPU内部含有大量的流处理器,运算密度非常高;Phi也一样,内部几十颗X86核心,对浮点数的运算性能非常可怕。

Intel Xeon Phi协处理器上面可以运行Linux,是一个真正意义上可以运行Linux给予x86架构的SMP(多对称处理器,共享内存,并且只运行一个操作系统)单芯片。每张卡拥有自己的IP地址。

二、版本

第一代代号Knights Corner

KNC只能插在PCI-E插槽上当协处理器,发挥加速卡的作用。

相关参数如下:

运行Linux

使用Intel 22nm 3D三栅晶体管技术工艺制造

支持包括Intel Parallel Studio XE在内的标准工具

众核:

——多于50核(不同产品之间不一样)

——顺序核支持64位x86指令,以及独一无二宽度的SIMD指令

——每核有4个硬件线程,主要用于隐藏顺序架构导致的延迟

——核之间通过高速双向环形总线互联

——每个协处理器具有cache一致性

——每核本地拥有512KB  L2缓存,并可以高速访问其他核的L2缓存(使得整体L2缓存大于25MB)

——缓存提供高速带宽内存的同时实现了高效的能源使用

除了64位的x86以外

——拥有独特宽度的SIMD技术,由512位宽度向量取代较窄的MMX、Intel SSE和Intel AVX技术

——针对倒数、平方根、平方和指数运算的高性能支持

特殊功能

——封装的内存控制器可以支持8GB GDDR5(部分可变)

——片内的PCI-E连接逻辑电路

——拥有电源管理功能

——性能监控功能,支持Intel VTune Amplifier XE一类的工具

第二代代号Knights Landing

2016年推出的KNL,可以当做独立的处理器,不用再搭配Xeon处理器共建系统,当然也可以当做协处理器,发挥加速卡的作用。

“天河2”使用的是Xeon E5-2692+Xeon Phi

三、评估高度并行能力

使用编译器选项 -O2 -xHost来完成自动向量化,使用编译器选项-no-vec -no-simd关闭向量化

当使用MPI时,可以使用Intel Cluster Studio XE里的Intel Trace Analyzer and Collector进行分析MPI通信性能,有助于使瓶颈图形化,并理解使用计算覆盖通信的有效性。

Xeon Phi比GPU的可编程能力强

四、常用的优化方法

内存访问和循环移植,比如:缓存阻塞、循环展开、预取、切片分块(tilling)、内层循环交换、对齐、亲缘性(affinity)。

单元跨度向量量化效果最好(被消费的数据在内存中是连续的)。数据结构转换可以按照单元跨度向量访问的数量增加。

最好使用完整的(不是部分)向量。

向量化最好使用正确对齐的数据。

考虑使用大页面(推荐广泛使用的Linux libhugelbfs库)。

算法选择或更改要易于并行和向量化。

使用编译指导指令进行预取:intrinsics函数

五、常用命令

编译命令

icc -openmp -mmic -vec 0report = 3 -O3 test.c -o test

ifort -align array64byte -openmp -mmic -vec -report=3 -O3 test.f90 -o test

其中-align array64byte选项令全部静态数组数据对齐到64位内存地址范围,以确保数组能够以最佳的方式从内存传输到缓存。

设置线程数 OMP_SET_NUM_THREADS(2) 

线程优先在一个核上运行 KMP_SET_DEFAULTS("KMP_AFFINITY=COMPACT")

线程均匀分布在所有核上运行 KMP_SET_DEFAULTS("KMP_AFFINITY=SCATTER")

也可以使用export配置环境变量来指定

export OMP_NUM_THREADS = 2

export KMP_AFFINITY = compact

代码分载offload

#pragma offload target(mic)

分载编译时不再使用-mmic选项,因为代码编译的目标是主处理器,增加的#pragma offload target(mic)指出需要分载到协处理器上的代码了。

因为程序只在主处理器端运行并且和协处理器控制台没有交互,所以需要在主机端配置正确的环境以确保程序按照预期运行。在主机命令行输入一下命令配置:

export MIC_ENV_PREFIX = MIC

export MIC_OMP_NUM_THREADS = 120

export MIC_KMP_AFFINITY = scatter

PS:利用分载模式时,最好保留一个协处理器核心以处理运行时的控制和数据交换。

分载模式的额外开销主要包括启动程序以及主机和协处理器之间数据传输的时间。

猜你喜欢

转载自blog.csdn.net/u013313909/article/details/88719437
今日推荐