MyMSDN

MyMSDN记录开发新知道

英特尔® 多线程应用开发指南

http://software.intel.com/zh-cn/articles/intel-guide-for-developing-multithreaded-applications/

英特尔® 多线程应用开发指南

提交新文章

Published On : 
2010年02月25日 20:00

评级

请登录后评级!当前分数: 0 由 0 用户

请登录后评级!当前分数: 0 由 0 用户

请登录后评级!当前分数: 0 由 0 用户

请登录后评级!当前分数: 0 由 0 用户

请登录后评级!当前分数: 0 由 0 用户

目录:


应用线程化

本章节将涵盖并行性能领域的常见主题,同时也会偶尔涉及针对 API 的问题。

1-1 - 预测与测量并行性能

1-2 - 循环修改增强数据并行性能

1-3 - 粒度与并行性能

1-4 - 负载平衡与并行性能

1-5 - 避免或消除人为相依性有利于揭示并行性

1-6 - 任务取代线程工具

1-7 - 发掘有序数据流的数据并行性

同步处理

本章节将主要谈论采用哪些技术来降低同步处理对性能的负面影响。

2-1 - 管理锁争用:大、小关键代码段(Critical Section)

2-2 - 采用线程化 API 提供的同步例程替代手工编码

2-3 - 选择合适的同步原语最大限度减少开销

2-4 - 尽量使用非阻塞锁

内存管理

线程为内存管理开辟了另外一个不容忽视的新空间。本章节将涵盖对于多线程应用至关重要的内存问题。

3-1 - 避免线程之间发生堆冲突

3-2 - 采用线程本地存储减少同步开销

3-3 - 检测线程化应用的内存带宽饱和度

3-4 - 避免并识别线程间伪共享

编程工具

本章节将说明如何利用英特尔软件产品开发、调试和优化多线程应用。

4-1 - 借助英特尔® 编译器实现自动并行

4-2 - 英特尔® 数学核心函数库并行性

4-3 - 线程化与英特尔® IPP 高效多媒体函数库

4-4 - 使用英特尔® Parallel Inspector 查找基于 OpenMP* 的多线程代码中存在的竞态条件

4-5 - 采用英特尔® Parallel Amplifier 解决线程不平衡问题

4-6 - 采用英特尔® Parallel Composer 编写并行执行代码

2010 年 3 月 9 日,位于英特尔® 软件网络上的并行编程社区发布了一系列技术文章,旨在为软件开发人员提供应用线程化、同步处理、内存管理和编程工具领域的最新技术信息。我们期待看到您提出自己的想法和建议,希望您能参与英特尔® 并行架构线程化论坛的讨论,提出您的疑问。

1.1 动因

《英特尔® 多线程应用开发指南》的目标是为开发人员在基于英特尔® 架构的对称多处理器(SMP)和/或支持英特尔® 超线程(HT)技术的系统上,开发高效多线程应用提供一些有用的指导。应用开发人员可以在本文建议下提高当前及未来支持英特尔® 处理器的 SMP 架构上的多线程处理性能,最大限度减少意外出现的性能故障。

本指南针对如何改进多线程性能提供了各种建议。文中有意保留了通过优化硬件提高线程性能的方法。但在本指南的更新版中将涵盖此硬件优化法,为那些愿意牺牲可移植性换取更高性能的开发人员提供一个参考。

1.2 前提条件

读者应具备使用高级编程语言(最好是 C、C++ 和/或 Fortran)编程的经验,尽管本文所提供的许多建议同样适用于 Java、C# 和 Perl 等编程语言。同时,读者还必须了解基本并行编程知识,熟悉一种以上线程化方法,最好是 OpenMP*、POSIX 线程(又名 Pthreads)或 Win32* 线程化 API。

1.3 适用范围

本指南的主要目的是为开发人员在英特尔® 平台上开发多线程应用提供快速设计和优化参考指导。本文不应用作多线程教材,也不是向英特尔平台实施迁移的指南。

1.4 结构

《英特尔® 多线程应用开发指南》涵盖从适用于所有多线程方法的一般性建议到英特尔® 软件产品在应对 API 有关问题时的使用指南在内的各类主题。涉及每个主题的文章之间互相独立,可用作单独的参考文章。所有主题可分为四类:应用线程化、同步处理、内存管理与编程工具。尽管每个主题是对各个关键线程问题的独立探讨,这些主题之间却会形成内容互补。读者可以在阅读这一系列文章时交叉参考相关主题。

1.5 作者与编者

参与《英特尔® 多线程应用开发指南》的撰稿、审核以及编辑工作的英特尔工程师和技术专家如下:Henry Gabb、Martyn Corden、Todd Rosenquist、Paul Fischer、Julia Fedorova、Clay Breshears、Thomas Zipplies、Vladimir Tsymbal、Levent Akyil、Anton Pegushin、Alexey Kukanov、Paul Petersen、Mike Voss、Aaron Tersteeg 和 Jay Hoeflinger。

1.6 并行编程人员有关本指南的意见

Tom Spyrou's在以编程工具为主题的文章《采用英特尔® Parallel Amplifier 解决线程不平衡问题》中提出了 有关如何优化线程间工作任务分配的建议,并在《检测线程化应用的内存带宽饱和度》中分享了他在发现主内存带宽导致程序瓶颈时的检测经历

Dmitriy Vyukov 在《避免并识别线程间伪共享》中提出了有关伪共享的想法

Asaf Shelly 在《避免线程间出现堆争用情况》中探讨了如何通过为每条线程分配属于自己的堆来正确实施内存分配

Clay Breshears 撰写了一篇与《粒度与并行性能》有关的文章《吹雪的艺术》。

