MỤ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
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 2
1. 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.
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 3
Hì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.
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 4
Hì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á.
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 5
2. 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 để
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 6
gia 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.
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 7
Hì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)
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 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.
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 9
Hì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.
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 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:
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 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.
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 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
của GPU, cũng như nhiều bộ đo hiệu năng khác trên GPU.
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 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.
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 14
Ví dụ về kỹ thuật SLI với chương trình Direct3D Texture, một minh họa
đơn giản cho việc sử dụng SLI và Direct3D cùng với CUDA C.
* Phiên bản 4.0
Hình 2.7 – Các tính năng của Cuda 4.0 [4]
NVIDIA GPUDirect 2.0
Liên lạc giữa các GPU với nhau không cần sự chỉ thị của GPU chính
Unified Virtual Addressing (UVA)
Tính năng này tương tự cơ chế Non-Uniform Memory Access (NUMA). Trước đây
mỗi chip xử lý sẽ có một không gian bộ nhớ cho riêng nó. Khi một chip nào đó muốn
truy cập vào bộ nhớ của chip khác thì nó buộc lòng phải gửi yêu cầu (request) thông
qua bus dùng chung (ở đây là PCIe) đến chip kia. Và hệ quả hiển nhiên là mỗi khi có
yêu cầu từ chip này (1) lên chip khác (2) thì chip (1) sẽ luôn phải chờ chip (2) “rảnh”
mới trả lời được yêu cầu trên.
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 15
UVA hay NUMA giải quyết vấn đề trên bằng cách hợp nhất không gian bộ nhớ của
các thiết bị trên lại. Lúc này sẽ xuất hiện giới hạn về kích thước không gian nhớ
(0×0000 – 0xFFFF), song không phải lúc nào mọi hệ thống cũng tận dụng hết không
gian trên. Và bạn tưởng tượng như các phòng ban đã được “nhất thể hoá” (unified)
vào một căn phòng chung, tài nguyên bộ nhớ sẽ là của chung và chip (1) có thể truy
cập nhanh chóng đến dữ liệu của chip (2) mà không cần phải đợi chip (2) “rảnh”.
Thrust C++ Template Performance Primitives Libraries
CUDA 4.0 sẽ bổ sung thêm các thư viện template C++ đã được code sẵn, giúp tiết
kiệm thời gian cho lập trình viên.
* Phiên bản 4.1
Phiên bản hiện nay là 4.1 hỗ trợ thêm các tính năng mới
- New compiler.
Thực hiện cải tiến trình biên dịch với công nghệ mới giúp tăng khả năng biên dịch.
- Image Processing
Tập trung vào khả năng xử lý ảnh của GPU
- Dev Tools
Visual Profiler đã được cải tiến với phiên bản mới làm tăng hiệu xuất khả năng phân tích
với chương trình CUDA.
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 16
3. Cài đặt CUDA
Để chạy được các ứng dụng trong bộ GPU Computing SDK, cũng như các ứng dụng
được viết dựa trên công nghệ CUDA khác trên Windows, sau đây là những thứ bạn phải
có trên hệ thống máy tính của mình:
NVIDIA GPU có hỗ trợ CUDA (
Trong trang này, phần „Frequently Asked Questions‟ sẽ chỉ cho bạn cách kiểm tra
đời GPU trên máy của mình, và xác định xem liệu nó có chạy được ứng dụng
CUDA hay không.
Trình điều khiển thiết bị CUDA. Bạn có thể download nó ở đây, tùy theo hệ điều
hành bạn sử dụng là Windows 32-bit hay 64-bit, máy của bạn ở dạng PC hay
notebook hay máy chủ. Các trình điều khiển được liệt kê trong link tôi đã nêu là
những trình điều khiển đã được kiểm tra chạy tốt với CUDA phiên bản 3.0 và bạn
có thể dùng nó khi học CUDA. Tuy nhiên, do sự thật là trình điều khiển thiết bị
CUDA được nhúng bên trong trình điều khiển thiết bị đồ họa tương ứng với GPU
của bạn do NVIDIA cung cấp, bạn cũng có thể cài đặt bản mới nhất thích hợp cho
máy của mình theo hướng dẫn ở trang
Bộ công cụ phát triển ứng dụng CUDA. Bạn có thể tải về (download) ở đây. Bộ
công cụ này cung cấp môi trường phát triển ứng dụng cơ bản, bao gồm trình biên
dịch, trình gỡ rối, trình đo đạc hiệu năng, các thư viện nền cần thiết cho mọi ứng
dụng CUDA.
DirectX phiên bản mới nhất thích hợp với hệ điều hành Windows trên máy của
bạn.
Thao tác cài đặt GPU Computing SDK trên môi trường Windows rất đơn giản.
Bạn chỉ cần chú ý xem hệ điều hành Windows trên máy của mình là 32-bit hay 64-
bit rồi download phiên bản thích hợp từ link có ở đầu bài viết và cài đặt nó vào
máy của mình.
Để kiểm tra hệ điều hành của bạn là 32-bit hay 64-bit, với Windows Vista/7 hãy
ấn phím mouse bên phải trên mục Computer trong Start Menu của Windows, chọn
Properties, sau đó tìm chỗ có thông tin về System Type. Với Windows XP, chọn
Start → Run, nhập vào lệnh dxdiag, chọn No để bỏ qua mục „verify drivers‟, sau
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 17
đó quan sát cửa sổ sau cùng, tìm dòng Operating System. Nếu trên dòng đó có con
số 64 hoặc từ Itanium thì máy chạy hệ điều hành 64-bit, ngược lại là 32-bit.
3.1 Các bước cài đặt
1. Cài bộ visual C++ 2008: vào link sau để tải ba chuơng trình Cuda driver, Cuda
toolkit, GPU Computing SDK (
2. Cài Cuda driver (Trình điều khiển thiết bị CUDA, thường đi kèm với Driver khi
mua card đồ họa NVIDIA)
3. Cài Cuda Toolkit (Bộ công cụ phát triển CUDA bao gồm các chương trình phân
tích thuật toán CUDA, Hỗ trợ Debug)
4. Cài GPU Computing SDK (Bộ thư viện CUDA hỗ trợ các thư viện lập trình
CUDA và các chương trình mẫu về CUDA
Sau khi install xong, bạn có thể kiểm tra nơi lưu các chương trình mẫu đã được
biên dịch sẵn như sau:
<CUDA_SDK_INSTALLED_PATH>\C\bin\win32\Release (cho hệ điều hành 32-
bit), hoặc <CUDA_SDK_INSTALLED_PATH>\C\bin\win64\Release (cho hệ
điều hành 64-bit), trong đó <CUDA_SDK_INSTALLED_PATH> là nơi bạn đã
chọn cài đặt bộ SDK này.
3.2 Làm việc với C#
CUDA.NET được xây dựng và phát triển bởi GASS. Phiên bản đầu tiên ra đời ngày
04/07/2008, hiện nay đã có 2.3.7
Trang CUDA.NET poe -
cloud.com/Solutions/CUDA.NET/Default.aspx
CUDA.NET bao gồm các thành phần:
Mô hình lập trình CUDA
Dấu chấm động
CUDA 2.3 Driver API
CUDA 2.3 Runtime API
Các thủ tục CUFFT
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 18
Các thủ tục CUBLAS
Thao tác với Direct3D
Thao tác với OpenGL
CUDA.NET hiện tại tương thích với các hệ điều hành: Microsoft Windows
, Linux 32/64 bit (using Mono) , Mac OSX (using Mono)
Thư viện CUDA.NET cung cấp bao gồm
Hình 8: Thư viện CUDA.NET
Thư mục docs : chứa file CUDA.Net.chm là tài liệu hướng dẫn sử dụng,
giải thích chi tiết các thuộc tính, phương thức của các không gian tên
Thư mục examples : chứa các ví dụ được viết sẵn bằng CUDA.Net
Thư mục libs : chứa dll để chạy CUDA.Net
Cài đặt môi trường lập trình
Các bước tạo project chạy CUDA.Net:
Bước 1 : Chọn New project C# (hoặc Vb.Net) trực tiếp trên Visual Studio.
Bước 2 : Add thư viện CUDA.Net và file kernel viết bằng CUDA vào project
(kernel.cu)
Bước 3 : Cấu hình build : Click phải project chọn Propertie > Build Events. Ở ô
Post-build event command line nhập vào dòng lệnh : nvcc kernel.cu –cubin (với
kernel.cu là tên file chứa hàm kernel). Lệnh này sẽ build file .cu tạo ra file .cubin
mà chương trình có thể hiểu được.
Sau đó có thể viết code như 1 chương trình C# (hay Vb.Net) thông thường.
3.3 Làm việc với Java
CUDA JAVA hiện tại tương thích với các hệ điều hành: Microsoft Windows ,
Linux 32/64 bit (using Mono) , Mac OSX (using Mono)
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 19
Thư viện CUDA JAVA cung cấp bao gồm:
Hình 9: Thư viện CUDA JAVA
Cài đặt môi trường lập trình
Các bước tạo project chạy CUDA JAVA:
Bước 1 : Tạo New project trên Ecllipse.
Bước 2 : Add thư viện CUDA JAVA vào project.
Sau đó có thể viết code như 1 chương trình Java thông thường.
Bước 3 : Để biên dịch chương trình thì dùng các lệnh sau đây trong project
On Windows:javac -cp ".;jcuda-0.3.2a.jar" JCudaRuntimeTest.java
On Linux:javac -cp ".:jcuda-0.3.2a.jar" JCudaRuntimeTest.java
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 20
4. So sánh tốc độ các thuật toán
Trên môi trường CUDA để làm việc với GPU, thực hiện một số thuật toán phổ biến và so
sánh tốc độ xử lý của chúng khi thực hiện trên CPU và GPU. Thực nghiệm được thực
hiện nhiều lần và lấy giá trị trung bình cộng làm kết quả đánh giá.
4.1 Thuật toán sinh hoán vị của N phần tử
* Thuật toán 1:
Bước 1: Đi từ phải sang trái tìm điểm gãy k của của dãy ( điểm i là điểm gãy khi A[i] <
A[i+1]).
Bước 2: Đi từ phải sang trái tìm điểm trội đầu tiên lớn hơn điểm gãy. ( điểm i gọi là trội
nếu A[i] > A[k]).
Bước 3: Đổi chỗ điểm gãy và điểm trội sau đó lật lại mảng từ điểm cuối tới điểm gãy
Ví dụ:
[9] [7] [1] [9] [8] [5] [9] [8] [6] [4] [3] [2]
B1: [9] [7] [1] [9] [8] (5) [9] [8] [6] [4] [3] [2] (Điểm gãy là 5)
B2: [9] [7] [1] [9] [8] [5] [9] [8] (6) [4] [3] [2] (Điểm trội là 6)
B3: [9] [7] [1] [9] [8] (6) [9] [8] (5) [4] [3] [2] (Đổi chỗ 5 và 6)
[9] [7] [1] [9] [8] (6) [2] [3] [4] [5] [9] [8] (Lật lại mảng từ 2 -> 9)
Với thuật toán này khi thực hiện với N số liên tiếp sẽ phải mất (N! - 1) thủ tục.
* Thuật toán 2:
Liệt kê các hoán vị 2 số
1 2
2 1
Để liệt kê các hoán vị 3 số, đầu tiên ta chép lại danh sách trên, mỗi hàng được chép lặp 3
lần:
1 2
1 2
1 2
2 1
2 1
2 1
viết thêm số 3 vào cuối hoán vị nhứ nhất, rồi tuần tự di chuyển số 3 ra phía đầu hoán vị,
ta được 3 hoán vị 3 phần tử:
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 21
1 2 3
1 3 2
3 1 2
giữ số 3 ở vị trí đầu một lần nữa, rồi tuần tự di chuyển số 3 về phía cuối hoán vị, ta thu
được 3 hoán vị 3 phần tử:
3 2 1
2 3 1
2 1 3
Tương tự với 4 số, 5 số v.v. Thuật toán này không nhất thiết ta phải sinh hoán vị 2 số
trước rồi mới sinh hoán vị 3 số mà ta áp dụng thuật toán tìm điểm gãy trước để sinh một
hoán vị của 2 số rồi sau đó với mỗi kết quả ta di chuyển số 3 để được các hoán vị tiếp
theo. Độ phức tạp của thuật toán này là O(N).
Lần 1:
Số chữ số
CPU Time
GPU Time 1
GPU Time 2
4
0.00352
0.00252
0.00162
6
0.05006
0.03299
0.02351
8
3.76702
0.03982
0.02655
10
242.96041
0.05651
0.03855
Lần 2:
Số chữ số
CPU Time
GPU Time 1
GPU Time 2
4
0.00152
0.00132
0.00153
6
0.04563
0.02599
0.02432
8
3.45326
0.03643
0.02531
10
231.7854
0.05367
0.03655
Lần 3:
Số chữ số
CPU Time
GPU Time 1
GPU Time 2
4
0.001473
0.002759
0.00113
6
0.04648
0.03357
0.02374
8
4.8357
0.03964
0.02846
10
257.6843
0.06731
0.03658
Lần 4:
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 22
Số chữ số
CPU Time
GPU Time 1
GPU Time 2
4
0.00253
0.00261
0.00131
6
0.04986
0.03325
0.02163
8
4.9863
0.03867
0.02745
10
262.4532
0.06432
0.02965
Lần 5:
Số chữ số
CPU Time
GPU Time 1
GPU Time 2
4
0.002136
0.00312
0.00166
6
0.04967
0.03324
0.02364
8
5.1327
0.03621
0.02687
10
253.4673
0.05468
0.03478
Trung bình:
Số chữ số
CPU Time
GPU Time 1
GPU Time 2
4
0.0022358
0.0024658
0.00145
6
0.04834
0.031808
0.023368
8
4.434996
0.038154
0.026928
10
249.670122
0.059298
0.035222
Hình 4.1 Thời gian thực hiện của thuật toán hoán vị giữa CPU và GPU
* Số liệu chạy lần thứ 3 với 4 chữ số tốc độ CPU nhanh hơn GPU.
0
50
100
150
200
250
300
4 chữ số 6 chữ số 8 chữ số 10 chữ số
CPU
GPU-1
GPU-2
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 23
* Khi chạy với số phần tử lớn từ 10 trở đi. Thời gian của CPU nhiều hơn GPU đáng
kể.
4.2 Thuật toán Bubble Sort
* Số phần tử random ngẫu nhiên
Stt
Số phần tử
CPU Time (ms)
GPU Time (ms)
1
500
0.428174
0.182040
2
700
1.297796
0.249168
3
900
1.474148
0.332982
4
1000
1.688804
0.456239
5
1500
3.809954
0.480890
6
2000
6.759768
0.758123
Hình 4.2 Thời gian thực hiện của thuật toán bubble sort giữa CPU và GPU
0
1
2
3
4
5
6
7
8
500 700 900 1000 1500 2000
CPU
GPU
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 24
4.3 Thuật toán Merge Sort
* Số phần tử random ngẫu nhiên
Stt
Số phần tử
CPU Time (ms)
GPU Time (ms)
1
500
0.082712
0.045764
2
700
0.094907
0.063853
3
900
0.182058
0.082788
4
1000
0.354706
0.322558
5
1500
0.582503
0.440107
6
2000
1.034106
0.694656
Hình 4.3 Thời gian thực hiện của thuật toán merge sort giữa CPU và GPU
0
0.2
0.4
0.6
0.8
1
1.2
500 700 900 1000 1500 2000
CPU
GPU
Tìm hiểu GPUGRID - Tính toán lưới GPU GVHD: PGS.TS Nguyễn Phi Khứ
Nguyễn Thị Ngọc Thanh_CH1101132 Trang 25
5. Nhận xét
Đa số thời gian thực hiện một thuật toán trên GPU sẽ nhanh hơn đáng kể khi dữ liệu lớn.
Có một số thuật toán trong thực nghiệm nhưng tốc độ thực hiện trên GPU không nhanh
hơn hoặc nhanh hơn không đáng kể là do kỹ thuật lập trình còn hạn chế của tôi. Trong
quá trình lập trình song song sẽ có một giai đoạn kết hợp kết quả tính toán sau cùng, giai
đoạn này rất phức tạp trong xử lý.
Điều đó sẽ giúp cho thời gian thực hiện GPUGRID sẽ nhanh hơn đáng kể so với các
phương pháp tính toán lưới thông thường. Hiện nay hướng nghiên cứu GPUGRID là
hướng nghiên cứu rất quan trọng trong tính toán hiệu năng cao trên các bài toán đang cần
thiết trong ngành Tin-Sinh học. Tham khảo thêm
Hình 5.1 Các chuỗi gien ung thư phức tạp trong sinh học.