借助英特尔® 至强融核™ 协处理器实现卓越的 Black-Scholes 定价计算性能

1. 简介

英特尔在德国汉堡举行的国际超级计算机大会 (ISC'12) 上宣布英特尔® 至强融核将是未来所有基于英特尔® 集成众核架构英特尔® MIC 架构的产品的全新品牌名称。定位于超级计算机的英特尔® 至强融核协处理器将拥有高达 61 个内核,可在执行复杂科学计算的过程中提供极具突破性的能耗和显著的性能提升。

本文对英特尔® 至强融核协处理器进行了简要介绍,并概述了如何利用处理器微体系结构来加快金融服务行业的最热门模型之一 - Black-Scholes 定价模型的计算速度。

1.1 英特尔® 至强融核协处理器扩充了英特尔® 至强® 处理器家族的执行资源

英特尔® 集成众核架构英特尔® MIC 架构 Black Scholes 公式相关的定量金融应用提供了一个理想的执行平台。英特尔 MIC 架构构建于相同的 IA-32/英特尔 64 指令集架构 (ISA) 之上,保留了与英特尔® 至强®处理器相同的编程模式。英特尔 MIC 架构对并行执行基础设施进行了进一步扩展,支持在几乎不修改源代码的情况下,使高度并行化应用的性能远远超过通用图形计算或 GPGPU 设备的性能。最终用户获得的优势包括加快软件开发与部署速度,以及提升软件应用的性能。

1.2 处理器架构

在微处理器架构层面它是一种 SMP 处理器由多达 61 个内核组成这些内核被分成两个单向环。处理器上有 8 个模上内存控制器支持 16 GDDR5 通道预计最高性能可达 5.5 GT/秒。在内核层面,每个协处理器内核都具备完整的功能,并根据其自身权限进行排序,能够独立于其它内核之外运行英特尔® 架构的指令。此外,每个内核还支持硬件超线程技术及四个硬件环境或线程。在任意时钟周期下,每个内核可从任意一个环境最多发出两条指令。

1.1.2 内核与矢量处理器单元

协处理器内核支持全部 16 个通用 64 位处理器以及与 64 位扩展相关的大多数新指令。但是,支持的唯一矢量指令集是英特尔® 初始众核指令(英特尔® IMCI)。尽管协处理器 (x87) 是集成式的并具备完整功能,但是内核中不支持英特尔® MMX™、英特尔® SIMD 流指令扩展(英特尔® SSE)或英特尔® 高级矢量扩展(英特尔® AVX)。

其采用的是经过全新设计的矢量处理单元或 VPU。这是一种 512 SIMD 引擎,能够执行 16 宽单精度或宽双精度浮点 SIMD 操作,并且完整支持全部四种舍入模式(IEEE* 754R)。矢量处理单元内部有一个新型的可扩展数学单元,可加快单精度超越函数的实施速度:倒数、反平方根、以 2 为底的对数、以 2 为底的指数函数(使用查询表)。这些硬件实施函数可实现一个或两个周期的高吞吐量,其它超越函数可从初等函数衍生出来。

1.4 高速缓存架构

英特尔® 至强融核协处理器的一级 (L1) 高速缓存旨在满足每个内核四个硬件环境的更高的工作集要求它具备 32 KB一级指令高速缓存和 32 KB一级数据高速缓存。相关性增加到 8 路,带有 64 字节高速缓存行。Bank(存储区)宽度为 8 字节。数据返回可以是乱序的。访问时间具有三个周期的延迟。

完全重新设计的 512 KB 统一二级 (L2) 高速缓存包括 64 个字节每路 8 路相关性1024 个集、2 个存储区、32GB35 可缓存的地址范围。预计闲置访问时间约为 80 个周期。

二级高速缓存具有一个流动的硬件预取器,它可以选择性地预取代码、读取高速缓存行,并将其 ROF 到二级高速缓存中。它支持 16 个流,最多可提供 4-KB 的数据页面。一旦检测到流方向,预取器便会发出最多 4 个多预取请求。英特尔® 至强融核协处理器中的二级高速缓存现在支持 ECC 功能。一级和二级高速缓存的替换算法基于伪 LRU 实施。

ISA 扩展可提高应用性能降低功耗并增强软件向后兼容性开发人员将可以从中受益。例如,统称为 8087 的浮点 (FP) 运算功能已被定义为一个扩展并添加到 8086 微处理器中。过去用于调用浮点库例程的应用软件现在可以执行 8087 指令。早期扩展(如 x87)着重于添加单数据指令,较新的扩展却开始添加可执行多个数据或单指令流多数据流的指令或 SIMD 指令。

从采用英特尔® MMX™ 技术的第二代英特尔® 奔腾® 处理器家族开始,英特尔就在 IA-32 和英特尔 64 架构中引入了 6 个扩展程序来执行 SIMD 运算。这些扩展程序包含 MMX 技术和英特尔 SIMD 流指令扩展,后者包括英特尔 SSE、英特尔 SSE2、英特尔 SSE3、追加英特尔 SSE3 和英特尔 SSE4。这些扩展提供了一组在封包整数和/或封包浮点数据元中执行 SIMD 运算的指令。

2. 在英特尔® 至强融核协处理器上实施 Black-Scholes 公式

2.1 Black-Scholes Black-Scholes 公式

在金融领域衍生品是一种金融工具其价值取决于其它基础变量的价值。通常,标的衍生品的变量是交易资产的价格。例如,作为一种衍生品,股票期权的价值取决于股票价格本身。并非所有衍生品变量都依赖于交易资产。某些变量可能是一个特定度假村的降雪,一个特定时间间隔内的平均温度等。

期权是一种衍生品它规定了双方以一个参考价格就一种资产所达成的未来交易合约称作行使价。期权的买方获得行使该交易的权利(而不是义务),而卖方则承担履行交易的相应义务。期权有两种类型:看涨期权给合约持有者(即买方)按照约定的价格在约定日期前购买标的资产的权利。看跌期权给合约持有者(即买方)按照约定的价格在约定日期前卖出标的资产的权利。合约中的价格被称为行使价格。合约中的日期被称为到期日。欧式期权仅能在到期日当天行使。美式期权可在到期日或之前的任一交易日行使。

Black Scholes 模型是现代定量金融理论中最重要的概念之一。该模型由 Fisher Black费舍尔·布莱克)、Robert Merton(罗伯特·默顿)和 Myron Scholes(迈伦·斯克尔斯)于 1973 年提出,至今仍广为采用,被视作为金融衍生品确定合理价格的最佳方式之一。

