创建面向英特尔® 至强融核™ 协处理器的本机应用

简介

某些应用程序非常适合直接在英特尔® 至强融核协处理器上运行无需从主机系统上卸载即在本机模式下运行。本文旨在描述如何创建直接在英特尔至强融核协处理器和嵌入式 Linux* 操作系统上运行的本机应用程序。以下是步骤概要。

1.     确定应用程序是否适合本机执行。

2.     编译支持本机执行的应用程序。

3.     创建本机执行所需的库。

4.     将可执行文件和所有依赖关系如运行时库复制到目标硬件。

5.     将文件共享安装到目标硬件上以访问输入数据集并保存输出数据集。

6.     通过控制台连接至目标硬件设立环境并运行应用程序。

7.     通过目标环境上运行的调试服务器从本机调试器上调用本机应用来进行调试。

本文不包括有关如何使用基本 Linux* 服务的信息。这些说明中使用的某些命令需要根权限。

本文假设您正在使用英特尔® Composer XE 2013 1 更新包中提供的编译器请访问http://software.intel.com/en-us/intel-sdp-home

配置英特尔至强融核协处理器的非根 SSH SCP 访问需要超级用户权限不在本文范围内

本机执行的适用性

当应用程序完全在英特尔至强融核协处理器上运行的时候,便称为本机执行。创建本机应用程序是通过最小代码更改来运行现有软件的一种快速方法。首先,确保应用程序适合本机执行。数据并行、并行算法的使用,以及应用程序的可扩展性是针对英特尔至强融核协处理器的标准,但不用于区分卸载或本机模式。在本机执行下,应用程序可能会从大量内核中受益,而且往往具有以下特点。

·         适度的内存占用空间少于设备上的可用物理内存

·         极少数串行代码段

·         不执行大量 I/O

·         复杂的代码结构,没有明确的热内核,卸载无需显著的数据传输开销

正如卸载模式一样有可能需要额外的软件优化尤其是矢量来实现出色的性能。

编译本机应用

英特尔® C++ 编译器与英特尔® Fortran 编译器支持英特尔至强融核协处理器代码的交叉编译。编译器选项 –mmic 支持交叉编译器生成只在英特尔至强融核协处理器上运行的目标文件(默认a.out)。根据以下步骤编译支持本机执行的应用程序。

1. 英特尔编译器的正常运行依赖于环境变量。首先,执行安装脚本来配置 Linux 的运行时环境。C shell 使用 compilervars.cshBash shell 使用 compilervars.sh。下例从默认安装位置上运行 Bash shell 中的脚本。

$ source /opt/intel/composer_xe_2013/bin/compilervars.sh intel64

2. 通过运行 icc –V (C 编译器) icpc –V (C++ 编译器) ifort –V (Fortran 编译器)检查确保正确的环境设置。

$ icc –V

面向在英特尔(R) 64 上运行的应用的英特尔(R) C 英特尔(R) 64 编译器 XE, 13.0.1.117 版本,创建于 20121010
版权所有 (C) 1985-2012 英特尔公司。所有权保留。

3. 调用编译器并在构建命令行中包含 –mmic 选项。

$ icc –mmic mycode.c
$ icpc –mmic mycode.cpp
$ ifort –mmic mycode.f90

当不使用 –O 选项时英特尔编译器的默认优化级别是 -O2。了解更多关于支持的编译器选项的信息,请参阅 /opt/intel/composer_xe_2013/Documentation/en_US/ 中的英特尔® 编译器 XE13.0 更新 1 用户和参考指南。

创建库

当编写在英特尔至强融核协处理器上本机运行的代码时开发人员可能需要创建支持本机执行的库并在创建应用时链接至库以实现本机模式下的运行。按照标准方法来创建 Linux 共享库和静态库,同时也要包括 –mmic 选项来生成面向英特尔至强融核协处理器的代码。

共享库

下列步骤说明了如何使用英特尔编译器创建支持本机执行的 Linux 共享对象。

1. 编译库源代码。默认情况下会生成 mylib.o
$ icc -mmic -c -fpic mylib.c
$ icpc –mmic –c –fpic mylib.cpp
$ ifort –mmic –c –fpic mylib.f90

2. 使用编译器的共享 (-shared) 选项在目标文件中创建库文件。
$ icc -mmic -shared -o libmylib.so mylib.o
$ icpc –mmic –shared –o libmylib.so mylib.o
$ ifort -mmic -shared -o libmylib.so mylib.o

