第六章:多核编译器

Download Report

Transcript 第六章:多核编译器

®
Intel
Core Duo™ 处理器上使用
Intel Compilers 10.x
Windows版本
杨全胜
http://www.njyangqs.com/
东南大学成贤学院计算机系
多核结构与程序设计
内容




介绍
编译器开关
双核
向量化
Southeast University
东 南 大 学
2
http://www.njyangqs.com/
多核结构与程序设计
介绍

优化的关键: Intel® Core™ Duo
 使用编译器提高与结构有关的性能
 更好地使用:
 寄存器和功能部件
 双核/多处理器
 SSE指令集
 Cache结构
Southeast University
东 南 大 学
3
http://www.njyangqs.com/
多核结构与程序设计
介绍

与微软C++的兼容性
 与VS2003的/Qvc71在源码和二进制码兼容
 与VS2005的/Qvc8在源码和二进制码兼容
 Microsoft*和Intel的OpenMP在二进制上不兼容
 用一个编译器来编译带有OpenMP的模块
 更多的信息看用户指南
Southeast University
东 南 大 学
4
http://www.njyangqs.com/
多核结构与程序设计
介绍

在Microsoft10.0中使用Intel Compiler 10.0
Southeast University
东 南 大 学
5
http://www.njyangqs.com/
多核结构与程序设计
介绍

在Microsoft IDE中使用Intel Compiler11.0
Southeast University
东 南 大 学
6
http://www.njyangqs.com/
多核结构与程序设计
内容




介绍
编译器开关
双核
向量化
Southeast University
东 南 大 学
7
http://www.njyangqs.com/
多核结构与程序设计
编译器开关

常规优化
Windows* Linux* Mac*
/Od
-O0
-O0
禁止优化
/Zi
-g
-g
产生符号(symbol)
/O1
-O1
-O1
/O2
-O2
-O2
为代码大小而优化:服务器代
码
为速度优化(缺省)
/O3
-O3
-O3
Southeast University
东 南 大 学
为数据Cache优化:
浮点循环代码
8
http://www.njyangqs.com/
多核结构与程序设计
编译器开关

过程间多遍优化(IPO)
Windows* Linux* Mac*
/Qip
-ip
-ip
允许在单文件中进行过程间的
优化
/Qipo
-ipo
-ipo 允许在多个文件之间进行过程
间的优化


可以在各自文件中内联函数
当和其他的编译器属性联合使用时,会增强优
化效果。
Southeast University
东 南 大 学
9
http://www.njyangqs.com/
多核结构与程序设计
编译器开关

IPO使用: 两阶段处理
Compiling
Pass 1
Windows*
icl -c /Qipo main.c func1.c func2.c
Linux*
icc -c -ipo main.c func1.c func2.c
Mac*
icc -c -ipo main.c func1.c func2.c
virtual .o
Pass 2
executable
Southeast University
东 南 大 学
Linking
Windows*
icl /Qipo main.o func1.o func2.o
Linux*
icc -ipo main.o func1.o func2.o
Mac*
icc -ipo main.o func1.o func2.o
10
http://www.njyangqs.com/
多核结构与程序设计
编译器开关

跟踪指导的优化(PGO)
 使用执行时的反馈来指导编译器做更多其他的优
化
 帮助I-cache, 页式管理和分支预测
 允许的优化:
 基本块排序
 更好的寄存器分配
 更好地决定哪些函数内联
 函数排序
 Switch语句的优化
 更好的向量化决策
Southeast University
东 南 大 学
11
http://www.njyangqs.com/
多核结构与程序设计
编译器开关

PGO: 三阶段处理
Step 1
编译指令
(Mac*/Linux*) icc -prof_gen[x] prog.c
(Windows*)
icl -Qprof_gen[x] prog.c
可执行的指令
Step 2
执行指令
DYN文件包含动态信
息: .dyn
用典型的数据集来执行程序
Step 3
合并DYN概要文件: .dpi,
如果你不希望旧的信息被
包含进去,就删除旧的dyn
反馈给编译
(Mac/Linux)
icc -prof_use prog.c
(Windows)
icl -Qprof_use prog.c
Southeast University
东 南 大 学
12
http://www.njyangqs.com/
多核结构与程序设计
内容




