Document

性能库:Intel 数学核心库(MKL)
杨全胜
http://www.njyangqs.com/
东南大学成贤学院计算机系
多核结构与程序设计
内容




介绍
性能特性
使用库
库内容
Southeast University
东 南 大 学
2
http://www.njyangqs.com/
多核结构与程序设计
库内容

性能库: Intel® MKL
 Intel®
数学核心库是一个广泛的科学/工程数学
库
 为Intel® processors优化
 他的多线程可以在SMP的机器上有效的使用
Southeast University
东 南 大 学
3
http://www.njyangqs.com/
多核结构与程序设计
介绍

Intel®数学核心库目的
性能,性能,还是性能!
 Intel公司的工程、科学和金融数学库
 访问:

(BLAS, LAPACK)
 特征向量/特征值求解(BLAS, LAPACK)
 一些量子化学的需要(dgemm)
 偏微分方程, 信号处理, 地震, 固态物理(FFTs)
 常规科学,金融科学[向量超越函数 (VML)和向量随机
数发生器(VSL)]
 解算程序

为Intel的当前和未来处理器做调整
Southeast University
东 南 大 学
4
http://www.njyangqs.com/
多核结构与程序设计
介绍

Intel® 数学核心库目的 – 不能做的
 但是不能用Intel®
做 …
X’
Y’
Z’
W’
数学核心库(Intel® MKL) 来
=
4x4
变换矩阵
X
Y
Z
W
几何变换
MKL
 不要在小n上调用向量数学函数.
 不要在“小”计算上用Intel®
Southeast University
东 南 大 学
5
http://www.njyangqs.com/
多核结构与程序设计
介绍

Intel® 数学核心库内容

BLAS (基本线性代数子例程)

Level 1 BLAS – 向量-向量操作
• 15个函数类型
• 48个函数

Level 2 BLAS – 矩阵-向量操作
• 26个函数类型
• 66个函数

Level 3 BLAS – 矩阵-矩阵操作
• 9个函数类型
• 30个函数

Southeast University
东 南 大 学
Extended BLAS – 对稀疏向量的level 1 BLAS
• 8个函数类型
• 24个函数
6
http://www.njyangqs.com/
多核结构与程序设计
介绍

Intel® 数学核心库内容

LAPACK (线性代数包)

解算程序进而特征值求解. 全部数百个子例程
 有总数超过1000的用户可调用和支持例程

DFTs (离散福利叶变换)
混合基数, 多维变换
 多线程


VML (矢量数学库)
矢量超越函数集
 大多数的libm函数,但是更快


VSL (矢量统计学库)

Southeast University
东 南 大 学
矢量随机数发生器集
7
http://www.njyangqs.com/
多核结构与程序设计
介绍

Intel® 数学核心库内容
 BLAS和LAPACK*
都是Fortran.
 传统的高性能计算
 VSL和VML有Fortran和C接口
 DFTs有Fortran
95和C接口
 cblas接口:更便于C/C++程序员调用BLAS
Southeast University
东 南 大 学
8
http://www.njyangqs.com/
多核结构与程序设计
介绍

Intel® 数学核心库(Intel® MKL) 环境
编译器
库



Linux*
Intel, Gnu
.a, .so
支持32位和64位Intel处理器
一个例子和测试的大集合
大量的文档
Southeast University
东 南 大 学
Windows*
Intel, CVF,
Microsoft
.dll, .lib
9
http://www.njyangqs.com/
多核结构与程序设计
内容




介绍
性能特性
使用库
库内容
Southeast University
东 南 大 学
10
http://www.njyangqs.com/
多核结构与程序设计
性能特性

资源的有限优化


所有优化的目标是速度最大化
有限的资源优化 – 消耗一个或者更多的系统资源:
CPU: 寄存器使用, 浮点单元
 Cache: 尽可能久地保持cache中的数据; 处理cache更迭
 TLBs: 最大限度地使用每页上的数据
 存储带宽: 尽可能少地访问存储器.
 计算机: 用所有可用的处理器执行线程
 系统: 使用所有的可用节点(机群软件).

Southeast University
东 南 大 学
11
http://www.njyangqs.com/
多核结构与程序设计
性能特性

线程化

大部分Intel® 数学核心库(Intel® MKL) 能够线程化,但
是:
内存带宽是有限的资源
 线程化level 1和level 2 BLAS 基本上没效果( O(n) )


