基于 Intel 多核处理器平台的多线程开发

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#pragma omp parallel for schedule(static, 8) for( int i = start; i <= end; i += 2 ) { if( TestForPrime(i) ) globalPrimes[InterlockedIncrement(&gPrimesFound)] = i; ShowProgress(i, range); }
英特尔多核平台
• 处理器已经进入多核时代
– 服务器、台式机、笔记本均以多核为主
• 多核对应用程序的挑战
– 如何将多核的性能优势充分发挥出来
• 英特尔软件工具可以大大加速在英特尔多 核平台上提升基于Windows操作系统的程 序性能
本次课程内容包括
• 英特尔多核平台 • 英特尔软件工具概览 • 范例
串行 并行
串行
31
Thread Profiler (Explicit Threads)
LVesrys Active
性能
• 前面的实现有潜在的同步调用 • 由于context切换限制了性能的提升
需要返回到设计阶段
性能
void ShowProgress( int val, int range ) {void ShowProgress( int val, int range )
– 英特尔编译器、性能库(IPP、MKL)
• 生成或内含针对英特尔多核平台的性能最优代码
英特尔软件工具(续)
• 英特尔软件工具充分支持基于IA多核平台的 Windows操作系统
• 英特尔编译器、VTune等软件工具已经与微 软Visual Studio系列紧密结合,安装时可以 在Visual Studio中安装插件,方便使用
Baseline measurement
采用OpenMP线程化
• Fork-join 模式: • 主线程根据需要产生一组子线程 • 串行程序演变成并行程序
主线程
并行区域
修改原串行程序
• #pragma omp parallel for

for( int i = start; i <= end; i+= 2 ){

ShowProgress(i, range);

}
• #pragma omp critical
需要为这些变量引用 设置临界区
•{

gProgress++;

percentDone = (int)(gProgress/range *200.0f+0.5f)
•}
修改完毕
• 结果正确,但性能只有~1.33X
例子:生成质数
i factor
32 52 7 23 9 23 11 2 3 13 2 3 4 15 2 3 17 2 3 4 19 2 3 4
bool TestForPrime(int val) { // let’s start checking from 3
int limit, factor = 3; limit = (long)(sqrtf((float)val)+0.5f); while( (factor <= limit) && (val % factor) )
factor ++;
return (factor > limit); }
void FindPrimes(int start, int end) {
int range = end - start + 1; for( int i = start; i <= end; i += 2 ) {
if( TestForPrime(i) ) globalPrimes[gPrimesFound++] = i;
基于 Intel 多核处理器平台的 多线程开发
王然 微软认证讲师 wangran@itgoldenbridge.com
点击添加MSN机器人小新 为您收听下载MSDN中文网络广播课程加油助力!
本次课程内容包括
• 英特尔多核平台 • 英特尔软件工具概览 • 范例
议程
• 英特尔多核平台 • 英特尔软件工具概览 • 范例
ShowProgress(i, range); } }
英特尔编译器
• 自动并行化和多线程处理,支持多线程 (OpenMP2.0 +)
• 矢量化处理 • 自动的CPU识别,支持针对各种CPU性能
特性的特殊优化 • 过程间优化IPO (Inter-procedural
optimization) • 背景指导优化PGO (Profile-guided
英特尔软件工具
• 充分发挥英特尔多核平台的性能优势
– 支持英特尔最新的多核平台 – 与微软Windows操作系统紧密配合
• 方便多核环境下编程
– 英特尔VTune,Thread Check, Thread Profiler, Threading Building Block
• 针对多线程编程的调试和调优
globalPrimes[gPrimesFound++] = i;

ShowProgress(i, range);
确定} 最}消耗时间的代码段
调用图分析
需要线程化的层次
用于找到在调用树中适合多线 程化的层次
分析
• 在哪里优化 – FindPrimes()
• 所选择的区域是否值得优化?
– 很少的依赖关系 – 可采用数据并行 – 占用 95% 的运行时间

