面向英特尔® 至强融核™ 协处理器的数学核心库自动卸载

概述

英特尔® 数学核心库 (MKL) 具备一项独特的全新自动卸载 (AO) 功能支持用户代码中调用的计算密集型英特尔® MKL 函数自动、透明地受益于附加的英特尔® 至强融核协处理器。这一特殊功能支持用户利用协处理器提供的额外计算资源,同时无需更改他们代码中的英特尔 MKL 调用,也无需修改他们的编译和链接方式。AO支持编程人员使用他们所熟悉的使用模型,同时享受从多核到大量内核的性能提升。

因为协处理器通过外设组件互连 Express (PCIe) 连接至主机系统因此AO 支持只面向涉及大型问题以及具有较高计算与数据访问比率的函数提供。例如,像许多 LAPACK 函数和 Level 3 BLAS 一样,计算复杂度性高于 O(n3) 且数据访问为O(n2) 的英特尔 MKL函数可在明显较长的计算时间中分摊数据传输所需的时间,从而缩短问题解决时间并实现性能提升。具有这些特性的函数是 AO 的合适候选项。在目前 MKL (11.0) 版本中,只有下列 Level-3 BLAS 函数可启用 AO 功能:

·         ?GEMM?TRMM ?TRSM

在未来升级版本中LU QR 分解函数将启用 AO 功能。

启用和禁用自动卸载

自动卸载功能可通过对支持函数的简单调用或设置环境变量来启用。无需编译器编译指示,用户可像往常一样编译和链接代码。

下列文本显示了如何在 FORTRAN C 代码中启用 AO

rc = mkl_mic_enable( )

或者也可使用环境变量来启用。

MKL_MIC_ENABLE=1

一旦启用 AO,英特尔 MKL 可能会自动将计算任务卸载至一个或多个英特尔至强融核协处理器。

在英特尔 MKL 运行时决定卸载多少任务方面,计算任务的卸载对用户是完全透明的。根据问题的大小以及协处理器当前的状态,函数库可以选择在协处理器上运行所有计算任务、部分任务或不在协处理器上运行计算任务。同样,函数库可以决定使用所有可用协处理器或只使用一个协处理器。面向希望控制问题卸载比例的用户,英特尔 MKL提供了相应机制,以对如何在主机和协处理器之间分配任务进行调整。参见下方的如何控制任务分配部分了解更多信息。

同时,卸载在这一方面也是透明的,即当不存在协处理器时,相同的可执行文件仍然有效。它只是像往常一样在主机上运行所有计算任务,丝毫不影响性能。

要禁用自动卸载,只需调用支持函数 mkl_mic_disable()。通过调用 mkl_mic_enable() 可重新启动自动卸载。

控制任务分配

借助英特尔 MKL 提供的支持函数,用户可覆盖英特尔 MKL 运行时决定的默认任务分配,并查询当前任务分配设置和可用协处理器的数量。请参阅参考手册,详细了解有关每个支持函数的信息。下表给出了几个示例来说明如何设置和管理主机与协处理器之间的任务分配。

示例

注释

mkl_mic_set_workdivision ( MKL_TARGET_MIC, -1, MKL_MIC_AUTO_WORKDIVISION)

让运行时决定将多少任务卸载到所有卡上。运行时系统决定使用哪些卡。

mkl_mic_set_workdivision ( MKL_TARGET_MIC, -1, 0.5)

50% 的计算任务卸载到所有卡上。运行时系统决定使用哪些卡。

mkl_mic_set_workdivision ( MKL_TARGET_MIC, 0, 0.5)

只将 50% 的计算任务卸载到第一个卡上。

mkl_mic_set_workdivision ( MKL_TARGET_HOST, 0, 0.5)

在主机上保留 50 的计算任务将其余的 50 卸载到所有卡上。(在这种情况下,忽略第二个参数)

mkl_mic_get_workdivision ( MKL_TARGET_MIC, 0, &wd)

查询为第一个卡指定了多少计算任务。

mkl_mic_get_device_count ( )

了解系统上有多少卡可用。

任务分配也可通过使用环境变量来控制。请参见下表中的示例。请注意支持函数总是优先于环境变量。 

示例

注释

MKL_MIC_WORKDIVISION=MIC_AUTO_WORKDIVISION