3. 编译并将本机应用代码链接至本机共享对象。
$ icc -mmic main.c libmylib.so
$ icpc –mmic main.cpp libmylib.so
$ ifort -mmic main.f90 libmylib.so

除了将本机应用程序和共享对象传输至协处理器上您还需要传输编译器运行时系统所需的共享对象。这些文件默认安装到 /opt/intel/composer_xe_2013.1.117/compiler/lib/mic/。本机应用程序通常会需要以下库。根据您的应用需求,您的应用程序可能还需要其它共享库。

说明

libcilkrts.so.5

英特尔® Cilk™ Plus 运行时库

libifcoremt.so.5

线程安全英特尔特有的 Fortran 运行时库

libifport.so.5

可移植性和 POSIX 支持

libimf.so

数学库

libintlc.so.5

英特尔支持库面向 CPU 调度、intel_fast_*以及追溯支持例程

libiomp5.so

兼容性 OpenMP * 动态运行时库

libsvml.so

短矢量数学库

libirng.so

随机数生成器库

libmpi.so.4.0,
libmpigf.so.4.0,
libmpigc4.so.4.0

英特尔® MPI 运行时库

要确定将哪些英特尔运行时对象上传到卡中请运行以下命令

$ readelf -d libmylib.so | grep -i NEED

0x0000000000000001 (NEEDED)             共享库: [libimf.so]

0x0000000000000001 (NEEDED)             共享库: [libsvml.so]

0x0000000000000001 (NEEDED)             共享库: [libirng.so]

0x0000000000000001 (NEEDED)             共享库: [libm.so.6]

0x0000000000000001 (NEEDED)             共享库: [libgcc_s.so.1]

0x0000000000000001 (NEEDED)             共享库: [libintlc.so.5]

0x0000000000000001 (NEEDED)             共享库: [libc.so.6]

0x0000000000000001 (NEEDED)             共享库: [libdl.so.2]

 0x000000006ffffffe (VERNEED)            0x3a8

 0x000000006fffffff (VERNEEDNUM)         1

列表中将包含 GNU C 库、GLIBC 和运行时库其中包括 libm.so, libstdc++.solibgcc_s.solibpthread.solibc.so libdl.so。协处理器上的 GLIBC 库随时可用,无需上传。

静态库

开发人员可使用 xiar 来创建本机静态库。

构建静态库需要执行以下步骤:

1. 编译库源代码。默认情况下会生成 mylib.o
$ icc -mmic -c mylib.c
$ icpc –mmic –c mylib.cpp
$ ifort –mmic –c mylib.f90

2. 使用归档实用程序在目标文件中创建库文件。
$ xiar crs libmylib.a mylib.o

3. 编译并将本机应用代码链接至本机静态库。
$ icc -mmic main.c libmylib.a
$ icpc –mmic main.cpp libmylib.a
$ ifort -mmic main.f90 libmylib.a

传输文件

在英特尔至强融核协处理器上运行的嵌入式 Linux 操作系统通过标准网络工具实现与主机的通信。若要在英特尔至强融核协处理器上直接运行应用程序,使用 SSH SCP 传输应用和所有依赖关系。

默认情况下驱动程序安装会为每个协处理器配置一个网络接口和别名这样开发人员就可以通过名称或静态 IP 地址查找协处理器。例如,默认配置会用 “mic0” 代表系统中的第一个卡,而 “mic1” 则代表第二个卡,以此类推。

以下说明显示了如何将文件传输到系统的第一个卡 mic0 中。

1. 使用 ssh 连接至该卡并在 /tmp 目录中创建一个文件夹。
$ ssh mic0 ‘mkdir /tmp/myname'

2. 将所有依赖关系,如 OpenMP* 和英特尔® Cilk™ SDK 运行时库,以及任何自定义共享对象复制到您创建的文件夹中
$ scp ./a.out mic0:/tmp/myname
$ scp /opt/intel/composer_xe_2013.1.117/compiler/lib/mic/libiomp5.so mic0:/tmp/myname

访问英特尔至强融核协处理器的 IP 地址在专用网络范围内预设为默认值。

处理输入和输出

英特尔至强融核协处理器的本地文件系统是 GDDR5 内存中的 RAM 磁盘。这意味着保存在本地文件系统中的任何文件都将占用本机应用程序的内存。处理大型数据集输入和输出的一个有效方法是安装一个从主机文件系统到协处理器的文件夹,并从那里访问数据。通过Linux 网络文件系统 (NFS) 安装从主机导出的文件夹需要超级用户权限。本例提供了从 /mydir 到系统中第一路协处理器的访问。