Robert Merton 是为 Black-Scholes 方程、欧式看涨期权 c 和欧式看跌期权 c 提供闭环式解决方案的第一人获得了一款名为 Black-Scholes-Merton 公式的解决方案。

其中

cnd(x) 函数是累计正态分布函数。它用于计算一个带标准正态分布函数的变量其中 (0, 1) 小于  x. cnd(x) 通过一个多项式函数见下进行预估的可能性

其中

2.2 Black-Scholes 公式的实施

Black-Scholes 公式几乎广泛应用于定量金融学的每一个方面。

Black-Scholes 计算基本上已经渗透到交易员和分析师使用的每个定量金融学代码库中。

Black-Scholes 计算已成为全球金融服务行业领域所有计算机架构的标志。在本文中,我们将讨论如何在英特尔® 至强融核协处理器上进行 Black-Scholes 计算。

我们来看一个假设情况一家公司需要计算数百万种金融工具的欧式期权。每种工具都具有当前价格、行使价格和期权到期时间。对于每一组的这些数据,它都会进行几千次 Black-Scholes 计算,这很像计算临近股票价格和行使价格的期权以及不同期权的到期时间。

[me@host BlackScholes]$ g++ -o BlackScholesStep0 -O2 BlackScholesStep0.cpp
[me@host BlackScholes]$ ./BlackScholesStep0
Black-Scholes
定价公式在 263.918349 秒内对 10.24 亿期权进行了定价。
程序以每秒 0.0466 亿期权的速度进行计算。

