使用Intel Thread Profiler查看Parallel.For性能

      Intel Thread Profiler是intel公司发布的一个优化线程的可视化工具。它有助于您了解线程应用的结构,

最大限度提升应用性能。同时可以快速准确找到影响程序执行时间的代码位置。今天的文章就是使用该工具

来对比一下使用Microsoft Parallel Extensions Jun08 CTP 中的Parallel.For与我们平时使用的for语句在

CPU运行时性能参数的一些不同之处。

 

     下面是我们平时使用for方式来遍历集合的例子

1.使用普通的for循环来遍历列表:

 
private   static   void  Ex1Task2_UserForLoop()
{
            EmployeeList employeeData 
=   new  EmployeeList();

            Console.WriteLine(
" Non-parallelized for loop " );

            DateTime start 
=  DateTime.Now;
            Console.WriteLine(
" Payroll process started at {0} " , start);
            
for  ( int  i  =   0 ; i  <  employeeData.Count; i ++ )
            {
                Console.WriteLine(
" Starting process for employee id {0} " ,
                    employeeData[i].EmployeeID);
                
decimal  span  =  PayrollServices.GetPayrollDeduction(employeeData[i]);
                Console.WriteLine(
" Completed process for employee id {0} process took {1} seconds " ,
                    employeeData[i].EmployeeID, span);
                Console.WriteLine();
            }

            DateTime end 
=  DateTime.Now;
            TimeSpan jobTime 
=  end.Subtract(start);

            Console.WriteLine(
" Payroll finished at {0} and took {1} " , end, jobTime);
            Console.WriteLine();
}

 

2.使用并行方式Parallel.For的代码:

private   static   void  Ex1Task2_UseParallelForMethod()
{
            Parallel.For(
0 , employeeData.Count, i  =>
            {
                Console.WriteLine(
" Starting process for employee id {0} " , employeeData[i].EmployeeID);
                
decimal  span  =  PayrollServices.GetPayrollDeduction(employeeData[i]);
                Console.WriteLine(
" Completed process for employee id {0} " , employeeData[i].EmployeeID);
                Console.WriteLine();
            });
}

 

     下面就是两者在intel thread profiler下执行时的性能参数,首先是普遍for循环方式:

 

    这里有必要说明一下图中红框中的四个指标:

    Processor Queue Length:是指处理队列中的线程数。即使在有多个处理器的计算机上处理器时间也会有一个单队列。

不象磁盘计数器,这个计数器仅计数就绪的线程,而不计数 运行中的线程。如果处理器队列中总是有两个以上的线程通常表

示处理器堵塞。这个计数器仅显示上一次观察的值;而不是一个平均值。

    Context Switches per Second:每秒线程切换次数, 在有的书中翻译成上下文切换,实际含义是任务切换,或CPU寄存

器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即CPU寄存器中的全部内

容。这些内容保存在任务的当前状况保存区(Tasks Context Storage area),也就是任务自己的栈区之中。入栈工作完

成以后,就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过

程叫做任务切换。任务切换过程增加了应用程序的额外负荷。CPU的内部寄存器越多,额外负荷就越重。做任务切换所需要的

时间取决于CPU有多少寄存器要入栈。更多的内容参见这篇文章, 还有一篇比较有意思的文章是蔡学庸先生写的,链接在这里

    Privileged Time(CPU内核时间)是在特权模式下处理线程执行代码所花时间的百分比。如果该参数值和"physical

Disk"参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。另外设置Tempdb in RAM,减低"max async IO",

"max lazy writer IO"等措施都会降低该值。

    Processor Time: 指处理器执行非闲置线程时间的百分比。这个计数器设计成用来作为处理器活动的主要指示器。它通

过在每个范例间隔中衡量处理器用于执行闲置处理线程的时间,并且用100%减去该值得出。(每个处理器有一个闲置线程,

该线程在没有其它线程可以运行时消耗周期)。可将其视为范例间隔用于做有用工作的百分比。

 

    下面是使用Parallel.For的运行参数截图:

 

    我们可以对比看一下这四个指标:                                                                      

      Processor Queue Length:普通for循环下是其平均值为1.7,而Parallel.For下是6.9,通过该值可以看出

Parallel.For会生成更多的线程加入到CPU的任务队列之中。

 

     Context Switch/Sec :普遍for循环下是其平均值为7889.6,而Parallel.For下是16966.9。而该值上后

者比前者高出一倍的原因我想主要就是在Processor Queue Length上,因为我记得windowsnt下CPU的每个

时间片的长度是20微秒,而如果CPU当前执行的任务未完成而时间片已用完就会造成Context Switch。而频繁

