线程并行化的概念及其用法

许多电影探索了人类只有 100% 充分利用大脑认知能力后才能完成的伟大事情。 尽管大脑利用率仅达到 10% 的说法依然存在,但事实的真相是,日常活动的完成几乎使用人类大脑这一有机整体的每个部分。1 事实上,尽管大脑只占身体重量的 3%,但却消耗 20% 的身体能量。

认为人类存在大量未开发的潜能这一见解非常有吸引力,或许确实存在。 有趣的是,谈到高性能计算 (HPC) 和充分利用目前硬件的强大功能时,我们可以使用休眠处理能力 (dormant processing power) 这一比喻。

那么现在,如果您正阅读该文章并思考如何充分发挥现代 HPC 硬件的潜能,可以考虑更新代码。 为实现最佳性能和长期可持续性,可以考虑采用三个层面的并行编程方法:多线程化、分布式并行化和矢量化。

扩展目前及未来的硬件

如果能够使用多层并行算法以充分利用现代硬件的并行特性,那么您将能够有效地扩展目前及未来的硬件。

“实现代码现代化和更出色的并行化,
显然将成为未来重要的投资领域。”
      英特尔公司首席讲师兼总监 James Reinders

借助多线程化提升软件性能

多线程化(或线程并行化)可为开发人员提供一个良好的入门机会,帮助他们在使用多核处理器时显著提升软件的性能。 借助线程并行化,您可以创建并将线程分布至内核,这意味着您可以构建合作线程,以通过共享内存实现单条进程通信,并共同处理大型任务。 具体而言,如果您能够优化代码以拥有独立计算并使节点容纳数据,那么线程化将有助于提高执行速度并随时维持该代码。

简单的方法是,添加 OpenMP* 编译指示(假设该代码使用 C/C++或 Fortran* 编写而成),使代码的这些部分并行运行。采用这种方案的最常见示例是,通过独立计算越过循环。采用这种方法,程序本身可以生成执行线程,由系统上的多个内核执行以单独运行。如欲共享执行线程之间的数据,只需写入共享内存并从中读取即可。(不过值得注意的一点是,这一部分流程必须小心进行,以确保答案正确并避免出现竞态条件;例如,当一条以上的线程尝试同时访问并更改共享数据。)

面向多台机器上的大型数据集的分布式并行化

相比于分布式并行化(或多节点优化),线程化是一个比较简单的起点。在分布式并行化过程中,相同代码在不同机器上独立运行,并通过消息传递实现数据共享。 使用消息共享数据是算法设计的一部分,必须仔细构建,才能确保不丢失任何数据,并且没有等待不会到达的消息的进程。 分布式并行化非常适用于单台机器无法容纳大型数据集的情况,计算操作可通过分发以处理各数据子集。

计算密集型工作负载矢量化

处理计算密集型工作负载(比如基因组学应用或大型数值计算)时,可以考虑使用矢量化。 在这一过程中,相同计算指令在单个内核中的多个数据段(称为 SIMD - 单指令、多数据)上执行。 这一计算技巧可将计算的执行性能提高一倍、两倍、四倍、八倍...(取决于内核上矢量寄存器的大小)。 即使代码使用线程,也可实现这一性能提升。

多线程化虚拟化可显著提高 GUI 应用的响应能力
CADEX Ltd. 使用多线程化算法成功提升了多核系统的性能。了解操作方法 >

 


 

VIPO 节省时间
了解金融服务设计事业部首席工程师兼经理 Robert Geva 的最佳矢量化实践。了解更多信息 >

 




 

获取构建现代代码所需的工具和资源

英特尔快速参考指南提供了更多关于如何开发多线程化应用的详细信息。

英特尔还提供许多有用资源,帮助您构建现代代码,充分利用各个层面的并行化。 这些有用资源包括培训、代码示例、案例研究、开发人员套件、访问动手实验室网络研讨会,等等。 我们将帮助您发挥代码的最大价值,并掌握代码战略,以充分利用基于英特尔® 的架构。 了解更多有关英特尔现代代码计划的信息

1 “All You Need To Know About the 10 Percent Brain Myth, in 60 Seconds.” wired.com/2014/07/everything-you-need-to-know-about-the-10-brain-myth-explained-in-60-seconds/

有关编译器优化的更完整信息,请参阅优化通知