-----------------------------华丽分割线-----------------------------

第一章、应用线程化

本章节将涵盖并行性能领域的常见主题,同时也会偶尔涉及针对 API 的问题。

-----------------------------华丽分割线-----------------------------

预测和测量并行性能

提交新文章

Published On : 
2010年02月27日 20:00

评级

请登录后评级!当前分数: 0 由 0 用户

请登录后评级!当前分数: 0 由 0 用户

请登录后评级!当前分数: 0 由 0 用户

请登录后评级!当前分数: 0 由 0 用户

请登录后评级!当前分数: 0 由 0 用户

摘要

构建软件的并行版本可使应用在更短的时间内运行给定数据集,在固定时间内运行多个数据集,或运行非线程软件无法运行的大型 数据集。 并行化的成功通常通过并行版本相对于串行版本的加速比来量化表示。 除了这种比较之外,将该加速比与可能的加速比 上限进行比较也十分有用。 这一点可使用阿姆达尔定律和古斯塔夫森定律做到。
本文是《英特尔® 多线程应用开发指南》系列的一部分,后者用于指导开发人员针对英特尔® 平台开发高效的多线程应用。

背景

应用运行的速度越快,用户等待结果所需的时间越短。此外,执行时间的缩短使用户在可接受的时间内能够运行更大规模的数据集 (例如,更多的数据记录,更多的像素,或更大的物理模型)。串行与并行执行时间之间一个具体的比较指标便是加速比 (speedup)
简单来说,加速比是串行执行时间与并行执行时间的比率。例如,如果串行应用运行需 6720 秒, 对应的并行应用运行需 126.7 秒(使用 64 个线程和核心),则并行应用的加速比是53X (6720/126.7 = 53.038)。
对于扩展良好的应用,加速比增加的速度应与核心(线程)数量增加的速度相同或接近。当增加使用的线程数时,如果测量的加速 比不能维持不变或开始下降,那么就测量的数据集,该应用的扩展性不够理想。如果该数据集是典型的实际数据集,而应用将在此 之上执行,那么该应用的扩展性能则不理想。
与加速比相关的另一个指标是效率(efficiency)。正如加速比 是衡量并行执行比串行执行快多少的指标,效率表示的是软件对系统计算资源的利用程度。要计算并行执行的效率,只需将观察到 的加速比除以使用的核心数,然后将得到的数值以百分数表示即可。例如,加速比为53X, 使用 64个核心,那么效率就等于82% (53/64 = 0.828)。这意味着,在应用执行过程中,平均每个核心大约有17% 的时间处于闲置状态。
阿姆达尔定律
在启动一个并行化项目前,开发人员会希望预估他们能够实现的性能提升量(加速比)。如果知道(或预估出)能 够以并行方式执行的串行代码的百分数,那么开发人员可使用阿姆达尔定律计算应用的加速比上限,无需实际编写任何并发代码。 本系列介绍了阿姆达尔定律公式的几种变形。每种变形均使用并行执行时间 (pctPar) 、串行执行时间 (1 - pctPar) 和线程/核心 (p) 的百分数(建议)。下面是一个简单的阿姆达尔定律公式,用于评估基于 p 个核心的并行 应用的加速比。

image

该公式只是串行时间(标准化为 1)与预估的并行执行时间的简单相除,使用标准化的串行时间的百分数。并行执行时间表示为串 行执行的百分数 (1 - pctPar)加上能够以并行方式执行的百分数与所用核心数 (pctPar/p)的除数。例如,如果 95% 的串行应用运行时间可以在 8 个核心上以并行方式执行,根据阿姆达尔定律,预估的加速比等于6X (1 / (0.05 + 0.95/8)= 5.925)。
除了在公式中的小于或等于关系 (≥),阿姆达尔定律公式假设这些能够以并行方式执行的计算可被无限核心 数整除。这一假设实际消除了分母中的第二项,意味着最大的加速比即是剩余串行执行百分数的倒数。
因为忽略了实 际开销,例如通信、同步和其它线程管理,以及无限核心处理器的假设,阿姆达尔定律一直饱受批评。除了没有考虑并发算法固有 的开销,对阿姆达尔定律最强烈的批评之一是,随着核心数量的增加,处理的数据量也可能会增加。阿姆达尔定律假设不论核心数 量如何,数据集大小均为固定,并且整体串行执行时间保持不变。
斯塔夫森定律
如果使用 8 核 的并行应用能够计算的数据集是原始大小的 8 倍,串行部分的执行时间会增加吗?即使有增加,它也并非与数据集的增加同比例增 长。实际数据显示串行执行时间几乎保持不变。
斯塔夫森定律又被称为扩展的加速比(scaled speedup),它 考虑了数据大小与核心数量成比例的增加并计算应用的加速比(上限),假设大数据集能够以并行方式执行。扩展的加速比公式如 下:

image

与阿姆达尔定律公式相同,p 代表核心数量。为简化表述,对于指定的数据集大小,s 代表并行应用中的串行执行时间的百 分数。例如,如果在 32 个核心上 1% 的执行时间用于串行执行,对于同一数据集,基于单个核心和单个线程运行的应用的加速比 是:

image

现在来考虑阿姆达尔定律基于这些假设估计的加速比。假设串行执行的百分比是 1%,阿姆达尔定律等式得出 1/(0.01 + (0.99/32)) = 24.43X。这是个错误计算,因为给定的串行时间百分数与 32 核心执行有关。该示例没有指出对于更多或更少的核心 (甚至只有一个核心),对应的串行执行百分数将是多少。如果代码扩展完美,并且数据大小与核心数同时扩展,那么该百分数能 够保持不变,