英特尔集成性能原语

科技工作者之家 2020-11-17

英特尔集成性能原语(Intel Integrated Performance Primitives,Intel IPP),也可以称作集成执行原语, 是一个多线程软件函式库,包含用于多媒体和数据处理应用的函数,由英特尔公司开发的。该库支持英特尔和兼容处理器,可用于Linux、MacOS、Windows和Android操作系统。它可单独提供或作为Intel Parallel Studio的一部分使用。

简介英特尔集成性能原语(Intel IPP)是由因特尔开发的用于多媒体和数据处理的函数库。Intel IPP被划分为四大主要处理组:信号(带有线性阵列或矢量数据)、图像(具有典型颜色空间的2D阵列)、矩阵(用于矩阵运算的nxm数组)和密码学。其入口点中一半为矩阵类型,三分之一为信号类型,其余是图像和密码类型。Intel IPP函数分为4种数据类型:数据类型包括8u (8-bit unsigned)、8s (8-bit signed)、16s、32f (32-bit floating-point)、64f等。Intel IPP包含下列函数:视频解码/编码、音频解码/编码、JPEG/JPEG2000/JPEG XR、计算机视觉、密码学、数据压缩、图像颜色转换、图像处理、光线追踪和渲染、信号处理、语音编码、语音识别、字符串处理以及矢量和矩阵数学。该库利用处理器的包括MMX、SSE、SSE2、SSE3、SSSE3、SSE4、AVX、AVX2、AVX-512、AES-NI和多核心处理器特性。

多线程与库多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。传统操作系统中的单线程进程由进程控制块和用户地址空间、以及管理进程执行的调用/返回行为的系统堆栈或用户堆栈构成。如果把进程的管理和执行相分离,进程作为操作系统中进行保护和资源分配的单位,允许一个进程中包含有多个可并发执行的控制流,这些控制流切换时不必线程则是指进程中的一条执行路径(控制流),每个进程内允许包含多个并行执行的路径,这就是多线程。线程是系统进行处理器调度的基本单位,同一个进程中的所有线程共享进程获得的主存空间和资源,线程具有:①一个线程执行状态;②一个受保护的线程上下文;③一个独立的程序指令计数器;④一个执行堆栈;⑤一个容纳局部变量的静态存储器通过进程调度,通信时可以直接借助于共享的内存区,这就形成了多线程进程1。

软件多线程。即便处理器只能运行一个线程,操作系统也可以通过快速的在不同线程之间进行切换,由于时间间隔很小,来给用户造成一种多个线程同时运行的假象。这样的程序运行机制被称为软件多线程。如微软的Windows作业系统和Linux就是在各个不同的执行绪间来回切换,被称为单人多任务作业系统。而DOS这类文字接口作业系统在一个时间只能处理一项工作,被视为单人单工作业系统。除此之外,许多系统及处理器也支持硬件多线程技术。对称多处理机(SMP)系统具有多个处理器,所以具有真正的同时执行多个线程的能力;CMP技术通过在一块芯片上集成多个核心(Core)也具有真正的多线程能力;CMT技术则稍有不同,有的是依靠硬件执行线程切换来获得多线程能力,操作系统不再负责线程切换,因而这部分开销可以减少甚至消除,这方面典型的例子是Sun的UltraSPARC T1,它同时综合了CMP和CMT。微软的Windows 2000以后的操作系统皆支持多线程与超线程技术。

由于程序代码中存在的数据及控制依赖关系,单线程中所能发掘的指令并行潜力是有限的。为了发掘有限的指令级并行潜力而一味强化乱序执行和分支预测,以至于处理器复杂度和功耗急剧上升,有时候是得不偿失的。因此,现代微处理器多采用硬件多线程技术来发掘线程之间的线程级并行潜力。这样子允许在接口转换的专业领域之运算能力大幅提升:既使这样做对于提升单一程序或是线程的性能相当困难,但是多数的系统都是使用多任务的方式作业。能够明显的提升整体系统运算能力,总体吞吐量获得提升。

在计算机科学中,库(ibrary)是用于开发软件的子程序集合。库和可执行文件的区别是,库不是独立程序,他们是向其他程序提供服务的代码。库链接是指把一个或多个库包括到程序中,有两种链接形式:静态链接和动态链接,相应的,前者链接的库叫做静态库后者的叫做动态库。静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。静态链接的最大缺点是生成的可执行文件太大,需要更多的系统资源,在装入内存时也会消耗更多的时间。动态链接,在可执行文件装载时或运行时,由操作系统的装载程序加载库。大多数操作系统将解析外部引用(比如库)作为加载过程的一部分。在这些系统上,可执行文件包含一个叫做import directory的表,该表的每一项包含一个库的名字。根据表中记录的名字,装载程序在硬盘上搜索需要的库,然后将其加载到内存中预先不确定的位置,之后根据加载库后确定的库的地址更新可执行程序。可执行程序根据更新后的库信息调用库中的函数或引用库中的数据。这种类型的动态加载称为装载(load-time)时加载,被包括Windows和Linux的大多数系统采用。装载程序在加载应用软件时要完成的最复杂的工作之一就是加载时链接。

