Alchemi是一个Grid的.net实现框架。有关Grid,个人理解,就是将很多闲置和一般计算机集合起来,共同通过并行计算,完成一个大的计算任务。每个计算机这时就相当于一个大计算机的CPU,那么很多很普通的计算机集合起来,就可以聚集非常可观的计算能力。其实也就是并行计算概念的深化。如下图:
安装和运行
需求:.net 1.1,SQL Server 2000或者MSDE
安装Alchemi Manager,可以作为普通的应用程序或者Windows Service。安装过程需要安装数据库。安装完成后启动Manager,需要设置数据库,然后启动之。启动Console可以查看Log,设置User等。
安装Executor,Executor可以安装为普通的应用程序或者Windows Service。启动Executor,在Console就可以查看资源。下图是笔者计算机运行界面。
具体的软件说明和安装有很详细的文档。下面我们试着写一个应用。
Alchemi SDK
解压SDK,其中有2个目录,Bin目录为其需要的库和2个可执行文件。Console (Alchemi.Console.exe)是一个管理工具,和安装了的Manager的是一个工具。Alchemi.Core.dll则是创建Grid程序的核心库。
Pi求解示例
我们打开Pi求解程序,编译,然后执行之,首先需要登录Grid,然后就可以执行,执行过程中从Console可以看到可用资源的变化。执行结果:
前边说过,Grid可以看做是一系列计算机的集合,对于应用程序,此集合表现为一个具有多“处理器”的“虚拟机”。
Alchemi和其他Grid平台的差别在于,其他平台一般是把“进程”作为基本的运行单位,运行在不同的计算机,而Alchemi可以以类似“多线程”程序的方式编程,其运行单位更小,更具可控制性,称为“Grid Threads”。
在本地计算机安装了Manager和Executor后,就可以模拟只有一个节点的Grid实现,如同我们可以在单CPU计算机上写多线程程序一样。
一个Grid程序必须先完成Grid Thread,首先需要添加需要的引用,然后从GThread继承自己的类,Override方法Start:
[Serializable]
public class PiCalcGridThread : GThread
{
public override void Start()
{
}
}
写好此Class后,可以写一个Console程序启动程序,这时就需要使用GApplication类了,定义一个GApplication的实例,然后使用GApplication.Threads.Add方法添加GTread,然后需要初始化连接,订阅事件,接着调用GApplication.Start启动计算,最后调用Stop结束。
App = new GApplication();
for (int i = 0; i < N; i++)
{
...
App.Threads.Add(thread);
}
// 定义事件
App.ThreadFinish += new GThreadFinish(ThreadFinished);
App.ApplicationFinish += new GApplicationFinish(ApplicationFinished);
App.Start();
这就是其基本的编程模式,具体代码可以看其例子。因此,Grid程序设计之主要难点和任务类似于多线程程序,或者说,就是一个多线程程序,首要需要解决的是解决一个问题的并行算法。
总结如下:
第一,从GThread继承自己的GThread类,实现具体的计算代码;
第二,使用GApplication实现主程序:
(1)通过GApplication.Threads.Add添加线程;
(2)通过GApplication.Connection初始化连接和Grid平台;
(3)GApplication.Start启动计算;
(4)必须订阅事件以获知线程结束和计算结束。
感想
以前也看过其他一些Grid的资料,不管其他功能(个人认为诸如数据共享,分布式数据集之类有很多解决方案,网格的精髓在于虚拟计算),最基础的计算Alchemi应该算完善了,而其安装、编程和使用的易用性都是其他Grid平台所不具备的。对于.net程序员,如果有这方面的需求(例如GIS、科学计算等),Alchemi无疑是最好的选择。
另外,例如一些大计算量的程序,如果使用Alchemi这样的技术来实现是否比集群这样的方法更高效和易于部署,也硬件平台无关呢?
至于Grid宣传的,所谓的与用户无关或透明的按需计算,无限的计算能力和存储空间,至少在暂时还是遥远的共产主义。