介绍
编译器开关
双核
向量化
Southeast University
东 南 大 学
13
http://www.njyangqs.com/
多核结构与程序设计
双核

自动并行化
 自动的循环线程化而无需人工添加OpenMP*指导
Windows*
Linux*
Mac*
/Qparallel
-parallel
-parallel
/Qpar_report[n] -par_report[n] -par_report[n]
 编译器可以识别“容易”的部分进行并行化,但是
大的应用程序分析会很困难
Southeast University
东 南 大 学
14
http://www.njyangqs.com/
多核结构与程序设计
双核

OpenMP*线程化技术
 基于Pragma的并行化技术
 使用方法:
 OpenMP开关:
-openmp : /Qopenmp
 OpenMP报告: -openmp-report : /Qopenmpreport
#pragma omp parallel for
for (i=0;i<MAX;i++)
C[i]= c*A[i] + B[i];
Southeast University
东 南 大 学
15
http://www.njyangqs.com/
多核结构与程序设计
双核

OpenMP*线程化技术
 Intel编译器的工作队列扩展
 创建任务队列…继续工作…
• 递归函数
• 链表等
#pragma intel omp parallel taskq shared(p)
{
while (p != NULL) {
#pragma intel omp task captureprivate(p)
do_work1(p);
p = p->next;
}
}
Southeast University
东 南 大 学
16
http://www.njyangqs.com/
多核结构与程序设计
双核

并行诊断
 Intel
Thread Checker中用源指令
 允许线程检查器诊断线程化的正确性错误
 要使用tcheck
/Qtcheck 必须安装Intel Thread
Checker
 看有关线程检查器的文档
 http://www.intel.com/support/performanceto
ols/sb/CS-009681.htm
Southeast University
东 南 大 学
17
http://www.njyangqs.com/
多核结构与程序设计
内容




介绍
编译器开关
双核
向量化
Southeast University
东 南 大 学
18
http://www.njyangqs.com/
多核结构与程序设计
向量化
4x doubles
8x floats
2x dqword
2x doubles
4x floats
1x dqword
16x bytes
AVX***
SSE2
SSE3
SSE4
SSE**
MMX*
8x words
4x dwords
2x qwords
8x bytes
4x words
2x dwords
1x qwords
* MMX使用的是64位的 x87 浮点寄存器作为MMX寄存器;
**SSE, SSE2, SSE3和 SSE4 使用了新的128位的XMM 寄存器;也可用MMX寄存器
19
http://www.njyangqs.com/
寄存器;也可用XMM寄存器,但是不使用MMX寄存器
东***AVX使用了新的256位的YMM
南 大 学
Southeast University
多核结构与程序设计
向量化

SSE3指令
FISTTP
浮点到整数的转换
复数运算
视频编码
ADDSUBPD, ADDSUBPS,
MOVDDUP, MOVSHDUP,
MOVSLDUP
LDDQU
SIMD浮点使用AOS
格式
HADDPD, HSUBPD
HADDPS, HSUBPS
线程同步
MONITOR, MWAIT
* 对复数和向量化都有好处
Southeast University
东 南 大 学
20
http://www.njyangqs.com/
多核结构与程序设计
向量化

使用SSE3 由下面的情况转成…
for (i=0;i<=MAX;i++)
c[i]=a[i]+b[i];
Southeast University
东 南 大 学
A[1]
A[0]
+
not used
+
not used
+
B[0]
B[1]
not used
not used
not used
+
128-bit
notRegisters
used
C[0]
C[1]
not used
not used
not used
21
http://www.njyangqs.com/
多核结构与程序设计
向量化

… 这样的情况
for (i=0;i<=MAX;i++)
c[i]=a[i]+b[i];
Southeast University
东 南 大 学
A[3]
+
A[2]
+
A[1]
+
B[3]
B[2]
B[1]
A[0]
+
128-bitB[0]
Registers
C[3]
C[2]
C[1]
C[0]
22
http://www.njyangqs.com/
多核结构与程序设计
向量化

