目录
英特尔® 至强融核™ 协处理器开发人员快速入门指南
目录
简介
目标
本文档内容包括:
本文档内容不包括:
术语
系统配置
英特尔® 至强融合™ 软件
英特尔® 集成众核架构概述
管理任务
为您的系统做首次使用准备
安装驱动程序及启动卡的步骤
安装软件开发工具的步骤
更新现有系统
更新已经配置英特尔® 至强融合™ 协处理器的系统
重启以后重新访问英特尔® 至强融合™ 协处理器
进程悬挂时重启英特尔® 至强融合™ 协处理器
监控英特尔® 至强融合™ 协处理器
从主机系统运行某个英特尔® 至强融合™ 协处理器程序
直接配合 uOS 环境英特尔® 至强融合™ 协处理器
有用的管理工具
开始了解/并开发英特尔® 至强融合™ 软件
可用软件开发工具/环境
开发环境:可用的编译器和函数库
开发环境:可用工具
一般开发信息
开发环境设置
文档与抽样代码
构建相关信息
编译器开关和 Makefiles
运行时间中调试
如何获取更多帮助
使用卸载编译器 – 显式内存复制模式
约减示例
创建卸载版本
异步卸载和数据传输
使用卸载编译器 – 隐式内存复制模式
本机编译
英特尔® 至强融合™ 协处理器上的并行编程选项
英特尔® 至强融合™ 协处理器上的并行编程: OpenMP*
英特尔® 至强融合™ 协处理器上的并行编程:OpenMP* + Intel® Cilk™ Plus 扩展阵列符号
英特尔® 至强融合™ 协处理器上的并行编程:英特尔® Cilk™ Plus
英特尔® 至强融合™ 协处理器上的并行编程:英特尔® TBB
英特尔® MKL 使用说明
SGEMM 示例
英特尔® MKL 自动卸载模式
调试英特尔® 至强融核™ 协处理器
英特尔® 至强融核™ 协处理器的性能分析
作者介绍
声明
简介
本文档将帮助您快速了解如何在包含基于英特尔® 集成众核架构(英特尔® MIC 架构)的英特尔® 至强融合™ 协处理器的系统(主机)上编写代码和运行应用。本文档介绍了一些可用工具,并随附几个简单示例以示范如何准备和运行基于 C/C++ 和 Fortran 的程序。现在,开发人员必须将本文档中提供的示例剪切/粘贴到自己的系统中。
如需在线查看本文档,可访问:http://software.intel.com/mic-developer,在“Getting Started”(开始)选项卡下。
目标
本文档内容包括:
为您介绍如何安装英特尔® 集成众核架构平台软件堆栈(MPSS)。
介绍支持运行英特尔® 至强融合™ 协处理器的软件的构建环境。
示范如何为英特尔® 至强融合™ 协处理器编写代码并使用英特尔® Composer XE 2013 进行构建。
示范如何使用英特尔函数库,如英特尔® 数学核心函数库(英特尔® MKL)。
为您提供如何调试并配置运行于英特尔® 至强融合™ 协处理器上的程序的相关信息。
本文档内容不包括:
详细介绍每个工具。请参考单个工具的用户指南。
术语
主机 — 包含英特尔® 至强融合™ 协处理器、安装于 PCIe* 插槽中的英特尔® 至强® 平台。主机支持的操作系统(OS)包括:Red Hat* Enterprise Linux* 6.0,Red Hat* Enterprise Linux* 6.1,Red Hat* Enterprise Linux* 6.2,Red Hat* Enterprise Linux* 6.3,SUSE* Linux* Enterprise Server SLES 11 SP1 和 SUSE* Linux* Enterprise Server SLES 11 SP2。用户必须安装操作系统(OS)。
目标 — 英特尔® 至强融合™ 协处理器以及协处理器中安装的相应运行环境。
uOS — 微操作系统 — 基于 Linux*的操作系统和运行于英特尔® 至强融合™ 协处理器的工具。
ISA — 指令集架构 — 计算机架构的一部分和程序相关,包括原生数据类型、指令、寄存器、寻址模式、内存架构、中断与例外处理、以及外部 I/O (输入/输出)。
VPU — 矢量处理单元 — CPU 中负责执行 SIMD(单指令、多数据)指令的部件。
NAcc — 本机加速 — 英特尔® MKL 处理数据的一种模式或形式,处理数据的 MKL 函数由英特尔® 至强融合™ 协处理器支持。
卸载编译器 — 英特尔® C/C++ Compiler 和英特尔® Fortran Compiler 编译器,可为主机系统和英特尔® 至强融合™ 协处理器生成二进制程序。卸载编译器可生成仅运行于主机或仅运行于英特尔® 至强融合™ 协处理器的二进制程序,或同时运行于主机与英特尔® 至强融合™ 协处理器并相互进行通信的二进制程序。
英特尔® MPSS — 英特尔® 众核平台软件堆栈 — 用户 — 支持程序运行于英特尔® 至强融合™ 协处理器并与之进行通信的系统级软件。
SCI — 系统通信接口 — 单个平台内的内部节点通信的机制,其中一个节点是英特尔® 至强融合™ 协处理器或基于英特尔至强处理器的主机处理器装置。具体地说,SCI 提取 PCIe 总线通信的信息(并控制相关英特尔® 至强融合™ 协处理器硬件)同时提供在所有类型节点之间对称分布的 API。
系统配置本文档中的配置为:包含两个英特尔至强处理器的英特尔工作站,一个或两个连接至 PCIe* x16 总线的英特尔® 至强融合™ 协处理器,以及一个 GPU 用于图形显示。
英特尔® 至强融合™ 软件

Figure 1: Software Stack
英特尔® 至强融合™ 协处理器软件堆栈包含分层的软件架构,如下图 1 所示。
驱动程序堆栈:
面向英特尔® 至强融合™ 协处理器的 Linux 软件包含众多组件:
设备驱动程序:内核空间中的软件堆栈的最底部是英特尔® 至强融合™ 协处理器设备驱动程序。设备驱动程序负责管理设备初始化以及主机与目标设备之间的通信。
函数库:在用户与系统空间中设备驱动程序的上方是函数库。函数库提供基本的卡管理功能,如系统中卡的列举,缓存管理,以及主机到卡的通信。函数库还提供高级功能,如在英特尔® 至强融合™ 协处理器上加载和卸载可执行程序,调用卡上可执行程序的函数,提供主机与卡之间的双向通知机制。函数库负责缓存管理以及 PCIe* 总线上的通信。
工具:各种工具帮助维护软件堆栈。示例包括:/opt/intel/mic/bin/micinfo 用于查询系统信息,/opt/intel/mic/bin/micflash 用于更新卡的闪存,/usr/sbin/micctrl 帮助管理员配置卡,等。
卡 OS (uOS):基于 Linux 的操作系统运行于英特尔® 至强融合™ 协处理器上。
注释:如需最新版本的 uOS、设备驱动程序、以及低级别 SCI 函数库接口,请访问网站:http://software.intel.com/mic-developer。
英特尔® 集成众核架构概述英特尔® 至强融合™ 协处理器拥有多达 61 个有序英特尔® MIC 架构的处理器内核,运行频率为 1GHz (最高 1.3GHz)。英特尔® MIC 架构基于 x86 ISA,扩展有 64 位寻址和新 512 位宽 SIMD 矢量指令和寄存器。每个内核支持 4 个硬件线程。除了内核,还有多个片上内存控制器和其它组件。