的切换也是影响系统性能的重要因素之一。(这里我想Parallel.For本身在使用上也不是说只要用了就会有怎么的

速度和性能上的提升,还要看Parallel.For中的代码会不会出现频繁的Context Switch) 。

 

    Privileged Time : 普遍for循环下是其平均值为9.623,而Parallel.For下是21.211。该值也是后者高于前者,

原因我想应该是由于CPU的使用率高了,导致要不断的到内存(或硬盘等外设)中访问操作数据(比如打印结果

到屏幕等),而些操作所耗时间最后是要算在Privileged Time(特权模式是为操作系统组件和操纵硬件驱动程序

而设计的一种处理模式。它允许直接访问硬件和所有内存)中的。

   

    Processor Time: 普遍for循环下是其平均值为11.892,而Parallel.For下是32.161。我想这个结果应该是

我们希望看到了,必定使用 Parallel.For会让我们的CPU"全身心"的投入到工作中,而这最终会让我们的程序运行

的更快,效率更高。

 

    通过本例可以看出,通过Parallel.For可以提升CPU的运行效率(创建多线程),但同时也造成了更多的Context

Switch,而切换的频繁程度与当前任务队列中的线程数量有一定关系。看来在使用Parallel.For时,我们还要考虑

诸如 Context Switch这类因素对程序运行时间的影响,当然也不是所有的应用都适合于Parallel.For这类的并行

开发方式。在进行并行开发时要提升性能也有一些门道,比如在Microsoft Parallel Extensions Jun08 CTP中的

