高性能计算

信息时代的硬件芯片和存储器价格以摩尔定律的形式下降,可是现在处理的数据量也越来越大。我们先以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上,也可以用在ios 4上。
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提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。同时,使用OpenMP也提供了更强的灵活性,可以较容易的适应不同的并行系统配置。线程粒度和负载平衡等是传统多线程程序设计中的难题,但在OpenMP中,OpenMP库从程序员手中接管了部分这两方面的工作。

例子
在 omp parallel 段內的程序代码由多线程來執行:
int main(int argc, char* argv[])
{
#pragma omp parallel
printf("Hello, world.n");

return 1;
}

GPU 编程: OpenCL
OpenCL (Open Computing Language,开放计算语言) 是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成。OpenCL由一门用于编写kernels (在OpenCL设备上运行的函数)的语言(基于C99)和一组用于定义并控制平台的API组成。OpenCL提供了基于任务分割和数据分割的并行计算机制。
OpenCL类似于另外两个开放的工业标准OpenGL和OpenAL,这两个标准分别用于三维图形和计算机音频方面。OpenCL扩展了GPU用于图形生成之外的能力。OpenCL由非盈利性技术组织Khronos Group掌管。

OpenCL 是基于C的一个程序语言,在软件上,分为Platform Layer、Runtime、Compiler三个部分。

•Platform Layer用来管理计算装置,提供初始化装置的界面,并用来建立compute contexts和work-queues
•runtime 用来管理资源,并执行程序的kennel
•编译器则是 ISO C99的子集合,并加上Open CL特殊的语法。

在OpenCL的执行模型中,有所谓的Compute Kenel 和Compute Program。Compute Kenel基本上类似于CUDA定义的kenel,是最基本的计算单元;而Compute Program则是Compute Kernel和内建函数的集合,类似一个动态函数库。而应用程序则是会把要执行的compute kernel排序,在执行时则可以依序或不依序来执行。

在平行计算方面,有data-parallel和task-parallel两种不同计算模型。

你可能感兴趣的:(高性能计算)