1. 创建或确定您要导出的主机目录。确保其权限是可读和可写的。
$ chmod –R 777 /mydir

2. 修改主机上的 /etc/exports以允许mydir card 0的导出。将下列文本添加到 /etc/exports 文件中
/mydir 172.31.1.1/24(rw,no_root_squash)

3. 修改主机上的 /etc/hosts.allow使 card 0 可以访问主机。将这行代码添加到 /etc/hosts.allow 中:
ALL: 172.31.1.1

4. 启动主机上的 exportfs,让 NFS 了解文件已更改。
$ /usr/sbin/exportfs -a –v
exporting 172.31.1.1/24:/mydir

5. 重新启动主机上的 NFS 服务。
$ chkconfig nfs on
$ service nfs restart

6. 使用 ssh 登录协处理器并使用 vi 修改 /etc/fstab以识别导出的文件系统。将下列代码添加到 /etc/fstab 文件:
host:/mydir /mydir nfs rsize=8192,wsize=8192,nolock,intr 0 0

7. card 0 上创建 /mydir 目录并运行安装命令。
# mkdir /mydir
# mount –a

8. 检查确保该文件夹在 card 0 上可用。

# df –h

文件系统                大小      已用 可用 使用率% 位置

tmpfs                     3.8G         0      3.8G   0% /dev/shm

host:/mydir             217.4G     25.2G    181.2G  12% /mydir

运行应用程序

开发人员可通过两种方法来运行本机应用。

·         手动将应用程序及其相关文件复制到协处理器登录然后调用该程序。

·         使用 micnativeloadex 实用程序自动复制相关文件并在协处理器上运行程序。

手动运行应用程序

将应用程序及其依赖关系复制到协处理器上通过控制台直接登录到卡设置所有所需的环境变量然后运行该应用程序。用户可使用 miccmd 登录。按照以下步骤连接至系统中的第一路协处理器 (card 0)

1. 从控制台上,使用 ssh 连接至 mic0

$ ssh mic0

# ls /

bin      etc      lib      linuxrc  proc     sbin     tmp      var

dev      home     lib64    oldroot  root     sys      usr

#

2. 更改为包含本机应用程序的目录。
# cd /tmp/myname

3. 确保这些文件是可执行的配置运行时环境。
# chmod +x *
# export LD_LIBRARY_PATH=/tmp/myname:$LD_LIBRARY_PATH

4. 运行该应用程序。
# ./a.out

使用 micnativeloadex

micnativeloadex 实用程序将本机二进制文件及其库依赖关系复制到指定的协处理器并执行它。该实用程序使用环境变量 SINK_LD_LIBRARY_PATH 定义的路径来搜索依赖关系。默认情况下,micnativeloadex 将运行在协处理器上的应用输出重定向到本地控制台。了解更多:

1. 从控制台,将 SINK_LD_LIBRARY_PATH 指向面向英特尔至强融核协处理器的英特尔编译器运行时库的位置。
$ export SINK_LD_LIBRARY_PATH=/opt/intel/composer_xe_2013.1.117/compiler/lib/mic/

2. 运行该应用程序。
$ /opt/intel/mic/bin/micnativeloadex a.out

调试

英特尔® 调试器为在英特尔至强融核协处理器上运行的应用程序提供命令行调试功能。调试过程类似于在协处理器上运行本机应用。

1.     借助 –g 选项编译本机应用的调试版本。

2.     将调试版本上传至协处理器。

3.    启动调试主机上的目标调试器连接到卡然后开始调试应用程序。处理调试通信的调试代理将自动下载至协处理器。或者,您可以直接从英特尔调试器启动本机应用程序。

请参阅《在命令行上调试英特尔® MIC 应用程序》详细了解如何借助英特尔调试器来调试本机应用。

另外如欲查看 GDB* 本机调试器预览安装请访问http://software.intel.com/en-us/forums/showthread.php?t=105443

一个简单示例

请访问 http://software.intel.com/sites/default/files/cube_charge.tar 下载 cube_charge.tar 文件并提取它。

此示例应用程序执行三维积分来计算静电势从数据文件中读取的一系列空间点构成一个立方结构其上电荷均匀分布。使用宏 NP 来指定要计算的数据点的数量。

更改为示例项目目录。

1. 打开终端并设置编译器环境。
$ source /opt/intel/composer_xe_2013/bin/compilervars.sh intel64

