Thiết kế giải thuật song song bằng phương pháp chia để trị

Một phần của tài liệu NGHIÊN CỨU CÁC GIẢI THUẬT SONG SONG TRÊN HỆ THỐNG XỬ LÝ ĐỒ HỌA GPU ĐA LÕI (Trang 30 - 32)

- 19 - Tính số PI trên nhiều máy.

Hình 1.1. Thí nghiệm tính số PI

Người ta có thể tính được gần đúng giá trị của số PI bằng cách đếm số điểm rơi vào trong hình tròn đơn vị, mà các điểm này được reo một cách ngẫu nhiên vào hình vuông ngoại tiếp. Tỷ lệ của số điểm rơi vào bên trong hình tròn so với toàn bộ số lượng điểm reo sẽ dần tiến tới tỷ lệ của diện tích hình tròn so với hình vuông. Một thí nghiệm như vậy có thể thực hiện được trên máy tính. Ở đấy mỗi điểm được biểu diễn bởi hai số có tọa độ (x, y) của nó.

Trình “reo” 20000 điểm, ứng với vòng lặp for = k; k < n; k++, mỗi lần reo là một lần ta có được 2 số (x, y). Lệnh rand() cho ta một số nguyên trong khoảng [0..RAND_MAX]. Như vậy điểm (x, y) có tính chất 0 ≤ x, y ≤ 1 là điểm nằm trong góc ¼ của hình vuông cạnh bằng 2, ngoại tiếp hình tròn đơn vị. Để kiểm tra điểm (x,y) có đúng là nằm trong hình tròn đơn vị không, ta kiểm tra x2 + y 2 ≤ 1.

Sau đây là chương trình “reo” điểm, qua đây tính được giá trị số π ≈ 3.1 #include <stdio.h> #include <stdlib.h> void main() { float x,y; unsigned int k,n, c=0; n =20000;

- 20 - for (k=0; k<=n;k++) { x= (float) rand()/RAND_MAX; y= (float) rand()/RAND_MAX; if (x*x+y*y<=1) c++; } printf("%5.3f",(float) 4*c/n); }

Chúng ta nhận thấy ngay là quá trình “reo” có thể coi như là gồm 2 lần. Lần thứ nhất (A) reo 10000 điểm, và lần thứ hai (B) reo 10000 điểm. Việc reo này có thể giao cho 2 máy tính cùng thực hiện một lúc – và như thế “thời gian” thực hiện việc tính giá trị số π sẽ “nhanh” hơn. Tất nhiên là các kết quả của (A) và của (B) gọi là “worker”, người làm thuê, phải được gửi đến cho một người -- chúng ta gọi là “server”, tức ông chủ.

Các worker cần phải kết nối với server để kết quả có thể gửi tới được. Việc gửi-nhận thật ra là không đơn giản. Ví dụ như worker (A) và (B) cùng gửi kết quả cho server thì server biết nhận của ai trước (A) hay (B)? Hoặc là nếu server đang bận xử lý việc khác, mà các worker gửi kết quả tới, thì làm sao mà nó nhận được? Vậy là phải có một môi trường đảm bảo cho việc gửi nhận này được an toàn. Môi trường mà chúng ta đề cập đến trong các bài giảng sau là MPI.

Trong mô hình, worker tiến hành “reo” và đếm các điểm rơi vào trong hình tròn. Sau đó chúng gửi kết quả về cho server bằng lệnh send(). Số lần mà server nhận dữ liệu vào – tức là số lần phải dùng đến lệnh recieve() – chính bằng số lượng các worker.

Một phần của tài liệu NGHIÊN CỨU CÁC GIẢI THUẬT SONG SONG TRÊN HỆ THỐNG XỬ LÝ ĐỒ HỌA GPU ĐA LÕI (Trang 30 - 32)