Figure 2: Architecture overview of an Intel® MIC Architecture core
每个内核包括一个全新设计的矢量处理单元(VPU)。每个矢量单元包含 32 个 512 位矢量寄存器。为支持全新矢量处理模式引入了新 512 位 SIMD ISA。
VPU 是英特尔® MIC 架构内核的关键特性。充分利用这些矢量单元对于获取英特尔® 至强融合™ 协处理器的最佳性能十分关键。务必注意:英特尔® MIC 架构内核不支持其它 SIMD ISA(如:MMX™,英特尔® SSE,或英特尔® AVX)。
每个内核提供一个 32KB L1 数据缓存,一个 32KB L1 指令缓存,以及一个 512KB L2 缓存。所有内核的 L2 缓存是互联的,并通过一个双向环形总线连接内存控制器,有效创建了一个多达 32MB 的共享式末级缓存。每个内核的设计包含一个简短有序管线。执行标量操作时无延迟,执行矢量操作时低延迟。借助这一简短的有序管线,分支预测错误的开销保持在低位。
如需深入了解设备架构,请参考《英特尔® 至强融合™ 软件开发人员指南》,网址:http://software.intel.com/mic-developer,位于“软件开发”选项卡下。
管理任务如需购买某个设备制造商提供的英特尔® 至强融合™ 协处理器,请参考“英特尔® 开发人员社区”页面:http://software.intel.com/mic-developer 并点击选项卡“工具与下载”,然后选择“英特尔® 集成众核架构(英特尔® MIC 架构)平台软件堆栈”。该页面支持您下载最新的硬件驱动程序以及平台发行说明(发行说明包含驱动程序和固件安装说明)。
为您的系统做首次使用准备
安装驱动程序及启动卡的步骤
在“英特尔® 开发人员社区”页面(http://software.intel.com/mic-developer)点击选项卡“工具与下载”,然后选择“英特尔® 集成众核架构(英特尔® MIC 架构) 平台软件堆栈”。下载“英特尔® MPSS 发行的自述文件”(readme.txt)。还可以下载发行说明(releaseNotes.txt)。
安装系统时您可以使用 Red Hat* Enterprise Linux 64-bit 6.0 kernel 2.6.32-71,Red Hat Enterprise Linux 64-bit 6.1 kernel 2.6.32-131,Red Hat Enterprise Linux 6.2 64-bit kernel 2.6.32-220,Red Hat Enterprise Linux 6.3 64-bit kernel 2.6.32-279,SUSE* Linux Enterprise Server SLES 11 SP1 kernel 2.6.32.12-0.7-default 或 SUSE Linux Enterprise Server SLES 11 SP2 kernel 3.0.13-0.27-default (自述文件 readme.txt 中的第 4.1-4.2 节)。请务必安装 ssh,它将用于登陆至卡的 uOS。
警告:安装 Red Hat 时,可能自动更新至新版本的 Linux 内核。如果发生这种情况,您将无法使用预建的主机驱动程序,必须针对新内核版本重新手动构建。请参考自述文件 readme.txt 的第 10 节内容以了解如何针对特定的 Linux 内核构建英特尔® MPSS 主机驱动程序的说明。
以 root 身份登录。
下载与您的操作系统相匹配的发行驱动程序,第 1 步 (KNC_gold-2.1.4346-xx-rhel-6.0.tgz, KNC_gold-2.1.4346-xx-rhel-6.1.tgz, KNC_gold-2.1.4346-xx-rhel-6.2.tgz, KNC_gold-2.1.4346-xx-rhel-6.3.tgz, KNC_gold-2.1.4346-xx-suse-11.1.tgz or KNC_gold-2.1.4346-xx-suse-11.2.tgz)。
按照自述文件 readme.txt 中第 5 节的说明安装主机驱动程序 RPM。请务必为您的协处理器创建配置文件。
按照自述文件 readme.txt 中第 5.1.7 节的说明更新您的协处理器的闪存。
7. 重启系统。
启动英特尔® 至强融合™ 协处理器(您可以手动设置由卡启动主机系统,不过这不是默认设置),然后运行“micinfo”以检验设置是否正确:
sudo service mpss start
sudo micctrl -w
sudo /opt/intel/mic/bin/micinfo
检验驱动程序版本是 4346-xx。
检验英特尔® MPSS 版本是 2.1.4346-xx。
安装软件开发工具的步骤
支持您购买软件开发工具的网站:http://software.intel.com/en-us/linux-tool-suites。选择您需要的工具(如:“英特尔® Cluster Studio XE 2013”,“英特尔® C++ Composer XE for Linux*”,“英特尔® Fortran Composer XE for Linux*”,等)。选择需要的工具并完成购买流程以后,您将收到一个序列号。您也可以访问 http://software.intel.com/en-us/mic-developer,在“工具与下载”下选择“英特尔® 软件开发产品”,查找英特尔® 至强融合™ 的最新支持工具列表。
您获得英特尔工具的序列号以后,请转到英特尔® 注册中心(IRC)(http://registrationcenter.intel.com)注册并下载产品。点击按钮“注册产品”,您将转到所购买产品的下载页面。以下示例是关于用户购买“英特尔® Cluster Studio XE for Linux”的案例。选择三个文件:完整产品、安装指南和发行说明,然后点击按钮“立即下载”获取。
按照“安装指南”中的说明安装英特尔® Cluster Studio XE for Linux*。如果您购买的是英特尔® C++ Composer XE for Linux,或英特尔® Fortran Composer XE for Linux,请阅读相应的安装指南进行这些包的安装,同时单独安装英特尔® VTune™ Amplifier XE 2013 for Linux*。
对于首次安装,请确保已经获得激活产品所需的产品许可号,安装过程中需要提供许可号。后续安装可使用“使用现有许可”选项。
请仔细阅读产品发行说明(ICSXE2013_ReleaseNotes.pdf 对应英特尔® Cluster Studio XE for Linux;Release-notes-c-2013-l-en.pdf 对应英特尔® C++ Composer XE for Linux;Release-notes-f-2013-l-en.pdf 对应英特尔® Fortran Composer XE for Linux)。
解压缩产品文件
tar -xvzf I_ics_<major>.<update>.<package_num>.tgz,或
tar -xvf I_ccompxe_<major>.<update>.<package_num>.tgz,或
tar -xvf I_fcompxe_<major>.<update>.<package_num>.tgz>
使用之前的序列号安装软件工具。
通过运行抽样程序检验卡的工作状态(对于 C/C++ 代码,位于 /opt/intel/composerxe/Samples/en_US/C++/mic_sample;对于 Fortran 代码,位于 /opt/intel/composerxe/Samples/en_US/Fortran/mic_sample),并使用“setenv H_TRACE 2”或“export H_TRACE=2”显示主机与英特尔® 至强融合™ 协处理器之间的对话(从处理器发出的消息将加上前缀“MIC:”)。如果您看到该对话,则表明一切运行正常,系统准备就绪可供一般使用。
如果您需要使用英特尔® VTune Amplifier XE 2013 采集该系统的性能数据:
转到 /opt/intel/vtune_amplifier_xe/bin64/k1om/ 并运行,启动协处理器以后加载数据采集驱动程序:
sudo sep_micboot_create.sh
sudo sep_micboot_install.sh
启动(或重启)英特尔® 众核平台软件堆栈服务(上一步中的复制操作一旦完成,这一步还将启动抽样驱动程序):
sudo service mpss restart
sudo micctrl -w
当 micctrl-w 报告“micx:online”时,表示协处理器已经成功重启。
现在每次协处理器重启时,抽样驱动程序都会启动。
如果您需要重新安装抽样驱动程序,您可以执行以下步骤:
sudo service mpss stop
sudo sep_micboot_uninstall.sh
sudo service mpss restart
sudo micctrl -w
更新现有系统
更新已经配置英特尔® 至强融合™ 协处理器的系统
使用自述文件 readme.txt 中第 5.3-5.6 节中的说明更新系统软件。
按照自述文件 readme.txt 中第 5.7 节的说明更新您的卡的闪存。
重启系统
启动英特尔® 至强融合™ 协处理器(您可以手动设置由卡启动主机系统,不过这不是默认设置),然后运行“micinfo”以检验设置是否正确:
sudo service mpss start
sudo micctrl -w
sudo /opt/intel/mic/bin/micinfo
检验驱动程序版本是 4346-xx。
检验英特尔® MPSS 版本是 2.1.4346-xx。
重启以后重新访问英特尔® 至强融合™ 协处理器
当主机系统重启时,英特尔® 至强融合™ 协处理器不会自动启动。您需要手动启动英特尔® 至强融合™ 协处理器,然后运行“micinfo”以检验是否正常启动。作为非 root 用户为了通过 sudo 成功执行以上步骤,您需要在路径中添加 /usr/sbin and /sbin :
sudo service mpss start
sudo micctrl -w
sudo /opt/intel/mic/bin/micinfo
注释:您可以将协处理器 uOS 设置为重启时自动启动并预加载所需文件。详情请参阅 MPSS readme.txt 自述文件中第 4.3-4.6 节的说明。
进程悬挂时重启英特尔® 至强融合™ 协处理器
如果运行于英特尔® 至强融合™ 协处理器的某个进程发生悬挂,而协处理器还可以通过 ssh 进行响应,则登陆协处理器,像其它 Linux 进程一样终止该进程。
如果协处理器发生悬挂,无法访问或通过 ssh 进行响应,则有两个重启途径。不过,首先看看是否能找到问题所在:
sudo micctrl --status <micx>
假设英特尔® MPSS 服务仍然正常运行,您可以重启协处理器而不会影响其它关联的协处理器,步骤如下:
sudo micctrl --reset <micx>
sudo micctrl --boot <micx>
sudo micctrl -w
sudo /opt/intel/mic/bin/micinfo
如果英特尔® MPSS 服务无法正常运行,您需要重启驱动程序和所有关联的协处理器:
sudo service mpss stop
sudo service mpss unload
sudo service mpss start
sudo micctrl -w
sudo /opt/intel/mic/bin/micinfo
监控英特尔® 至强融合™ 协处理器
如果您需要监控协处理器上的负载、温度等,请运行系统管理与配置(SMC)实用工具。详情请参阅 MPSS readme.txt 自述文件中第 5.3 节的说明。
执行监控程序
/opt/intel/mic/bin/micsmc &
如果不要参数启动,则 micsmc 将运行 GUI 模式。如果使用参数调用,则运行 character 模式。
从主机系统运行某个英特尔® 至强融合™ 协处理器程序
您可以将某个英特尔® MIC 架构原生二进制程序复制到指定的英特尔® 至强融合™ 协处理器中,并使用“micnativeloadex”实用工具进行执行。该实用工具可将函数库关系方便地复制到协处理器中。详情请参阅 MPSS readme.txt 自述文件中第 5.5 节的说明。
直接配合 uOS 环境英特尔® 至强融合™ 协处理器
由于协处理器运行于 Linux 并且是一个独立网络节点,所以 root 或 非 root 用户可以通过“ssh”登陆其中并发出众多共同 Linux 指令。和协处理器之间的往来文件传输是借助“scp”或其它手段。
从主机上看到的协处理器默认 IP 地址为 172.31.<coprocessor>.1,而默认情况下协处理器看到的主机地址是 172.31.<coprocessor>.254。从主机还可以使用别名 mic<coprocessor> 指涉协处理器。例如,您在系统中安装的第一个协处理器称为“mic0”,位置是 172.31.1.1。从它看主机的位置为 172.31.1.254。安装第二个协处理器以后,它将称为“mic1”且位置为 172.31.2.1,从它看主机的位置为 172.31.2.254。
关于非 root 用户如何设置卡,调整网络配置,安装主机为英特尔® 至强融合™ 协处理器而输出的 NFS 文件系统,等等,请参考 MPSS readme.txt 自述文件中第 6 节。
有用的管理工具
本产品附带以下管理工具,地址目录为“/opt/intel/mic/bin”。Root 用户以及需要使用这些工具的用户应当将该目录添加至自己的默认路径中:
micinfo – 提供主机与协处理器配置的相关信息。
micflash – 更新协处理器的闪存;保存并检索每个闪存扇区的版本信息及其它信息。
micsmc – 该工具旨在减轻英特尔® 至强融合™ 协处理器的监控与管理负担。
miccheck – 该实用工具通过运行各种诊断测试来检验英特尔® 至强融合™ 协处理器的配置状况。
micnativeloadex – 该实用工具将英特尔® MIC 架构原生二进制程序复制到指定的英特尔® 至强融合™ 协处理器并执行。
micctrl – 该工具帮助系统管理员配置并重启协处理器。
请参考 MPSS readme.txt 自述文件中第 6 节深入了解这些工具及其参数。
开始了解/并开发英特尔® 至强融合™ 软件您可以使用已经掌握的关于多核和 SIMD 程序的知识开发面向英特尔® MIC 架构的应用。卸载语言扩展集支持您导入代码段(使用 C/C++ 或 FORTRAN 编写)并运行于英特尔® 至强融合™ 协处理器,或者将整个应用导入至英特尔® MIC 架构。如需获得最佳性能,必须使用高度并行应用,并且多数执行过程需要使用 SIMD 操作(由编译器生成或使用编译器内联函数生成)。
可用软件开发工具/环境
您可以使用已经掌握的并行程序知识以及在主机上开发并行应用的技巧为英特尔® 至强融合™ 协处理器进行编程。不存在为支持英特尔® 至强融合™ 协处理器而开发的新工具,熟悉的基于主机的英特尔工具通过对标准语言和 API 的若干增强即可支持英特尔® MIC 架构。然而,为了最有效地利用开发工具并获得英特尔® 至强融合™ 协处理器的最佳性能,了解英特尔® MIC 架构是很有必要的。
开发环境:可用的编译器和函数库
编译器
英特尔® C++ Composer XE 2013,用于构建运行于英特尔® 64 架构和英特尔® MIC 架构的应用
英特尔® Fortran Composer XE 2013,用于构建运行于英特尔® 64 架构和英特尔® MIC 架构的应用
函数库 和编译器一起封装的函数库包括:
英特尔® 数学内核函数库(英特尔® MKL) ,针对英特尔® MIC 架构进行了优化
英特尔® 线程构建模块(英特尔® TBB)
英特尔® 集成性能基元(英特尔® IPP)
函数库 独立封装的函数库包括:
英特尔® MPI for Linux* OS,包含英特尔® 集成众核(英特尔® MIC) 架构
开发环境:可用工具
除了标准编译器和英特尔函数库,您也可以使用以下工具调试并优化运行于英特尔® 至强融合™ 协处理器上的软件。
调试器
英特尔® 调试器,面向运行于英特尔® 64 架构和英特尔® MIC 架构上的应用
英特尔® C++ Eclipse* 产品扩展,包含调试分析工具
英特尔® VTune™ Amplifier XE 2013 for Linux,用于主机 Linux OS 采集并查看英特尔® 至强融合™ 协处理器上的数据
英特尔® Inspector XE 2013,用于检测串行和并行应用的内存与线程错误
英特尔® Advisor XE 2013,用于协助开发人员设计线程。
一般开发信息
开发环境设置
为了设置使用英特尔工具的开发环境,您需要指定以下脚本的源地址(默认安装地址是假设的):
英特尔® C++ 和 Fortran Composer XE 2013:/opt/intel/composerxe/bin/compilervars.csh 或 compilervars.sh 脚本,参数为 intel64,例如:
源地址:/opt/intel/composerxe/bin/compilervars.sh intel64
以下脚本的运行是调用 compilervars 脚本的结果。为了您的环境正常初始化,建议不要单独运行它们(这会引发很多问题,还会引发排序问题,可能导致不可预测的行为)。
英特尔调试器:/opt/intel/composerxe/pkg_bin/idbvars.csh 或 idbvars.sh 脚本,参数为 intel64。
英特尔 TBB:/opt/intel/composerxe/tbb/bin/tbbvars.csh 或 tbbvars.sh 脚本,参数为 intel64。
英特尔® MKL:/opt/intel/composerxe/mkl/bin/mklvars.csh 或 mklvars.sh 脚本,参数为 intel64。
文档与抽样代码
最有用的文档放在 /opt/intel/composerxe/Documentation/en_US/including:
compiler_c/main_cls/index.htm and compiler_f/main_cls/index.htm- 完成英特尔® C++ Compiler XE 13.0 和英特尔® Fortran Compiler XE 2013 的相关文档。
关于面向英特尔® MIC 架构的程序构建信息,多数包含在“面向英特尔® MIC 架构的编程”之下“关键特性”章节中
关于英特尔® MIC 架构内联函数的信息,包含在“面向英特尔® MIC 架构的内联函数”之下“编译器参考/内联函数”章节
Release-notes-*-2013-l-en.pdf- 请仔细阅读这些内容了解英特尔® MIC 架构支持的所有工具的已知问题及其解决方案和安装说明。您将看到英特尔® MIC 架构的相关信息主要包含在第 3 节中。
注释:由于各种原因,本文档可能不是最新版本。最新版本的 Release-notes-*-2013-l-en.pdf 文档可在英特尔注册中心下载(参考“软件开发工具安装步骤”一节)。
debugger/debugger_documentation.htm – 关于如何使用英特尔调试器的信息。关于如何调试英特尔® MIC 架构应用的信息,包含在“使用英特尔® 调试器调试 Eclipse*”和“调试命令行”章节
关于如何使用英特尔® 至强融合™ 协处理器的其它文档:
关于英特尔数学内核函数库用户指南,可通过 /opt/intel/composerxe/Documentation/en_US/mkl下的mkl_documentation.htm 访问,其中包含一个章节为“基于英特尔® MIC 内核架构协处理器使用英特尔® 数学内核函数库”,介绍了英特尔® MKL 函数的“自动卸载”和“编译器辅助卸载”。
关于如何使用 VTune Amplifier XE 2013 for Linux* 采集英特尔® 至强融合™ 协处理器的性能数据信息,请访问 mic-data-collection.pdf(/opt/intel/vtune_amplifier_xe_2013/documentation/en)。
Web 上的有用文档:
在网站 http://software.intel.com/mic-developer 上您可以找到大量可供下载的文档,最抢眼的是“软件开发”选项卡下的《英特尔® 至强融合™ 软件开发人员指南》,还有《英特尔® 至强融合™ 协处理器指令集参考手册》,《ABI 文档系统 V 应用二进制程序接口 K1OM 架构处理器附录》,以及《英特尔® 至强融合™ 性能监控器单元》。在该网站上您还可以找到社区论坛(问题答疑),以及其它可用工具、代码样本与案例研究的链接。
http://software.intel.com/en-us/articles/programming-and-compiling-for-intel-many-integrated-core-architecture 这个网站包含大量关于编译器的信息。
使用显式内存复制模式的一些抽样卸载代码的地址为:
C++: /opt/intel/composerxe/Samples/en_US/C++/mic_samples/intro_sampleC/
Fortran: /opt/intel/composerxe/Samples/en_US/Fortran/mic_samples/
英特尔® MKL: /opt/intel/composerxe/mkl/examples/mic*
英特尔® MKL 自动卸载的示例:/opt/intel/composerxe/mkl/examples/mic_ao/blasc 和 …/mic_ao/blasf
以下示例展示如何通过编译器辅助卸载使用 MKL (/opt/intel/composerxe/mkl/examples/mic_offload)。
使用显式内存复制模式的一些抽样卸载代码的地址为:
C: /opt/intel/composerxe/Samples/en_US/C++/mic_samples/shrd_sampleC 和 …/LEO_tutorial
C++: /opt/intel/composerxe/Samples/en_US/C++/mic_samples/shrd_sampleCPP
构建相关信息
卸载编译器生成“胖”二进制程序,所以文件包含的代码同时支持主机和英特尔® 至强融合™ 协处理器。
卸载编译器生成的代码能够针对英特尔® 至强融合™ 协处理器检查运行时间执行环境。如果未发现协处理器,则在主机上执行“卸载”代码。换句话说,卸载编译器将创建同时支持主机和英特尔® MIC 架构版本的卸载代码。
关于大量解决方案和提示信息,请参考 Release-notes-*-2013-l-en.pdf。
编译器开关和 Makefiles
当构建将一些代码卸载至英特尔® 至强融合™ 协处理器的应用时,可以使用来自主机代码的不同编译器选项构建所卸载的代码。将这些选项传递至编译器的方法可参阅编译器文档,“编译器参考/编译器选项/编译器选项类别与描述”章节中。查看 –卸载-选项编译器开关。在同一章节中,还可以查找 –卸载 –属性 –目标编译器开关,它提供了在同样情形下编辑源文件的替代方法(适用于基于 pragma 的卸载方法)。最后,-no-offload 提供一个方法使编译器忽略 _Cilk_offload 和 #pragma_offload 结构(它将默认构建一个异质二进制程序)。
运行时间中调试
为了调试卸载活动,可使用以下环境变量:
了解程序中的卸载部分是运行在主机还是协处理器上
对于 csh - setenv H_TRACE 1
对于 sh - export H_TRACE=1
对于更加完整的调试信息
对于 csh - setenv H_TRACE 2
对于 sh - export H_TRACE=2
为了显示编译器的内部卸载计时器,报告值为 1 显示的仅是主机测量的卸载时间,以及协处理器使用的计算时间。报告值为 2 添加了关于各个方向上传输了多少数据的信息。
对于 csh - setenv OFFLOAD_REPORT <1 或 2>
对于 sh - export OFFLOAD_REPORT=<1 或 2>
如何获取更多帮助
您可以访问英特尔® 至强融合™ 协处理器的论坛提出问题。网站:http://software.intel.com/en-us/forums/intel-many-integrated-core。
使用卸载编译器 – 显式内存复制模式
在本节中将使用一个约减(reduction)示例展示面向使用卸载编译器的英特尔® 至强融合™ 协处理器开发应用的详细步骤。卸载编译器是一个异质2 编译器,具有主机 CPU 和目标编译环境。面向主机 CPU 和英特尔® 至强融合™ 协处理器的代码是在主机环境内编译的,所卸载的代码自动在目标环境里运行。卸载行为由编译器指令进行控制:在 C/C++ 中为 pragmas,在 Fortran 中为指令。
一些通用函数库,如英特尔® 数学内核函数库(英特尔® MKL),同时存在主机版本和目标版本。当一个应用执行首次卸载且目标可用时,运行时间(runtime)将可执行目标加载至英特尔® 至强融合™ 协处理器。同时,它还将初始化与目标代码相链接的函数库。加载的目标可执行文件依然保存在目标内存中,直到主机程序终止。因此,函数库维护的任何全局状态都将跨卸载实例得以维护。
注释:尽管用户可以指定在目标上运行的代码区域,但这并不保证在英特尔® 至强融合™ 协处理器上的执行。根据目标硬件的存在与否或英特尔® 至强融合™ 协处理器资源的可用性,当执行到标记为卸载的代码区域时,代码将运行于英特尔® 至强融合™ 协处理器或返回至主机运行。
以下代码抽样展示了使用卸载 pragma 指令将约减代码移植到英特尔® 至强融合™ 协处理器的多个版本。
约减示例
该操作涉及计算表达式:
ans = a[0] + a[1] + … + a[n-1]
以下抽样代码展示了实施该约减版本的 C 代码。
1 |
float reduction(float *data, int size) |
2 |
{ |
3 |
float ret = 0.f; |
4 |
for (int i=0; i<size; ++i) |
5 |
{ |
6 |
ret += data[i]; |
7 |
} |
8 |
return ret; |
9 |
} |
创建卸载版本
带卸载的串行约减
程序员使用 #pragma offload target(mic) (如下例所示)标记应当在英特尔® 至强融合™ 协处理器上执行的语句(卸载结构)。卸载区域的定义包含卸载结构以及由于函数调用而在目标环境里运行的附加代码区域。一旦目标环境里的语句执行完毕且结果可供主机调用时,主机上的语句执行将会恢复(换言之,卸载将会中断,尽管有一个 pragma 版本支持异步执行)。In、out 和 inout 语句指明数据在主机与目标之间的传输方向。
所卸载的结构如果被声明为不属于结构的范畴(包括文件范畴),则使用的变量(默认)在目标开始执行前就复制到目标,并在执行完毕后复制回主机。
以下代码可作为示例,变量 ret 在目标开始执行前就自动复制到目标,执行完毕后复制回主机。以下卸载代码在单个英特尔® MIC 架构内核上由单个线程执行。
01 |
float reduction(float *data, int size) |
02 |
{ |
03 |
float ret = 0.f; |
04 |
#pragma offload target(mic) in(data:length(size)) |
05 |
for (int i=0; i<size; ++i) |
06 |
{ |
07 |
ret += data[i]; |
08 |
} |
09 |
return ret; |
10 |
} |
代码示例 2:带卸载的串行约减
带卸载的矢量约减
英特尔® 至强融合™ 协处理器的每个内核都有一个 VPU。卸载编译器默认支持自动矢量化选项。另外,如下例所示,程序员可使用英特尔® Cilk™ Plus 扩展阵列符号实现矢量化的最大化,并利用英特尔® MIC 架构内核的 32 个 512 位寄存器。卸载代码在单个内核上由单个线程执行。该线程使用内建约减函数 __sec_reduce_add() 利用内核的 32 个 512 位矢量寄存器来约减阵列中的元素,每次约减 16 个。
1 |
float reduction(float *data, int size) |
2 |
{ |
3 |
float ret = 0; |
4 |
#pragma offload target(mic) in(data:length(size)) |
5 |
ret = __sec_reduce_add(data[0:size]); //Intel® Cilk™ Plus |
6 |
//Extended Array Notation |
7 |
return ret; |
8 |
} |
异步卸载和数据传输
主机和英特尔® 至强融合™ 协处理器之间支持异步卸载和数据传输。如需详细信息,请参阅《英特尔® C++ 编译器用户与参考指南》中“关于异步计算”和“关于异步数据传输”章节(在“面向英特尔® MIC 架构的关键特性/程序”下)。
如需异步卸载与传输的使用示例,请参考:/opt/intel/composerxe /Samples/en_US/C++/mic_samples/intro_sampleC/sampleC13.c
请注意:当使用显式内存复制模式(C/C++),支持阵列的前提条件是阵列元素是标量或按位可复制的结构或类型。所以不支持带指针的阵列。对于 C/C++ 复杂数据结构,请使用显式内存复制模式。更多信息请参考《英特尔 C++ 编译器用户与参考指南》文档中“使用 Pragma 卸载代码的限制”章节。
使用卸载编译器 – 隐式内存复制模式
英特尔 Composer XE 2013 包含两个面向 C 和 C++ 的附加关键字扩展(不支持 Fortran),它提供“共享内存”卸载编程模式,适用于处理复杂、基于指针的数据结构,如链接列表、二进制树、等等(_Cilk_shared and _Cilk_offload)。该模式支持变量在主机和协处理器之间共享(标记为 _Cilk_shared 关键字),位于两个设备的同一虚拟地址中,并在卸载函数调用的开始与结束时同步他们的值(标记为 _Cilk_offload 关键字)。需要同步的数据还可以使用特殊分配与自由调用进行动态地分配,从而确保分配的内存位于两个设备的同一虚拟地址。
支持动态共享内存分配的 API:
void *_Offload_shared_malloc(size_t size);
_Offload_shared_free(void *p);
支持动态均衡共享内存分配的 API:
void *_Offload_shared_aligned_malloc(size_t size, size_t alignment);
_Offload_shared_aligned_free(void *p);
应当指出:实际上这并不是“共享内存”:没有硬件可将英特尔® 至强融合™ 协处理器内存的一部分内容映射至主机系统。协处理器和主机上的内存子系统是完全独立的,这种编程模式是在定义明确的同步点的这些内存子系统之间复制数据的另一种方式。这些复制是隐式的,所有这些同步点(卸载调用标记为 _Cilk_offload)不指明复制哪些数据。相反,运行时间决定着主机和协处理器之间哪些数据发生了改变,并且仅复制在卸载函数调用开始和结束时发生变化的数据。
以下代码抽样展示了如何使用 _Cilk_shared 和 _Cilk_offload 关键字以及动态分配“共享”内存。
01 |
float * _Cilk_shared data; //pointer to “shared” memory |
02 |
03 |
_Cilk_shared float MIC_OMPReduction(int size) |
04 |
{ |
05 |
#ifdef __MIC__ |
06 |
float Result; |
07 |
int nThreads = 32; |
08 |
omp_set_num_threads(nThreads); |
09 |
10 |
#pragma omp parallel for reduction(+:Result) |
11 |
for (int i=0; i<size; ++i) |
12 |
{ |
13 |
Result += data[i]; |
14 |
} |
15 |
return Result; |
16 |
17 |
18 |
#else |
19 |
printf("Intel(R) Xeon Phi(TM) Coprocessor not availablen"); |
20 |
#endif |
21 |
return 0.0f; |
22 |
} |
23 |
24 |
int main() |
25 |
{ |
26 |
size_t size = 1*1e6; |
27 |
int n_bytes = size*sizeof(float); |
28 |
data = (_Cilk_shared float *)_Offload_shared_malloc (n_bytes); |
29 |
for (int i=0; i<size; ++i) |
30 |
{ |
31 |
data[i] = i%10; |
32 |
} |
33 |
34 |
_Cilk_offload MIC_OMPReduction(size); |
35 |
36 |
_Offload_shared_free(data); |
37 |
return 0; |
38 |
} |
代码示例 4:在 C/C++ 中使用“_Cilk_shared”和“_Cilk_offload”关键字和动态分配。
注释:如需更多隐式内存复制模式的示例,请参考:
C: /opt/intel/composerxe/Samples/en_US/C++/mic_samples/shrd_sampleC and …/LEO_tutorial
C++: /opt/intel/composerxe/Samples/en_US/C++/mic_samples/shrd_sampleCPP
需要更多信息的用户请参考《英特尔 C++ 编译器用户与参考指南》和/或《英特尔 Fortran 编译器用户与参考指南》。
《英特尔 C++ 编译器用户与参考指南》中“使用共享虚拟内存卸载限制”章节显示了这一编程模式的一些使用限制。
本机编译
应用还可以在英特尔® 至强融合™ 协处理器上本机运行,在这种情况下,协处理器将作为单机多核计算机。二进制程序在主机系统中构建以后,将二进制程序以及其它相关二进制程序或数据复制到英特尔® 至强融合™ 协处理器的文件系统中(或通过 NFS 显示出来)。
示例:
将 openmp_sample.c 从 /opt/intel/composerxe/Samples/en_US/C++/openmp_samples/ 复制到您的主目录
使用 –mmicflag 构建应用:
icc -mmic -vec-report3 -openmp openmp_sample.c
将二进制程序加载至协处理器:
scp a.out mic0:/tmp/a.out
复制您的应用需要的任何共享函数库,此时 OpenMP* 运行时间函数库:
scp /opt/intel/composerx/lib/mic/libiomp5.so mic0:/tmp/libiomp5.so
使用 ssh 连接协处理器并输出本地目录,以便应用找到需要调用的任何共享函数库(此时 OpenMP* 运行时间函数库):
ssh mic0
export LD_LIBRARY_PATH=/tmp
如果堆栈大小设置错误,则应用可能出现分段错误。如需修改堆栈大小,请使用:
ulimit -s unlimited
转到 /tmp 并运行 a.out:
cd /tmp
./a.out
英特尔® 至强融合™ 协处理器上的并行编程选项
主机系统支持的多数并行编程选项也支持英特尔® 至强融合™ 协处理器。其中包括:
英特尔® 线程构建模块(英特尔® TBB)
OpenMP*
英特尔® Cilk Plus
pthreads*
以下章节将讨论如何借助卸载扩展使用代码的并行编程模式。在英特尔® 至强融合™ 协处理器上本机运行的代码可以像在主机上一样使用这些并行编程模式,除了线程更多以外没有复杂性。
英特尔® 至强融合™ 协处理器上的并行编程: OpenMP*
主机 CPU 和英特尔® 至强融合™ 协处理器上的 OpenMP 线程之间没有通信。由于卸载/pragma 内部的 OpenMP 并行区域是作为一个单元卸载的,所以卸载编译器根据英特尔® 至强融合™ 协处理器的可用资源创建一个线程组。由于整个 OpenMP 结构是在英特尔® 至强融合™ 协处理器上执行的,所以在结构内部, OpenMP* 关于共享与私有数据的通常语义依然适用。
任何时间都可以将多个主机 CPU 线程卸载至英特尔® 至强融合™ 协处理器。如果一个 CPU 线程试图卸载至英特尔® 至强融合™ 协处理器而协处理器上的资源不可用,则试图卸载的代码可能在主机上执行。如果协处理器上的一条线程遇到“omp parallel”指令,则根据协处理器上的可用资源创建一个线程组。理论上硬件线程可创建的最大数量是英特尔® 至强融合™ 协处理器的内核数量的 4 倍。实际极限数量少于 4 倍(对于卸载代码),因为第一个内核是为 uOS 及其服务而保留的。
以下代码示例显示的是单个主机 CPU 线程试图使用卸载结构中的 OpenMP 将约减代码卸载至英特尔® 至强融合™ 协处理器。
01 |
float OMP_reduction(float *data, int size) |
02 |
{ |
03 |
float ret = 0; |
04 |
#pragma offload target(mic) in(size) in(data:length(size)) |
05 |
{ |
06 |
#pragma omp parallel for reduction(+:ret) |
07 |
for (int i=0; i<size; ++i) |
08 |
{ |
09 |
ret += data[i]; |
10 |
} |
11 |
} |
12 |
return ret; |
13 |
} |
代码示例 5: C/C++:在卸载约减代码中使用 OpenMP
01 |
real function FTNReductionOMP(data, size) |
02 |
implicit none |
03 |
integer :: size |
04 |
real, dimension(size) :: data |
05 |
real :: ret = 0.0 |
06 |
07 |
!dir$ omp offload target(mic) in(size) in(data:length(size)) |
08 |
!$omp parallel do reduction(+:ret) |
09 |
do i=1,size |
10 |
ret = ret + data(i) |
11 |
enddo |
12 |
!$omp end parallel do |
13 |
14 |
FTNReductionOMP = ret |
15 |
return |
16 |
end function FTNReductionOMP |
代码示例 6: Fortran:在卸载约减代码中使用 OpenMP*
英特尔® 至强融合™ 协处理器上的并行编程:OpenMP* + Intel® Cilk™ Plus 扩展阵列符号
以下代码抽样进一步将 OpenMP 示例扩展至使用英特尔® Cilk Plus 扩展阵列符号。在以下代码抽样中,每个线程使用英特尔® Cilk Plus 扩展阵列符号中的内建约减函数 __sec_reduce_add() 以利用英特尔® MIC 架构的所有 32 个 512 位矢量寄存器来约减阵列中的元素。
01 |
float OMPnthreads_CilkPlusEAN_reduction(float *data, int size) |
02 |
{ |
03 |
float ret=0; |
04 |
#pragma offload target(mic) in(data:length(size)) |
05 |
{ |
06 |
int nthreads = omp_get_max_threads(); |
07 |
int ElementsPerThread = size/nthreads; |
08 |
#pragma omp parallel for reduction(+:ret) |
09 |
for(int i=0;i<nthreads;i++) |
10 |
{ |
11 |
ret =_sec_reduce_add( |
12 |
data[i*ElementsPerThread:ElementsPerThread]); |
13 |
} |
14 |
//rest of the array |
15 |
for(int i=nthreads*ElementsPerThread; i<size; i++) |
16 |
{ |
17 |
ret+=data[i]; |
18 |
} |
19 |
} |
20 |
return ret; |
21 |
} |
代码示例 7:在 C/C++ 下使用 OpenMP 和英特尔® Cilk™ Plus 约减阵列
英特尔® 至强融合™ 协处理器上的并行编程:英特尔® Cilk™ Plus
默认状况下目标环境中的英特尔® Cilk Plus 头文件不可用。为了使头文件对于面向英特尔® MIC 架构(使用英特尔® Cilk Plus)构建的应用可用,请使用 #pragma offload_attribute(push,target(mic)) 和 #pragma offload_attribute(pop) 处理(wrap)头文件,方法如下:
1 |
#pragma offload_attribute(push,target(mic)) |
2 |
#include <cilk/cilk.h> |
3 |
#include <cilk/reducer_opadd.h> |
4 |
#pragma offload_attribute(pop) |
代码示例 8:在 C/C++ 下处理头文件
在以下示例中,编译器使用一个高效的分治策略将 cilk_forloop 转换为递归调用函数。
01 |
float ReduceCilk(float*data, int size) |
02 |
{ |
03 |
float ret = 0; |
04 |
#pragma offload target(mic) in(data:length(size)) |
05 |
{ |
06 |
cilk::reducer_opadd<int> total; |
07 |
cilk_for (int i=0; i<size; ++i) |
08 |
{ |
09 |
total += data[i]; |
10 |
} |
11 |
ret = total.get_value(); |
12 |
} |
13 |
return ret; |
14 |
} |
代码示例 9:通过转换“cilk_for”Loop 创建递归调用函数
英特尔® 至强融合™ 协处理器上的并行编程:英特尔® TBB
和英特尔® Cilk Plus一样,默认状况下目标环境中的英特尔® TBB 头文件不可用。使用类似方法可将它们对英特尔® MIC 架构目标环境可用:
1 |
#pragma offload_attribute (push,target(mic)) |
2 |
#include "tbb/task_scheduler_init.h" |
3 |
#include "tbb/blocked_range.h" |
4 |
#include "tbb/parallel_reduce.h" |
5 |
#include "tbb/task.h" |
6 |
#pragma offload_attribute (pop) |
7 |
8 |
using namespace tbb; |
代码示例 10:在 C/C++ 下处理英特尔® TBB头文件
从卸载结构中调用的函数和英特尔® 至强融合™ 协处理器需要的全局数据应该附以以下特殊属性 __attribute__((target(mic)))。
例如,parallel_reduce 将一个阵列递归分割为若干子界供每个线程工作。parallel_reduce 使用分割构造函数为每个线程生成一个或多个副本。对于每个分割,调用 method join 累加结果。
如果您需要为协处理器生成它们,请在类别前面加前缀 macro __MIC__ 并在类别名称前面加前缀 __attribute__((target(mic)))。
01 |
#ifdef __MIC__ |
02 |
class __attribute__((target(mic))) ReduceTBB |
03 |
{ |
04 |
private: |
05 |
float *my_data; |
06 |
public: |
07 |
float sum; |
08 |
09 |
void operator()( const blocked_range<size_t>& r ) |
10 |
{ |
11 |
float *data = my_data; |
12 |
for( size_t i=r.begin(); i!=r.end(); ++i) |
13 |
{ |
14 |
sum += data[i]; |
15 |
} |
16 |
} |
17 |
18 |
ReduceTBB( ReduceTBB& x, split) : my_data(x.my_data), sum(0) {} |
19 |
20 |
void join( const ReduceTBB& y) { sum += y.sum; } |
21 |
22 |
ReduceTBB( float data[] ) : my_data(data), sum(0) {} |
23 |
}; |
24 |
#endif |
代码示例 11:面向 C/C++ 下的英特尔® MIC 架构代码生成为英特尔® TBB 类别加前缀
在将要卸载至英特尔® 至强融合™ 协处理器的函数前面加前缀 __attribute__((target(mic)))
1 |
__attribute__((target(mic))) |
2 |
float MICReductionTBB(float *data, int size) |
3 |
{ |
4 |
ReduceTBB redc(data); |
5 |
// initializing the library |
6 |
task_scheduler_init init; |
7 |
parallel_reduce(blocked_range<size_t>(0, size), redc); |
8 |
return redc.sum; |
9 |
} |
代码示例 12:面向 C/C++ 下的英特尔® MIC 架构代码生成为英特尔® TBB 函数加前缀
使用 #pragma offload target(mic) 将英特尔® TBB 并行代码卸载至协处理器
1 |
float MICReductionTBB(float *data, int size) |
2 |
{ |
3 |
float ret(0.f); |
4 |
#pragma offload target(mic) in(size) in(data:length(size)) out(ret) |
5 |
ret = _MICReductionTBB(data, size); |
6 |
return ret; |
7 |
} |
代码示例 13:在 C/C++ 下将英特尔® TBB 代码卸载至协处理器
注释:使用英特尔® TBB 卸载的代码应当使用 -tbb 标志进行编译,而非使用 –ltbb。
英特尔® MKL 使用说明
对于卸载用户来说,英特尔® MKL 在英特尔® 至强融合™ 协处理器上的本机加速(NAcc)模式下是最常用的。在本机加速(Nacc)模式下,所有数据和二进制程序都位于英特尔® 至强融合™ 协处理器上。数据由程序员通过卸载编译器 pragmas 和语义传输,供英特尔® MKL在卸载区域或函数内调用。NAcc 功能包含 BLAS、LAPACK、FFT、VML、VSL(稀疏矩阵矢量),并需要英特尔® MKL 服务函数。请参阅英特尔® MKL 发行文档详细了解函数的优化和支持信息。
本机加速模式还可以在英特尔® MIC 架构原生代码中使用 — 在这种情况下,英特尔® MKL 共享二进制程序在执行前必须复制到英特尔® 至强融合™ 协处理器中。

Figure 3.1: Using MKL Native Acceleration with Offload
SGEMM 示例
使用 BLAS 二进制程序的 SGEMM 例程
示例代码 - sgemm
第 1 步:初始化矩阵,在本示例中,它需要是一个全局变量以便利用数据持久性。
第 2 步:使用 #pragma 卸载将数据发送至英特尔® 至强融合™ 协处理器。在本示例中,使用 free_if(0) 修饰符确保数据在英特尔® 至强融合™ 协处理器上的持久性。
1 |
#define PHI_DEV 0 |
2 |
#pragma offload target(mic:PHI_DEV) |
3 |
in(A:length(matrix_elements) free_if(0)) |
4 |
in(B:length(matrix_elements) free_if(0)) |
5 |
in(C:length(matrix_elements) free_if(0)) |
6 |
{ |
7 |
} |
代码示例 14:将数据发送至英特尔® 至强融合™ 协处理器
第 3 步:调用卸载部分中的 sgemm,使用英特尔® 至强融合™ 协处理器上的英特尔® MKL 的“本机加速”版本。nocopy() 修饰符的作用是重新使用第 2 步中复制到卡中的数据。
1 |
#pragma offload target(mic:PHI_DEV) |
2 |
in(transa, transb, N, alpha, beta) |
3 |
nocopy(A: alloc_if(0) free_if(0)) nocopy(B: alloc_if(0) free_if(0)) |
4 |
out(C:length(matrix_elements) alloc_if(0) free_if(0)) // output data |
5 |
{ |
6 |
sgemm(&transa, &transb, &N, &N, &N, &alpha, A, &N, B, &N, |
7 |
&beta, C, &N); |
8 |
} |
代码示例 15:调用卸载部分中的 sgemm
第 4 步:释放第 2 步中复制到卡中的内存。修饰符 alloc_if(0)的作用是在进入卸载部分时重新使用卡上的数据,修饰符 free_if(1) 的作用是退出时释放卡上的数据。
1 |
#pragma offload target(mic:PHI_DEV) |
2 |
in(A:length(matrix_elements) alloc_if(0) free_if(1)) |
3 |
in(B:length(matrix_elements) alloc_if(0) free_if(1)) |
4 |
in(C:length(matrix_elements) alloc_if(0) free_if(1)) |
5 |
{ |
6 |
} |
代码示例 16:释放复制的内存
对于任何平台上的英特尔® MKL,在卸载代码内部执行 MKL 函数之前,都可以通过设定允许的 OpenMP 线程数量来限制所使用的线程数量。
1 |
#pragma offload target(mic:PHIDEV) |
2 |
in(transa, transb, N, alpha, beta) |
3 |
nocopy(A: alloc_if(0) free_if(0)) nocopy(B: alloc_if(0) free_if(0)) |
4 |
out(C:length(matrix_elements) alloc_if(0) free_if(0)) // output data |
5 |
{ |
6 |
omp_set_num_threads(64); // set num threads in openmp |
7 |
sgemm(&transa, &transb, &N, &N, &N, &alpha, A, &N, B, &N, |
8 |
&beta, C, &N); |
9 |
} |
代码示例 17:使用 omp_set_num_threads() 控制英特尔® 至强融合™ 协处理器上的线程数量
英特尔® MKL 自动卸载模式
一些主机英特尔® MKL 函数能够感知自动卸载功能 — 您可以根据正常需要在主机上调用它们。然而,一旦您使用 mkl_mic_enable()开始调用函数库,英特尔® MKL 将在运行时间自动决定函数调用所需的部分工作或全部工作是否需要在主机和英特尔® 至强融合™ 协处理器上进行分割。决定因素包括问题大小、处理器上的负载状况以及其它指标。关闭该功能可使用 mkl_mic_disable()。
自动卸载仅适用在运行于英特尔® 至强融合™ 协处理器之外的代码通过 _Cilk_offload 或 #pragma 卸载而选择主机英特尔® MKL 函数库调用。因此,您应当最大程度限制同一数据在自动卸载调用和协处理器上通过 _Cilk_offload 或 #pragma 卸载而运行的代码中的传输。目前,协处理器上无法在自动 MKL 卸载和显式程序员控制卸载之间保存公用数据(通过 _Cilk_offload 或 #pragma 卸载)。
如需自动卸载的控制示例,请参考:/opt/intel/composerxe/mkl/examples/mic_ao/blasc (对于 C 代码);/opt/intel/composerxe/mkl/examples/mic_ao/blasf(对于 Fortran 代码)。
调试英特尔® 至强融核™ 协处理器如需深入了解如何调试英特尔® MIC 架构应用,请参阅“使用英特尔® 调试器调试 Eclipse*”和“调试命令行”章节(/opt/intel/composerxe/Documentation/en_US/debugger/debugger_documentation.htm)。
英特尔® 至强融核™ 协处理器的性能分析关于如何使用英特尔® VTune™ Amplifier XE for Linux* 采集英特尔® 至强融合™ 协处理器的性能数据信息,请访问 mic-data-collection.pdf(/opt/intel/vtune_amplifier_xe_2013/documentation/en)。
作者介绍![]() |
Sudha Udanapalli Thiagarajan |
![]() |
Charles Congdon |
![]() |
Sumedh Naik |
![]() |
Loc Q Nguyen |
声明
本文件中包含关于英特尔产品的信息。本文件不构成对任何知识产权的授权,包括明示的、暗示的,也无论是基于禁止反言的原则或其他。除英特尔产品销售的条款和条件规定的责任外,英特尔不承担任何其他责任。英特尔在此作出免责声明:本文件不构成英特尔关于其产品的使用和/或销售的任何明示或暗示的保证,包括不就其产品的(i)对某一特定用途的适用性、(ii)适销性以及(iii)对任何专利、版权或其他知识产权的侵害的承担任何责任或作出任何担保。
除非经过英特尔的书面同意认可,英特尔的产品无意被设计用于或被用于以下应用:即在这样的应用中可因英特尔产品的故障而导致人身伤亡。
英特尔有权随时更改产品的规格和描述而毋需发出通知。设计者不应信赖任何英特产品所不具有的特性,设计者亦不应信赖任何标有“保留权利”或“未定义”说明或特性描述。对此,英特尔保留将来对其进行定义的权利,同时,英特尔不应为因其日后更改该等说明或特性描述而产生的冲突和不相容承担任何责任。此处提供的信息可随时改变而毋需通知。请勿根据本文件提供的信息完成一项产品设计。
本文件所描述的产品可能包含使其与宣称的规格不符的设计缺陷或失误。这些缺陷或失误已收录于勘误表中,可索取获得。
在发出订单之前,请联系当地的英特尔营业部或分销商以获取最新的产品规格。
索取本文件中或英特尔的其他材料中提的、包含订单号的文件的复印件,可拨打1-800-548-4725,或登陆http://www.intel.com/design/literature.htm。
英特尔、Intel 标识、Cilk、Xeon、至强、Intel Xeon Phi 和英特尔至强融合是英特尔公司在美国和其他国家的商标。
* 其他的名称和品牌可能是其他所有者的资产。
英特尔公司 © 2012 年版权所有。所有权保留。




