Mô phỏng hệ hạt [14, 20, 21]

Một phần của tài liệu Mô phỏng song song sử dụng khối xử lý đồ họa GPGPU (Trang 76 - 87)

3.3.1.Giới thiệu bài toán

Các hệ hạt là một kỹ thuật phổ biến được sử dụng trong việc mô phỏng các hệ vật lý. Trong mục này, tác giả sẽ miêu tả cách thực thi hiệu quả cho một hệ hạt bằng CUDA, bao gồm các tương tác cục bộ sử dụng một cấu trúc lưới đồng dạng.

Các kỹ thuật dựa trên hạt được sử dụng trong rất nhiều ứng dụng – từ

mô phỏng tương tác của các chất lưu và khói trong game cho tới các mô phỏng thiên văn học và động lực học phân tử. Những nghiên cứu gần đây

72 cũng đã áp dụng các phương pháp hạt để mô phỏng các vật thể mềm, mô phỏng vải quần áo…và nó mang lại những hy vọng vào một ngày nào đó các kỹ thuật này sẽ cho phép mô phỏng một cách hiệu quả cả vật thể rắn.

Hình 3.6. Một hệ hạt được sử dụng để mô phỏng đám cháy.

Hình 3.7. Một hệ hạt được sử dụng để mô phỏng thiên hà.

Hình 3.8. Một hệ hạt được sử dụng để mô phỏng vụ nổ bom. Có hai cách mô phỏng cơ bản: các phương pháp Lagrangian, tính toán các đặc tính của một tập hợp các hạt theo sự di chuyển trong không gian và các phương pháp Eulerian (dựa trên lưới), tính toán các đặc tính này ở một tập hợp các điểm cốđịnh trong không gian.

73 Các phương pháp dựa trên hạt có một số thuật lợi khi sử dụng phương pháp mô phỏng dựa trên lưới:

• Chúng chỉ thực hiện tính toán khi cần thiết.

• Chúng cần ít băng thông và bộ nhớ hơn với việc các đặc tính chỉ lưu trữ ở vị trí của các hạt chứ không phải tại mọi điểm trong không gian.

• Không nhất thiết bị ràng buộc bởi một hộp hữu hạn.

• Sự bảo toàn khối lượng là đơn giản (mỗi hạt có khối lượng cốđịnh). Bất lợi chính của các phương pháp dựa trên hạt đó là chúng yêu cầu một số lượng rất lớn các hạt để nhận được một kết quả giống thực tế. May thay, chúng ta lại có thể song song hóa các hệ hạt một cách tương đối dễ dàng và khả năng tính toán song song của các GPU hiện đại ngày nay là rất khủng khiếp, do đó việc mô phỏng tương tác của các hệ hạt lớn có tốc độ ngày càng cao.

Các tương tác hạt – hạt:

Tương đối đơn giản để thực hiện một hệ hạt mà ở đó các hạt không tương tác với các hạt khác. Hầu hết các hệ hạt sử dụng trong game ngày nay rơi vào loại này. Trong trường hợp này, mỗi hạt là độc lập và chúng có thể được mô phỏng song song một cách bình thường.

Thuật toán cho các hệ hạt không tương tác:

for i = 0 to N - 1 do

Di chuyển hạt i;

end for

Thuật toán cho các hệ hạt tương tác phạm vi ngắn (vét cạn):

for i = 0 to N - 2 do Di chuyển hạt i;

74 for j= i +1 to N - 1 do

Kiểm tra va chạm giữa các hạt i và j; end for

end for

Thuật toán cho các hệ hạt tương tác phạm vi ngắn (sử dụng cấu trúc dữ liệu không gian)

for i=0 to N - 1 do

Di chuyển hạt i;

for all j in hàng xóm (hạt[i]) do

Kiểm tra va chạm giữa các hạt i và hạt j; end for

end for

Thuật toán cho các hệ hạt tương tác phạm vi xa: (adsbygoogle = window.adsbygoogle || []).push({});