3. 优化 Black-Scholes 实施

直接实施 Black-Scholes 公式不能保证高性能。如果使用 GNU* 编译器套装 4.4.6 版本和 -O2 优化交换机甚至在配有一个 2.6 GHz 英特尔® 至强® 处理器 E5-2670 的系统上 115.2 万期权定价需耗时 234.88 秒。2吞吐率仅为每秒 589 万期权。

在本章节中我们将提升 Black-Scholes的实施性能以实现最短的耗时和最高的吞吐量。

3.1 分步式优化框架

在此章节中我们重点介绍以系统化方式进行应用性能优化的优化框架。该框架将一个应用分为 5 个优化阶段。每个阶段都通过使用一种技术,力争在一个方向上提高应用性能。按照这种方法,一款应用便可以在英特尔® 至强融核协处理器家族产品上实现最高性能。

3.2 第一阶段利用优化工具和库

重复投入资源如果一个问题已被其他人解决那么最佳策略是充分利用现有工作将您的精力用在尚未得到解决的问题上。

Black-Scholes 实施中我们真的应该问一下我们是否有更好的编译器和 C/C++ 运行时库。这个问题引出了英特尔® Composer XE 2013。尽管 GCC* 可能定位于通用应用开发,但英特尔Composer XE 2013 却专门针对高性能应用开发。如果您的目标执行环境基于一种最近发布的英特尔微处理器产品,并且您允许编译器根据关联和分布等原则执行数学转换,那么您一定要使用英特尔® 编译器。通过将 g++ 替换为 icpc,即同一英特尔® Parallel Studio 编译程序开关中的类似 g++ 工具,该程序现在的运行时间为 46 秒,在不更改任何代码的情况下快速轻松地实现了 4 倍的性能提升。

[sli@cthor-knc2 bs_distributed]$ icpc -o BlackScholes -O2 -inline-level=0 BlackScholesStep0.cpp
[sli@cthor-knc2 bs_distributed]$ ./BlackScholes
Black-Scholes
定价公式在 63.698990 秒内对 10.24 亿期权进行了定价。
程序以每秒 0.1929 亿期权的速度进行计算。

英特尔® Composer XE 2013 中还包含英特尔对 C/C++ 运行时库的增强功能。常用的超越函数之一误差函数 erf() 是英特尔 Composer 的运行时库 libm 的一部分,但 GCC 库中没有这个函数。由于我们已经决定使用英特尔 Composer XE 2013,我们便可以进一步探讨 libm 误差函数(由英特尔提供)之间的内在联系,以及 Black-Scholes 公式中的累积正态分布函数。

const float          HALF = 0.5;
float CND(float d)
{
    return HALF + HALF*erf(M_SQRT1_2*d);
}

当我们充分利用这两个函数之间的内在联系时我们可以再实现 17% 的性能提升。

[sli@cthor-knc2 bs_distributed]$ icpc -o BlackScholes -O2 -inline-level=0 BlackScholesStep1.cpp
[sli@cthor-knc2 bs_distributed]$ ./BlackScholes
Black-Scholes
定价公式在 54.376429 秒内对 10.24 亿期权进行了定价。
程序以每秒 0.2260 亿期权的速度进行计算。4

总之最大限度地利用现有的较高性能解决方案以便您可以专注于自己应用中的问题。如果做法正确,我们可以将 Black-Scholes 公式的效用提高 5.75 倍。5

3.3 第二阶段:标量和串行优化

由于您已经用尽了可供使用的优化解决方案,但您的应用仍然达不到性能要求,因此您必须找到应用源代码并启动优化流程。在开展积极的并行编程工作之前,您需要确保您的应用在进行向量化和并行化处理之前可提供正确的结果。同样重要的是,您需要确保应用能够以最少的运算得到正确的结果。通常您要考虑数据和算法相关的问题,如:

