帖子位于 "并行计算" 分类 RSS

请与我们分享您关于线程的方法和意见,不论是游戏还是财务服务应用,欢迎您畅所欲言。请记住:多核总比单核好哦!

OpenMP 概述

作者: xwebsite (2 篇文章) 日期: 五月 7, 2012 在 6:19 下午
评论 (0)

根据计算平台和规模的不同,并行计算可以分为两种:第一种是基于单一计算机系统的多核处理器或多处理器进行多线程并行计算,采用共享存储的方式,主要的标准有OpenMP,如下左图所示;第二种就是基于多台计算机组件的集群(Cluster)计算系统进行并行计算,采用消息传递方式,主要的标准有MPI,如下右图所示。本文将主要介绍多线程方式的并行计算。 首先来了解一下单核处理器上程序运行方式,系统中包括操作系统和应用程序等都以进程(Process)形式存在,当程序结束时这个进程也就跟着消亡。每个进程中至少包含一个线程(Thread),一个线程用于完成程序的某个功能,一个程序中一般都包含多个线程,所有的这些线程在系统中都成队列形式。对于一个核心的处理器来说,某一时刻,它只能处理一个线程。这个线程处理之后就处理下一个线程,依次循环处理。由于CPU的主频都非常高,如Intel的奔四可到3GHz,所以每个线程处理的时间都非常短,以致我们并不会察觉。但是它们实际上是以串行的形式在CPU上运行。所以在物理上,对于单核处理器来说,是无法实现物理上的并行。在单核处理器上,即使使用多线程来分发程序,但实际上还是以单线程的形式在运行。 如果将执行核增加一个,那么在同一时刻,将会有两个线程在运行,这样将会在一定程度上提供计算机的运行速度,但对于某些单线程的程序过程来说,实际情况并没用得到改善。至于系统中的线程怎么分发到两个核上,这就是操作系统的任务了。很多应用程序都不止包含一个线程,一般都包含有多个线程,如用Spy++工具查看系统所有的线程,如下图所示: 这多个线程如果在一个执行核上运行,它们呈一个队列来执行。如果在两个执行核上运行的话,它们将呈两队来执行。如果某个程序中包括有四个线程,而这四个线程又分别在两个核上执行,那么执行该程序将节约一半的时间。但如果该程序是单线程,无论是单核还是多核,运行该程序所需的时间都将是一样的。所以,以前有人在某单线程程序中将一些程序分开放在两个线程中分别执行,效率得到了提高,节约将近一倍的时间,其原因就在此。 OpenMP提供的就是一个多线程编程标准,现在.Net平台也提供了并行编程的System.Threading.Tasks.Parallel类,可以使多个线程能够同时执行。如果直接采用多个线程去实现并行,需要经常处理线程或线程池,采用这些多线程编程标准可以简化并行开发,也不必直接处理线程或线程池。 在C/C++中采用OpenMP指令的格式如下: #pragma omp … 关键字omp表示这个指令是OpenMP指令,所以它会被OpenMP编译器处理,其他非OpenMP编译器将不会理会。由于OpenMP指令都预先定义了,所以很容易被识别出来。这样程序员编写的并行代码就可以在不同的平台上运行。如果平台不支持并行,也会直接跳过并行指令把程序当作串行程序来运行。 OpenMP提供了两种控制并行的结构:第一种就是提供了一个用于创建多线程程序的指令,这些线程相互之间是并行的,这个指令实际上就是创建了一些线程去执行并形体中的程序;第二种就是对已存在的并行结构进行分工的指令,像循环中的do指令(Fortran)或for(C/C ++)。 一个OpenMp程序通常都是从一个单线程程序开始,我们通常把这个单线程程序叫做主线程(Master Thread),在主线程的程序中应该要包含整个程序中需要使用的数据变量,包括全局变量。当主线程遇到并行结构时,将会创建新的线程来执行并形体中的程序。每个线程都会独立的执行并形体中的程序,相互之间不会影响,但是它们之间可以共用主线程里面定义的全局变量。在并行过程中具体哪些变量是共享的、哪些变量是线程私有的,可以通过条件clauses(…)对每个变量进行指定,这些条件用于并行线程中决定哪些可用。一个变量可以有三种类型,即shared、private和reduction。其中shared表示在并行结构中将有一个单独的内存位置来存放这个变量,所有的并行线程都可以使用这个变量,所有的并行线程将共享这块内存地址,因此,线程间的通信通过普通的读写操作方式就可以实现,当然,这个变量也可以随意被任何一个线程修改。相反,private变量将会有多个内存地址,每个线程里面一个。这个变量的所有读写操作都只限于本线程,其他线程是无法访问本线程中该变量的内存地址的。所以,一般都用于定义临时变量。reduction就有点难理解了,它具有shared和private的特征,就像它的字面意思一样,reduction属性用于需要下降的变量(指值的减少)。Reduction操作在很多程序中都非常重要,最常见的例子就是计算并行结构中最后的临时局部变量的总和。除了这三种之外,OpenMP还提供了许多其他数据属性参数。 多个OpenMP线程之间可以采用共享变量(shared)通过简单的读写操作来进行通信,但是这需要在多个线程中协调一致。如果协调不一致,可能会出现多个线程同时修改这个变量,或者这个线程正在读而那个线程又正在写,这些潜在的冲突都将导致数据的错误,因此,在多线程中必须避免这种情况,必须明确地协调好。在并行程序中设置同步(synchronization)就可以协调这些执行的多线程。最常见的两种情况就是相互排斥和事件同步,互斥就是在这段代码中通过一个线程不让其他线程读取这个共享变量。当很多线程正在修改同一个变量时,为了确保这个变量值是对的,在修改之前就需要进行互斥存取。OpenMP中提供了一个critical指标来表示互斥。事件同步常用于表示多线程间的事件,最简单的形式就是barrier阻塞。在并行程序中barrier指标表示在某点处每个线程都在这等待其他的线程也运行到这里,一旦所有的线程都达到这个点后,它们又继续执行。就像跑步的时候,有的人跑得快,有的人跑得慢,在跑了两圈的时候,所有人都在这里等待最后一个人,当最后一个人也跑到两圈的时候,然后大家又接着继续跑,这个过程就称为barrier阻塞。barrier指令能保证所有线程都执行了在barrier之前的代码。 一个典型的并行程序结构如下图所示: OpenMP API是一套非常简便的共享存储并行计算应用程序接口,它是一个多线程、共享存储的模型。线程间通过共享的变量进行交换,并可以通过线程同步来防止数据冲突,当然,同步是需要耗费很多的资源的,所以尽量减少同步的需要。

