GPU sẽ đóng một vai trò chính trong dự án FutureGrid của đại học Indiana dưới dự bảo trợ của quỹ khoa học quốc gia nhằm phát triển một môi trường thực nghiệm chuẩn cho phép các nhà khoa
Trang 1MỤC LỤC
1 Giới thiệu tính toán lưới GPU 2
2 Giới thiệu GPU 5
3 Cài đặt CUDA 16
3.1 Các bước cài đặt 17
3.2 Làm việc với C# 17
3.3 Làm việc với Java 18
4 So sánh tốc độ các thuật toán 20
4.1 Thuật toán sinh hoán vị của N phần tử 20
4.2 Thuật toán Bubble Sort 23
4.3 Thuật toán Merge Sort 24
5 Nhận xét 25
6 Tham khảo 26
Trang 21 Giới thiệu tính toán lưới GPU
Tính toán lưới rất giống tính toán nhóm, nhưng ở tỷ lệ lớn hơn có liên quan đến việc gom lại các cụm Các giải pháp GPU cho phép xử lý không chỉ trên một CPU mà còn trên cả môi trường nhóm hay còn gọi là môi trường lưới
Tính toán lưới GPU được sử dụng trên nhiều lĩnh vực rộng rãi, nhưng vẫn còn quá nhiều lĩnh vực khác có thể áp dụng được như là tính toán trong khoa học và công nghệ, cũng như các dự án có cường độ tính toán mạnh Một trong những động lực mở ra lớn nhất cho chúng ta là GPUGRID, thuật ngữ này ra đời trong khi thực hiện các công việc xử lý tính toán phức tạp trong ngành Tin-Sinh học Cơ sở hạ tầng của GPUGRID được kết hợp nhiều card đồ hoạ NVIDIA lại với nhau để thực hiện việc tạo ra các giả lặp về toàn bộ hoạt động các phân tử sinh học Việc thực hiện các phân tử sinh học được các nhà khoa học trong tính toán hiệu năng cao và các nhà sinh học tình nguyện xung phong thực hiện lúc ban đầu, và cho đến nay vẫn còn nhiều bổ sung cũng như nhiều mảng có thể nghiên cứu nhất là trong ngành tính toán hiệu năng cao cho các bài toán trong sinh học
GPU sẽ đóng một vai trò chính trong dự án FutureGrid của đại học Indiana dưới dự bảo trợ của quỹ khoa học quốc gia nhằm phát triển một môi trường thực nghiệm chuẩn cho phép các nhà khoa học cùng nhau phát triển và kiểm thử các hướng mới về xử lý song song, tính toán lưới, cũng như tính toán đám mây
Như vậy thuật ngữ tính toán lưới GPU thật chất là thực hiện công việc tính toán lưới trên các GPU thay vì trên các CPU Công việc này sẽ phức tạp hơn rất nhiều so với tính toán lưới thông thường, vì mỗi đơn vị GPU bản thân nó là một nút thực hiện tính toán song song Ta có thể hình dung tính toán lưới GPU như là một mạng lưới gồm nhiều máy xử lý một vấn đề mà dữ liệu cũng nằm trên nhiều máy, mà trong đó một máy xử lý là một GPU thay vì một CPU Các nhà khoa học mong chờ kết quả thực hiện một bài toán trên GPUGRID sẽ nhanh hơn trên môi trường tính toán lưới thông thường với một tỷ lệ nhất định
Trang 3Hình 1.1 Dự án phát triển GPUGRID Tốc độ xử lý của GPU ngày càng được cái tiến và xử lý ngày càng nhanh hơn, tăng khả
năng, hiệu xuất tính toán của GPU Giới hạn của phần cứng, xu hướng tăng số lõi (cores) thay vì tăng xung nhịp (clock rate) đang trở nên phổ biến CPU thì có multicores, còn GPU thì có many-cores GPU, ngày nay, đã có thể hoạt động nhanh hơn cả CPU trong
việc xử lí tính toán Cụ thể nhờ số lượng cores lớn (vài trăm so với 2, 4, hoặc 8 của CPU), tốc độ truy xuất bộ nhớ nhanh (85GB/s với G80, 150GB/s với GTX200) Nhờ thế, vai trò của GPU đã vượt ra ngoài phạm vi truyền thống; đó là chạy các ứng dụng tính toán Để làm việc với GPU, chúng ta thường sử dụng bộ thư viện CUDA nổi tiếng đã được NVIDIA phát triển hỗ trợ và đã được cộng đồng đón nhận Sự phát triển các ứng dụng với sự hỗ trợ của CUDA bắt đầu xuất hiện từ 2008, và tiếp tục phát triển cả về số lượng, chất lượng, tính hiệu quả, tính năng được cung cấp
Trang 4Hình 1.2: Tốc độ tính toán của GPU được phát triển qua các năm [1]
Bài báo cáo này sẽ trình bày rõ về tỷ lệ xử lý về mặt thời gian của một GPU so với CPU
Vì vậy, các phần tiếp theo sẽ là trình bày cơ chế hoạt động của GPU và phương pháp cài đặt, so sánh kết quả tốc độ các thuật toán thông thường sau khi thử nghiệm, và phần cuối cùng là nhận xét đánh giá
Trang 52 Giới thiệu GPU
CUDA (Compute Unified Device Architecture - Kiến trúc thiết bị tính toán hợp nhất) là
một kiến trúc tính toán song song do NVIDIA phát triển CUDA là cơ chế tính toán trong các GPU (Graphics Processing Unit - Đơn vị xử lý đồ họa) của NVIDIA, lập trình viên
có thể sử dụng thông qua các ngôn ngữ lập trình phổ biến Lập trình viên dùng ngôn
ngữ C for CUDA, dùng trình biên dịch PathScale Open64 C để cài đặt các thuật toán
chạy trên GPU Kiến trúc CUDA hỗ trợ mọi chức năng tính toán thông qua ngôn ngữ C
Hình 2.1 - CUDA trên các GPU đời mới của NVIDIA [4]
CUDA cho phép các nhà phát triển truy xuất các chỉ lệnh ảo và bộ nhớ của các thành phần tính toán song song trong đơn vị xử lý đồ họa của CUDA (CUDA GPU) Sử dụng CUDA, các GPU mới nhất do NVIDIA sản xuất có thể dễ dàng thực hiện các tính toán giống như nhiều CPU Tuy nhiên, không giống như CPU, các GPU có kiến trúc song song có khả năng thực thi nhiều luồng dữ liệu trong một thời điểm Cách tiếp cận giải
quyết các vấn đề có mục đích tổng quát này trên các GPU được gọi là GPGPU
Trong công nghiệp giải trí trên máy tính, ngoài nhiệm vụ làm trơn hình ảnh, GPU cũng được sử dụng để tính toán các hiệu ứng vật lý trong game CUDA cũng được sử dụng để
Trang 6gia tốc các ứng dụng ngoài đồ họa như sinh học tính toán, xử lý khối lượng dữ liệu lớn
cùng với CPU, trong mật mã học và nhiều lĩnh vực khác
CUDA cung cấp cả giao diện chương trình ứng dụng (API) bậc thấp và bậc cao Kiến trúc CUDA SDK đầu tiên được phát hành cho cả hai hệ điều hànhMicrosoft Windows và Linux, có hỗ trợ cho Mac OS X ở phiên bản thứ 2.0 CUDA có trong mọi GPU NVIDIA bắt đầu từ họ G8X về sau
Kiến trúc phần cứng GPU :
Hình 2.2 - Phần cứng GPU [5]
Số phần tử xử lý toán học của GPU nhiều hơn hẳn CPU Điều này mang đến cho GPU một khả năng xử lý song song cực kỳ hiệu quả Điện toán GPU xét trên khía cạnh phần
mềm từ quan điểm và công nghệ của NVIDIA
Ở lớp thấp nhất của kiến trúc phần mềm giành cho điện toán GPU, chúng ta có các GPU của NVIDIA được trang bị kiến trúc tính toán song song CUDA, bao gồm cả trình điều khiển thiết bị CUDA vốn được nhúng bên trong trình điều khiển thiết bị đồ họa do NVIDIA cung cấp
Trang 7Hình 2.3 – Kiến trúc phần mềm điện toán GPU [3]
Trình điều khiển thiết bị CUDA này giữ nhiệm vụ chuyển đổi mã PTX (Parallel Thread Execution - thực thi tiểu trình song song) được sinh ra bởi các trình biên dịch của từng ngôn ngữ lập trình như là C/C++, Fortran, Java, Python sang dạng mã máy thật sự của
GPU được dùng để thực thi ứng dụng
Lớp thứ hai kể từ dưới lên trong hình 2 cho chúng ta thấy một số ngôn ngữ lập trình như C/C++, Fortran, Java, Python và giao diện lập trình như OpenCL, Direct Compute, NET
mà hiện tại lập trình viên có thể dùng để tạo ra một làn sóng mới những phần mềm Sau đây là những nét chính giữa các phiên bản:
* Phiên bản 3.0
Như trong hình 1 trên đây cho thấy, cùng với kiến trúc phần cứng Fermi mới, bộ công cụ phát triển phần mềm CUDA 3.0 đã được phát hành vào tháng Ba năm 2010, nhằm hỗ trợ các tính năng phần cứng GPU mới sau đây:
Hỗ trợ 64-bit GPU
Hỗ trợ cơ chế đa sao chép (Multiple Copy Engine)
Trang 8 Hỗ trợ việc báo cáo các lỗi kiểu ECC
Hỗ trợ việc thực thi các nhân đồng hành (Concurrent Kernel Execution)
Hỗ trợ gỡ rối trên phần cứng Fermi với công cụ cuda-gdb cho môi trường Linux
Hỗ trợ đo đạc hiệu năng phần cứng Fermi cho các ứng dụng viết bằng CUDA C và OpenCL với công cụ Visual Profiler
Hình 2.4 – Quá trình tiến hóa của bộ công cụ phát triển phần mềm CUDA từ phiên bản
1.0 đến 3.0 [3]
Ngoài các tính năng hỗ trợ phần cứng nêu trên, CUDA 3.0 còn mang lại cho chúng ta nhiều cải tiến khác, tạm chia thành 3 nhóm lớn là hỗ trợ ngôn ngữ lập trình C++ tốt hơn, cung cấp môi trường phát triển phần mềm tiện lợi hơn, và hỗ trợ tương tác giữa mức thực thi cấp thấp (mức trình điều khiển thiết bị – CUDA Driver API) và cấp cao hơn (mức môi trường thực thi ứng dụng – CUDA C Runtime API) (xem hình 5)
Trong nhóm cải tiến liên quan đến sự hỗ trợ ngôn ngữ C++ trong phiên bản 3.0, nhờ có
sự ra đời của kiến trúc tập chỉ thị PTX (Parallel Thread Execution) 2.0 mới, cơ chế lời gọi hàm gián tiếp dùng trong các hàm ảo của C++ đã được cài đặt thành công, đồng thời mô hình truy cập và đánh địa chỉ bộ nhớ thống nhất kiểu 64-bit cũng được hiện thực hóa Phiên bản này lập trình viên đã có thể sử dụng tính năng thừa kế lớp và thừa kế template của C++ trong chương trình CUDA của mình nhằm cải thiện năng suất làm việc
Trang 9Hình 2.5 – Các cải tiến do CUDA 3.0 mang lại [4]
Dưới góc độ hỗ trợ phát triển phần mềm, CUDA 3.0:
Khai sinh ra bộ công cụ gỡ rối/phân tích/đo đạc hiệu năng có tên gọi Parallel Nsight dùng chung với bộ phần mềm danh tiếng Visual Studio, là môi trường phát triển ứng dụng kết hợp CPU+GPU đầu tiên trên thế giới cho hệ điều hành Windows
Cung cấp chức năng hỗ trợ gỡ rối mức thấp với giao diện lập trình ứng dụng mức thiết bị CUDA
Cải tiến công cụ cuda-gdb cho việc gỡ rối các ứng dụng được phát triển bằng kỹ thuật JIT compiled kernel Hiệu năng làm việc với cuda-gdb cũng được cải thiện rất nhiều trong phiên bản này
Giới thiệu CUDA Memory Checker, một công cụ mới cho phép báo cáo các lỗi canh chỉnh và vượt phạm vi vùng nhớ, có thể dùng dưới dạng độc lập hoặc như một chế độ gỡ rối bên trong cuda-gdb
cải tiến trình biên dịch NVCC cho ra kết xuất biên dịch các nhân CUDA C/C++ dưới dạng chuẩn ELF, và chuẩn bị loại bỏ định dạng cubin cũ trong các lần phát hành kế tiếp
Trang 10 Loại bỏ chế độ mô phỏng thiết bị, vốn trong các phiên bản trước cho phép một chương trình CUDA có thể chạy mô phỏng theo kiểu đơn tiểu trình trên CPU mà
không cần có phần cứng GPU hỗ trợ CUDA cài đặt trong hệ thống máy tính
Hoàn tất việc cài đặt đầy đủ các hàm có trong thư viện BLAS Thư viện CUBLAS 3.0 hỗ trợ tất cả các hàm có trong đặc tả BLAS mức 1, mức 2, và mức 3, kể cả khi thao tác trên dữ liệu kiểu số phức với độ chính xác đơn và kép
Xét trên khía cạnh hỗ trợ tương tác giữa mức thực thi cấp thấp (mức trình điều khiển thiết bị) và cấp cao hơn (mức môi trường thực thi ứng dụng), CUDA 3.0 lần đầu tiên giới thiệu khái niệm liên thông trong việc truy cập đến các vùng đệm được sử dụng bởi các hàm trong CUDA Driver API và CUDA C Runtime API, hai giao diện lập trình khả dĩ dùng
để truy cập đến phần cứng GPU có kiến trúc CUDA Cho đến trước CUDA 3.0, lập trình viên chỉ có thể chọn sử dụng một trong hai cách tiếp cận này khi phát triển ứng dụng CUDA của mình
* Phiên bản 3.1
Ba tháng sau khi phát hành CUDA 3.0, vào tháng Sáu năm 2010, phiên bản CUDA 3.1 được tung ra và tiếp tục cung cấp thêm nhiều tính năng mới hỗ trợ cho phần cứng Fermi CUDA 3.1 cho phép
Ứng dụng thực thi đến 16 nhân song song khác nhau cùng một lúc trên các GPU
có kiến trúc Fermi (16-way concurrency)
Gọi hàm C cổ điển printf() trong các hàm nhân song song chạy trên GPU
Sử dụng con trỏ hàm và kỹ thuật đệ qui, tạo điều kiện thuận lợi cho việc chuyển
mã nhiều thuật toán đang có sang các GPU kiểu Fermi
Công cụ Unified Visual Profiler hỗ trợ CUDA C/C++ và OpenCL, đồng thời hỗ trợ việc theo vết các hàm trong CUDA Driver API
Ngoài ra CUDA 3.1 còn mang lại rất nhiều cải tiến liên quan đến các thư viện toán học, bao gồm:
Trang 11 Sải tiến hiệu năng thực thi của một số hàm chọn lọc trong họ log, pow, erf, và gamma,
Cải tiến đáng kể hiệu năng thực thi của các phép biến đổi FFT có kích thước là lũy thừa của 2 với độ chính xác kép trên các GPU kiểu Fermi,
Tối ưu hóa các phép toán biến đổi CUFFT từ thực sang phức (R2C) và ngược lại (C2R) có kích thước dữ liệu là lũy thừa của 2,
Hỗ trợ chồng lấp thời gian các thao tác sao chép dữ liệu và tính toán bằng cách sử dụng streaming API trong thư viện CUBLAS,
Cải tiến hiệu năng thực thi của các trình con GEMV và SYMV trong CUBLAS, và
Cung cấp các cài đặt được tối ưu hóa cho các trình con chia và nghịch đảo trên kiến trúc Fermi
Nhiều mã chương trình SDK được viết mới hoặc cập nhật nhằm minh họa:
Cách sử dụng các con trỏ hàm trong các nhân CUDA C/C++
Kỹ thuật chia sẻ vùng đệm giữa OpenCL và Direct3D
Mô hình Markov ẩn trong OpenCL
Cách thức gọi một hàm Excel thực thi trên GPU thông qua ví dụ Microsoft
Excel GPGPU
* Phiên bản 3.2
Các thư viện CUDA mới và cải thiện hiệu năng với các thư viện đã có:
CUSPARSE, một thư viên mới bao gồm các trình con làm việc với ma trận
thưa được tăng tốc nhờ GPU cho các phép toán thưa/thưa và dày/thưa
CURAND, một thư viện mới bao gồm các trình con phục vụ cho việc sinh
số ngẫu nhiên (RNG) được tăng tốc nhờ GPU, hỗ trợ các trình con kiểu
Sobol tựa ngẫu nhiên và XORWOW giả ngẫu nhiên trong các mã chương
trình chạy trên CPU và GPU
Trang 12 Cải tiến hiệu năng thực thi của thư viện CUFFT cho các phép biến đổi có
radix-3, -5, và -7 trên các GPU kiểu Fermi
Cải tiến hiệu năng thực thi của thư viện CUBLAS từ 50% đến 300% trên
các GPU kiểu Fermi cho phép nhân ma trận với mọi kiểu dữ liệu và các
biến thể chuyển vị
Các thư viện nén/giải nén video trước đây chỉ có thể tìm thấy trong bộ GPU
Computing SDK giờ đây được phát hành như một phần của bộ công cụ
CUDA
Hỗ trợ các sản phẩm Quadro và Tesla với 6GB bộ nhớ DRAM trên GPU
Hỗ trợ gỡ rối chương trình trên các GPU có nhiều hơn 4GB bộ nhớ DRAM
trên GPU
Hỗ trợ Integrated Tesla Compute Cluster (TCC) trên các gói trình điều
khiển thiết bị Windows
Các công cụ phát triển phần mềm được cải tiến tốt hơn
Hỗ trợ gỡ rối chương trình sử dụng nhiều GPU trong cuda-gdb và Parallel
Nsight
Hỗ trợ việc sử dụng cuda-memcheck trên các GPU kiểu Fermi
Các cải tiến về giao diện của phần mềm Visual Profiler nhằm giúp tạo
luồng làm việc phân tích dữ liệu đạt năng suất hơn
Trình biên dịch NVCC hỗ trợ Intel C Compiler (ICC) v11.1 trên các bộ
phân phối Linux 64-bit
Hỗ trợ việc gọi các hàm hệ thống cố điển của C là malloc() và free() trong
các nhân tính toán CUDA C
Hỗ trợ giao diện quản lý hệ thống NVIDIA (NVIDIA System Management
Interface) qua chương trình nvidia-smi trong việc báo cáo mức độ bận rộn
Trang 13 Có rất nhiều chương trình mẫu mới giúp lập trình viên hiểu cách sử dụng
thư viện CURAND, bao gồm các chương trình có
tênMonteCarloCURAND, EstimatePiInlineP, EstimatePiInlineQ,
EstimatePiP, EstimatePiQ, và SingleAsianOptionP
Chương trình mẫu Conjugate Gradient Solver minh họa việc dùng kết hợp
2 thư viện CUBLAS và CUSPARSE với nhau
Chương trình mẫu Function Pointers chỉ cách sử dụng các con trỏ hàm
trong việc cài đặt bộ lọc Sobel Edge Detection cho các ảnh đơn sắc 8-bit
Chương trình mẫu Interval Computing minh họa cách sử dụng các phép
toán số học trên khoảng thông qua các khái niệm C++ template và kỹ thuật
đệ qui
Chương trình mẫu Simple Printf minh họa các cách dùng tốt nhất hàm
printf và cuprintf trong các nhân tính toán
Hình 2.6 – Các tính năng mới trong CUDA 3.2 RC [4]
Chương trình Bilateral Filter, một bộ lọc trơn phi tuyến bảo toàn cạnh cho
bài toán phục hồi/khử nhiễu ảnh, minh họa cách cài đặt bằng CUDA C và
hiển thị kết quả bằng OpenGL