·         选择合适的浮点精度

·         选择合适的估算法准确度:多项式与有理数

·         避免跳跃算法

·         利用迭代计算缩短循环运算长度

·         避免或最大程度减少算法中的条件分支

·         避免重复计算,使用之前的结果。

您还必须处理语言相关的性能问题。由于我们使用的是 C/C++因此下面是 C/C++ 相关问题的列表

·         对所有常量使用外显式型态法 (explicit typing)以避免自动升级

·         选择正确的 C 运行时函数类型exp() expf()abs() fabs()

·         以显性方式将点别名告知编译器

·         显式调用内联函数,以避免开销

C 语言数值分析方法库中的数百个例程相同Black-Scholes 公式也是在 float 中编写的。32 位浮点的动态范围对于多数定量金融学应用已经足够了。输入数据、输出数据和算法均使用 32 位。任何从 32 位向 64 位的意外升级都可能会导致性能损失和零精确度增益。所有常量的库函数调用在 float 中都应该是显式类型化的。

数学家喜欢完美对称。有时他们的公式可以反映这种偏好。然而当在 verbose 中实施其公式时,这种倾向可能会导致性能损失。看涨期权和看跌期权的计算就属于这种情况。

c = Scnd(d1) - Ke-rTcnd(d2)
p = Ke-rTcnd(-d2)- Scnd(-d1)

Merton 的公式非常对称不过一旦您在看涨期权上花费一定的周期即使 Merton Formula 建议也无需在看跌期权上花费同等长度的周期。原因在于看涨和看跌期权符合买卖权平价关系。

p – c = Ke-rT- S

在数学上,买卖权平价关系还可以从以下事实中推导得出:

cnd(-d2) = 1 - cnd(d2 )

总之一旦您获得了看涨期权只需进行两次加法便可获得看跌期权。
以下是修改后的代码,接着是命令行

[sli@cthor-knc2 bs_distributed]$ icpc -o BlackScholes -O2 -inline-level=0 BlackScholesStep2.cpp
[sli@cthor-knc2 bs_distributed]$ ./BlackScholes
Black-Scholes
定价公式在 45.104644 秒内对 10.24 亿期权进行了定价。
程序以每秒 0.2724 亿期权的速度进行计算。6

总结一下通过在未引入矢量化或并行化的情况下使用 –O2 进行编译我们额外获得了 20% 的性能是相同硬件上 GCC 性能的 5.85 倍。7

3.4 第三阶段:矢量化

优化的标量代码为矢量化奠定了坚实的基础。在本章节,我们会将矢量化引入到 Black-Scholes 源代码中。矢量化对不同的人有不同的含义。但在这种情况下,我们是在处理器级别利用 SIMD 寄存器和 SIMD 指令。您可以使用多种不同的方式将矢量化引入到您的程序中,从使用处理器固有函数到使用英特尔® Cilk™ Plus Array Notation。在编程人员对于生成代码的控制数量、语法表达以及串行程序所需的变化数量方面,这些基于编译器的矢量化技巧各有不同。

在我们使用编译器对串行代码进行矢量化处理以及生成 SIMD 指令之前编程人员必须确保内存对齐正确无误。没有对齐的内存访问会导致高速缓存行隔离、对象代码重复,这都会影响系统性能,严重的时候还会产生处理器故障。确保内存对齐的一种方法是,始终请求并使用严格对齐的内存。在英特尔 Composer XE 2013 的帮助下,用户可以通过添加内存定义前缀 __attribute__(align(32)) 来请求静态分配的内存。对于 YMMx 寄存器来说,32 字节界限是最低的对齐要求。此外,您还可以使用 _mm_malloc _mm_free 来请求和提供动态分配的内存。

        CallResult = (float *)_mm_malloc(mem_size, 64);
        PutResult  = (float *)_mm_malloc(mem_size, 64);
        StockPrice    = (float *)_mm_malloc(mem_size, 64);
        OptionStrike  = (float *)_mm_malloc(mem_size, 64);
        OptionYears   = (float *)_mm_malloc(mem_size, 64);