for i=0 to N - 1 do for j=0 to N - 1 (với j ≠ i) do Tính tương tác giữa j và i; end for Di chuyển hạt i; end for

Ví dụ tiêu biểu về “n-body” ở mục 3.1 bao gồm các tương tác ở dạng lực hấp dẫn giữa các thực thể. Nó đã chứng minh rằng có thể đạt được một hiệu năng tuyệt hảo khi sử dụng CUDA để mô phỏng lực hấp dẫn n-body bằng việc tính toán các tương tác theo phương pháp vét cạn (tính tất cả n2 tương tác của n thực thể). Việc sử dụng bộ nhớ chia sẻ cho thấy phương pháp này không bị giới hạn bởi băng thông bộ nhớ. Tuy nhiên, với các tương tác cục bộ (chẳng hạn như các va chạm) chúng ta có thể cải thiện hiệu năng bằng

75 việc sử dụng phương pháp chia nhỏ không gian. Mấu chốt bên trong ở đây là với rất nhiều kiểu tương tác, lực tương tác sẽ giảm nhiều theo khoảng cách.

Điều này có nghĩa là chúng ta có thể tính toán lực của một hạt cho trước bằng việc so sánh nó với tất cả các hạt láng giềng của nó trong một phạm vi (bán kính) cố định. Kỹ thuật chia nhỏ không gian sẽ chia nhỏ không gian mô phỏng giúp cho việc tìm các hạt láng giềng của một hạt cho trước được dễ

dàng hơn.

Lưới đồng nhất:

Trong ví dụ này, ta sử dụng một lưới đồng nhất để có thể chia nhỏ

không gian một cách đơn giản nhất. Một lưới đồng nhất chia nhỏ không gian mô phỏng thành các ô lưới có kích thước như nhau. Để đơn giản ta sử dụng một lưới mà kích thước ô bằng với kích thước của hạt (bằng 2 lần bán kính hạt). Điều này có nghĩa là mỗi hạt chỉ có thể khám phá một số lượng ô lưới giới hạn (8 ô trong không gian 3 chiều). Nếu giả sử không có sự thâm nhập giữa các hạt (không bị xuyên vào nhau), có một cận trên cốđịnh cho số lượng của các hạt trên ô lưới (4 hạt trong không gian 3 chiều). Mỗi hạt được chỉ định tới một ô lưới dựa trên điểm trọng tâm của hạt đó. Chỉ số của hạt được chứa trong ô lưới. Cấu trúc lưới được sinh ngẫu nhiên tại mỗi thời điểm. Ta sẽ

sử dụng hai phương pháp khác nhau để sinh cấu trúc lưới dựa trên năng lực tính toán của GPU như sau:

Lưới sử dụng các toán tử nguyên tử (Atomic Operations):

Trên các GPU có hỗ trợ các phép toán nguyên tử (năng lực tính toán từ

version 1.1 trởđi), việc xây dựng lưới tương đối đơn giản.

Toán tử nguyên tử cho phép nhiều luồng cập nhật cùng một giá trị

trong bộ nhớ toàn cục một cách đồng thời mà không bị xung đột. Ta sử dụng hai mảng trong bộ nhớ toàn cục:

76

gridCounters – lưu trữ số lượng các hạt trong mỗi ô. Nó được khởi tạo bằng 0 khi bắt đầu mỗi frame.

gridCells – lưu trữ các chỉ số hạt ở mỗi ô, và cả số lượng tối đa các hạt có trên một ô.

Hàm thực thi trong nhân GPU “updateGrid” cập nhật cấu trúc lưới. Nó chạy một luồng cho một hạt. Mỗi hạt tính toán ô lưới mà nó sẽ nằm trong, và sử dụng hàm “atomicAdd” để tăng bộđếm của ô tương ứng tại vị trí này. Sau

đó nó sẽ ghi chỉ số của nó vào trong mảng lưới ở vị trí chính xác. Hình 3.x bên dưới là một ví dụđơn giản cho 6 hạt trong một lưới 2D.