帮助文档中有一篇Performance Tips就介绍了一些"点子"。

 

     Tags:intel thread profiler,性能,线程,并行,Parallel

     原文链接:http://www.cnblogs.com/daizhj/archive/2009/01/07/1371150.html

     作者:代震军,daizhj

     网站主页:http://daizhj.cnblogs.com

 

     Intel Thread Profiler 下载链接,点击这里:)

     Microsoft Parallel Extensions Jun08 CTP 下载链接,点击这里:)

     本文DEMO下载链接: /Files/daizhj/Parallel_Example.rar

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
part 3因为文件很大~ 所以分开压缩了 解压后是镜像概述立刻采用多线程技术,释放多核处理器(包括最新的 64 位四核处理器)系统的卓越性能。英特尔® 线程档案器 3.1 Windows* 版有助于您调整并提高多线程应用程序的运行速度,从而使代码在英特尔® 多核处理器上的性能得到优化。英特尔® 线程档案器可作为独立产品获得。更加完整的性能调试解决方案随 VTune™ 性能分析器 Windows 版提供。特性虚拟化线程应用程序行为:●时间轴视图可帮助理解线程正在执行的操作以及线程之间的交互。●在调用堆栈和源代码中准确定位引发性能问题的确切位置,从而对分析发挥辅助作用。●测量应用有效利用的内核数量,确定实际的并行处理性能英特尔® 线程档案器 3.1 Windows 版同时显示并发视图和时间轴视图,这有助于查看哪部分代码适合并行处理以及应用性能问题源于何处。在图 1 中,对源代码进行了两次修复,每次修复后性能持续提高,通过应用运行时间缩短可以看出这一点。通过英特尔® 线程档案器,开发人员能够在应用中充分利用多核技术。通过双击时间轴视图上的转换进入源代码视图,从而准确查看线程在源代码中进行转换工作的位置发现并行性能问题:●发现影响性能的线程和同步对象●查看线程任务分配,准确定位负载失衡高级线程性能分析功能:●通过 OpenMP* 分析,可以快速确定原型,并估计不同设计的性能潜力●使用关键路径分析有助于将精力集中于比较重要的性能问题上Microsoft Visual Studio* 2005 支持:●支持 Microsoft Visual Studio* 2005 中使用 Microsoft Windows 编译器开发的 C++ 应用程序本版本新增内容支持最新多核处理器:●优化新的英特尔® 酷睿™2 双核处理器以及英特尔® 酷睿™2 四核处理器上的多线程应用程序的性能在 Microsoft Windows Vista* 上安装并运行:●分析在 Microsoft Windows Vista* 上运行的已编译 32 和 64 位应用程序兼容性英特尔线程档案器 3.0 Windows 版兼容现今的行业标准开发工具:Microsoft Visual Studio* 2005Microsoft Visual C++* 编译器 2005、2003、2002 版或 Visual C++ 6.0Microsoft Visual Studio 2005 Express Edition C++ 编译器英特尔® VTune™ 性能分析器 8.0 或更高版本英特尔® Fortran 和 C++ 编译器Windows 线程和 POSIX* 线程英特尔® 线程构建模块支持英特尔® OpenMP*
part 4<br>因为文件很大~ 所以分开压缩了 解压后是镜像<br><br>概述<br><br>立刻采用多线程技术,释放多核处理器(包括最新的 64 位四核处理器)系统的卓越性能。<br><br>英特尔® 线程档案器 3.1 Windows* 版有助于您调整并提高多线程应用程序的运行速度,从而使代码在英特尔® 多核处理器上的性能得到优化。<br><br>英特尔® 线程档案器可作为独立产品获得。更加完整的性能调试解决方案随 VTune™ 性能分析器 Windows 版提供。<br><br>特性<br><br>虚拟化线程应用程序行为:<br><br>●时间轴视图可帮助理解线程正在执行的操作以及线程之间的交互。<br>●在调用堆栈和源代码中准确定位引发性能问题的确切位置,从而对分析发挥辅助作用。<br>●测量应用有效利用的内核数量,确定实际的并行处理性能<br><br>英特尔® 线程档案器 3.1 Windows 版同时显示并发视图和时间轴视图,这有助于查看哪部分代码适合并行处理以及应用性能问题源于何处。在图 1 中,对源代码进行了两次修复,每次修复后性能持续提高,通过应用运行时间缩短可以看出这一点。通过英特尔® 线程档案器,开发人员能够在应用中充分利用多核技术。<br><br>通过双击时间轴视图上的转换进入源代码视图,从而准确查看线程在源代码中进行转换工作的位置<br><br>发现并行性能问题:<br><br>●发现影响性能的线程和同步对象<br>●查看线程任务分配,准确定位负载失衡<br><br>高级线程性能分析功能:<br><br>●通过 OpenMP* 分析,可以快速确定原型,并估计不同设计的性能潜力<br>●使用关键路径分析有助于将精力集中于比较重要的性能问题上<br><br>Microsoft Visual Studio* 2005 支持:<br><br>●支持 Microsoft Visual Studio* 2005 中使用 Microsoft Windows 编译器开发的 C++ 应用程序<br><br>本版本新增内容<br><br>支持最新多核处理器:<br><br>●优化新的英特尔® 酷睿™2 双核处理器以及英特尔® 酷睿™2 四核处理器上的多线程应用程序的性能<br><br>在 Microsoft Windows Vista* 上安装并运行:<br><br>●分析在 Microsoft Windows Vista* 上运行的已编译 32 和 64 位应用程序<br><br>兼容性<br><br>英特尔线程档案器 3.0 Windows 版兼容现今的行业标准开发工具:<br><br>Microsoft Visual Studio* 2005<br>Microsoft Visual C++* 编译器 2005、2003、2002 版或 Visual C++ 6.0<br>Microsoft Visual Studio 2005 Express Edition C++ 编译器<br>英特尔® VTune™ 性能分析器 8.0 或更高版本<br>英特尔® Fortran 和 C++ 编译器<br>Windows 线程和 POSIX* 线程<br>英特尔® 线程构建模块<br>支持英特尔® OpenMP*<br>
Intel.Thread.Profiler.Intel.Thread.Profiler.英特尔_.线程档案器9<br><br><br>因为文件很大~ 所以分开压缩了 解压后是镜像<br><br>概述<br><br>立刻采用多线程技术,释放多核处理器(包括最新的 64 位四核处理器)系统的卓越性能。<br><br>英特尔® 线程档案器 3.1 Windows* 版有助于您调整并提高多线程应用程序的运行速度,从而使代码在英特尔® 多核处理器上的性能得到优化。<br><br>英特尔® 线程档案器可作为独立产品获得。更加完整的性能调试解决方案随 VTune™ 性能分析器 Windows 版提供。<br><br>特性<br><br>虚拟化线程应用程序行为:<br><br>●时间轴视图可帮助理解线程正在执行的操作以及线程之间的交互。<br>●在调用堆栈和源代码中准确定位引发性能问题的确切位置,从而对分析发挥辅助作用。<br>●测量应用有效利用的内核数量,确定实际的并行处理性能<br><br>英特尔® 线程档案器 3.1 Windows 版同时显示并发视图和时间轴视图,这有助于查看哪部分代码适合并行处理以及应用性能问题源于何处。在图 1 中,对源代码进行了两次修复,每次修复后性能持续提高,通过应用运行时间缩短可以看出这一点。通过英特尔® 线程档案器,开发人员能够在应用中充分利用多核技术。<br><br>通过双击时间轴视图上的转换进入源代码视图,从而准确查看线程在源代码中进行转换工作的位置<br><br>发现并行性能问题:<br><br>●发现影响性能的线程和同步对象<br>●查看线程任务分配,准确定位负载失衡<br><br>高级线程性能分析功能:<br><br>●通过 OpenMP* 分析,可以快速确定原型,并估计不同设计的性能潜力<br>●使用关键路径分析有助于将精力集中于比较重要的性能问题上<br><br>Microsoft Visual Studio* 2005 支持:<br><br>●支持 Microsoft Visual Studio* 2005 中使用 Microsoft Windows 编译器开发的 C++ 应用程序<br><br>本版本新增内容<br><br>支持最新多核处理器:<br><br>●优化新的英特尔® 酷睿™2 双核处理器以及英特尔® 酷睿™2 四核处理器上的多线程应用程序的性能<br><br>在 Microsoft Windows Vista* 上安装并运行:<br><br>●分析在 Microsoft Windows Vista* 上运行的已编译 32 和 64 位应用程序<br><br>兼容性<br><br>英特尔线程档案器 3.0 Windows 版兼容现今的行业标准开发工具:<br><br>Microsoft Visual Studio* 2005<br>Microsoft Visual C++* 编译器 2005、2003、2002 版或 Visual C++ 6.0<br>Microsoft Visual Studio 2005 Express Edition C++ 编译器<br>英特尔® VTune™ 性能分析器 8.0 或更高版本<br>英特尔® Fortran 和 C++ 编译器<br>Windows 线程和 POSIX* 线程<br>英特尔® 线程构建模块<br>支持英特尔® OpenMP*<br>英特尔_.线程档案器6
Intel.Thread.Profiler.英特尔_.线程档案器7<br><br><br>因为文件很大~ 所以分开压缩了 解压后是镜像<br><br>概述<br><br>立刻采用多线程技术,释放多核处理器(包括最新的 64 位四核处理器)系统的卓越性能。<br><br>英特尔® 线程档案器 3.1 Windows* 版有助于您调整并提高多线程应用程序的运行速度,从而使代码在英特尔® 多核处理器上的性能得到优化。<br><br>英特尔® 线程档案器可作为独立产品获得。更加完整的性能调试解决方案随 VTune™ 性能分析器 Windows 版提供。<br><br>特性<br><br>虚拟化线程应用程序行为:<br><br>●时间轴视图可帮助理解线程正在执行的操作以及线程之间的交互。<br>●在调用堆栈和源代码中准确定位引发性能问题的确切位置,从而对分析发挥辅助作用。<br>●测量应用有效利用的内核数量,确定实际的并行处理性能<br><br>英特尔® 线程档案器 3.1 Windows 版同时显示并发视图和时间轴视图,这有助于查看哪部分代码适合并行处理以及应用性能问题源于何处。在图 1 中,对源代码进行了两次修复,每次修复后性能持续提高,通过应用运行时间缩短可以看出这一点。通过英特尔® 线程档案器,开发人员能够在应用中充分利用多核技术。<br><br>通过双击时间轴视图上的转换进入源代码视图,从而准确查看线程在源代码中进行转换工作的位置<br><br>发现并行性能问题:<br><br>●发现影响性能的线程和同步对象<br>●查看线程任务分配,准确定位负载失衡<br><br>高级线程性能分析功能:<br><br>●通过 OpenMP* 分析,可以快速确定原型,并估计不同设计的性能潜力<br>●使用关键路径分析有助于将精力集中于比较重要的性能问题上<br><br>Microsoft Visual Studio* 2005 支持:<br><br>●支持 Microsoft Visual Studio* 2005 中使用 Microsoft Windows 编译器开发的 C++ 应用程序<br><br>本版本新增内容<br><br>支持最新多核处理器:<br><br>●优化新的英特尔® 酷睿™2 双核处理器以及英特尔® 酷睿™2 四核处理器上的多线程应用程序的性能<br><br>在 Microsoft Windows Vista* 上安装并运行:<br><br>●分析在 Microsoft Windows Vista* 上运行的已编译 32 和 64 位应用程序<br><br>兼容性<br><br>英特尔线程档案器 3.0 Windows 版兼容现今的行业标准开发工具:<br><br>Microsoft Visual Studio* 2005<br>Microsoft Visual C++* 编译器 2005、2003、2002 版或 Visual C++ 6.0<br>Microsoft Visual Studio 2005 Express Edition C++ 编译器<br>英特尔® VTune™ 性能分析器 8.0 或更高版本<br>英特尔® Fortran 和 C++ 编译器<br>Windows 线程和 POSIX* 线程<br>英特尔® 线程构建模块<br>支持英特尔® OpenMP*<br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值