...

        _mm_free(CallResult);
        _mm_free(PutResult);
        _mm_free(StockPrice);
        _mm_free(OptionStrike);
        _mm_free(OptionYears);

处理完内存对齐后我们将为 Black-Scholes 实施选择一种矢量化方法。为了最大限度减少工作量并保持可移植性,我们对 SIMD 并行化采用了用户启动的半自动矢量化方法。用户使用 #pragma#pragma SIMD 将某个循环需要矢量化的消息告知编译器。这一行为与之前的模式不同。在之前的模式中,用户只需在 #pragma IVDEP 中提供建议,然后编译器就会对成本模型进行详细检查,以确定矢量化代码的执行速度是否比串行代码快。当编译器认为其速度可以超过串行代码时,矢量化代码将生成。在这种模式下,编程人员需要确保矢量化成本不会超过任何加速增益。

[sli@cthor-knc2 bs_distributed]$ icpc -o BlackScholes -O2 -xAVX -fimf-precision=low -fimf-domain-exclusion=15 -vec-report1 BlackScholesStep3.cpp
BlackScholesStep3.cpp(136):
(col. 2) remark: SIMD LOOP WAS VECTORIZED.
BlackScholesStep3.cpp(88): (col. 2) remark: SIMD LOOP WAS VECTORIZED.
Black-Scholes
定价公式在 6.395131 秒内对 10.24 亿期权进行了定价。
程序以每秒 1.9215 亿期权的速度进行计算。

矢量化代码可以充分利用现代微处理器中的 SIMD 指令并在不增加频率或内核数的前提下提供出色的应用性能。在本例中,矢量化实现了 7.05 倍的性能提升(最高 8 倍)。 9

3.5 第四阶段:并行化

在过去 10 年中,微处理器包中的 CPU 内核数一直在增加。到目前为止,我们的矢量化 Black-Scholes 公式充分利用了一个处理器内核。为了充分利用其它内核,我们需要向代码中引入多线程。我们希望使所有内核同时工作,并且每个内核完成的工作量都与矢量化 Black-Scholes 公式所用内核的工作量相同。

与矢量化相同,多线程也为编程人员提供了多种线程选择。每种选择在显式编程人员控制、可组合性和代码可维护性方面有所不同。

我们的 Black-Scholes 公式有两个循环。内循环已经实现了矢量化。实现多线程的最简单的方法是让每个线程在不同的数据上运行整个外循环。考虑到各个方面,OpenMP 似乎是显而易见的选择。

#pragma omp parall 创建或分解线程。每条线程都在自己的数据子集上运行自己的外部循环。#pragma omp 用于将线程绑定到内部循环上。

[sli@cthor-knc2 bs_distributed]$ icpc -o BlackScholes -O2 -openmp -xAVX -fimf-precision=low -fimf-domain-exclusion=15 -vec-report1 BlackScholesStep4.cpp
BlackScholesStep4.cpp(118):
(col. 2) remark: SIMD LOOP WAS VECTORIZED.
BlackScholesStep4.cpp(118): (col. 2) remark: loop was not vectorized: nonstandard loop is not a vectorization candidate.
BlackScholesStep4.cpp(70): (col. 2) remark: SIMD LOOP WAS VECTORIZED.
BlackScholesStep4.cpp(67): (col. 2) remark: loop was not vectorized: nonstandard loop is not a vectorization candidate.
[sli@cthor-knc2 bs_distributed]$ ./BlackScholes
Black-Scholes
定价公式在 0.333349 秒内对 10.24 亿期权进行了定价。
程序以每秒 36.8623 亿期权的速度进行计算。

运行此程序可提供比矢量化标量实施高 19.18 倍的性能11。尽管系统有 16 个内核并且 OpenMP 线程创建会产生一些费用,但性能提升幅度仍然显著。

