Hướng dẫn này giới thiệu cơ bản về lập trình lưới với Alchemi. Tương tự với VS.NET và C #.
Viết một ứng dụng lưới đơn giản tạo ra các số nguyên tố. Ứng dụng này tạo ra một vài số lớn ngẫu nhiên và sử dụng lưới để kiểm tra xem chúng là nguyên tố hay không.
Thực hiện theo các bước sau để thiết lập một môi trường phát triển:
• Xây dựng một lưới tối thiểu (1 Manager và 1 Executor) trên máy phát triển và thử nghiệm nó bằng cách chạy PiCalculator
• Tải Alchemi SDK về và giải nén vào một vị trí thuận tiện
Như đã thảo luận, lưới Alchemi có thể được xem như một máy ảo với nhiều bộ xử lý. Ứng dụng lưới có thể lợi dụng điều này bằng cách tạo ra các đơn vị công việc độc lập được thực hiện song song trên lưới (mỗi đơn vị công việc được thực hiện bởi một Executor riêng biệt).
Đơn vị công việc được gọi là grid thread và phải là thể hiện của lớp có nguồn gốc từ Alchemi.Core.Owner, GThread. Đoạn mã đó được thực thi trên lưới được định nghĩa trong phương thức void Start().
Để viết một lớp grid thread, ta kế thừa lớp mới từ các Alchemi.Core.Owner, lớp GThread và override phương thức void Start(). Chúng ta cũng phải thêm thuộc tính Serializable vào lớp:
[Serializable]
class CustomGridThread : GThread {
public override void Start() {
} }
Quá trình kiểm tra xem một số là số nguyên tố hay không là tính toán chuyên sâu. Ngoài ra, quá trình này có thể được thực hiện cho một vài số song song. Do đó có thể được hiện thực như grid thread.
Để bắt đầu ta làm như sau:
• Tạo ra một dự án ứng dụng console mới "PrimeNumberGenerator"
• Thêm tham chiếu đến Alchemi.Core.dll (Alchemi.Core.dll phải được tham chiếu bởi bất kỳ dự án sử dụng API Alchemi)
Bây giờ chúng ta viết một grid thread để kiểm tra xem một số là số nguyên tố hay không. Chúng ta sẽ sử dụng một thuật toán đơn giản để đếm số lượng ước số từ 1 đến chính nó. Nếu số lượng ước số là 2 (1 và chính nó) thì theo định nghĩa, đó là số nguyên tố.
using System;
using Alchemi.Core; namespace Tutorial {
[Serializable]
class PrimeNumberChecker : GThread {
public readonly int Candidate; public int Factors = 0;
public PrimeNumberChecker(int candidate) {
Candidate = candidate; }
public override void Start() {
// count the number of factors of the number from 1 to the number itself for (int d=1; d<=Candidate; d++)
{ if (Candidate%d == 0) Factors++; } } } ...
Lưu ý: Có những thuật toán hiệu quả hơn để kiểm tra xem một số là số nguyên tố không. Tuy nhiên, chúng ta không quan tâm đến thuật toán, mục đích của hướng dẫn này là dạy lập trình song song trong môi trường lưới sử dụng Alchemi.
Bây giờ chúng ta đã viết xong mã song song, chúng ta có thể viết mã để chạy nó trên lưới. Để làm điều này, chúng ta sử dụng lớp GApplication.
...
class PrimeNumberGenerator {
public static GApplication App = new GApplication(); [STAThread]
static void Main(string[] args) {
// create grid threads to check if some randomly generated large // numbers are prime
Random rnd = new Random(); for (int i=0; i<100; i++)
{
App.Threads.Add(new PrimeNumberChecker(rnd.Next(1000000))); }
// initialise application Init();
// start the application App.Start();
Console.ReadLine(); // stop the application App.Stop();
...
GApplication là một container để thực thi grid thread và được sử dụng để tương tác với lưới. Trong phương thức Main của ứng dụng, grid thread 100 PrimeNumberChecker được tạo ra và thêm vào thuộc tính Thread của ứng dụng lưới App.
Các ứng dụng được khởi tạo bằng cách gọi phương thức Init() và thực thi tất cả thread được khởi tạo bằng cách gọi phương thức Start().
...
private static void Init() {
// specify connection properties
App.Connection = new GConnection("localhost", 9000, "user", "user"); // grid thread needs to
App.Manifest.Add(new
ModuleDependency(typeof(PrimeNumberChecker).Module)); // subscribe to ThreadFinish event
App.ThreadFinish += new GThreadFinish(App_ThreadFinish); }
...
Trước khi một ứng dụng được bắt đầu, một số thuộc tính kết nối lưới phải được xác định (thông qua lớp GConnection) và thiết lập (thông qua thuộc tính Connection của ứng dụng). Đó là:
• Manager host • Manager port • Username • Password
Thuộc tính Manifest của GApplication cho phép bạn xác định phụ thuộc cho grid thread trong ứng dụng. Các phụ thuộc cho một ứng dụng cụ thể được tự động triển khai đến Executor khi thực thi thread thuộc về ứng dụng lần đầu tiên. Phụ thuộc cần thiết được thêm vào biểu hiện của ứng dụng là tập tin chứa hiện thực của grid thread. Điều này phải được xác định để Executor có thể tái tạo thread và thực thi nó. Lớp ModuleDependency cho phép bạn chỉ định một module cụ thể (.dll hay.Exe) là phụ thuộc.
Để thêm module chứa PrimeNumberChecker như một phụ thuộc vào ứng dụng, trước tiên chúng ta có đối tượng System.Type của PrimeNumberCheckers và sau đó sử dụng thuộc tính Module của Type.
Chúng ta đăng ký sự kiện ThreadFinish của Gapplication để kích hoạt khi một thread kết thúc thực hiện.
...
private static void App_ThreadFinish(GThread thread) {
// cast the supplied GThread back to PrimeNumberChecker PrimeNumberChecker pnc = (PrimeNumberChecker) thread; // check whether the candidate is prime or not
bool prime = false;
if (pnc.Factors == 2) prime = true; // display results
Console.WriteLine(
"{0} is prime? {1} ({2} factors)", pnc.Candidate, prime, pnc.Factors); }
} }
Thread hoàn thành được cung cấp như một tham số của xử lý sự kiện GThreadFinish. Trình xử lý sự kiện kiểm tra số lượng ước số để xác định xem số là nguyên tố hay không và cuối cùng hiển thị kết quả.
Lưu ý: Mã nguồn của hướng dẫn này có thể được tìm thấy trong thư mục examples\PrimeNumberGenerator.
KẾT LUẬN
Framework tính toán lưới dựa trên .NET cung cấp runtime machinery và môi trường lập trình hướng đối tượng để dễ dàng xây dựng desktop grid và phát triển các ứng dụng lưới. Tích hợp vào lưới cross-platform toàn cầu để thực thi grid job thông qua giao diện dịch vụ web và sử dụng thành phần broker.
Alchemi là một .Net Grid-computing framework dễ sử dụng nhằm mục đích giảm các rào cản gia nhập vào thế giới tính toán phân tán và tính toán lưới, bằng cách làm cho nó dễ dàng hơn để thiết lập, quản lý và duy trì lưới trên một mạng nội bộ hoặc mạng diện rộng.
Một lần nữa em xin gửi lời cảm ơn chân thành đến Thầy Nguyễn Phi Khứ. Thầy đã cung cấp cho chúng em rất nhiều kiến thức và kinh nghiệm quý báu cùng với sự hướng dẫn tận tình trong suốt thời gian môn học.
TÀI LIỆU THAM KHẢO
[1]Slide bài giảng của Thầy Nguyễn Phi Khứ
[2]Peer-to-Peer Grid Computing and a .NET-based Alchemi Framework, Akshay Luther, Rajkumar Buyya, Rajiv Ranjan, and Srikumar Venugopal