高性能计算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
高性能计算
信息时代的硬件芯片和存储器价格以摩尔定律的形式下降,可是现在处理的数据量也越来越大。我们先以cocoa编程为例,然后再结合网格计算、云计算,综合对最新的高性能计算技术作介绍。
使用runloop
在cocoa编程如果用NSThread开线程
[NSThread detachNewThreadSelect:@selector(run)toTarget:self withObject:nil]
也可以用runLoop的方式来取代
[self performSelector:@selector(run)withObject:nil afterDelay:0.0]
在runLoop里面的run函数要有循环调用
相比而言使用runLoop的方法效率更高。
Grand Central Dispatch
GCD是一项由苹果发展起来的技术,用多核处理器和其他多处理系统去优化应用对系统的支持。这是一个根据线程池模式的并行任务的实现。它首先发布在mac os x10.6上,也可以用在ios4上。
GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等负责的异步编程问题。
在开始之前,需要理解是要提供给GCD队列的是代码块,用于在系统或者用户创建的的队列上调度运行。
如下会返回一个用户创建的队列:
dispatch_queue_t myQueue=dispatch_queue_create("com.iphonedevblog.post",NULL);
执行一个队列
如下会异步执行传入的代码:
dispatch_async(myQueue,^{[self doSomething];});其中,首先传入之前创建的队列,然后提供由队列运行的代码块。
声明并执行一个队列
如果不需要保留要运行的队列的引用,可以通过如下代码实现之前的功能:
dispatch_async(dispatch_queue_create("com.iphonedevblog.post",NULL),^{[self doSomething];});
从队列中在主线程运行代码
有些操作无法在异步队列运行,因此必须在主线程(每个应用都有一个)上运行。UI绘图以及任何对NSNotificationCenter的调用必须在主线程长进行。
在另一个队列中访问主线程并运行代码的示例如下:
dispatch_sync(dispatch_get_main_queue(),^{[self dismissLoginWindow];});
注意,dispatch_suspend(以及dispatch_resume)在主线程上不起作用。
SETI@home
at Home,在家搜寻外星智慧(地外文明---也就是我们常说的“外星人”)),是一个通过互联网利用家用个人计算机处理天文数据的分布式计算项目。该项目试图通过分析阿雷西博射电望远镜采集的无线电信号,搜寻能够证实外星智能生物存在的证据。该项目由美国加州大学伯克利分校的空间科学实验室主办。
网格计算:Xgrid
Xgrid是一组Mac OS X应用套件,它使管理人员可以将本地和远程计算机连接起来形成网格,从而使本地和远程用户可以随时使用整个网格提供的计算资源。当用户将一项工作(Job)提交给系统后,Xgrid将为每项工作创建多个任务(Task)并且将它们分配给网格上的多个节点去并行地执行。Xgrid产生的目的是为了解决复杂耗时的计算问题,诸如蒙特卡洛计算、3D渲染等。然而,Xgrid本身并不是一种计算方法,它是一种让多台计算机相互“交谈”的网格结构。
Xgrid允许一个程序在不同的机器上并行运行,从而迅速得到运行结果。在Xgrid中包括三大软件组件:用于启动运算例程的客户机(Client)、进行初始化计算的控制机(Controller)以及执行计算过程的代理机(Agent)。
GridEZ.framework
GridEZ框架是目的是使得你的yingiyong整合Xgrid的服务更加容易。XgridFoudation api 是强大的,可是它使用起来很复杂。为了让使用者连接控制器,提交一项工作和得到相应的结果,你需要用XgridFoundation写数百行代码,和管理一个复杂的XgridFoundation要求你的异步调用链。
GridEZ框架提供一个使用简单的对象隐藏了这些复杂度,和提供了大部分你所需要的功能。例如,你提交一项工作,当工作完成之后结果回自动装载到你的应用,而你要做的仅仅是写一个代理方法去处理它。如果你从来没有使用XgridFoundation APIs,你可能不知道困难的是什么。可是如果你知道的话,你已经意识到GridEZ是怎么使你的生活大为轻松了。
云计算:EC2
Elastic Compute Cloud(EC2)
EC2是由亚马逊提供的web计算服务,是一个让使用者可以租用云端电脑运行所需应用的系统。EC2由提供web
服务的方式让使用者可以弹性地运行自己的Amazon机器映象档,使用者将可以在这个虚拟机上运行任何自己想要的应用程序。
EC2与传统的服务器电脑有以下优势:
没有系统管理员
没有机房的空间
没有电费账单
没有限制的空间
OpenMPI
MPI最大的特点是用户写一份单独的程序却运行在所有的计算机上。可是因为每一个计算机被赋予一个唯一的标识序列,尽管它只运行相同的代码,它却可以为不同的机器上进行不同的操作:
if(I am processor A)then
add a bunch of numbers
else if(I am processor B)then
multipy a matrix times a vector
end
另一个MPI的特点的特点是单独数据存储在各个计算机上。如果一个计算机需要从另一个得到数据,或者发送一个特别的数据到所有其他计算机,它必须单独调用合适的库要求数据传输。
由于库路径的调用,它对发送者和接收者来说要求同时在线(意味着一个人将可能要等待另一个人出现),或者为了以后传输发送者在同一时间发送一个消息到缓冲区,允许发送者立即进行再进一步的计算。
这是一个一份程序看起来的简单例子,在那里数字X被认为被处理器A计算,数字B被处理器B计算。
if(I am processor A)then
call MPI_Send(X)
else if(I am processor B)then
call MPI_Recv(X)
end
open MPI项目是一个开源的MPI-2层级的实现,由科研机构和合伙公司共同发展和维护的。open MPI可以从各个高性能的计算单位联合专家知识、技术和资源,从而组建一个最高MPI 可行的库。open MPI向系统和软件供应商和应用开发者和计算机学者提供很多好处。
不完全列举open MPI的特点:
完全支持MPI-2层级
线程和并发安全
支持异构网络
单一库支持所有网络
运行时指令
支持各种操作系统
在各个平台上的高性能
可移植和容易维护
动态和快速响应的邮件列表
并行程序:OpenMP
OpenMP(Open Multi-Processing)是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多线程程序设计的一套指导性注释(Compiler Directive)。
程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMP时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。
OpenMP提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程