请注意,这种 Black-Scholes 公式的矢量化并行实施方法可以在任意线程数目的系统上运行。对于 DATASIZE/NumOfThreads 的输入数组大小,每条线程只运行迭代的重复次数。每条线程的迭代次数可能不是乘数宽度。所以编译器将生成两个循环体版本,一个面向矢量化循环,一个面向小于 SIMD 长度的数据。因此,矢量化并行程序的目标代码可能比矢量化串行代码大。

3.6 第五阶段:从多核扩展为众核

我们在第四阶段末尾获得的矢量化并行代码可以由面向英特尔® 至强融核协处理器的英特尔® Composer XE 2013 进行编译,因为没有进一步的源代码修改。在编译器调用行上,您只需添加 –mmic,其它一切都是一样的。您可以将可执行文件移到协处理器中,它会立即运行。

由于 Black-Scholes 定价公式已经移植到协处理器中,因此您可以将全部的时间和精力都放在优化上。

我们可以通过扩展的数学单元或 EMU 来实现更高性能。协处理器的 EMU 是一项从头设计的全新技术,用于支持快速的单精度超越函数调用、倒数函数、平方根倒数函数、指数函数和对数函数,至少 3 个版本的 Black-Scholes 定价公式可以从中潜在受益。使用 EMU 实施的超越函数可实现 50-80% 的性能提升。12 但协处理器 EMU 支持以 2 为底数的指数和对数函数,而 Black-Scholes 定价公式需要自然对数底。这意味着您或编译器不能直接使用 EMU 超越函数。

若要解决这个问题,我们必须更改源代码。我们的方法是在调用以 2 为底数的函数之前调整参数,或对调用以 2 为底数的函数的结果进行调整,以便结果相同。

假设我们想要通过调用 exp2(x) 2y 来计算 exp(x) ex。结果必须相等。我们得到 ex = 2y。在等式两边取以 2 为底数的对数值,得到 log2 exx = log2 2y,这样便可获得 x*log2E= log2 2y y = x*log2Elog2E 是一个常量,在 <math.h> 中被定义为 M_LOG2E。我们得到了 exp(x) = exp2(x*M_LOG2E)。同样,通过更改基础运算,我们可以得到 ln(x) = log2(x)/log2E = log2(x)/M_LOG2E。这意味着,它可以在调用函数之前,通过调整参数来调用以 2 为底数的指数函数,我们可以在调用函数之后,通过调整结果来调用以 2 为底数的对数函数,而非自然对数底。

现在我们在使用 exp2(x) log2(x) 计算其他任何底数方面已经没有任何数学问题,那么在确实需要 exp(x) log(x) 时,使用它们就一定合理吗?答案是否定的。原因是 exp(x) exp2(x) 之间的速度差对另一个完整的乘法运算不够大。在某种程度上,我们可以将 exp(x) 视为一个完整 exp2(x) 和乘法运算的优化。

exp(x) 的参数必须乘以一个常量时,我们可以对该常量进行调整,以便在调用 exp2(x) 时没有额外的倍数。同样的规则也适用于 log(x)当函数结果后的调整看起来不受约束时,替换才有意义。这种优化很有意义,尤其是当 exp(x) 调用在一个循环内进行时。对常量的调整可以在进入循环之前进行。

一般来说,当您试图计算以 a 为底的指数 ax 时,始终将其转换为以 2 为底的等值,而不是自然对数底等值。您需要记住数学等价关系expa(x) = ax = 2x*log2a.同样, loga(x) = log2(x)/log2a = log2(x) * loga2

以下是英特尔® 至强融核协处理器修改后的代码

3.6.1 构建本地的英特尔® 至强融核应用

除了 –mmic 以外我们还想要让编译器知道我们将使用英特尔至强融核协处理器中每个内核的全部 4 条线程。我们还希望编译器可以通过内联超越函数调用来避免函数调用开销。