Hình 3.9. Lưới đồng nhất sử dụng các phép toán nguyên tử [14].

Lưới sử dụng phương pháp sắp xếp:

Với các GPU như GeForce 8880, không hỗ trợ các phép toán nguyên tử, chúng ta cần sử dụng phương pháp phức tạp hơn dựa trên việc sắp xếp. Thuật toán sẽ bao gồm một số hàm thực thi trong nhân GPU. Hàm đầu tiên đó là “calHash” tính toán một giá trị băm cho mỗi hạt dựa trên chỉ số ô chứa hạt

đó. Trong ví dụ này, đơn giản ta chỉ sử dụng chỉ số ô thay cho việc băm. Nhân sẽ lưu trữ các kết quả vào mảng “particleHash” trong bộ nhớ toàn cục dưới kiểu uint2 (giá trị băm của ô, chỉ số hạt). Sau đó ta sẽ sắp xếp các hạt dựa trên

77 giá trị băm của chúng. Việc sắp xếp được thực hiện với phương pháp radix sort được mô tả trong tài liệu của Scott Le Grand trong bài báo GPU Gems 3. Nó sẽ tạo ra danh sách các chỉ số hạt trong ô theo thứ tự. Ta sẽ phải đi tìm ô bắt đầu của mỗi ô trong danh sách đã sắp xếp. Việc này được thực hiện bằng cách thực thi hàm “findCellStart” trong nhân, ở đó mỗi luồng được dành cho một hạt và so sánh chỉ số ô của hạt hiện tại với chỉ số ô của hạt trước đó trong danh sách đã sắp xếp. Nếu các chỉ số này khác nhau, nó biểu thị bắt đầu một ô mới và địa chỉ khởi đầu được ghi vào một mảng khác. Hình 3.12 dưới đây minh họa việc tạo lưới sử dụng phương pháp sắp xếp.

Hình 3.10. Lưới đồng nhất sử dụng phương pháp sắp xếp [14].

Các tương tác:

Bằng việc xây dựng cấu trúc lưới ở trên, chúng ta có thể sử dụng để

tăng tốc các tương tác hạt – hạt. Trong mã nguồn của chương trình, tác giả

thực hiện va chạm đơn giản giữa các hạt sử dụng phương pháp DEM [28]. Mô hình va chạm này cấu thành bởi một số lực tác dụng, gồm có lực đàn hồi và lực giảm xóc. Mỗi hạt tính toán ô lưới mà nó sẽ nằm trong đó. Sau đó nó sẽ

lặp lại với 27 ô lưới láng giềng (3x3x3 ô) và kiểm tra sự va chạm với mỗi hạt trong các ô này. (adsbygoogle = window.adsbygoogle || []).push({});

78

3.3.2.Cài đặt và thử nghiệm

Tác giảđã cài đặt thuật toán theo phương pháp được giới thiệu trong tài liệu Particles Simulation using CUDA [14], trong đó các tính toán sử dụng bộ

nhớ dùng chung của GPU để tăng cường hiệu năng mô phỏng. Các phép toán tương tác giữa các hạt được thực hiện trong các luồng tại các block. Dưới đây là hình ảnh minh họa mô phỏng hệ hạt theo thuật toán [14] sử dụng card đồ

họa Nvidia GeForce 9600M GS 32 cores, cores speed 430MHz, memory 1024MB.

79

KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN

