面向英特尔® 至强® 处理器和英特尔® 至强融核™ 协处理器等多核和众核产品的编程

面向英特尔® 至强® 处理器和英特尔® 至强融核协处理器等多核和众核产品的编程(包括卸载至英特尔® 至强融核协处理器的语言扩展)


摘要

如今用于多核处理器的编程模式也可用于众核协处理器。因此,说明并行编程选项是说明如何对英特尔至强处理器和英特尔至强融核协处理器进行编程的最好方式。本文为了解如何通过一种抽象、直观且有效的统一编程方法实现多核处理器和众核协处理器的最佳编程奠定了基础。这种方法非常简单自然,因为它能够轻松满足如今应用的需求并带来出色的成果。与英特尔® 众核处理器和英特尔® 多核协处理器所利用的通用英特尔® 架构指令库结合使用时,它能够比其他不太直观的方法更轻松地实现高度并行计算性能。

利用多核处理器和众核协处理器的程序可提供多种选项来满足各种需求。这些选项可充分利用目前广泛采用的解决方案,如 CC++FortranOpenMP*MPI 和英特尔® 线程构建模块(英特尔® TBB),并且正在快速推动 OpenCL* 等其他新兴标准以及英特尔® Cilk™ Plus 等全新开放模型的发展。

简介

在世界上的所有处理器中,单核处理器是少数正在萎缩的处理器产品。拥有并行计算能力的多核处理器已经永远取代了单核处理器。计算的未来是并行计算,编程的未来是并行编程。

利用多核处理器的方法近年来不断演变,为编程人员提供了更多更好的选择。英特尔 TBB 的快速普及或行业对 OpenCL 的兴趣和支持就是最好的例证。

随着多核处理器和编程方法变得越来越普遍,英特尔正在引入既能迎合这一演变、又能不影响英特尔架构优势的众核处理器。众核处理器的其它全新功能以一种自然、直观的方式提供,且众核处理器可使用与英特尔多核处理器相同的工具、编程语言、编程模式、执行模式、内存模式和行为。

文本讲解了适用于多核处理器和众核处理器的编程方法,其中着重介绍了广泛采用的解决方案和新兴标准。

如今的并行编程

由于在多核处理器和众核协处理器中使用英特尔架构是直观且常见的编程方法,因此先了解一下多核处理器并行编程的现状和未来发展方向是非常重要的。由于采用通用的英特尔架构,因而可以为众核处理器并行编程定义准确的基础。

函数库

函数库提供了一种需要在开始编程前予以考虑的重要的抽象并行编程方法。针对 BLAS、视频或音频编码器和解码器、快速傅立叶转换 (FFT)、解算器和分类器等算法的函数库实现是重要的考虑因素。英特尔® 数学核心函数库(英特尔® MKL)等函数库已提供了许多算法的高级实现,这些算法经过高度优化,可利用英特尔® SIMD 流指令扩展(英特尔® SSE)、英特尔® 高级矢量扩展指令集(英特尔® AVX)、多核处理器和众核协处理器。通过在英特尔 MKL(支持面向 Linear Algebra PACKage (LAPACK) Fortran 语言和 C 语言行业标准接口)的一个例程中添加单次调用,程序便可以开始获得这些优势。行业标准加上英特尔对高性能的追求使得函数库成为并行编程的首选和必然之选。

当函数库无法满足特定编程需求时,开发人员将采用多年来一直使用的编程语言。

在最常用的编程语言中,没有任何一种语言是专为并行编程而设计的。这会产生许多针对新编程语言的建议以及针对已有语言的扩展。最终,这些经验将演变为许多广泛部署的解决方案,支持开发人员使用 CC++ Fortran 语言进行并行编程。

使用最广泛的抽象并行编程方法是 OpenMP主要使用 C Fortran、英特尔线程构建模块主要使用 C++ MPICC++ Fortran。这些方法支持各种处理器和操作系统,是真正通用且可靠的编程选择。