2. 检查确保编译器环境已设置。
$ ifort -V
面向在英特尔(R) 64 上运行的应用的英特尔(R) Fortran 英特尔(R) 64 编译器 XE, 13.0.1.117 版本,创建于 20121010
版权所有 (C) 1985-2012 英特尔公司。所有权保留。

3. 创建该示例。请注意使用 –mmic –openmp
$ ifort -DNP=120 -mmic -openmp -openmp-report1 -ipo -vec-report1 -fpp cube_charge.f90 threed_int.f90 twod_int.f90 trap_int.f90 func.f90

输出如下所示
ipo: remark #11000: performing multi-file optimizations
ipo:
remark #11006: generating object file /tmp/ipo_ifortqS9Myh.o
cube_charge.f90(118):
(col. 7) remark: OpenMP DEFINED LOOP WAS PARALLELIZED.
cube_charge.f90(110):
(col. 7) remark: OpenMP DEFINED REGION WAS PARALLELIZED.
trap_int.f90(33):
(col. 5) remark: LOOP WAS VECTORIZED.

4. 将程序和所有依赖关系从主机转移至协处理器
$ ssh mic0 ‘mkdir /tmp/myname’
$ scp ./a.out mic0:/tmp/myname
$ scp /opt/intel/composer_xe_2013.1.117/compiler/lib/mic/libiomp5.so mic0:/tmp/myname

5. 使用 SSH 连接至协处理器。确保文件可执行设置环境并运行可执行文件
#
# export LD_LIBRARY_PATH=/tmp/myname:$LD_LIBRARY_PATH
# ./a.out

6. 使用 micnativeloadex 实用程序将依赖关系从主机传输至协处理器而不是重复步骤 4 和步骤 5并运行可执行文件
$ export SINK_LD_LIBRARY_PATH=/opt/intel/composer_xe_2013.1.117/compiler/lib/mic/
$ /opt/intel/mic/bin/micnativeloadex a.out

作者简介

Amanda Sharp 是英特尔编译器团队的一名技术咨询工程师专注于软件优化领域。她为高性能计算软件开发人员提供技术支持和培训。Amanda 持有波特兰州立大学的计算机科学的理学士学位。

其它资源

·         面向 Linux* 的英特尔® 编译器 XE 2013 用户和参考指南安装在 /opt/intel/composer_xe_2013/Documentation/en_US/ 中。

·         调试英特尔® 至强融核协处理器:命令行调试可从以下网站下载http://software.intel.com/mic-developer

声明

本文件中包含关于英特尔产品的信息。本文件不构成对任何知识产权的授权,包括明示的、暗示的,也无论是基于禁止反言的原则或其他。除英特尔产品销售的条款和条件规定的责任外,英特尔不承担任何其他责任。英特尔在此作出免责声明:本文件不构成英特尔关于其产品的使用和/或销售的任何明示或暗示的保证,包括不就其产品的(i)对某一特定用途的适用性、(ii)适销性以及(iii)对任何专利、版权或其他知识产权的侵害的承担任何责任或作出任何担保。

除非经过英特尔的书面同意认可,英特尔的产品无意被设计用于或被用于以下应用:即在这样的应用中可因英特尔产品的故障而导致人身伤亡。

英特尔有权随时更改产品的规格和描述而毋需发出通知。设计者不得依赖于带有保留未定义的任何特性或说明。对此,英特尔保留将来对其进行定义的权利,同时,英特尔不应为因其日后更改该等说明或特性描述而产生的冲突和不相容承担任何责任。此处提供的信息可随时改变而毋需通知。请勿根据本文件提供的信息完成一项产品设计。

本文件所描述的产品可能包含使其与宣称的规格不符的设计缺陷或失误。这些缺陷或失误已收录于勘误表中,可索取获得。

在发出订单之前,请联系当地的英特尔营业部或分销商以获取最新的产品规格。

索取本文件中或英特尔的其他材料中提的、包含订单号的文件的复印件,可拨打1-800-548-4725,或登陆:http://www.intel.com/design/literature.htm

英特尔、Intel 标识、VtuneCilk 和至强是英特尔公司在美国和其他国家地区的商标。
* 其他的名称和品牌可能是其他所有者的资产
版权所有 © 2012 英特尔公司。所有权保留。

优化声明

http://software.intel.com/en-us/articles/optimization-notice/

Para obter informações mais completas sobre otimizações do compilador, consulte nosso aviso de otimização.