icpc -o BlackScholes.mic -O3 -openmp -mmic -fimf-precision=low -fimf-domain-exclusion=15 -mGLOB_default_function_attrs=use_fast_math=on -mCG_lrb_num_threads=4 -vec-report6 -no-prec-div -no-prec-sqrt -mP2OPT_hlo_report -O3 BlackScholesStep5.cpp

3.6.2 在英特尔® 至强融核协处理器上运行本地 Black-Scholes 定价程序

[root@cthor-knc2-mic0 /tmp]# export LD_LIBRARY_PATH=.
[root@cthor-knc2-mic0 /tmp]# export OMP_NUM_THREADS=240
[root@cthor-knc2-mic0 /tmp]# export KMP_AFFINITY="granularity=fine,proclist=[1-240:1],explicit"
[root@cthor-knc2-mic0 /tmp]# ./BlackScholes.mic
lack-Scholes
定价公式在 20.014538 秒内对 2457.6 亿期权进行了定价。
程序以每秒 122.7907 亿期权的速度进行计算。

4. 结论

在文本中我们简要介绍了英特尔® 至强融核协处理器及其指令集架构与科学领域程序员的关系。我们还介绍了最流行的定量金融学应用 Black-Scholes 定价模型的实施方案。我们实施 Black-Scholes 公式的目的是为了分步式应用优化框架。借助该优化框架Black-Scholes 计算程序使用英特尔® Composer XE 2013 组合实现了令人难以置信的 791 倍的性能提升。借助相同的程序和工具,英特尔® 至强融核协处理器在完全并行化的至强程序上又实现了 3.33 倍的性能提升。下图将使用每款工具的加速性能与 GCC 的原始基准性能进行了对比。

这项优化工作的核心是一个分步式优化框架事实证明该框架不仅适用于金融数字应用而且对于一般科学计算来说也同样有效。借助即将发布的英特尔® Composer XE 2013,科学领域的编程人员能够更容易地将性能优化用作一种结构化的活动,同时快速了解程序的局限性,并尽可能地实现各个层面上的并行化。

其它资源

·         面向 Linux* 的英特尔® Composer XE 2013包括英特尔® MIC 架构**

·         英特尔® C++ 编译器 XE 12.0 用户和参考指南**

作者简介

Shuo Li 就职于英特尔公司软件与服务事业部。他在软件开发领域拥有 24 年的丰富经验。其关注的重点包括并行编程、计算金融和应用性能优化。作为软件性能工程师,Shuo 最近与金融服务业的软件开发人员与建模人员密切合作,帮助其在英特尔平台上实现了最佳的性能。Shuo 拥有俄勒冈大学计算科学专业硕士学位以及杜克大学 MBA 学位。

声明

“英特尔、至强、XeonCilkIntel Xeon Phi 和英特尔至强融核是英特尔公司在美国和其他国家(地区)的商标。”
* 其他的名称和品牌可能是其他所有者的资产。

性能声明

在性能检测过程中涉及的软件及其性能只有在英特尔微处理器的架构下方能得到优化。诸如SYSmark和MobileMark等测试均系基于特定计算机系统、硬件、软件、操作系统及功能,上述任何要素的变动都有可能导致测试结果的变化。请参考其他信息及性能测试(包括结合其他产品使用时的运行性能)以对目标产品进行全面评估。

1, 2 配置:双插槽服务系统,配有两个 2.6 GHz 英特尔® 至强处理器 E5-2670 32GB8 4GB DDR3-1600MHzGCC 版本 4.4.6

3,4,5,6,7,8,9,10,11 配置:双插槽服务系统,配有两个 2.6 GHz 英特尔® 至强处理器 E5-2670 32GB8 4GB DDR3-1600MHz。英特尔 Composer XE 2011 SP2

12,13 配置:双插槽服务系统,配有两个 2.6 GHz 英特尔® 至强处理器 E5-2670 32GB8 4GB DDR3-1600MHz。带预发布版本的英特尔® 至强融核协处理器:61 个内核(主频为 MHz)。英特尔 Composer XE 2013 Release

文本中的示例源代码依据英特尔示例源代码许可协议进行发布。