有大量的线程化的机会:
Level 3 BLAS ( O(n3) )
 LAPACK* ( O(n3) )
 FFTs ( O(n log(n) )
 VML, VSL ? 依赖处理器和函数



所有的线程化都是使用OpenMP*.
所有Intel MKL都被设计和编译成对线程化是安全的
Southeast University
东 南 大 学
12
http://www.njyangqs.com/
多核结构与程序设计
内容




介绍
性能特性
使用库
库内容
Southeast University
东 南 大 学
13
http://www.njyangqs.com/
多核结构与程序设计
使用库

连接Intel® 数学核心库(Intel® MKL)
ifort, BLAS, IA-32处理器:
 方案1:
 ifort
 方案2:
 f77
myprog.f mkl_c.lib
CVF, LAPACK, IA-32处理器:
myprog.f mkl_s.lib
 方案3:
使用一个在运行时连接的DLL来静态连接
一个C程序:
 link
myprog.obj mkl_c_dll.lib
 注意:基于处理器的优化二进制代码将在运行的时
候执行
Southeast University
东 南 大 学
14
http://www.njyangqs.com/
多核结构与程序设计
使用库

矩阵乘法
 自己做卷积或用点积
Roll Your Own
for( i = 0; i < n; i++ ){
for( j = 0; j < m; j++ ){
for( k = 0; k < kk; k++ )
c[i][j] += a[i][k] * b[k][j]; }}
ddot
for( i = 0; i < n; i++ ){
for( j = 0; j < m; j++ )
c[i][j] = cblas_ddot( n, &a[i], incx,&b[0][j], incy); }
Southeast University
东 南 大 学
15
http://www.njyangqs.com/
多核结构与程序设计
使用库

矩阵乘法
 DGEMV/DGEMM
dgemv
for( i = 0; i < n; i++ )
cblas_dgemv( CBLAS_RowMajor, CBLAS_NoTrans, m, n,
alpha, a, lda, &b[0][i], ldb, beta, &c[0][i], ldc );
dgemm
Cblas_dgemm( CblasColMajor, CblasNoTrans,
CblasNoTrans, m, n, kk, alpha, b, ldb, a, lda, beta, c, ldc );
Southeast University
东 南 大 学
16
http://www.njyangqs.com/
多核结构与程序设计
使用库

实验 1: DGEMM
 比较分别用C源码,DDOT,DGEMG和DGEMM实
现矩阵乘法的性能
 练习在MKL/BLAS中控制线程的能力
Southeast University
东 南 大 学
17
http://www.njyangqs.com/
多核结构与程序设计
内容




介绍
性能特性
使用库
库内容
Southeast University
东 南 大 学
18
http://www.njyangqs.com/
多核结构与程序设计
库内容

LAPACK*中优化Intel® 数学核心库
 很多重要的LAPACK优化:
– 有效地使用多处理器和多核
 递归分解
 线程化
• 减少串行时间(Amdahl’s law: t = t串行 + t并行/p)
• 代码中进一步扩展阻塞到整个列的块,以提高局部性
 无需运行时库的支持
 NETLIB
LAPACK有很多调用函数提高了对运行时
库函数的支持,这些函数都在Intel MKL中,所以
不再需要运行时库,可以和任何编译器方便的链接、
Southeast University
东 南 大 学
19
http://www.njyangqs.com/
多核结构与程序设计
库内容

离散福利叶变换(DFTs)
 1维,2维,3维…(受编程语言限制)
 支持多线程
 为内存的有效利用而进行混合基数变换,并满足
许多物理问题的需要。可以指定任何规模的变换,
但并不是所有规模的变换运行的同样快
 用户指定比例,变换的符号
 嵌入矩阵的变换,一次允许调用多个一维变换
 C和F90接口
Southeast University
东 南 大 学
20
http://www.njyangqs.com/
多核结构与程序设计
库内容

用Intel® 数学核心库做离散福利叶变换
 基本上是3个步骤
 创建一个描述器.
•
Status = DftiCreateDescriptor(MDH, …)
 提交描述器(实例化它).
•
Status = DftiCommitDescriptor(MDH)
 执行转换.
•
Status = DftiComputeForward(MDH, X)
 释放描述器(可选地)
Southeast University
东 南 大 学
21
http://www.njyangqs.com/
多核结构与程序设计
库内容

矢量数学库(VML)的功能/问题
 矢量数学库: 矢量超越函数 – 像libm,但是更好
(更快)
 接口: 有Fortran和C两个接口
 多种精确度
< 1 ulp )
 较低精度, 更快( < 4 ulps )
 高精度(
sin(0),等
 错误处理– 这里不能复制libm
 特殊值的处理√(-a),
Southeast University
东 南 大 学
22
http://www.njyangqs.com/
多核结构与程序设计
库内容

VML: 是怎样的?
 它对金融代码很重要(蒙托卡罗模拟法).
 指数,
对数
 依赖于超越函数的其他科学代码
 误差函数能够在一些代码中起到很重要的作用.
Southeast University
东 南 大 学
23
http://www.njyangqs.com/
多核结构与程序设计
库内容

矢量统计学库(VSL)
 随机数发生器组(RNGs)
 大量的非均匀分布
 VSL广泛地使用在各种变换上
– 一些函数
 用户能够提供自己的BRNG或变换
 5个基本的RNGs (BRNGs) – 位,整数,浮点数
 并行计算的支持
 MCG31,
Southeast University
东 南 大 学
R250, MRG32, MCG59, WH
24
http://www.njyangqs.com/
多核结构与程序设计
库内容

非均匀RNGs
 Gaussian
(two methods) 高斯
 Exponential 指数
 Laplace 拉普拉斯变换
 Weibull 韦伯分布
 Cauchy 柯西分布
 Rayleigh 瑞利
 Lognormal 对数正态
 Gumbel Gumbel分布
Southeast University
东 南 大 学
25
http://www.njyangqs.com/
多核结构与程序设计
库内容

使用VSL
 基本是三个步骤
 创建一个流指针
• VSLStreamStatePtr stream;
 创建一个流.
• vslNewStream(&stream,VSL_BRNG_MC_G31,
seed );
 生成一组RNGs.
• vsRngUniform( 0, &stream, size, out, start,
end );
 删除一个流(可选).
• vslDeleteStream(&stream);
Southeast University
东 南 大 学
26
http://www.njyangqs.com/
多核结构与程序设计
库内容

实验: 用蒙特卡罗法计算π
 根据圆面积公式,S=πr2
 看一个单位圆,其中,1/4个
1
x
单位圆的面积是单位矩形面积
y
的一部分,单位矩形面积为1,
-1
1
现在在单位矩形内产生大量
0
随机的点,则落在1/4圆内的
点所占的百分比就是1/4的单位
圆面积。
-1
 一个点是否在1/4单位圆内的判断方法就是该点的
坐标是否满足 x2+y2≤1
Southeast University
东 南 大 学
27
http://www.njyangqs.com/
多核结构与程序设计
库内容
int main(){
 实验: 用蒙特卡罗法计算π
unsigned int iter=200000000;
int i,j;
double x, y;
double dUnderCurve=0.0;
double pi=0.0;
srand( 0);
for (i=0;i<iter;i++) {
x=(double)rand()/(double)RAND_MAX;
y=(double)rand()/(double)RAND_MAX;
if (x*x + y*y <= 1.0) {
dUnderCurve++;
}
}
pi = dUnderCurve / (double) iter * 4 ;
return 0;
Southeast University
}
东 南 大 学
1
x
-1
y
0
1
-1
28
http://www.njyangqs.com/
多核结构与程序设计
库内容
unsigned int iter=200000000;
 int i,j;
double x, y;
double dUnderCurve=0.0;
double pi=0.0;
1
double r[BLOCK_SIZE*2];
x
VSLStreamStatePtr stream;
vslNewStream( &stream, BRNG, (int) clock() );
y
for(j=0;j<iter/BLOCK_SIZE; j++) {
-1
1
vdRngUniform( METHOD, stream, BLOCK_SIZE*2, r, 0.0, 1.0 );
0
for (i=0; i<BLOCK_SIZE; i++) {
x=r[i];
y=r[i+BLOCK_SIZE];
if (x*x + y*y <= 1.0) {
dUnderCurve++;
-1
}
}
}
vslDeleteStream( &stream );
Southeast University
29
pi = dUnderCurve / (double) iter * 4 ;
http://www.njyangqs.com/
东 南 大 学
实验: 用蒙特卡罗法计算π