处理器指令集MMX是由英特尔开发的一种SIMD多媒体指令集,共有57条指令。它于1996年集成在英特尔奔腾(Pentium)MMX处理器上,以提高其多媒体数据的处理能力。其优点是增加了处理器关于多媒体方面的处理能力,缺点是占用浮点数寄存器进行运算(64位MMX寄存器实际上就是浮点数寄存器的别名)以至于MMX指令和浮点数操作不能同时工作。为了减少在MMX和浮点数模式切换之间所消耗的时间,程序员们尽可能减少模式切换的次数,也就是说,这两种操作在应用上是互斥的。AMD在此基础上发展出3D Now!指令集。3D Now!发布一年后,Intel在MMX基础上发展出SSE(Streaming SIMD Extensions)指令集,用来取代MMX。新开发的程序不再仅使用MMX来最优化软件运行性能,而是改使用如SSE、3DNOW!等更容易最优化性能的新一代多媒体指令集,不过的处理器大多仍可以运行针对MMX最优化的较早期软件。

SSE(Streaming SIMD Extensions)是英特尔在AMD的3D Now!发布一年之后,在其计算机芯片Pentium III中引入的指令集,是继MMX的扩充指令集。SSE指令集提供了70条新指令。AMD后来在Athlon XP中加入了对这个新指令集的支持。SSE2,全名为Streaming SIMD Extensions 2,是一种IA-32架构的SIMD(单一指令多重数据)指令集。SSE2是在 2001年随着Intel发表第一代Pentium 4处理器也一并推出的指令集。它延伸较早的SSE指令集,而且可以完全取代MMX指令集。在2004年,Intel 再度扩展了SSE2指令为 SSE3 指令集。与 70 条指令的 SSE 相比,SSE2新增了144条指令。在2003年,AMD也在发布AMD64的64位处理器时跟进SSE2指令集。

SSE3(Streaming SIMD Extensions 3),又称PNI(Prescott New Instructions),它指的是:在原有架构的处理器中,所第三次额外新增、添加的多媒体指令集,之前的两次分别是SSE、SSE2。

SSE3是Intel公司所其原有IA-32架构的处理器所研创,并在2004年初的新款Pentium 4(P4E,Prescott核心)处理器中使用,之后2005年4月AMD公司也发表具备部分SSE3功效的处理器:Athlon 64(E3步进核心),此后的x86处理器也几乎都具备SSE3的新指令集功能

此外,在SSE3提出之前,x86架构的处理器先后已有多种多媒体指令集被提创与使用,先后顺序大致是Intel MMX、AMD 3DNow![4]、Intel SSE、Intel SSE2等。附带一提的是,SSE3比在它之前的SSE2增加13条新指令。

高级加密标准指令集(或称英特尔高级加密标准新指令,简称AES-NI)是一个x86指令集架构的扩展,用于Intel和AMD微处理器,由Intel在2008年3月提出。该指令集的目的是改进应用程序使用高级加密标准(AES)执行加密和解密的速度。

多核处理器(Multi-core processor),又称多核微处理器,是在单个计算组件中,加入两个或以上的独立实体中央处理单元(简称核心,英语:Core),只有两个核心的处理器,称为双核处理器(dual-core processor)。这些核心可以分别独立地运行程序指令,利用并行计算的能力加快程序的运行速度。“多核心”通常是对于中央处理器(Central Processing Unit,CPU)而论的,但是某些时候也指数字信号处理器(DSP)和系统芯片(SoC)。

通常,把将两个或更多独立处理器封装在一个单一集成电路(IC)中的方案称为多核心处理器;而封装在不同IC中的独立处理器形成的计算机系统被称为多处理器。在某些情况中(比如广告中),有些人会将在同一个集成电路中多个独立的单核心微处理器(或多核心微处理器)称做“多处理模块”、“多核心”等,其实是指“多处理器”而不是“多核心处理器”。除非特别说明,本文将使用“多核心”指代在同一集成电路中集成多个独立处理器的CPU(即“多核心处理器”)。

一般情况下,多核心处理器可以在每个核心分别独立物理封装的情况下进行多任务处理(线程级并发处理(Thread-Level Parallelism,TLP),这种形式的TLP通常被认为是芯片级多处理)。

AVX指令集(Advanced Vector Extensions,即高级向量扩展指令集)是x86架构处理器中的指令集,被英特尔和AMD的处理器所支持。AVX指令集由英特尔在2008年3月提出,并在2011年第一季度出品的Sandy Bridge系列处理器首获支持。随后,AMD在2011年第三季度的Bulldozer系列处理器也支持了AVX。

AVX是X86指令集的SSE延伸架构,如IA16至IA32般的把暂存器XMM 128bit提升至YMM 256bit,以增加一倍的运算效率。此架构支持了三运算指令(3-Operand Instructions),减少在编码上需要先复制才能运算的动作。在微码部分使用了LES LDS这两少用的指令作为延伸指令Prefix。

AVX2指令集将整数操作扩展到了256位,并引入了FMA指令集作为扩充。AVX-512则将指令进一步扩展到了512位。

本词条内容贡献者为:

李岳阳 - 副教授 - 江南大学

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。