基于向量化的编译器-特定处理器
使用
Windows*
Linux*
W
/QxW
-xW
P
/QxP
/QaxP
-xP,
-axP
为包含MMX, SSE,SSE2,SSE3,SSSE3
指令的Intel® Core 2 Duo兼容处理器进行优 T
化.
/QxT
/QaxT
-xT,
-axT
能够针对未来的Intel处理器产生使用SSE4
向量化和媒体加速指令的编译器选项。
/QxS
/QaxS
-xS,
-axS
描述
为包含MMX, SSE,SSE2指令的Intel
Pentium® 4兼容处理器进行优化.
®
为包含MMX, SSE,SSE2,SSE3指令的
Intel® Core Duo兼容处理器进行优化.
Southeast University
东 南 大 学
S
23
http://www.njyangqs.com/
多核结构与程序设计
向量化

为什么循环不能向量化
 独立性
 循环迭代一般必须是无关的
 一些相关的限制:
 一些相关的循环能够被向量化
 大多数函数调用不能向量化
 一些有条件分支不能向量化
 循环次数必须是可数的
 嵌套循环的外循环不能被向量化
 混合数据类型不能被向量化
Southeast University
东 南 大 学
24
http://www.njyangqs.com/
多核结构与程序设计
向量化

为什么循环不能向量化
Windows*
-Qvec_reportn
Linux*
-vec_reportn
Macintosh*
-vec_reportn
设置输出到stdout的诊断级别
n=0: 没有诊断信息
n=1: (缺省) 循环成功地被向量化
n=2: 循环没有被向量化–给出原因
n=3: 增加依赖信息
n=4: 只报告没有向量化的循环
n=5: 只报告没有向量化的循环并添加依赖信息
Southeast University
东 南 大 学
25
http://www.njyangqs.com/
多核结构与程序设计
向量化

为什么循环不能向量化
 “存在的向量依赖”
 通常,
循环迭代间明显表现出真实的依赖关系,比
如:
for (i = 0; i < 100; i++)
x[i] = A * x[i + 1];
 定义独立的循环
int a[MAX], b[MAX];
for (j=0;j<MAX;j++) {
a[j] = b[j];
}
Southeast University
东 南 大 学
26
http://www.njyangqs.com/
多核结构与程序设计
向量化

为什么循环不能向量化
 “使用非连续单元的操作”
Memory
for (I=0;I<=MAX;I++)
for (J=0;J<=MAX;J++) {
c[I][J]+=1; // Unit Stride
c[J][I]+=1; // Non-Unit
A[J*J]+=1; // Non-unit
A[B[J]]+=1; // Non-Unit
if (A[MAX-J])=1 last1=J;} // Non-Unit
最终结果:加载向量可能要比执行顺序操作多花费一些周期
Southeast University
东 南 大 学
27
http://www.njyangqs.com/
多核结构与程序设计
向量化

为什么循环不能向量化
 “混合数据类型”
int howmany_close( double *x, double *y)
{ int withinborder=0;
double dist;
for(int i=0;i<MAX;i++) {
dist=sqrtf(x[i]*x[i] + y[i]*y[i]);
if (dist<5) withinborder++;
}
}
混合数据是可能的,但会使问题复杂化
•即: 每个SIMD寄存器含2个双精度数与4个整型数
在特殊类型下有些操作不工作
Southeast University
东 南 大 学
28
http://www.njyangqs.com/
多核结构与程序设计
向量化

为什么循环不能向量化
 “不支持的循环结构”
struct _xx {
int data;
int bound; } ;
doit1(int *a, struct _xx *x) {
for (int i=0; i<x->bound; i++) a[i] = 0;
一个不支持的循环结构意味着循环是不可数,或者编译器
由于某种原因不能构造一个运行时的形成计数表达式
Southeast University
东 南 大 学
29
http://www.njyangqs.com/
多核结构与程序设计
向量化

为什么循环不能向量化
 “包含非向量化语句”
for (i=1;i<nx;i++) {
B[i] = func(A[i]); }
Southeast University
东 南 大 学
A[3]
func
A[2]
func
A[1]
func
B[3]
B[2]
B[1]
30
A[0]
func
128-bit Registers
B[0]
http://www.njyangqs.com/