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

原文链接

许多电影探索了人类只有 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/

时间: 2024-11-08 19:21:36

线程并行化的概念及其用法的相关文章

java多线程(1) 线程的基本概念

一.线程的基本概念: 线程是一个程序里面不同的执行路径. 程序里面不同的执行路径,每一个分支都是一个线程. 进程:静态的概念.机器上的一个class文件,机器上的一个exe文件,这叫一个进程. 机器里面实际上运行的都是线程. window等.linux等都是多进程,多线程的系统. CPU的执行是这样的: CPU速度比较快,一秒钟算好几亿次,它把自己的时间分成一个一个的小时间片,这个时间片我执行你一会,再执行他一会,虽然有几十个线程, 没关系,执行这个一会,执行那个一会,挨着排的都执行一遍,但是对

OC学习篇之---协议的概念和用法

这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了,当然这个活在Java5.0之后,被注解替代了,因为注解就是为了此功能诞生的. 协议就是定义了一组方法,然后让其他类去实现 下面来看代码: WithProtocol.h [objc] vi

Java深度历险(三)——Java线程?:基本概念、可见性与同步

开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于Java来说,在语言内部提供了线程的支持.但是Java的多线程应用开发会遇到很多问题.首先是很难编写正确,其次是很难测试是否正确,最后是出现问题时很难调试.一个多线程应用可能运行了好几天都没问题,然后突然就出现了问题,之后却又无法再次重现出来.如果在正确性之外,还需要考虑应用的吞吐量和性能优化的话,就

线程的基本概念和操作

一:线程的基本概念 1.      调用run()方法 public class Demo1 { publicstatic void main(String[] args) { Thread1th1=new Thread1("线程A"); Thread1th2=new Thread1("线程B"); th1.run(); th2.run(); } } class Thread1 extends Thread{ privateString name; publicTh

PLSQL_Material View物化视图的基本概念和用法(概念)

2014-06-08 BaoXinjian 1. 用法 物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表. 物化视图存储基于远程表的数据,也可以称为快照.对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的. 如果你想修改本地副本,必须用高级复制的功能.当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取. 对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图. 实现两个数据库之间的数据同步,可以存在时

在Java 线程中返回值的用法

http://icgemu.iteye.com/blog/467848 在Java 线程中返回值的用法 博客分类: Java Javathread 有时在执行线程中需要在线程中返回一个值:常规中我们会用Runnable接口和Thread类设置一个变量:在run()中改变变量的值,再用一个get方法取得该值,但是run何时完成是未知的:我们需要一定的机制来保证. 在在Java se5有个Callable接口:我们可以用该接口来完成该功能: 代码如: Java代码   package com.thr

深入理解正则表达式环视的概念与用法

在<深入理解正则表达式高级教程-环视>中已经对环视做了简单的介绍,但是,可能还有一些读者比较迷惑,今天特意以专题的形式,深入探讨一下正则表达式的环视的概念与用法. 深入理解正则表达式环视的概念与用法 一.环视的概念 (一)环视概念与匹配过程示例 示例一:简单环视匹配过程 (二)什么是消耗正则的匹配字符? 示例二:一次匹配消耗匹配字符匹配过程 示例三:多次匹配消耗匹配字符匹配过程 二.环视的类型 (一)肯定和否定 (二)顺序和逆序 · 两种类型名称组合 · 四种组合的用法 四种组合正则与环视的摆

GIT基本概念和用法总结【转】

在日常使用GIT过程中,经常会出错,比如无意间丢失了未提交的数据,回退版本时丢失了工作目录,等等.经过思考发现,所有这些错误都是因为对GIT中一些基本的概念模糊而导致,因为对一些基本概念不清晰,导致对GIT每一条命令将会产生的结果不符合预期.下面我就梳理以下我经常碰到的问题相关的基本概念. 1. Working Directory(工作目录) Git的工作目录是保存当前正在工作的文件所在的目录,和working tree是相同的意思.在这个目录中的文件可能会在切换branch时被GIT删除或者替

(转载)OC学习篇之---协议的概念和用法

在前一篇文章中我们介绍了OC中类的延展,这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了,当然这个活在Java5.0之后,被注解替代了,因为注解就是为了此功能诞生的. 协议就是定义了一组方法,然后让其他类去实现. 下面来看代码: Wit