Trong khuôn khổ luận văn, tác giảđã nghiên cứu và trình bày một cách tổng quan về các kiến thức liên quan đến GPGPU như: các loại card đồ họa và khối xử lý đồ họa, lập trình với mục đích tính toán thông dụng trên GPU sử dụng công nghệ NVIDIA CUDA. Trên cơ sở những kiến thức đã nghiên cứu, tác giả đã tiến hành cài đặt, thử nghiệm và đánh giá hiệu năng của GPGPU so với CPU trên một số bài toán tính toán song song tiêu biểu như: bài toán sắp xếp nhanh, bài toán chuyển đổi Fourier, bài toán nhân ma trận, bài toán phân cụm K-means và bài toán người du lịch. Kết quả cho thấy việc sử dụng GPGPU để tính toán song song nhanh hơn rất nhiều so với sử dụng CPU. Trong chương 3, tác giả cũng trình bày khá chi tiết một số bài toán mô phỏng hệ thống phức như: mô phỏng n-body, mô phỏng chất lưu, mô phỏng hệ hạt và mô phỏng sóng biển. Các bài toán trên cũng được cài đặt thử

nghiệm trên các thiết bị GPGPU. Kết quả cho thấy việc mô phỏng trên khối xử lý đồ họa GPGPU cho hiệu năng cao hơn hẳn so với trên CPU. Như vậy, có thể đi đến kết luận: khối xử lý đồ họa GPGPU có hiệu năng tính toán cao hơn hẳn so với CPU và rất thích hợp trong các bài toán đòi hỏi khối lượng tính toán lớn, đặc biệt là trong các bài toán mô phỏng hệ thống phức.

Do hạn chế về mặt kinh phí nên trong luận văn, tác giả mới chỉ cài đặt thử nghiệm các bài toán trên một thiết bị xử lý đồ họa thông dụng mà chưa

đánh giá được trên các thiết bị đồ họa hiện đại khác. Do thời gian thực hiện luận văn không nhiều nên số lượng bài toán mô phỏng được nghiên cứu và cài

đặt thử nghiệm trong luận văn chưa thực sự nhiều mà chỉ dừng lại ở một số

bài toán tiêu biểu nhất. Trong thời gian tới, tác giả sẽ nghiên cứu thêm một số

bài toán mô phỏng khác và cài đặt thử nghiệm trên các thiết bị xử lý đồ họa mạnh hơn để kiểm chứng được hiệu năng của các thiết bị này một cách đầy

80

DANH MỤC TÀI LIỆU THAM KHẢO Tiếng Việt

[1] PSG TS Nguyễn Đức Nghĩa (2007), Tính Toán Song Song, Nhà xuất bản

Đại học Quốc gia Hà Nội.

[2] Đức Khánh (2/2010), “Cuda quá khứ - hiện tại & tương lai của điện toán GPU”, Tạp chí CGEZINE, X4, tr 34 - 41.

[3] Nguyễn Thị Thùy Linh (2009), Tính toán hiệu năng cao với bộ xử lý đồ

họa GPU và ứng dụng, Luận văn thạc sĩ, Đại học Công nghiệp - Đại học quốc gia Hà Nội, tr 17-60.

[4] Ngô Quốc Vinh (2008), Hướng dẫn cách thiết lập dự án CUDA, Kyoto- Japan.

[5] TS Lê Huy Thập (8/2010), Cơ sở lý thuyết song song, Nhà xuất bản thông tin và truyền thông, Hà Nội.

[6] Phạm Mạnh Hùng (2007), Các kỹ thuật toán học cho bài toán so sánh đa

trình tự, Luận văn thạc sĩ Khoa học máy tính, Đại học Bách khoa thành phố Hồ Chí Minh.

[7] Trịnh Công Quý (2005), Phát triển ứng dụng song song với OpenMP, Luận văn tốt nghiệp Đại học, Đại học Công nghệ - Đại học quốc gia Hà Nội, tr 3,12.

[8] Trương Văn Hiệu (2011), 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, Luận văn thạc sĩ kỹ thuật, Đại học Đà Nẵng.

Tiếng Anh

[9] ERDAL YILMAZ, MASSIVE CROWD SIMULATION WITH PARALLEL PROCESSING, A THESIS SUBMITTED TO THE GRADUATE SCHOOL OF INFORMATICS OF THE MIDDLE (adsbygoogle = window.adsbygoogle || []).push({});