继续 ›

分类: 博客征文专栏, 并行计算, 软件开发工具

并行数目与并形体对运行效率的影响

作者: xwebsite (2 篇文章) 日期: 五月 7, 2012 在 6:18 下午
评论 (0)

接下来再做一个测试,将并行和串行的循环次数设置为100,即将上例的main函数中: for(int i = 0; i < 10000;i++) 更改为: for(int i = 0; ...

继续 ›

分类: 博客征文专栏, 并行计算

为什么你不能收集OFFCORE_相关的事件样本?

作者: Peter Wang (Intel) (41 篇文章) 日期: 三月 24, 2012 在 10:03 上午
评论 (0)

VTune™ Amplifier XE 性能分析工具可以使用处理器的性能计数器采集样本,进而对事件(如缓存不中,分支误测,写缓冲满等)高频发生的代码进行优化,以提高程序的整体性能。  可是当我们使用事件OFFCORE_RESPONSE.ANY_REQUEST.LLC_MISS_LOCAL.DRAM_0 和 OFFCORE_RESPONSE.ANY_REQUEST.LLC_MISS_LOCAL.DRAM_1 希望得到第三层缓存不中的情况, amplxe-cl -collect-with runsa -knob ...

继续 ›

分类: 并行计算, 英特尔® 软件网络 2.0
标签:

MFC 中的多线程(Work线程)

作者: yongsheng123 (1 篇文章) 日期: 三月 22, 2012 在 5:28 下午
评论 (0)

MFC中的线程分为两种,我用到的是Work线程,主要用于后台计算等等,不用和用户交互。 (1)首先,在需要建立多线程的那个类的实现文件 *.cpp中,定义以下全局变量, struct threadInfo //一个信息结构体 { depthDlg* DlgHandle;//对话框的指针,用于传入参数 }; threadInfo Info; //定义一个结构体变量 UINT Thread_Kincet(LPVOID lpParam); //多线程函数 其中,第一个threadInfo ...

继续 ›

分类: 博客征文专栏, 并行计算

多线程伪共享 (false sharing) 问题分析

作者: realxie123 (1 篇文章) 日期: 三月 22, 2012 在 12:29 下午
评论 (1)

在多核的CPU架构中,每一个核心core都会有自己的缓存空间,因此如果一个变量如果同时存在不同的核心缓存空间时,就会出现伪共享(false sharing)的问题。 此时如果一个核心修改了该变量,该修改需要同步到其它核心的缓存。 在linux执行cat /proc/cpuinfo 来查看cpu的缓存的行大小: cache_alignment : 64, 在目前的Intel处理器中cache是64B对齐的,因此K * 64与(K + 1) ...

继续 ›

分类: 博客征文专栏, 并行计算

Intel MKL 多线程设置

作者: Chao Y (Intel) (4 篇文章) 日期: 三月 20, 2012 在 2:58 下午
评论 (1)

对于多核程序,多线程对于程序的性能至关重要。 下面,我们将对Intel MKL 有关多线程方面的设置做一些介绍: 我们提到MKL 支持多线程,它包括的两个概念: 1>MKL 是线程安全的: MKL在设计时,就保证它是一个线程安全的库函数。 也就是说,无论是在单个线程中调用MKL函数,还是在多个线程中同时使用Intel MKL 函数,都能够确保函数有正确的计算结果。 2>MKL函数内部实现了多线程优化。许多MKL的函数,已经包括内部多线程的实现。用户调这些函数时,只需设置多线程的数目,MKL ...

继续 ›

分类: 并行计算, 软件开发工具

并行计算性能测试

作者: ilaotu (1 篇文章) 日期: 三月 20, 2012 在 1:24 下午
评论 (0)

背景:现在需要A/B/C三个分数,然后我们再利用三个分值算出一个总分。原来的方式是一台服务器顺序计算出A/B/C,最后算出总分,此时的计算耗时约为A+B+C+ABC,(ABC为对ABC进行求和的运算);现在为提高整体计算的效率,采用并行计算,如果要计算总分,就把A/B/C的计算需求由主机同时分发给三台服务器,待三台服务器运算出结果后返回给主机,然后主机根据三台服务器的返回结果算出部分,此时的计算耗时约为max(A,B,C)+ABC,(忽略网络耗时)。 功能性的测试在这不作说明,重点关注性能测试中的负载均衡和信息准确性。 比方现在有四台服务器,SD,SD1,SD2,SD3,SD做为主机,而SD1,SD2,SD3作为分发机器。现在有如下关注点:1、SD分发给SD1,SD2,SD3是否均衡。2. SD同时大规模并发时,信息是否准确,线程池是否混乱。 本次使用TESTNG进行性能测试,(大家也可以选择LR及jmeter,本次是只想对校验负载均衡和校验数据准确性,并非计算服务性能曲线,所以选择TESTNG) 开始时我使用了TESTNG的标签,来指定invocationCount = 10000和threadPoolSize = 20,这两个参数的意思是一共调用服务10000次,而线程池一共20个,因此平均下来每个线程调用500次。 关注点一、查看分发是否均衡。因为有三个节点A/B/C需要进行运算,因此如下设计:1.一台主机3台分发机器,运行上述脚本,然后进入logs/sofa/sofa-sal-digest.log目录,统计每台服务器的调用情况,查看是否均衡。2.一台主机4台分发机器,查看负载是否均衡。3.一台主机2台分发机器,查看负载是否均衡。4.一台主机,1台分发机器,查看负载是否均衡。5.一台主机,没有分发机器,查看负载情况。 关注点二、信息准确性,大量并发时信息是否混乱。准备了十组数据,对应十组期望值,然后利用随机数,随机选取一组数据进行查询,对比查询到的结果是否准确。服务器使用情况同上。 关注点三、持续不断的并行计算时,信息是否准确。使用TESTNG的标签进行并发调用时,总共执行invocationCount=10000次,这样足够猛,但是不够持久。如果想长时间的运行,就得把这个值设置的很大,但是受限于我们的机器和网卡,机器运行会越来越慢。因此考虑自己单独启线程,然后死循环去调用,就是小剂量不停歇的去调服务,这样就能够达到我们的要求了。 下面是我用来进行并行计算的脚本: @XMode(XMode.WEBSERVICE) public class CallDataSetNormalTest { @XAutoWire(XAutoWire.BY_NAME) protected DataSetService ...

继续 ›

分类: 博客征文专栏, 并行计算

应用英特尔的集成I/O 改进I/O 性能

作者: Bruce Chen 陈宇达 (Intel) (125 篇文章) 日期: 三月 16, 2012 在 10:05 上午
评论 (0)

英特尔® 至强® 处理器 E5 系列中的I/O性能增强功能减少了I/O延迟并提高了数据吞吐量,这是关于它的一个介绍video,供参考。 集成I/O

继续 ›

分类: 企业应用开发, 并行计算

英特尔® 智能功耗节点管理器

作者: Bruce Chen 陈宇达 (Intel) (125 篇文章) 日期: 三月 16, 2012 在 9:54 上午
评论 (0)

数据中心的不断扩张,带来了能耗的大幅增加。如何有效地降低IPDC能耗呢,英特尔® 智能功耗节点管理器提供了一个选择。这是关于英特尔® 智能功耗节点管理器的一篇白皮书,供参考。 英特尔® 智能功耗节点管理器

继续 ›

分类: 企业应用开发, 并行计算

企业计算的未来

作者: Bruce Chen 陈宇达 (Intel) (125 篇文章) 日期: 三月 16, 2012 在 9:50 上午
评论 (0)

这是一篇介绍企业计算展望的白皮书,供大家参考。 企业计算的未来

继续 ›

分类: 企业应用开发, 并行计算