让运行时决定将多少任务卸载到所有卡上。运行时系统决定使用哪些卡。

MKL_MIC_WORKDIVISION=50

50% 的计算任务卸载到所有卡上。运行时系统决定使用哪些卡。

MKL_MIC0_WORKDIVISION=50

只将 50% 的计算任务卸载到第一个卡上。

MKL_HOST_WORKDIVISION=50

在主机上保留 50 的计算任务将其余的 50 卸载到所有卡上。

卸载报告

使用自动卸载的提示

这些编码技巧可以帮助用户更好地了解并充分利用 AO

当矩阵大小合适时自动卸载的效果更好。

矩阵大小是 AO 获得出色性能的关键。事实上当矩阵太小行或列小于 20481AO 甚至不会启动。这是因为在这种情况下,数据传输的开销远远大于卸载带来的性能提升。在矩阵足够大的情况下,通常方阵可实现最佳 AO 性能。

在协处理器上预留最大内存量以供自动卸载使用

英特尔 MKL 为每个执行自动卸载计算的进程分配额外内存。为了减少缓冲区初始化和数据传输的开销,用户可以限制自动卸载所使用的协处理器内存。这可通过调用支持函数 mkl_mic_set_max_memory() 或设置环境变量 MKL_MIC_MAX_MEMORY 来实现。比方说,如下所示,设定第一路协处理器的内存最大为 4 GB

rc = mkl_mic_set_max_memory(MKL_TARGET_MIC, 0, 4G)


1 在以后的版本中AO 的阈值可能会有所不同。

可通过调用函数 mkl_mic_free_memory() 来释放特定协处理器上预留的内存。

使用运行时卸载报告来了解自动卸载

因为自动卸载是透明的,默认情况下,用户不知道它是否正在进行以及它是如何进行的。但是,有时候(如调试)了解这些信息也是有帮助的。为此,英特尔 MKL 运行时可在程序运行时生成自动卸载的卸载报告。要查看分析报告,在执行之前需要将环境变量 OFFLOAD_REPORT 设置为 1 2。数值控制报告中的信息等级,数值 2 意味着提供更详细的信息。

OFFLOAD_REPORT 设置完成后,用户可以使用函数 mkl_mic_set_offload_report() 来动态打开/关闭报告。该函数取单整数值。非零值开启报告。然后,采用零值调用关闭报告。

在同一程序中使用自动卸载和编译器辅助卸载

除了自动卸载英特尔 MKL 也支持编译器辅助卸载 (CAO)。也就是说,可以使用英特尔® Fortran 编译器 XE 和英特尔® C/C++ 编译器 XE 提供的编译器编译指示显式指定卸载。CAO 需要编程人员进行更多操作,但同时也更加灵活并支持更多的控制。对于复杂的应用程序而言,可能有必要在一个应用中同时使用 AO CAO。英特尔 MKL 支持这种使用模式。然而,当在同一程序中使用 AO CAO 时,用户需要使用支持函数或环境变量显式指定 AO 函数的任务分配。否则,便默认在主机上运行所有任务,而不进行卸载。

如果卸载失败,无法强制执行

如果卸载运行时找不到协处理器或不能对其正确进行初始化,英特尔 MKL AO 将自动在主机上运行所有计算。这意味着用户无法确定计算在协处理器上进行,还是在主机上进行。用户可通过设置环境变量 MKL_MIC_DISABLE_HOST_FALLBACK 来覆盖此默认行为。

MKL_MIC_DISABLE_HOST_FALLBACK=1

如果卸载失败,设置 MKL_MIC_DISABLE_HOST_FALLBACK 会导致程序退出,并提示错误信息无法启用自动卸载

自动卸载中的线程控制

主机和协处理器上的线程可通过两个 OpenMP 环境变量集分别进行控制。由于 AO 可能会在主机和协处理器上进行计算,通常需要设置二者的环境变量以获得最佳性能。

借助 OpenMP 线程控制,用户在程序执行过程中可灵活设置允许使用的最大线程数量,以及线程关联性。环境变量是:

主机

协处理器

OMP_NUM_THREADS

MIC_OMP_NUM_THREADS

KMP_AFFINITY

MIC_KMP_AFFINITY