if( TestForPrime(i) )
••OpenMPShowgPlroobgarlePsrsi(mie,sr[agnPgr分ei)m解;esFfoournd循++]环= i;

}
为并行区域产生线程
英特尔多线程工具
• Intel Thread Checker
– 识别多线程应用的编程错误 • 数据竞争 • 死锁 • 遗弃的锁 • 线程停滞 • API 使用错误 • 其它错误
• 运行,测试 return (factor > limit); }
• PrimeSingvloeid F<insdtParirmte>s(i<ntesntdar>t, int end)
{
// start is always odd
int range = end - start + 1;

Usage: ./PrimfeorS(iifin(ntgTielset=F1osrtPa1rrit0m;e0(ii0)<=0)0en0d; i+= 2 ){
Thread 2 789 factors to test 623759
Thread 3 934 factors to test 873913
解决负载不均衡的问题
• 更平均地分配任务
void FindPrimes(int start, int end) {
// start is always odd int range = end - start + 1;
Intel® Thread Checker
Intel® Thread Profiler, Intel® VTune™ Analyzers
应用架构分析 多线程、并行编程
查错 性能优化
本次课程内容包括
• 英特尔多核平台 • 英特尔软件工具概览 • 范例
以生成质数为例使用英特尔软件 工具在多核平台上进行性能优化
}
最终对比分析
Baseline = 1X Imbalanced = 1.40X
Balanced = 1.80X
多线程编程需要不断重复软件开发的过程
其他本示例中没有提及的英特尔软件工具
• Intel Threading Building Block
} if( percentDone % 10 == 0 && lastPercentDone < percentDone / 10){ printf("\b\b\b\b%3d%%", percentDone); lastPercentDone++;
} } 在显示进度的时候,这种方式需要不断的update
• 这是我们希望的最好结果吗?
常见的性能问题
• 并行开销
– 线程创建,调度等 …
• 同步
– 过度使用全局变量,对同步变量的竞争
• 负载不平衡
– 不恰当的并行任务分配
• 粒度
– 不够有效的并行任务
29
Thread Profiler for OpenMP
30
Thread Profiler for OpenMP
• Intel Thread Profiler
– 分析线程性能,识别并行处理的性能问题
• Intel Threading Building Block
– C++库来加速多线程化开发,提升性能
正确性调试
• 线程实现正确么? • No! 每次的结果都不一样
正确性调试
• Intel® Thread Checker 可以指出 常见的多线程编程错误 ,比如:数据冲突,stalls ,死锁
optimization)
英特尔编译器(续) • ICL —— Windows平台上的Intel Compiler
编译器 • ICL可以集成在Visual Studio中
从MS编译器切换到ICL
VTune性能分析器
• 以可视化的方式测量系统的资源如内存,CPU,磁 盘和网络带宽的利用率,确定系统的瓶颈
– 可以结合在微软Visual C++ 6.0, Visual Studio 2003, Visual Studio 2005, Visual Studio 2008等
英特尔软件工具(续)
Intel® VTune™ Analyzers
Intel® Compilers +OpenMP, Intel® Performance Libraries (MKL, IPP, …) Intel® Threading Building Block
• 以可视化的方式测量应用程序各个模块和功能 的执行时间,确定应用的瓶颈
• 判断运行的模块如何影响彼此的性能. • 判断应用中资源消耗最多的功能调用和调用的
顺序. • 判断应用程序在处理器上的执行情况,以识别系
统微架构的性能瓶颈
VTune性能分析器
• 集成在Visual Studio里的VTune性能分析器
Pr来自百度文库mes.exe
VTune™ Performance Analyzer
Intel® Thread Checker
Binary Instrumentation
Primes.exe
(Instrumented)
Runtime Data
Collector
+DLLs (Instrumented)
threadchecker.thr (result file)
{ int percentDone; sitnatticpericnetntlDaosnteP;ercentDone = 0;
#pragmgaProogmrpescsr+i+t;ical {percentDone = (int)((float)gProgress/(float)range*200.0f+0.5f); gProgress++; if(peprecrecnetnDtoDnoene= %(i1n0t)(=(=fl0oa)t)gProgress/(float)range*200.0f+0.5f); } printf("\b\b\b\b%3d%%", percentDone);
启动VTune
VTune采样分析
bool TestForPrime(int val) { // let’s start checking from 3
int limit, factor = 3;
• 使用编译器编译lim并it 用= (VloTngu)(nsqert采f((样floa来t)v查al)找+0.5热f);点 while( (factor <= limit) && (val % factor)) factor ++;
正确性调试
• #pragma omp parallel for

for( int i = start; i <= end; i+= 2 ){需要为这些变量引用

if( TestForPrime(i) )
设置临界区
• #pragma omp critical

globalPrimes[gPrimesFound++] = i;
修改解决了同步竞争的问题
34
Thread Profiler for OpenMP
我们再来看一下四个线程时的 情况
35
四个线程示例
250000 500000 750000 1000000
Thread 0 342 factors to test 116747
Thread 1 612 factors to test 373553
相关文档
最新文档