英特尔示例源代码许可协议

与本许可协议(下称“示例代码”)相链接的示例代码需遵守以下所有条款和条件:1. 英特尔公司下称英特尔”)授予您非独占且不可转让的版权许可证仅允许您制作内部使用所必需的最少数量的示例代码副本并准许您对以源代码可读形式提供的示例代码进行修改。

2. 您不得反汇编、反编译或以其它方式对仅以二进制格式提供的任何软件执行反向工程。

3. 您不得以任何形式将任何部分的示例代码透露给任何第三方。

4. 示例代码及所有副本的所有权仍属英特尔或其供应商所有。示例代码属于版权资料,受美国版权法与国际公约条款的保护。您不得从示例代码中删去任何版权声明。您同意阻止任何未经授权复制本示例代码的行为。除本协议明确规定之外,英特尔未授予您有关英特尔专利、版权、商标或商业机密信息的任何明示或暗示的权利。在遵循英特尔对本示例代码所有权的情况下,与修改本示例代码相关的所有权利、所有权和利益均归您所有。

5. 本示例代码以“概不保证”的方式提供,不提供任何形式的担保。英特尔不做任何明确或隐含的担保,包括对适销性、不侵犯第三方知识产权,或适用于特定用途的担保。对于因使用或无法使用本示例代码导致的任何损害(包括但不仅限于商业利润损失、业务中断、业务信息丢失或任何其它损失),英特尔或其供应商概不承担任何责任,即使事先英特尔已被告知有发生此类损害的可能。由于某些法律机构不允许免除或限制对因果或偶然损失的责任,因此上述限制能对您不适用。

6. 这些示例代码的设计目的、针对用途或授权用途不包括示例代码发生故障时可能会引起人身伤亡事故的领域(例如,医疗、生命维持或救生系统)。如果您出于任何这些非针对或未授权用途使用本示例代码,则对于同此类非针对或未授权用途有关的产品责任、人身伤亡的直接或间接索赔(即使此类索赔声称英特尔在部件设计或制造方面存在过失)引起的索赔、开支、损害、费用及合理的律师费,您必须保障英特尔及其职员、分支机构及附属机构免受起诉并确保其不受损失。

7. 您同意,您依据本协议传送/发布到英特尔网站或提供给英特尔的任何材料、信息或其他通信内容被视为非机密且非专有的信息(通信内容)。英特尔对这些通信内容不承担任何责任。您同意英特尔及其指定人员可以出于任何及所有商业或非商业目的,自由复制、修改、再创作、公开展示、披露、分发、通过多层分发和被许可方进行许可和再许可、合并以及其他方式使用这些通信内容以及所有数据、图像、声音、文本和嵌于其中的其他内容(包括衍生品)。禁止将任何非法的、威胁性的、诽谤的、破坏名誉的、淫秽的、色情的或其他违反任何法律的材料发布/传送至英特尔网站或提供给英特尔。如果您希望将您的机密信息交给英特尔,则需要与英特尔签订一份有关接收此类机密信息的保密协议(“NDA”),请与您的英特尔代表联系,以确保双方签订了适当的保密协议。

8. 本协议的条款自您接受本协议之日起生效,至协议终止时失效。您可以随时终止本协议。如果您违反了本协议中的条款,英特尔可能随时以书面形式终止本协议。一旦协议终止,您必须立即销毁示例代码以及您制作的所有副本。

9. 美国政府的受限权利:本示例代码以“有限权利”的方式提供。政府使用、复制或披露这些软件必须遵守 FAR52.227-14、DFAR252.227-7013 及其后续文件中的限制性规定。政府使用本材料即表示承认英特尔在其中享有的权利。

10. 适用法律:本协议引起或附带引起的任何索赔均受特拉华州的州内实体法或位于特拉华州的联邦法院管辖,而不考虑冲突法的原则。出口本示例代码不得违反适用的出口法律。

有关编译器优化的更完整信息,请参阅优化通知