企业: | 美国国家仪器(NI)有限公司 | 日期: | 2009-05-20 |
---|---|---|---|
领域: | 运动控制 | 点击数: | 654 |
The Challenge: The Solution: "VTune能够监测许多不同种类的构架事件。VTune调谐助手能够给出如何更好使用这些事件的建议。" 为计算Pi 值,我们采用了近似综合技术,需要在单个循环中完成数百万次浮点计算。选择该范例是因为它是CPU 密集型的,并且是可优化的应用。如下所示为外部代码的主循环结构,CPU的主要计算量是处理CalcSum 函数。 for(i=0; i<num_steps; i++) 我们的目标是通过编译器中的优化选项以最快速度完成上述计算。 应用中有4 个函数,均包含于独立源文件中。我们采用不同优化开关来编译每个源文件。如图1 所示。 表1.应用中的函数 “即插即用”的Intel C++ 编译器 默认设置 表2./O2 选项中集成的最优化列表 自动向量化 本范例中,编译器通过\QT 选项生成适合Core 2 构架的代码,编译器报告以下创建时间信息: 注释:循环未作向量化处理 反汇编生成代码后可看到编译器插入了SIMD扩展指令集(SSE)。该指令集的使用直接提升了应用的运行性能,代码运行速度提高了2倍。 这类优化可应用于目前大多数CPU 上,这里我们在Core 2 处理器上运行,当然您也可以在单核或早期CPU 上应用。 自动并行化 在首次运行中,编译器并未显著提高运行性能。通过开启编译器的报告功能,可以看到它并未进行优化。 注释:循环未作并行化处理,循环无需并行化 Intel编译器要对一段代码进行自动并行化时,首先决定是否有值得进行并行化的代码部分。在我们的代码中由一个主循环完成所有工作。编译器不能确定循环的重复次数,循环计数值只有在运行时得到。于是编译器采取谨慎选择,不对循环进行并行化处理。 我们可以通过在命令行输入/Qpar-threshold:n 来进行试探优化,这里n 是介于0(总是并行处理)到100(不进行并行处理)的数,这个值决定了试探优化的程度。 输入/Qpar-threshold:0 后,编译器对代码并行化,并输出报告: 注释:循环已作自动并行化处理 使用该优化后,程序的运行速度比默认设置下提高了近2 倍。 其它优化选项 Intel 编译器同时支持OpenMP 这个基于pragma 的标准,用于实现应用代码的并行化。 测量性能 作为备选,我们还可采用LabVIEW的定时工具,或采用外部工具,如Intel VTune 性能分析器。 VTune能够监测许多不同种类的构架事件。VTune调谐助手能够给出如何更好使用这些事件的建议。 结论 表3.不同优化方式下的速度提高 在应用自动向量化时可达到2.5倍速,该优化专用于非多核处理器,可用于目前多数CPU。 在应用自动并行化后可实现接近2 倍的提速。结合两种优化更可达到4.6 倍。 以上结果是在不修改源代码的前提下实现的。尽管我们选择了模拟应用(计算Pi值),但这类优化技术能够用于各类实际应用。从Intel编译器用户反馈中了解到,使用这些优化方式可显著提高代码执行速度。
|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
1.我有以下需求: | |
|
|
2.详细的需求: | |
* | |
姓名: | * |
单位: | |
电话: | * |
邮件: | * |