81 [10] Kamil Rocki, Reiji Suda: Accelerating 2-opt and 3-opt Local Search Using GPU in the Travelling Salesman Problem, The University of Tokyo, CREST, JST, 2012.

[11] Kamil Rocki, Reiji Suda: High Performance GPU Accelerated Local Optimization in TSP, 2013 IEEE 27th International Symposium on Parallel & Distributed Processing Workshops and PhD Forum, 2013. [12] GPU Gems 3, Chapter 31. Fast N-Body Simulation with CUDA

http://developer.nvidia.com/GPUGems3/gpugems3_ch31.html

[13] Mark Harris, GPU Gems, Chapter 38. Fast Fluid Dynamics Simulation on the GPU http://developer.nvidia.com/GPUGems/gpugems_ch38.html [14] Particle Simulation Using CUDA,

http://developer.download.nvidia.com/compute/cuda/1.1- Beta/x86_website/Physically-Based_Simulation.html

[15] J. Barnes and P. Hut, “A Hierarchical O(NlogN) Force-Calculation Algorithm,” Nature, vol. 324, pp.446–449, Dec.1986.

[16] TESSENDORF, J. 2001. Simulating ocean water. In Simulating. Nature: Realistic and Interactive Techniques. SIGGRAPH 2001Course Notes 47.

[17] Chin-ChihWang, Jia-XiangWu, Chao-EnYen, PangfengLiu, Chuen- LiangChen, ”OceanWave Simulation in Real-time using GPU”, 2010. [18] J. Kr¨uger, P. Kipfer, P. Kondratieva, and R. Westermann, “A particle

system for interactive visualization of 3D flows,” IEEE Transactions on Visualization and Computer Graphics, vol. 11, no. 6,pp. 744–756, Nov./ Dec. 2005.

[19] K. Fatahalian, J. Sugerman, and P. Hanrahan, “Understanding the efficiency of GPU algorithms for matrix-matrix multiplication,” in Graphics Hardware 2004, Aug. 2004, pp. 133–138.

82 [20] L. Greengard and V. Rokhlin, “A fast algorithm for particle simulations,”

Journal of Computational Physics, vol. 73, pp. 325–348, Dec. 1987. [21] Pyarelal Knowles, “GPGPU Based Particle System Simulation”, School

of Computer Science and Information Technology, RMIT University Melbourne, AUSTRALIA, November 12, 2009.

[22] Jerod J. Weinman, Augustus Lidaka, Shitanshu Aggarwal "large scale machine learning" GPU Computing Gems Emerald Edition chapter 19 2011. [23] Stuart, Jeff A., and John D. Owens. "Multi-GPU MapReduce on GPU

clusters."Parallel & Distributed Processing Symposium (IPDPS), 2011 IEEE International. IEEE, 2011.

[24] Preis, Tobias, et al. "Accelerated fluctuation analysis by graphic cards and complex pattern formation in financial markets." New Journal of Physics 11.9 (2009): 093024.

[25] Won-Ki Jeong, Hanspeter Pfister, Massimiliano Fatica "Medical Image Processing Using GPU-Accelerated ITK Image Filters" Wen-mei, W. Hwu. GPU Computing Gems Emerald Edition. Morgan Kaufmann, 2011.

[26] Fung, James, and Steve Mann. "Using graphics devices in reverse: GPU- based image processing and computer vision." Multimedia and Expo, 2008 IEEE International Conference on. IEEE, 2008.

[27] Kim, Changkyu, et al. "FAST: fast architecture sensitive tree search on modern CPUs and GPUs." Proceedings of the 2010 ACM SIGMOD International Conference on Management of data. ACM, 2010.

[28] Harada, T.: Real-Time Rigid Body Simulation on GPUs. GPU Gems 3. Addison Wesley, 2007.

[29] http://serban.org/software/kmeans/ [30] http://ixbtlabs.com/articles3/video/cuda-1-p1.html

Một phần của tài liệu Mô phỏng song song sử dụng khối xử lý đồ họa GPGPU (Trang 76 - 87)