协处理器的环境变量的前缀通常是“MIC_”。但是,这个前缀其实是可定制的,用户可通过设置另一环境变量 MIC_ENV_PREFIX 来使用不同的前缀。这些环境变量由主机端的用户进行设置。在 AO 情况下,英特尔 MKL 运行时对其进行分析,并自动将其传递到协处理器环境中。

在协处理器上,其中一个内核总是用于微操作系统 (OS)。数据传输和内务处理等任务也可以在该内核上运行。出于性能方面的考虑,卸载的执行应避免使用运行微操作系统的内核。因此,建议显式设置协处理器的线程关联性(通过 MIC_KMP_AFFINITY)来使用除了运行操作系统的内核以外的所有可用内核。对于在主机上运行的任务比例,建议设置 KMP_AFFINITY 来防止内核之间的线程迁移并避免高速缓存局部性的损失。

为了更好地阐明上述概念,我们来看一个例子。以下环境变量设置示例显示了面向配有 60 核协处理器(每内核 4 线程)和 8 核主机(每内核 1 线程)的系统的线程控制设置:

OMP_NUM_THREADS=8
KMP_AFFINITY=granularity=fine,compact,1,0
MIC_OMP_NUM_THREAD=236
MIC_KMP_AFFINITY=explicit,granularity=fine,proclist=[1-236:1]
MIC_ENV_PREFIX=MIC_

结论

自动卸载是在配有英特尔至强融核协处理器的系统上使用英特尔 MKL 的最简单的方法。它支持用户充分利用主机和协处理器,同时无需任何代码更改。如果存在协处理器,英特尔 MKL 可做出明确的决策(决定哪些操作值得卸载),并在主机和协处理器之间适当地分配任务。同时,该函数库以透明的方式处理数据传输并管理远程执行。如果没有协处理器,则在主机上运行所有任务,同时丝毫不影响性能。

英特尔 MKL 面向希望获得更高自动卸载控制的用户提供服务函数和环境变量来控制主机与协处理器之间的任务分配。

此外,英特尔 MKL 函数也可以在同一应用程序中同时使用自动卸载和编译器辅助卸载。

英特尔 MKL 致力于为英特尔至强融核产品上运行的高度并行应用带来突破性性能。自动卸载功能通过在英特尔至强处理器和英特尔至强融核协处理器上提供一致的编程模型帮助实现了这一目标。英特尔 MKL 用户可以继续使用相同的代码以及熟悉的工具和库,同时享受从多核到许多内核的性能提升。

其它资源

下列文档针对本文讨论的支持函数和环境变量提供了详细介绍。

·         英特尔数学核心库参考手册

·         英特尔数学核心库用户指南

致谢

本文基于英特尔 MKL 架构师兼首席工程师 Greg Henry (greg.henry@intel.com) 的技术演讲。

非常感谢 Shane Story (shane.story@intel.com)Todd Rosenquist (todd.rosenquist@intel.com)Ying Song (ying.song@intel.com)Larry McGlinchy (larry.j.mcglinchy@intel.com) Roger Herrick (roger.i.herrick.jr@intel.com) 对本文的审查。

作者简介

Zhang Zhang (zhang.zhang@intel.com) 是一名为英特尔软件开发工具提供支持的技术咨询工程师其工作重点是支持 ISV 在英特尔架构上使用英特尔数学核心库和其它软件产品。

声明

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

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

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

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

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

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

英特尔、Intel 标识、VtuneCilk 和至强是英特尔公司在美国和其他国家地区的商标。

* 其他的名称和品牌可能是其他所有者的资产。

英特尔公司 © 2012 年版权所有。所有权保留。

注释不同的宣传内容可能需要其它注意事项和免责声明。一般情况下,包括以下几个方面的声明,并且必须添加至文章的声明部分。

一般声明: 适用于英特尔分发或发布的所有材料

基准测试和性能免责声明: 适用于使用基准测试或作出性能声明的英特尔材料。

技术资料免责声明: 适用于描述英特尔产品外观、适用性和功能的英特尔技术材料。

技术声明: 适用于说明技术或程序的优势或功能的英特尔材料。请注意——如果正在讨论的产品(如ACER ULV)有特定技术/特性,您可以在免责声明中删除需求陈述。如果您有多项技术免责声明,您可以将实际性能可能有所差异整合为结果有所不同

Pour de plus amples informations sur les optimisations de compilation, consultez notre Avertissement concernant les optimisations.