此外,编程人员可以直接使用操作系统的本地线程方法。这些接口(包括 POSIX 线程 (pthreads) Windows* 线程)提供了一个用于全面控制的低级别接口,但不具备高级别抽象编程的优势。这些接口基本上都是针对并行计算的汇编语言程序设计。编程人员基本上已经完全过渡到更高的抽象级别并放弃了汇编语言程序设计。同样,避免直接使用线程模型一直是一种强劲趋势,多核处理器的推出加速了这一趋势的发展。这种面向“任务”而非“线程”中程序的转变是编程习惯方面一个重要的根本性变化,抽象编程模式可以很好地支持这一变化。

如今部署的大部分并行编程都是利用三种最常见的抽象并行编程方法(OpenMPMPI 或英特尔 TBB)之一或操作系统的原始线程接口来进行的。

这些标准在不断演变,新方法也在不断提出。现在,这些演变的主要技术驱动因素是数据高度并行的硬件和不断发展的编译器技术。这两个驱动因素都是由于强烈希望提高编程抽象级别以提高编程人员工作效率,从而加快实现投资回报并降低开发和维护成本而导致的。

最适合组合的并行编程模式

更多信息请访问http://Intel.com/go/parallel

出于本文之前已解释过的原因,最适合组合的并行编程方法是英特尔 TBB 和英特尔® Cilk™ Plus。这两种方法在实现有效抽象编程方面拥有一致的优势,可带来高性能并保护编程投资。它们为有效的并行程序提供了可进行选择和组装的重组组件。虽然这两种方法可以单独进行描述和研究,但最好将它们视为一组功能集合,即可轻松地单独使用,也可轻松地结合使用。这是极其重要的,因为它提供了用于混合模块(包括函数库)的可组合性。这两种方法都具有自组合性,而线程和 OpenMP 则不具备这种能力。OpenMP OpenCL 虽然存在可组合性方面的限制,但仍比使用原始线程更可取。英特尔架构多核处理器和众核协处理器的优势之一就是可以为所有这些方法提供强大的支持,从而提供最符合您当前和未来编程需求的解决方案。

OpenMP

{0>Learn more at http://openmp.org/wp/<}0{>更多信息请访问 http://openmp.org/wp/?<0}

1996 年提出 OpenMP 标准时,它是用于支持编译器协助利用并行硬件的。在十多年以后的今天,面向 CC++ Fortran 语言的每个主要编译器都支持 OpenMP 标准。OpenMP 特别适合用于满足 Fortran 程序和用 C 语言编写的科学计算程序的需求。英特尔是 OpenMP 工作组的成员,同时也是实施 OpenMP 与支持工具的领先厂商。OpenMP 既适用于多核编程,也适用于众核编程。

OpenMP 点积示例(Fortran 语言):

 

1 !$omp do
2    do j = 1, n
3       adotb = adotb + a(j) * b(j)
4     end do
5 !$omp end do

OpenMP 求和(约简)示例(C 语言):

 

1 #pragma omp parallel for reduction(+: s)
2   
3 for (int i = 0; i < n; i++)
4    s += x[i];

未来,OpenMP 规范将进行扩展,以规范面向附加计算(通常称为“卸载”或“加速”)的新兴控件。如今,英特尔提供了面向 OpenMP 的非标准扩展,称为“面向卸载的语言扩展”(LEO)。目前,OpenMP 委员会正在审核 LEO 以及一组面向 GPU 的非 OpenMP 卸载指令(称为 OpenACC),并同时着眼于融合,以满足英特尔至强融核协处理器和 GPU 的需求。

英特尔 TBB

更多信息请访问 http://threadingbuildingblocks.org/

英特尔在 2006 年引入了英特尔® TBB,并于 2007 年启动了英特尔 TBB 开源项目。到 2009 年,按使用的开发人员数量计算,英特尔 TBB 的受欢迎程度已经超过了 OpenMP(依照 Evans Data Corp 所提供的研究结果:http://www.evansdata.com/research/market_alerts.php,以及后续研究报告方面的支持)英特尔 TBB 特别适合用于满足 C++ 编程人员的需求,而 OpenMP 旨在满足 C Fortran 开发人员的需求,因此英特尔 TBB OpenMP 之间几乎没什么好竞争的。值得注意的是,C++ 编程人员而言可以在同一个程序中使用 OpenMP 和英特尔 TBB

并行函数调用示例(C++ 语言,使用英特尔 TBB):

 

1 parallel_for (0, n,
2   
3    [=](int i) {
4    Foo(a[i]);
5 });

英特尔 TBB 不直接需要也不利用编译器技术,它强调了编程对于任务的价值,并为广泛认可任务窃取系统的使用引领了道路。编译器技术在不断演变,以帮助应对并行编程需求并创建英特尔 Cilk™ Plus 项目。扩大编译器技术的使用能够更好地释放并行计算的全部潜力。英特尔仍然是英特尔 TBB 开源项目的主要参与者和贡献者以及英特尔 TBB 支持服务和支持工具的领先提供商。英特尔 TBB 适用于多核和众核编程。

MPI

更多信息请访问 http://Intel.com/go/mpi

对于使用集群(处理器通过传递消息相互连接,而不一定通过共享内存相互连接)的编程人员而言,消息传递接口 (MPI) 是最常用的编程方法。在集群中,无论一个节点是否有众核处理器,通信都会继续使用 MPI。

如今基于 MPI 的程序可以轻松迁移到基于英特尔至强融核协处理器的系统,因为英特尔协处理器支持的队列可以与其它协处理器队列和多核(如英特尔至强® 处理器)队列进行通信。英特尔至强融核协处理器就像多核处理器,可以根据编程人员的需要创建任意数量的队列。这样的队列可以与其它队列进行通信,无论它们是否在多核或众核处理器中。

由于英特尔至强融核协处理器是通用的,因此 MPI 任务能够在协处理器上运行。这是一个非常强大的功能,因为无需算法重新编码或重构便可从现有的 MPI 程序获取工作结果。借助协处理器的通用功能加上英特尔至强融核协处理器上的 MPI 支持,MPI 编程人员可以直观地获取立竿见影的结果。

广泛采用的英特尔® MPI 库提供了面向几乎所有互联的高性能和支持。英特尔 MPI 库支持多核和众核系统以一种符合 MPI 编程的熟悉方式在多核处理器和众核协处理器上创建队列。

英特尔至强融核协处理器上的 MPI 与其它线程模式(如 OpenMP、英特尔 TBB、英特尔® Cilk™ Plus)进行组合,这在基于多核处理器的系统中已经很普遍。

英特尔是一家 MPI 实现和工具领域的领先厂商。MPI 适用于多核和众核编程。

并行编程新兴标准

对于数据并行硬件而言,面向特定 C C++ 扩展的支持为开发人员提供了重要选择,并解决了编程人员的工作效率问题。

英特尔® Cilk™ Plus

更多信息请访问 http://cilk.com

英特尔于 2010 年底推出了英特尔 Cilk Plus。根据麻省理工学院的研究成果和行业领导者 Cilk Arts 的产品经验英特尔在面向 Linux* Windows 的编译器中提供了对任务窃取的支持。英特尔已发布了面向英特尔 Cilk Plus 的完整规范,以帮助支持其它实施任务以及可选的英特尔运行时间或通过 API 标准构建可互换的运行时间。英特尔正在积极使用其它编译器,以便将来为更多编译器提供支持。凭借相关产品和工具,英特尔为成为英特尔 Cilk Plus 领域的业界领先支持商而深感自豪。

英特尔 Cilk Plus 提供了三个新的关键字、对归约运算的特别支持以及数据并行扩展。cilk_spawn 关键字可用于函数调用,就像在 x = cilk_spawn fib(n-1) 中一样,以表示 fib 函数可以与后续代码并发执行。cilk_sync 关键字表示执行必须要等到函数中的所有 spawn 返回后才能进行。通过将函数作为 spawn 的一个单位,代码将具有可读性,并可以依靠基线 C/C++ 语言来定义变量的作用域规则并允许英特尔 Cilk Plus 程序进行组合。

斐波纳契数列递归计算中的并行 spawnC 语言,使用英特尔 Cilk Plus):

 

01 int fib (int n) {
02   
03    if (n < 2) return 1;
04    else {
05       int x, y;
06       x = cilk_spawn fib(n-1);
07       y = fib(n-2);
08       cilk_sync;
09       return x + y;
10    }
11 }

Cilk C C++ 编程人员提供了非常直观和高效的编译器支持。Cilk 简单易学,将得到广泛采用。将关键字“for”改为“cilk_for”便可将一个没有环间依赖关系的普通“for”循环转变为一个并行循环。这可以向编译器表明循环迭代之间没有顺序。

并行函数调用(C 语言,使用英特尔 Cilk Plus):

 

1 cilk_for (int i=0; i<n; ++i){
2   
3       Foo(a[i]);
4 }

对于不需要新的编译器关键字或优化的特性算法或特性(如线程识别内存分配器或排序例程),Cilk 编程人员仍使用英特尔 TBB。英特尔 Cilk Plus 适用于多核和众核编程。

C/C++ 数据并行扩展

更多信息请访问 http://cilk.com

有关如何扩展 C(和 C++)从而直接提供数据并行扩展的讨论正在进行中。实现、经验和采用是走向标准化的重要步骤。英特尔已将基本数据并行扩展实施为面向 LinuxWindows Mac* OS X 系统的英特尔 Cilk Plus 的一部分。英特尔正在积极使用其他编译器,以便将来提供支持。英特尔提供了一个与 Fortran 90 数组运算类似的直观的语法扩展作为英特尔 Cilk Plus 的关键要素,该扩展允许在数组上进行简单运算。C/C++ 语言不支持表达数组运算。编程人员必须从数组要素方面编写一个循环并表达运算,从而产生了不必要的明确串行排序。更好的做法是编写一个 [:] = b[:] + c[:];,以表示添加的每个要素并且不指定不必要的串行顺序。这些简化的语义可以释放一个编译器来始终生成向量代码,而非生成非最优的标量代码。

另一种避免意外串行化的方法是允许编程人员在标准 C/C++ 中编写一个标量函数,并将其声明为“基础函数”。这将触发编译器生成该函数的短矢量版本,从而利用矢量寄存器和矢量指令在参数的短矢量版本中运算,而非在该函数的单一参数组中运算。通常情况下,如果函数内的控制流不依赖于数据值,那么执行短矢量函数生成结果矢量的时间与正则函数生成单一结果的时间大致相同。

基础函数(C 语言,使用英特尔 Cilk Plus):

 

1 __declspec (vector) void saxpy(float a, float x, float &y)
2 {
3    y += a * x;
4 }

目前,英特尔正在通过相关产品和工具来支持这些面向 C C++ 的语法扩展,并与其它编译器厂商进行讨论,以提供更广泛的支持。CC++ 和数据并行扩展适用于多核和众核编程。

OpenCL*

更多信息请访问 http://Intel.com/go/opencl

OpenCL 最初是由 Apple* 提出的,而后演变为一个行业标准组织,英特尔是这一组织的参与者和支持者。OpenCL 提供了一种“与硬件相关”的接口,从而提供了一些重要的抽象和实质控制以及业界的广泛兴趣与承诺。OpenCL 可能需要对本白皮书所涉及的任意解决方案进行最大程度的重构,特别是根据对基础硬件的深入了解进行重构。重构工作的结果可能对多核和众核性能十分重要,如果没有这样的重构,最终性能可能能够实现,也可能无法实现。OpenCL 的目标是使重构投资能够发挥最大作用。除 OpenCL 之外的解决方案可能会提供替代方案,以避免重构需要(只有在对基础硬件有深入了解时才能最出色地完成重构)。

简单的每个元素的乘法(使用 OpenCL):

 

1 kernel void
2    dotprod( global const float *a,
3              global const float *b,
4              global float *c)
5    {
6       int myid = get_global_id(0);
7       c[myid] = a[myid] * b[myid];
8    }

英特尔是 OpenCL 标准的主要参与者,也是一家解决方案和相关工具及早期实施方案提供商。OpenCL 适用于多核、众核和 GPU 编程,尽管 OpenCL 程序中的代码通常是独立的或对于每个目标是重复的。英特尔目前提供了面向英特尔多核处理器(使用英特尔 SSE 和英特尔 AVX 指令)和英特尔® 核芯显卡(集成显卡作为许多第三代英特尔® 酷睿处理器的一部分)的 OpenCL 支持。

使用多种模式时的可组合性

可组合性是一个重要概念。借助多个编程选项来满足不同需求时,必须要确保这些方法不会相互排斥。上文介绍的抽象编程方法可以在一款应用中进行混合。通过提供支持可组合性编程的较新编程模式,编程人员可以在单一应用中混合和匹配编程方法时,摆脱难以捉摸、毫无效率的限制。

最适合组合的方法是英特尔 TBB 和英特尔 Cilk Plus包括 C/C++ 数据并行扩展OpenMP OpenCL 虽然存在可组合性方面的限制但仍比使用原始线程更可取。

英特尔 TBB 和英特尔 Cilk Plus 为有效的并行程序提供了可进行选择和组装的重组组件。这是极其重要的,因为它提供了用于混合模块(包括函数库)的可组合性。这两种方法都具有自组合性,而线程和 OpenMP OpenCL 则不具备这种能力。

充分利用众核

将多核和众核的优势结合起来可以带来无限的可能。

英特尔至强融核协处理器旨在为高度并行工作提供节能高效的处理能力并同时保持高度可编程能力。同时包含多核处理器和英特尔至强融核协处理器的平台可称为异构平台。这样的异构平台可提供双重优势,多核处理器能够非常灵活地处理通用的串行和并行工作负载,更专业的众核处理能力能够有效处理高度并行的工作负载。异构平台能够以此方式进行编程,并利用一种编程模式来管理数据复制和传送控制。

应用仍利用单一的源代码库进行构建。英特尔架构多核处理器和众核协处理器的多功能性使得编程可以直观、有效地进行。

众核的显式使用与隐式使用

通过使用英特尔 MKL 等函数库,众核处理器可实现隐式使用,使用方式是通过提供代码来检测和利用众核处理器。开发人员可以对英特尔函数库进行显式控制,但依靠函数库来决定是否以及何时使用附加的多核处理器的简单方法可能非常有效。

编程人员在源代码中的明确指令也可能带来其他的编程机会。通过编写一款异构程序来编写一款以显性方式利用众核的应用。这一程序将包括编写并行应用以及划分多核处理器和众核处理器之间的工作。

即使有显式控制,英特尔也已经设计了足够灵活的扩展,可在没有众核处理器的情况下工作并为未来的融合做好了准备。这两项优势极其重要。首先,单个源程序可以提供卸载至英特尔至强融核协处理器的指令。但在运行时,如果正在使用的系统中没有协处理器,那么在多核处理器和众核协处理器上使用英特尔架构则意味着可卸载至协处理器的代码可以在任一类型的处理器上无缝执行。

卸载

在如今的硬件中,一个异构平台包含多个不同的内存空间,一个(或一个集群中的更多空间)面向多核处理器,一个面向每个众核处理器。多核处理器和众核协处理器之间的连接可能是一个瓶颈,需要进行一番考虑。

利用这样的异构平台有两种方法。一种方法是将内存空间视为完全不同的空间,使用卸载指令在多核处理器中移入和移出控制及数据。另一种方法利用一个称之为 MYO 的软件虚拟共享内存来支持单一系统(或一个集群的单一节点)上的多核处理器和众核协处理器之间的共享,从而简化数据问题。MYO 是“Mine Yours Ours”的缩写,指的是在一个系统内共享内存,以确定当前访问权和所有权权限的软件抽象层。

第一种方法完全公开了多核处理器和众核处理器不共享内存。借助编译器对这一执行模式的指令支持,编程人员可以不必指定系统的低级别细节,同时公开目标为异构平台的基本属性,将时间用于解决更棘手的问题。

简单卸载(Fortran 语言):

 

1 !dir$ offload target(MIC1)
2 !$omp parallel do
3       do i=1,10
4          A(i) = B(i) * C(i)
5       enddo
6 !$omp end parallel

编译器提供了一个面向卸载的编译指示(#编译指示卸载),编程人员可用来表示后面的语言结构可以在英特尔至强融核协处理器上执行。该编译指示还提供了子句,允许编程人员指定一些需要在执行已卸载代码之前在处理器内存和协处理器内存之间复制的数据项。这些子句还允许开发人员指定之后应复制回多核处理器内存的数据。卸载编译指令适用于 CC++ Fortran

简单卸载(C 语言,包含数据传输):

 

1 float *a, *b; float *c;
2   
3 #pragma offload target(MIC1)
4    in(a, b : length(s))
5    out(c : length(s) alloc_if(0))
6 for (i=0; i<s; i++) {
7    c[i] = a[i] + b[i];
8 }

另一种方法是一个称之为 MYO 的运行时用户模式库。MYO 支持在多核处理器和英特尔至强融核协处理器之间同步数据,编译器支持在相同的虚拟地址中分配数据。这意味着数据指针可以在多核和众核内存空间之间共享,并且完全支持复制基于指针的数据结构(如树和链接列表等),且无需数据封送处理。若要使用 MYO 功能,编程人员需要利用 _Cilk_shared 关键字,对两端均应可见的数据项进行标记,并使用卸载来调用英特尔至强融核协处理器上的工作。x = _Offload func(y); 语句表示 func() 函数在英特尔至强融核协处理器上执行,并且返回值已分配给变量 x。作为执行的一部分,该函数可以读取并修改共享数据,修改后的值在所有处理器上的代码执行中可见。

卸载方法非常明确,狠适合某些程序。MYO 方法在本质上较为隐性,有多项优势。MYO 支持在没有封送处理的情况下复制类,并支持复制 C++ 类,而卸载编译指示则不支持。更重要的是,MYO 不会在同步时复制所有共享变量,而只会复制在两个同步点之间发生变化的值。

尽管这些卸载编程方法旨在支持控件将工作引导至众核处理器,但它们可用于多核和众核编程,以便让代码具有高度可移植性和持久性——即使系统发生演变。拥有众核处理器的系统和没有众核处理器的系统可以使用相同的源代码。

其它卸载功能

调用英特尔至强融核协处理器上的工作时,关键字和编译指示机制都会受到触发,执行数据复制操作。未来的指令选项支持在调用计算之前启动数据复制操作,以便能够在复制数据的同时安排其他工作。

由于系统可能配置了多核处理器,并且每个节点配置了不止一个英特尔至强融核协处理器,因此额外的语言支持可以让编程人员在强制卸载或允许作出运行时决定之间选择。这个选项为根据环境的具体情况制定更加动态的最优决策提供了可能。

标准

通过在多核和众核处理器上使用英特尔架构指令,编程工具及模式将可以最好地满足这两者的需求。凭借敏锐的洞察力和正确的模式,您将可以构建一个能够以直观、有效的方式利用多核处理器系统、异构系统和未来融合系统的单一源代码库。这可以通过一个采用熟悉且最新的编程语言的单一源代码库实现。

尝试的和真正的解决方案(包括 CC++FortranOpenMPMPI 和英特尔 TBB)都可应用于这些英特尔架构多核和众核系统中。

包括英特尔 Cilk Plus、卸载扩展和 OpenCL 在内的新兴技术得到了英特尔的大力支持,并为未来更广泛的采用和支持做好了准备。

标准化之路从强大的产品和已发布规范开始,逐步发展到用户(客户)和其它厂商的支持。随后,各种可行标准将纷至沓来。有了 OpenCL、英特尔 Cilk Plus 和卸载扩展,产品支持和规范将得以存在,客户使用将可以顺利进行。接下来,用户将可以享受到更广泛的支持,各种标准也将根据用户体验进行完善。

总结

利用英特尔架构和行业标准的编程工具可以提供适用于这两者的并行编程方法。这些方法可以通过使用熟悉的工具、编程语言和先前的源代码投资来采用单一的源代码库。当前和新兴的解决方案支持应用发展成为能够最大限度利用多核处理器和众核协处理器的单一代码段。利用多核和众核并行编程的方法不仅可以实现出色的性能,还可以保护投资,并提供直观的编程方法。

标准在编程方法中起着重要作用。英特尔为支持和实施标准的编程模式和方法投入了大量资金。此外,英特尔在推动标准演变以应对新挑战方面一直处于领导地位。

进行面向英特尔至强融核协处理器的编程时,应用程序将可以在一个易于维护的高性能应用(具有高度可移植性,可扩展到未来的架构,并且完全支持代码相同的多核系统)中获得英特尔至强融核协处理器的强大功能。

组织在节点中的多核处理器和众核协处理器的集群将能够以一种直观、易于维护且有效的方式,充分利用这些可用于英特尔架构的丰富工具和编程模式。

能够利用现有的开发人员工具、标准和性能并且具有出色的灵活性,这使得英特尔多核和众核解决方案独具一格。

作者简介

James Reinders(仁达敬),英特尔公司软件讲师兼总监

James Reinders 是一位高级工程师,于 1989 年加入英特尔公司,他为许多项目做出了贡献,包括脉动阵列系统 WARP iWarp、全球首台万亿次浮点运算/秒的超级计算机 (ASCI Red)、全球首台万亿次浮点运算/秒的单芯片计算设备(当时称为 Knights Corner,现称为首个英特尔® 至强融核协处理器)以及多个英特尔® 处理器和并行系统的编译器和架构工作。James 带领英特尔成为软件开发产品的主要提供商,现任英特尔首席软件讲师。James O'Reilly Media 公司出版的《英特尔线程构建模块》一书的作者,该书已被翻译为多种语言,包括日语、中文和韩语。James 还是 Morgan Kaufmann Publishing 出版社于 2012 年出版的《结构化并行编程》一书的合著者之一。他发表过大量文章,参与过多本书籍的编写工作。 James 拥有密歇根大学电气与计算机工程专业的工程学理学士学位以及计算机工程专业的教育理学硕士学位。

声明

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

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

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

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

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

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

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

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

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

优化声明

英特尔编译器针对非英特尔微处理器的优化程度可能与英特尔微处理器相同(或不同)。这些优化包括 SSE2®SSE3 SSSE3 指令集以及其它优化。对于在非英特尔制造的微处理器上进行的优化,英特尔不对相应的可用性、功能或有效性提供担保。该产品中依赖于处理器的优化仅适用于英特尔微处理器。部分非针对英特尔微体系架构的优化也为英特尔微处理器保留了下来如欲了解更多有关本声明所涉及的特定指令集的信息请参阅适用产品的用户和参考指南》。

声明版本 #20110804

 

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