Ứng dụng tính toán song song màu hóa ảnh Ứng dụng tính toán song song màu hóa ảnh Ứng dụng tính toán song song màu hóa ảnh luận văn tốt nghiệp,luận văn thạc sĩ, luận văn cao học, luận văn đại học, luận án tiến sĩ, đồ án tốt nghiệp luận văn tốt nghiệp,luận văn thạc sĩ, luận văn cao học, luận văn đại học, luận án tiến sĩ, đồ án tốt nghiệp
Trang 1MỤC LỤC
MỤC LỤC 1
Tóm tắt luận văn 1
Lời cảm ơn 2
Lời cam đoan 3
Danh mục các ký hiệu, chữ viết tắt 4
Danh mục các bảng biểu 5
Danh mục các hình vẽ, đồ thị 6
PHẦN MỞ ĐẦU 8
1 Lý do chọn đề tài 8
2 Ý nghĩa, mục đích của đề tài 8
3 Đối tượng và phạm vi nghiên cứu 9
3.1 Đối tượng nghiên cứu 9
3.2 Phạm vi nghiên cứu 9
4 Phương pháp nghiên cứu 9
5 Phương tiện nghiên cứu 10
6 Ý nghĩa khoa học và thực tiễn của đề tài 10
7 Những vấn đề sẽ giải quyết 10
8 Kết quả đạt được 10
9 Bố cục của luận văn 11
NỘI DUNG 12
CHƯƠNG 1: TỔNG QUAN VỀ TÍNH TOÁN SONG SONG 12
1.1 Khái niệm "Tính toán song song" 12
1.2 Lý do phải tính toán song song? 12
Trang 21.4 Định luật Amdahl 17
1.5 Tính toán song song trên card đồ họa (GPU) 19
CHƯƠNG 2: TỔNG QUAN VỀ KIẾN TRÚC XỬ LÝ SONG SONG CUDA 22
2.1 Giới thiệu kiến trúc CUDA 22
2.2 Kiến trúc phần cứng 23
2.2.1 Thế hệ thứ nhất: Kiến trúc G80 24
2.2.2 Thế hệ thứ hai: Kiến trúc GT200 25
2.2.3 Thế hệ thứ ba: Kiến trúc Fermi 25
2.2.4 Thế hệ thứ tư: Kiến trúc Kepler 28
2.2.5 So sánh các kiến trúc 30
2.3 Cấu trúc logic trong lập trình CUDA 30
2.4 Cơ chế phân công công việc 32
2.5 Cấu trúc lưu trữ, truy xuất dữ liệu bộ nhớ trong lập trình CUDA 34
2.5.1 Bộ nhớ toàn cục 35
2.5.1.1 Bộ nhớ Global 35
2.5.1.2 Bộ nhớ const 38
2.5.1.3 Bộ nhớ CUDA array 39
2.5.2 Bộ nhớ cục bộ và bộ nhớ dùng chung 41
2.6 Lập trình ứng dụng CUDA mở rộng với C/C++ 44
2.6.1 Mở rộng với ngôn ngữ lập trình C 44
2.6.2 Biên dịch với NVCC (Nvidia’s CUDA Compiler) 45
2.6.3 Từ khóa phạm vi kiểu hàm và kiểu biến 46
2.6.4 Các ràng buộc 48
2.6.5 Thực hiện cấu hình 49
2.6.6 Các biến built-in và vector built-in 49
2.6.7 Hàm đồng bộ 50
Trang 32.6.8 Các hàm chuyển đổi kiểu 51
2.6.9 Các hàm ép kiểu 51
2.6.10 Hàm thời gian 52
2.6.11 Các hàm kết cấu 52
2.7 Các chương trình mẫu 54
2.7.1 Cách xây dựng một chương trình CUDA đơn giản bằng Visual Studio 54
2.7.2 Cộng ma trận 55
2.7.3 Sàng số nguyên tố 57
CHƯƠNG 3: ỨNG DỤNG TÍNH TOÁN SONG SONG TRÊN GPU TRONG MÀU HÓA ẢNH 59
3.1 Thuật toán màu hóa ảnh 59
3.1.1 Bài toán AX=B 64
3.1.2 Một số phương pháp giải bài toán AX=B 66
3.1.2.1 Phương pháp khử Gauss (Gaussian Elimination) 66
3.1.2.2 Phương pháp khử Gauss-Jordan (Gauss-Jordan Elimination) 68
3.2 Cài đặt thuật toán 69
3.2.1 Cài đặt thuật toán khử Gauss 69
3.2.1.1 Cài đặt thuật toán trên CPU 69
3.2.1.2 Cài đặt thuật toán trên GPU 70
3.2.2 Giới thiệu thư viện ViennaCL 71
3.2.3 Sử dụng thư viện ViennaCL để giải bài toán Ax=b và áp dụng vào thuật toán màu hóa ảnh 72
3.2.3.1 Sử dụng thư viện ViennaCL chạy GPU 72
3.2.3.2 Sử dụng thư viện CSparse chạy CPU 75
3.3 Thử nghiệm 75
3.3.1 Môi trường thử nghiệm 75
Trang 43.3.2.1 So sánh thời gian thực hiện thuật toán khử Gauss (Gaussian
Elimination) trên CPU và GPU 76
3.3.2.2 So sánh thời gian thực hiện trên CPU với thư viện CSparse và GPU với thư viện ViennaCL 76
3.3.3 Kết luận 79
PHỤ LỤC 80
Phụ lục 1: Code chương trình cộng ma trận 80
Phụ lục 2: Code chương trình sàng số nguyên tố 81
Phụ lục 3: Kiểm tra GPU 81
DANH MỤC TÀI LIỆU THAM KHẢO 84
Trang 5Tóm tắt luận văn
Họ và tên học viên: Đỗ Bảo Sơn
Chuyên ngành: Công Nghệ Thông Tin
Cán bộ hướng dẫn: TS Lã Thế Vinh
Tên đề tài: Ứng dụng tính toán song song trong màu hóa ảnh
Tóm tắt: Nghiên cứu tổng quan về tính toán song song; các đặc trưng về phần cứng và phần mềm của công nghệ tính toán song song CUDA trên GPU; ngôn ngữ lập trình sử dụng trong tính toán song song CUDA; Phương pháp xây dựng bài toán song song trên GPU từ bài toán tuần tự; Phương pháp màu hóa ảnh số thực hiện trên ảnh tĩnh Xây dựng ứng dụng màu hóa ảnh dựa trên công nghệ tính toán song song
Nội dung luận văn
Chương 1: Tổng quan về tính toán song song
Tìm hiểu khái niệm, đặc điểm của tính toán song song nói chung và tính toán song song trên card đồ họa nói riêng
Chương 2: Tổng quan về kiến trúc xử lý song song CUDA
Tìm hiểu kiến trúc phần cứng CUDA
Tìm hiểu mô hình bộ nhớ CUDA
Tìm hiểu ngôn ngữ lập trình dung trong CUDA
Chương 3: Ứng dụng tính toán song song trong màu hóa ảnh
Phân tích kỹ thuật màu hóa ảnh số
Xây dựng ứng dụng tính toán song song để màu hóa ảnh số, đánh giá các kết quả đã đạt được
Trang 6Lời đầu tiên, tôi xin bày tỏ lòng biết ơn sâu sắc nhất tới thầy giáo Lã Thế Vinh, người thầy đã trực tiếp quan tâm và tận tình hướng dẫn giúp tôi hoàn thành luận văn này
Tôi xin bày tỏ lời cảm ơn chân thành tới các thầy, cô giáo, cán bộ trong trường Đại học Bách khoa Hà Nội đã tạo điều kiện thuận lợi và nhiệt tình giúp đỡ cho tôi trong thời gian học tập tại trường
Xin chân thành cảm ơn tất cả các bạn bè, đồng nghiệp đã động viên, giúp đỡ nhiệt tình và đóng góp nhiều ý kiến quý báu để tôi hoàn thành luận văn này
Tôi xin tỏ lòng biết ơn sâu sắc tới gia đình đã nuôi nấng, luôn là chỗ dựa vững chắc cho tôi, kịp thời động viên, khích lệ, giúp đỡ tôi vượt qua những khó khăn trong cuộc sống
Do thời gian nghiên cứu có hạn, luận văn của tôi chắc hẳn không thể tránh khỏi những sơ suất, thiếu sót, tôi rất mong nhận đuợc sự đóng góp của các thầy cô giáo cùng toàn thể bạn đọc
Xin chân thành cảm ơn!
Hà Nội, tháng 9 năm 2016
Tác giả luận văn
Đỗ Bảo Sơn
Trang 7Lời cam đoan
Tôi xin cam đoan đây là công trình nghiên cứu của bản thân, được xuất phát từ yêu cầu phát sinh trong công việc để hình thành hướng nghiên cứu Các số liệu có nguồn gốc rõ ràng tuân thủ đúng nguyên tắc và kết quả trình bày trong luận văn được thu thập trong quá trình nghiên cứu là trung thực chưa từng được ai công bố trước đây
Tôi xin cam đoan rằng mọi sự giúp đỡ cho việc thực hiện luận văn đã được cám
ơn, các thông tin trích dẫn trong luận văn này đều được chỉ rõ nguồn gốc
Hà Nội, tháng 9 năm 2016 Tác giả luận văn
Đỗ Bảo Sơn
Trang 8Trang 4
Danh mục các ký hiệu, chữ viết tắt
ALU Bộ tính toán số học logic Arithmetic Logic Unit
API Giao diện chương trình ứng
dụng
Application Program Interface
CPU Bộ xử lý trung tâm Central Processing Unit
CTM Kiến trúc tính toán song song
của AMD
Close to Metal
CUDA Kiến trúc thiết bị thống nhất cho
tính toán của Nvidia
Compute Unified Device Architecture
DP Bộ tính toán dấu chấm động độ
chính xác kép
Double precision processor
DRAM Bộ nhớ truy cập ngẫu nhiên
động
Dynamic random access memory
Flops Đơn vị đo số thao tác dấu chấm
Floating point unit
GPGPU Tính toán đa năng trên GPU General purpose graphics
processing unit GPU Bộ xử lý đồ họa Graphics processing unit
NVCC Trình biên dịch CUDA Nvidia’s CUDA compiler
SDK Bộ phát triển phần mềm Software development kit
SFU Bộ tính toán hàm chức năng đặc
biệt
Special function unit
SIMD Đơn lệnh đa dữ liệu Single instruction multiple data
SM Bộ xử lý đa luồng Streaming multiprocessor
SMX Bộ xử lý đa luồng thế hệ mới Next Generation Streaming
Multiprocessor
SP Bộ xử lý luồng Streaming processor
TPC Cụm xử lý luồng trong CUDA Thread Processing Clusters
Trang 9Danh mục các bảng biểu
Bảng 2.1 So sánh các thể hệ kiến trúc phần cứng 30 Bảng 2.2 So sánh thời gian sàng số nguyên tố 58
Bảng 3.1 Bảng kết quả thử nghiệm thuật toán khử Gauss trên CPU Intel(R) Core(TM)
i5 1.7GHz và GPU Nvidia GeForce GT 820M 76 Bảng 3.2 Bảng kết quả thử nghiệm trên CPU với thư viện CSparse và GPU với thư viện ViennaCL 79
Trang 10Trang 6
Danh mục các hình vẽ, đồ thị
Hình 1.1 Tính toán song song 12
Hình 1.2 Biểu đồ định luật Moore (1971-2004) 14
Hình 1.3 Ba nhà khoa học tiên phong trong tính toán song song, từ trái sang phải là Gene Amdahl, Daniel Slotnick, John Cocke 15
Hình 1.4 Máy tính ILLIAC IV 17
Hình 1.5.Tối ưu hóa từng thành phần khác nhau 18
Hình 1.6 Biểu diễn định luật Amdahl 19
Hình 1.7 So sánh số lượng core giữa CPU và GPU 19
Hình 1.8 Siêu máy tính Tianhe-2 20
Hình 1.9 GPU Tesla Kepler K20X 21
Hình 2.1 Sơ đồ kiến trúc phần mềm CUDA 22
Hình 2.2 Các thao tác thu hồi và cấp phát bộ nhớ 23
Hình 2.3 Vùng nhớ dùng chung trên GPU 23
Hình 2.4 Kiến trúc phần cứng G80 24
Hình 2.5 Kiến trúc phần cứng GT200 25
Hình 2.6 Kiến trúc phần cứng Fermi 26
Hình 2.7 Cấu tạo phần cứng của một SM thuộc thế hệ Fermi 27
Hình 2.8 Kiến trúc phần cứng Kepler 28
Hình 2.9 Cấu tạo phần cứng của 1 SMX thuộc thế hệ Kepler 29
Hình 2.10 Sơ đồ hoạt động truyền dữ liệu giữa Host và Device 31
Hình 2.11 Kiến trúc phần mềm tương ứng với kiến trúc phần cứng 33
Hình 2.12 Mô hình grid, block, thread 34
Hình 2.13 Mô hình bộ nhớ CUDA 35
Hình 2.14 Bộ nhớ shared memory 43
Hình 3.1 Mặt phẳng U-V khi Y = 0.5, nằm trong phổ màu RGB 59
Hình 3.2 (a) ảnh đầu vào, (b) ảnh được phân vùng và tô màu, (c) ảnh đầu ra 60
Hình 3.3 Tương quan giữa các điểm ảnh trên miền không gian và thời gian 61
Hình 3.4 Trên miền không gian và thời gian 62
Hình 3.5 Ma trận trọng số tương quan 62
Hình 3.6 Chuyển ma trận được tô màu thành ma trận cột 63
Hình 3.7 Ma trận phương trình AX=B 63
Trang 11Hình 3.8 Thử nghiệm 1 76
Hình 3.9 Thử nghiệm 2 77
Hình 3.10 Thử nghiệm 3 78
Hình 3.11 Thử nghiệm 4 79
Trang 12đã ra đời với khả năng tận dụng nhiều nguồn tài nguyên máy tính cùng đồng thời giải quyết nhiều bài toán lớn mà vẫn đảm bảo tăng hiệu năng và tiết kiệm năng lượng
Một trong những công nghệ tính toán song song mới hiện nay đó là sử dụng bộ xử
lý đồ họa (GPU) để tính toán song song GPU ban đầu được chế tạo để phục vụ chủ yếu cho các ngành công nghiệp giải trí Nhưng GPU hiện đại thì không chỉ dùng để xử
lý đồ họa mà còn có thể thực hiện được các thao tác tính toán khác ngoài đồ họa như thực hiện phép tính dấu chấm động Từ cơ sở đó, GPU có thể trở thành công cụ hữu ích phục vụ cho tính toán song song Và vào năm 2007, công nghệ CUDA (Compute Unified Device Architecture – kiến trúc thiết bị hợp nhất cho tính toán) của Nvidia ra đời đánh dấu bước ngoặt trong tính toán song song trên GPU CUDA giúp cho việc ứng dụng GPU vào tính toán song song trở nên thuận lợi hơn Đây là bộ công cụ phát triển phần mềm dựa trên ngôn ngữ lập trình C Nhờ CUDA, các nhà lập trình viên có thể điều khiển GPU, có thể xây dựng các ứng dụng tính toán song song trên GPU với lượng dữ liệu lớn, đạt hiệu năng cao trên nhiều lĩnh vực: mô phỏng các mô hình vật lý, khai thác dầu khí, khí tượng thủy văn, chuẩn đoán y khoa, di truyền học, kĩ thuật điện
tử,
Với những ý nghĩa đó, tôi đã lựa chọn đề tài luận văn : “ỨNG DỤNG TÍNH TOÁN SONG SONG TRONG MÀU HÓA ẢNH”
2 Ý nghĩa, mục đích của đề tài
Mục đích chính của đề tài là: nghiên cứu về công nghệ tính toán song song trên GPU, nghiên cứu về phương pháp màu hóa ảnh Trên cở sở đó xây dựng ứng dụng tính toán song song để màu hóa ảnh đảm bảo việc xử lý và thời gian tính toán được hiệu quả
Về mặt lý thuyết
Trang 13- Giới thiệu tổng quan về tính toán song song
- Giới thiệu công nghệ tính toán song song CUDA trên GPU
- Trình bày một số phương pháp màu hóa ảnh số
Về mặt thực tiễn
- Thực hiện chuyển đổi một số giải thuật tuần tự xử lý trên CPU sang giải thuật tính toán song với tốc độ xử lý nhanh hơn, cài đặt và giải quyết bài toán trên thiết bị xử lý
đồ họa GPU bằng ngôn ngữ lập trình CUDA và một số thư viện hỗ trợ
3 Đối tượng và phạm vi nghiên cứu
3.1 Đối tượng nghiên cứu
Đối tượng nghiên cứu chính là:
- Công nghệ tính toán song song CUDA trên GPU
- Phương pháp xây dựng bài toán song song trên GPU
- Phương pháp màu hóa ảnh số
3.2 Phạm vi nghiên cứu
Phạm vi nghiên cứu giới hạn:
- Các đặc trưng về phần cứng và phần mềm của công nghệ CUDA
- Kỹ thuật chuyển đổi từ bài toán tuần tự trên CPU sang bài toán song song trên GPU
- Kỹ thuật màu hóa ảnh số thực hiện trên các ảnh tĩnh
4 Phương pháp nghiên cứu
Để thực hiện đề tài đã nêu ra, cần kết hợp mềm dẻo giữa hai phương pháp nghiên cứu: phương pháp nghiên cứu lý thuyết và phương pháp nghiên cứu thực nghiệm, được thực hiện theo các bước sau:
Nghiên cứu lý thuyết về tính toán song song và công nghệ tính toán song song CUDA:
- Nghiên cứu tài liệu về tính toán song song
Trang 14- Nghiên cứu tài liệu công nghệ tính toán song song CUDA trên GPU: kiến trúc phần cứng, kiến trúc phần mềm
- Ngôn ngữ lập trình sử dụng trong tính toán song song CUDA
Nghiên cứu lý thuyết màu hóa ảnh và phương pháp màu hóa ảnh số:
- Nghiên cứu tài liệu về quá trình màu hóa ảnh số
- Các kỹ thuật màu hóa ảnh số
5 Phương tiện nghiên cứu
Trong quá trình làm luận văn tôi đã tham khảo các tài liệu từ các nguồn sau: các giáo trình, các sách tham khảo, các bài báo tạp chí về tính toán song song, các tài liệu trên mạng Internet, các luận văn thạc sĩ và các đồ án tốt nghiệp kỹ sư có liên quan, các phần trợ giúp của các phần mềm, ứng dụng có liên quan Tất cả các nguồn này đã được ghi trích dẫn trong luận văn và liệt kê đầy đủ trong phần tài liệu tham khảo
6 Ý nghĩa khoa học và thực tiễn của đề tài
Trong luận văn đã sử dụng công nghệ tính toán song song trên GPU để song song hóa quá trình màu hóa ảnh tĩnh để tăng thời gian tính toán và xử lý trên khối lượng dữ liệu lớn giúp tiết kiệm thời gian, công sức, tiền bạc
7 Những vấn đề sẽ giải quyết
Để đáp ứng các mục đích đề ra ở trên, trong luận văn này tôi tập trung giải quyết các nội dung chính sau:
- Nghiên cứu chi tiết về công nghệ tính toán song song CUDA trên GPU
- Nghiên cứu các kỹ thuật màu hóa ảnh số
- Đề xuất kỹ thuật song song hóa quá trình màu hóa ảnh số trên GPU
- Xây dựng được module thực hiện màu hóa ảnh dựa trên công nghệ tính toán song song trên GPU
8 Kết quả đạt được
- Xây dựng ứng dụng tính toán song song trên GPU thực hiện màu hóa ảnh số
Trang 159 Bố cục của luận văn
Ngoài phần mở đầu, kết luận, tài liệu tham khảo và phụ lục trong luận văn gồm
có các chương như sau:
Chương 1: Tổng quan về tính toán song song Chương này trình bày những kiến thức
cơ bản về tính toán song song và bước đầu giới thiệu tính toán song song trên GPU
Chương 2: Tổng quan về kiến trúc xử lý song song CUDA Chương này cung cấp
những kiến thức lý thuyết về kiến trúc CUDA, lập trình CUDA và một số ví dụ mẫu
Chương 3: Ứng dụng tính toán song song trên GPU trong màu hóa ảnh Chương
này tìm hiểu phương pháp màu hóa ảnh số, thử nghiệm song song hóa quá trình màu hóa ảnh số trên GPU
Trang 16NỘI DUNG CHƯƠNG 1: TỔNG QUAN VỀ TÍNH TOÁN SONG SONG
1.1 Khái niệm "Tính toán song song"
Tính toán song song hay xử lý song song là quá trình xử lý thông tin trong đó nhiều đơn vị dữ liệu được xử lý đồng thời bởi một hay nhiều bộ xử lý để giải quyết một bài toán
Vấn đề được chia thành các phần riêng biệt có thể giải quyết đồng thời
Các phần được thực hiện đồng thời trên nhiều CPU
Có cơ chế kiểm soát, điều phối quá trình tính toán
Hình 1.1 Tính toán song song
Trên hình 1.1 là mô tả cách thức tính toán song song, từ 1 bài toán chia thành 4 phần Sau đó mỗi phần, bao gồm n dòng lệnh được được thực hiện đồng thời trên mỗi CPU
1.2 Lý do phải tính toán song song?
Tiết kiệm thời gian và tiền bạc:
Về mặt lý thuyết, trong tính toán song song khi tăng thêm nguồn lực vào một nhiệm vụ sẽ rút ngắn thời gian để hoàn thành nó với chi phí tiết kiệm Máy tính song song có thể được xây dựng từ những thành phần, linh kiện rẻ hơn Tận dụng được các nguồn tài nguyên tính toán trên mạng diện rộng
Trang 17 Xử lý các bài toán lớn:
Có nhiều vấn đề rất lớn hoặc rất phức tạp, mà nó là không thực tế hoặc không thể giải quyết trên một máy tính duy nhất, đặc biệt là khi bộ nhớ máy tính bị hạn chế Tính toán song song (được coi là bước phát triển cao nhất của tính toán) hoàn toàn có thể giải quyết được những vấn đề này
Ví dụ:
- Mô hình hóa và mô phỏng diễn biến của một hiện tượng tự nhiên và trong nhiều
lĩnh vực khoa học kĩ thuật như vật lý, hóa học, sinh học, …
- Dự báo thời tiết, động đất, sóng thần
- Các bài toán thiên văn học vũ trụ, tính toán quỹ đạo, sự chuyển động của các
hành tinh
- Điều khiển tên lửa
- Công cụ tìm kiếm web, dịch vụ kinh doanh dựa trên web, xử lý đồng thời hàng
triệu yêu cầu trong một giây trên Internet
- Đồ họa và các môi trường ảo trong ngành công nghiệp giải trí
- Vấn đề xử lý ngôn ngữ tự nhiên, trí tuệ nhân tạo, di truyền học
- Các vấn đề toán học: như tìm số pi, …
- …
Khả năng cung ứng đồng thời:
Một nguồn lực tính toán chỉ có thể làm một việc tại một thời điểm Nhiều nguồn tài nguyên tính toán có thể làm nhiều việc cùng một lúc
Tận dụng được các nguồn tài nguyên phân tán:
Sử dụng được các nguồn tài nguyên tính toán trên mạng diện rộng hay qua Internet trong khi nguồn tài nguyên cục bộ ít hoặc không đáp ứng được nhu cầu
Giới hạn của tính toán tuần tự
Về lý thuyết: tốc độ tính toán của CPU là hữu hạn vì phải chịu nhiều giới hạn về
Trang 18.thước bóng bán dẫn không thể nhỏ hơn nguyên tử), vấn đề làm nguội khi công suất của chip tăng lên
Định luật Moore [13] được xây dựng bởi Gordon Moore - một trong những sáng lập viên của tập đoàn sản xuất chip máy tính nổi tiếng Intel Định luật được phát biểu như sau:
“Mật độ transistor sẽ tăng lên gấp đôi sau 18 tháng”
Tuy nhiên, trong thời gian gần đây định luật Moore đã có nhiều biểu hiện bị thay đổi và kéo dài dần thời gian tăng đôi số transistor trên một đơn vị diện tích Tại thời điểm năm 2007, khoảng thời gian để tăng đôi số transistor là xấp xỉ 60 tháng Trong tương lai không xa khi mà các áp dụng kỹ thuật đã không thể rút nhỏ kích cở của một transistor xuống hơn được (cụ thể là khi kiến trúc của transistor đã được rút xuống đến mức độ phân tử) thì định luật Moore sẽ không còn đúng nữa
Hình 1.2 Biểu đồ định luật Moore (1971-2004)
Mở rộng tần số là nguyên nhân chủ yếu trong việc làm tăng tốc độ khả năng xử lý của máy tính Thời gian chạy của một chương trình được tính bằng số câu lệnh nhân với thời gian trung bình của một câu lệnh Như vậy nếu duy trì tất cả những thứ khác
ổn định, gia tăng tần số xung nhịp sẽ làm giảm thời gian trung bình để thực thi một câu
Trang 19.lệnh Như vậy tần số tăng sẽ giảm đi thời gian chạy của những chương trình giới hạn tính toán [13]
Tuy nhiên, mức tiêu hao năng lượng của một con chip được tính bởi công thức
P = C × V2 × F (1.1) trong đó P là năng lượng, C là capacitance (điện dung) được chuyển mỗi chu kỳ xung nhịp (tỷ lệ thuận với số lượng bán dẫn có đầu vào thay đổi), V là voltage (điện áp), và
F là tần số của bộ xử lý (số chu kỳ mối giây) Như vậy tăng tần số cũng làm năng lượng sử dụng của bộ xử lý tăng theo, việc làm mát chip cũng trở nên khó khăn hơn và kích thước quạt gió cũng phải tăng theo Việc tăng tiêu hao năng lượng này đã dẫn đến quyết định ngừng phát triển bộ xử lý Tejas and Jayhawk của Intel tháng 5 năm 2004, được cho là sự chấm dứt của nỗ lực tăng tần số hệ thống máy tính [13]
1.3 Lịch sử của tính toán song song
Vào tháng Tư năm 1958, S Gill (Ferranti) thảo luận về lập trình song song và nhu cầu phân nhánh và chờ đợi Cũng trong năm 1958, hai nhà nghiên cứu của IBM John Cocke và Daniel Slotnick lần đầu tiên thảo luận về việc sử dụng song song trong các tính toán số học Tập đoàn Burroughs đã giới thiệu D825 năm 1962, một máy tính bốn
bộ xử lý có thể truy cập lên đến 16 module bộ nhớ thông qua một bộ chuyển mạch thanh ngang Năm 1967, Amdahl và Slotnick công bố một cuộc tranh luận về tính khả thi của xử lý song song tại của Hội nghị xử lý thông tin xã hội Liên bang Mỹ Từ cuộc tranh luận này mà định luật Amdahl đã được đặt ra để xác định giới hạn sự tăng tốc do song song [13]
Hình 1.3 Ba nhà khoa học tiên phong trong tính toán song song, từ trái sang phải là
Trang 20.Năm 1969, công ty của Mỹ Honeywell giới thiệu hệ thống Multics đầu tiên của mình, một hệ thống đa xử lý đối xứng có khả năng chạy đến tám bộ xử lý song song C.mmp, một dự án bộ đa xử lý ở Đại học Carnegie Mellon những năm 1970, là "một trong những bộ đa xử lý đầu tiên với hơn một vài bộ vi xử lý"
Nói về những mô hình tính toán song song đầu tiên, ta có thể kể đến Daniel Slotnick - Đại học Illinois – người đã thiết kế hai mẫu máy tính song song từ rất sớm:
- Máy Solomon chế tạo tại công ty Westinghouse Electric vào đầu những năm 60
- Máy ILLIAC IV lắp đặt tại tổ hợp Buroughs vào đầu những năm 70
Năm 1964, Slotnick đã đề xuất xây dựng một máy tính song song hàng loạt cho Phòng thí nghiệm quốc gia Lawrence Livermore Thiết kế của ông được tài trợ bởi Không quân Hoa Kỳ, đây là nỗ lực tính toán song song SIMD đầu tiên, ILLIAC IV Chìa khóa cho việc thiết kế của nó là một song song khá cao, lên đến 256 bộ xử lý, cho phép máy làm việc trên bộ dữ liệu lớn mà sau này được biết đến như là xử lý liên hợp Tuy nhiên, ILLIAC IV được gọi là "nổi tiếng nhất trong các siêu máy tính", vì dự án chỉ hoàn thành được một phần tư, nhưng tốn 11 năm và chi phí gấp gần bốn lần so với ước tính ban đầu Khi nó cuối cùng cũng có thể chạy ứng dụng đầu tiên vào năm 1976,
nó đã hoàn toàn thua kém so với những siêu máy tính thương mại lúc đó như Cray-1 [13]
Trang 21Hình 1.4 Máy tính ILLIAC IV
Tại đại học Carnegier – Mellon, hai kiểu máy tính song song C.mmp và Cm+ cũng
đã được chế tạo vào đầu những năm 70 Vào đầu thập kỷ 80, các nhà nghiên cứu của
tổ hợp Caltech đã xây dựng Cosmic Cube, hình mẫu nguyên thủy cho các loại máy song song sau này của Intel, Ametek
Tuy nhiên phải đến giữa những năm 80, máy tính song song dựa trên các bộ vi xử
lý (microprocessor) mới trở thành hiện thực Có được điều đó là nhờ tốc độ phát triển của công nghệ chế tạo bộ vi xử lý đã phát triển vượt bậc, đạt tới 35% mỗi năm, trong khi tốc độ phát triển của các siêu máy tính truyền thống chỉ là 20%
Tháng 6/1993, các giáo sư Hans Meuer (Đại học Mannheim – Đức), Jack Dongarra (Đại học Tennessee – Hoa Kỳ) cùng Eric Strohmaier và Horst Simon (Phòng thí nghiệm quốc gia Lawrence Berkeley – Hoa Kỳ) đã thiết lập bảng xếp hạng các siêu máy tính hàng đầu thế giới Top 500 Supercomputer (top500.org) Top500 thống kê danh sách các siêu máy tính trên thế giới vào tháng 6 và tháng 11 hàng năm Bảng xếp hạng này cung cấp 1 cái nhìn đầy đủ về các siêu máy tính hiện đại nhất trên thế giới, bao gồm các thông số về khả năng tính toán của các hệ thống (Rmax, Rpeak) được đo bởi hệ thống LINPACK và thông tin thời sự xung quanh chủ đề “Các máy tính và kiến trúc song song”
Trang 22.Speedup (hệ số tăng tốc): speedup của thuật toán song song là tỷ số giữa thời gian thực hiện trong tình huống xấu nhất của thuật toán tuần tự tốt nhất và thời gian thực hiện cũng công việc đó của thuật toán song song Trong trường hợp thông thường, có thể hình dung một cách tương đối như sau:
Hình 1.5.Tối ưu hóa từng thành phần khác nhau
Giả sử một công việc có hai bộ phận độc lập, A và B Phần B chiếm khoảng 25% thời gian của toàn bộ tính toán, nếu ta làm cho phần việc này nhanh gấp 5 lần thì điều này chỉ làm giảm thời gian của toàn bộ tính toán đi một chút Ngược lại, nếu ta làm cho phần A nhanh gấp hai lần thì sẽ làm cho tính toán nhanh hơn bằng cách tối ưu phần B, mặc dù B có tốc độ tăng lớn hơn (5× với 2×) [13]
Một chương trình giải quyết một vấn đề khoa học/ công nghệ thường bao gồm một
bộ phận song song và phần còn lại không song song (tuần tự) Khi đó phần không thể được song song của chương trình, dù nó nhỏ đến đâu đi nữa, cũng sẽ hạn chế khả năng tăng tốc tổng thể của việc song song hóa Năm 1967 Gene Amdahl đã phát biểu định
lý sau đây:
Định luật Amdahl:
Gọi f là tỷ lệ thao tác tuần tự trên tổng số thao tác phải làm, trong đó 0 f 1 Tốc độ tối đa S của một máy tính song song với p bộ xử lý luôn nhỏ hơn
Hệ quả : Ngưỡng cực đại của S là 1/f
thời gian thực hiện trên máy tính tuần tự
thời gian thực hiện trên máy tính song
song
p f f
S
/ ) 1
Trang 23.Chẳng hạn, giả sử phần tuần tự của một chương trình là 10% thời gian chạy, khi
đó hệ số tăng tốc (speedup) sẽ không thể đạt được quá 10 lần, bất kể ta huy động bao nhiêu bộ xử lý đi nữa Điều này đặt ra một giới hạn về tính hữu ích của việc thêm các đơn vị thực hiện song song với nhau nhiều hơn
Hình 1.6 Biểu diễn định luật Amdahl
1.5 Tính toán song song trên card đồ họa (GPU)
Hình 1.7 So sánh số lượng core giữa CPU và GPU
Trang 24.Hiện nay, số lượng nhân tính toán trong CPU chỉ ở mức 4, 8 hay 16 nhân trên 1 chip Để tính toán song song đạt hiệu năng cao cần có một hệ thống gồm nhiều chip, nhiều nhân tính toán Điều này dẫn tới phải giải quyết vấn đề về chi phí, cách thức điều khiển, truyền thông giữa các chip Nhưng với công nghệ GPU hiện đại, ta có thể tính hợp hàng trăm, thậm chí hàng nghìn nhân chỉ phục vụ cho mục đích tính toán trên cùng 1 chip, giúp giảm chi phí sản xuất, việc điều khiển, truyền thông trong 1 chip thuận lợi hơn so với nhiều chip
Dựa trên cấu trúc phần cứng, tính toán đa năng trên các đơn vị xử lý đồ họa (GPGPU) đã ra đời Đây là một xu hướng khá phổ biến gần đây trong nghiên cứu kỹ thuật máy tính GPUs là các bộ xử lý động bộ được tối ưu hóa mạnh cho việc xử lý đồ họa máy tính Xử lý đồ họa máy tính là một lĩnh vực bị chi phối bởi các thao tác dữ liệu song song – đặc biệt là các thao tác ma trận đại số tuyến tính
Trong những ngày đầu, các chương trình GPGPU sử dụng đồ họa thông thường APIs để chạy Tuy nhiên, một số ngôn ngữ và nền tảng lập trình mới đã được xây dựng để thực hiện tính toán đa năng trên GPU với cả Nvidia và AMD, tạo ra môi trường lập trình với CUDA và CTM tương ứng Các ngôn ngữ lập trình GPU khác là BrookGPU, PeakStream và RapidMind [13]
Hình 1.8 Siêu máy tính Tianhe-2
Trong danh sách Top 500 Supercomputer (top500.org) được công bố tháng 11/2015, có đến 104/500 hệ thống có sử dụng GPU tính toán hiệu năng cao, tính riêng top 10 có 5 hệ thống có tích hợp thêm GPU Tiêu biểu là siêu máy tính Tienhe-2 (hình 1.8) đặt tại trung tâm siêu máy tính quốc gia Quảng Châu – Trung Quốc đang chiếm lĩnh vị trí số 1 Tienhe-2 có khả năng tính toán cao nhất theo lý thuyết là 54,902
Trang 25.TeraFlop/s và trên thực tế là 33,862 TeraFlop/s (nghĩa là có hệ thống có thể thực hiện được 33.862 triệu tỷ phép tính trong một giây) Điều đặc biệt ở siêu máy tính Tienhe-2
đó là sức mạnh của nó được tạo nên bởi 32,000 CPU Xeon và 48,000 GPU Xeon Phi (hình 1.9)
Hình 1.9 GPU Xeon Phi
Đứng thứ hai trong top 10 tính đến thời điểm 11/2015 cũng là một siêu máy tính
có trang bị GPU để xử lý song song là Titan của Hoa Kỳ Siêu máy tính đặt tại phòng thí nghiệm quốc gia Hoa Kỳ - Oak Ridge thuộc tiểu bang Tennessee này gồm 18,688 CPU và 18,688 GPU Nvidia Tesla Kepler K20X có khả năng tính toán lên đến 17,590 TeraFlop/s
Tesla Kepler K20X là một đại diện tiêu biểu cho dòng GPU Tesla chuyên về tính toán hiệu năng cao, của Nvidia – nhãn hiệu sản xuất GPU phổ biến thế giới K20X được trang bị 2496 nhân, khả năng tính toán là 1.31 TFlop/s cùng với bộ nhớ 6 GB Ngoài ra còn có thể kể đến dòng GPU tính toán hiệu năng cao AMD FireStream của AMD Trong đó, đại diện tiêu biểu là Radeon HD5870 với khả năng tính toán 544
GFlop/s
Trang 26CHƯƠNG 2: TỔNG QUAN VỀ KIẾN TRÚC XỬ LÝ SONG SONG CUDA
2.1 Giới thiệu kiến trúc CUDA
CUDA là từ viết tắt của thuật ngữ Compute Unified Device Architecture, tạm dịch
là kiến trúc thiết bị hợp nhất cho tính toán CUDA bắt đầu xuất hiện từ tháng bảy năm
2007 với vai trò ban đầu là một bộ công cụ phát triển phần mềm dựa trên ngôn ngữ lập trình C Bây giờ CUDA đang tiến hóa thành kiến trúc điện toán GPU, hay còn gọi là GPGPU của NVIDIA CUDA có mặt trên hầu hết các GPU đời mới của NVIDIA, từ dòng GeForce giành cho giải trí đến Quadro giành cho điện toán hình ảnh chuyên nghiệp và dòng Tesla cho tính toán hiệu năng cao
Bộ phần mềm CUDA có các lớp mô tả trong Error! Reference source not found.gồm: Bộ điều khiển (dirver) cho phần cứng, API lập trình, môi trường thực thi
và hai thư viện toán học mức cao hơn của các hàm thường dùng: CUFFT và CUBLAS Phần cứng được thiết kế để hỗ trợ bộ điều khiển hạng nhẹ và lớp môi trường thực thi
Từ đó cho tốc độ cao
Hình 2.1 Sơ đồ kiến trúc phần mềm CUDA
Thư viện lập trình CUDA bao gồm các hàm mở rộng của ngôn ngữ C CUDA
cung cấp cách đánh địa chỉ DRAM thường dùng như mô tả trong Error! Reference source not found.cho việc lập trình linh hoạt hơn, bao gồm cả thao tác cấp phát và thu
hồi bộ nhớ Từ góc độ lập trình, điều đó tương ứng với khả năng đọc và ghi dữ liệu tại bất kỳ địa chỉ nào trong DRAM, giống như CPU
Trang 27Hình 2.2 Các thao tác thu hồi và cấp phát bộ nhớ
CUDA có đặc tính lưu dữ liệu đệm song song, bộ nhớ chia sẽ trên bộ vi xử lý với tốc độ đọc ghi rất cao, các luồng dùng bộ nhớ này để chia sẻ dữ liệu với nhau Như mô
tả trong Error! Reference source not found., ứng dụng có thể đạt kết quả tốt bằng
cách tối thiểu việc lấy/trả dữ liệu từ DRAM Từ đó giảm phụ thuộc băng thông truyền
bộ nhớ DRAM
Hình 2.3 Vùng nhớ dùng chung trên GPU
Trang 28.Hiện nay, NVIDIA đã phát triển được 4 thế hệ kiến trúc phần cứng tính toán cho CUDA Các kiến trúc đó là:
Card đồ họa CUDA GPGPU có các bộ xử lí 32-bit (thread processors, streaming
processor core, hay scalar processor- SP) – đơn vị xử lí nhỏ nhất
Ở thế hệ 1 chưa có bộ xử lí kép Từ thế hệ 2 trở đi mới có thêm có thêm bộ xử lí tính toán dấu chấm động độ chính xác kép (64-bit) double precision processor (DP) Trong kiến trúc G80, cứ mỗi 8 SP, cùng với các đơn vị phần cứng khác (1 I-cache,
1 MT-issue, 1 C-cache, 2 SFU, 1 shared memory) được gộp thành một nhóm, tương ứng là 1 multiprocessors (streaming multiprocessor – SM) Cứ mỗi 2 SM (hoặc nhiều hơn tuỳ vào kiến trúc), cùng với các đơn vị phần cứng khác (1 Texture unit, 1 Geometry controller (aka TPC controller), 1 SMC), tạo thành 1 group, tương ứng là 1
Thread Processing Clusters (TPC)
Hình 2.4 Kiến trúc phần cứng G80
Trang 29so với G80
Hình 2.5 Kiến trúc phần cứng GT200
2.2.3 Thế hệ thứ ba: Kiến trúc Fermi
Trang 30Hình 2.6 Kiến trúc phần cứng Fermi
Kiến trúc GPU Tesla thế hệ 3 (Hình 2.1) có những đặc điểm sau:
Streaming processors (CUDA cores): số lượng là 448 hoặc 512
Double precision processors (DP): số lượng là 224 hoặc 256 (bằng một nửa SP)
Streaming multiprocessors (SM) : số lượng là 14 hoặc 16, mỗi SM bao gồm 32 CUDA cores, GigaThread: phân phối các blocks cho các SM và quản lý chuyển mạch thiết bị giữa các thread trong quá trình thực hiện
Host Interface: có nhiệm vụ kết nối GPU với CPU thông qua giao tiếp Express v2 bus (tối độ truyền tối đa là 8GB/s)
PCI- DRAM: hỗ trợ tối đa 6 GB bộ nhớ GDDR5 DRAM với băng thông tối đa là
192 GB/s
Hiệu năng tối đa: 1,5 TFlop/s
Có 64 KB constant cache (lưu trữ các giá trị hằng số) và instruction cache (lưu các lệnh của kernel)
L2 Cache: 768 KB dùng chung cho toàn bộ SM Nó có nhiệm vụ tải, lưu trữ từ
bộ nhớ toàn cục, bao gồm cả copy dữ liệu đến CPU hoặc từ CPU đi
Trang 31Hình 2.7 Cấu tạo phần cứng của một SM thuộc thế hệ Fermi
Kiến trúc một SM của GPU Tesla thế hệ 3 (Hình 2.2) có các đặc điểm sau:
Có 32 SP (CUDA cores), mỗi CUDA cores có một đơn vị tính toán số học logic (ALU) và đơn vị tính toán số thực dấu chấm động độ chính xác đơn (FPU)
Có 16 DP (2 SP hợp thành 1 DP) phục vụ tính toán số thực dấu chấm động độ chính xác kép
16 đơn vị load/store: tải và lưu trữ dữ liệu từ cache, DRAM hoặc đến cache, DRAM
4 SFU (Special Function Unit): là hàm tính toán chức năng đặc biệt, có khả năng tính toán nhanh hơn SP, DP nhưng độ chính xác thì thấp hơn
32768 thanh ghi (registers) 32 bit: mỗi thread có quyền truy cập đến tối đa 63 thanh ghi của thread đó Các thanh ghi có băng thông rất cao lên đến 8000 GB/s
64KB L1 cache/Shared memory: L1 cache dùng để lưu trữ dữ liệu cho mỗi thread trong khi shared memory lữu trữ dữ liệu được chia sẻ cho một vài thread
Có thể có 48 KB L1 cache + 16 KB shared memory hoặc 16KB L1 cache + 48
KB shared memory Bộ nhớ chia sẻ (shared memory) cho phép một vài thread trong cùng block cùng truy cập đến nó Bộ nhớ này cung cấp truy cập với độ trễ
Trang 32bộ nhớ Số lượng thanh ghi và bộ nhớ chia sẻ trên mỗi SMX cũng được mở rộng hơn Phần cứng được thiết kế để hỗ trợ các mô hình lập trình mới
Trang 33Hình 2.9 Cấu tạo phần cứng của 1 SMX thuộc thế hệ Kepler
Hình là kiến trúc SM mới được gọi là SMX, trong đó bao gồm:
Có 192 SP (CUDA cores), mỗi CUDA cores giống như ở kiến trúc Fermi
Có 64 DP
32 bộ load/store
32 SFU
65536 thanh ghi (registers) 32 bit với GK110 và 131072 thanh ghi với GK210
64KB L1 cache/Shared memory với GK110 và 128KB với GK210
4 warp scheduler và 8 dispatch unit
Trang 34L1 Cache (1 SM) None None 16, 48 KB 16, 32, 48 KB
L2 Cache None None 768 KB 1536 KB
Load/Store Address Width 32-bit 32-bit 64-bit 64-bit
Bảng 2.1 So sánh các thể hệ kiến trúc phần cứng
2.3 Cấu trúc logic trong lập trình CUDA
Trong kiến trúc CUDA, CPU được xem là host, GPU được xem là device Có thể
có nhiều hosts và nhiều devices trên một máy tính Cả hai đều có bộ nhớ riêng với tên gọi tương ứng là host memory và device memory, không có bộ nhớ dùng chung Vì thế khi thực hiện tính toán, cần copy qua dữ liệu qua lại giữa CPU và GPU Ở mẫu lệnh cơ bản việc copy dữ liệu chỉ được diễn ra khi không có đoạn code nào đang chạy trên GPU, tuy nhiên với kiến trúc CUDA kiểu mới cho phép copy dữ liệu và thực hiện lệnh trên GPU diễn ra đồng thời
Trang 35Hình 2.10 Sơ đồ hoạt động truyền dữ liệu giữa Host và Device
Điểm cốt lõi đặc biệt quan trọng trong lập trình với kiến trúc CUDA là hiểu và xử
lí tốt thread Thuật ngữ thread trong CUDA được hiểu là phần tử cơ bản của dữ liệu
được xử lí song song
Các nhà phát triển kiến trúc CUDA đã cung cấp cho lập trình viên phát triển một
số phần mềm cho phép kiểm tra việc copy và thực hiện tính toán trong GPU Kết quả kiểm thử cho thấy copy từ GPU sang CPU nhanh hơn so với CPU sang GPU GPU phù hợp để thực thi 1 tác vụ gọi nhiều lần, mỗi lần áp dụng trên các dữ liệu đầu vào
khác nhau Đoạn code cho tác vụ như vậy khi thực thi trên GPU được gọi là kernel Như vậy, kernel được hiểu là 1 đoạn mã do người lập trình viết ra chỉ để thực hiện
tính toán trên thiết bị hay còn gọi là GPU
Khi có lệnh gọi kernel từ chương trình chính được CPU quản lí, chương trình sẽ kiểm tra thông qua 1 cú pháp gọi kernel được qui định sẵn trong trình biên dịch của CUDA xem có bao nhiêu threads chạy song song trong kernel đó
Điểm hạn chế cho tới thế hệ 2 của Tesla là tại mỗi thời điểm trên mỗi GPU chỉ có
1 kernel được thực thi tuy nhiên số lượng threads trong kernel đó là rất lớn Để dễ
quản lí một số lượng lớn threads như vậy, cũng đồng thời giúp ánh xạ (mapping) dễ
dàng từ dữ liệu sang các threads, kiến trúc blocks và grids được sử dụng Threads,
blocks, grids được gọi là hệ thống phân cấp logic các luồng của CUDA theo thứ tự từ cấp thấp đến cao Khi gọi 1 kernel thực thi, ta phải qui định tường minh số chiều của
block và của grid
Để dễ quản lí, phân chia dữ liệu, các thread được gộp thành từng nhóm gọi là
blocks theo kích thước 1-, 2- hoặc 3- chiều, và số lượng tối đa threads trong
Trang 36.trọng trong việc lập trình CUDA bởi lẽ nếu cấp phát >512 threads trên 1 block thì kernel sẽ thực hiện sai ý đồ của người lập trình
Ví dụ: một 3D block thì chỉ có thể có kích thước tối đa là 8x8x8
Để tăng số lượng threads song song có thể thực hiện cho 1 kernel, các blocks có thể gộp thành 1 grid của các blocks với cách sắp xếp có thể theo dạng 1 chiều, 2
chiều với kích thước tối đa của grid ≤ 232 blocks/grid Như vậy, tối đa, ta có thể
có 232 * 29 = 241 threads tổng cộng chạy song song trong 1 kernel
Các threads của GPU là light-weight Mỗi threads đều có bộ nhớ chứa dữ liệu của
riêng nó (bao gồm thanh ghi – register – và local memory)
Các threads trong cùng 1 block có thể chia sẽ dữ liệu qua shared memory, nhưng điều này không thể xảy ra với hai threads ở hai blocks khác nhau Muốn làm được
điều này ta cần lưu trữ dữ liệu ở device memory – global memory)
Tốc độ truy xuất đến dữ liệu trong shared memory là cực kì nhanh Dữ liệu của
threads lưu ở shared memory sẽ mất khi thread kết thúc Nếu với dữ liệu quá lớn ( >
16KB), nó sẽ tự động được lưu trữ ở device memory - chính là DRAM (kích thước có thể đến 4GB, hoặc thậm chí 6GB với Tesla M2070)
Dữ liệu lưu ở device memory sẽ tồn tại trong suốt thời gian chương trình hoạt
động (hoặc khi mà nó bị giải phóng) Vì thế, dữ liệu lưu ở device memory có thể được truy xuất từ mọi thread trong mọi kernel Đồng thời, dữ liệu ở device memory của
chương trình đang chạy sẽ là nơi trao đổi qua lại với host memory để rồi cuối cùng trả lại cho chương trình chính
2.4 Cơ chế phân công công việc
Trang 37Hình 2.11 Kiến trúc phần mềm tương ứng với kiến trúc phần cứng
Hệ thống phân cấp logic các luồng của CUDA được ánh xạ tới hệ thống phân cấp của bộ vi xử lý trên GPU như hình 2.3 Một GPU sẽ thực thi một hoặc nhiều grid Một
SM sẽ thực thi một hoặc nhiều blocks Một CUDA cores và các đơn vị khác trong SM
sẽ thực thi một hoặc nhiều threads
Mỗi SM sẽ thực thi một tập hợp gồm 32 threads gọi là warp Như vậy 32 là kích thước tối thiểu để xử lí song song bởi 1 SM theo kiểu SIMD
Để thuận lợi, thay vì tương tác trực tiếp với các warp, CUDA đưa ra khái niệm block Ở thế hệ 3 (kiến trúc Fermi), một block có tối đa là 1024 thread và kích thước lớn nhất của block 3 chiều là 1024 x 1024 x 64 Số lượng thread trong mỗi block nên
là bội của 32
Tiếp đến, việc nhóm các blocks vào trong 1 grid cho phép gọi và thực thi hàng ngàn threads chỉ bằng 1 lệnh gọi đơn, và không cần quan tâm đến tài nguyên của phần cứng Trong GPU Tesla thế hệ 3, kích thước lớn nhất của grid 3 chiều là 65535 x
65535 x 65535
Trang 38Hình 2.12 Mô hình grid, block, thread
Các threads thuộc cùng 1 warp thì bắt đầu cùng lúc, cùng thực hiện một lệnh, tuy nhiên chúng có thể hoạt động độc lập, rẽ nhánh (branching) có thể xảy ra Nếu branching xảy ra, ví dụ theo 2 hướng A và B, thì một số threads sẽ thực hiện A trước,
và các threads còn lại thực hiện B sẽ đợi cho tới khi A xong sẽ thực hiện Chính vì thế, chúng có thể được đồng bộ với nhau [14]
Ví dụ: để đảm bảo là mọi threads đều đã đọc xong dữ liệu của nó trước khi cho
phép mỗi thread thực hiện tiếp tác vụ, hay là các threads cần phải kết thúc trước khi trở lại chương trình gọi
2.5 Cấu trúc lưu trữ, truy xuất dữ liệu bộ nhớ trong lập trình CUDA
Vì tốc độ chậm trong truy xuất bộ nhớ là nguyên nhân chủ yếu gây ra hiện tượng nghẽn cổ chai (bottleneck) trong các chương trình song song Tesla tạo ra nhiều lớp (layer) bộ nhớ khác nhau với tốc độ truy cập khác nhau phù hợp cho các nhu cầu cụ thể Quyền truy cập đến mỗi loại bộ nhớ cũng tuỳ vào cấp độ phần cứng sử dụng Trước hết cần nắm được nguyên tắc chung khi thao tác với bộ nhớ trong lập trình CUDA Dữ liệu muốn được tính toán trên GPU thì cần phải được copy từ Host
Trang 39.memory sang Device memory, dữ liệu sau khi tính toán xong thì phải copy trở lại Host memory (dữ liệu chỉ dùng được khi nó nằm trên host memory)
Bộ nhớ Device memory ra thành 3 loại: bộ nhớ toàn cục (global), bộ nhớ cục bộ (Local), bộ nhớ chia sẻ (Share memory)
Phân loại bộ nhớ theo cấp độ truy cập
- Bộ nhớ toàn cục(Global) mọi thread trên GPU có thể truy cập, bao gồm:
Trang 40.Dung lượng bộ nhớ này chính là thông số dung lượng “total memory” nhà sản xuất ghi trên GPU
Ví dụ: Card geforce 8800 GT có 256MB global memory
Card geforce 8800 GTS có 512 MB
Cách thức khai báo và sử dụng bộ nhớ Global:
Trước tiên cần phải khai báo một vùng nhờ trên device memory
Dùng hàm cuda malloc
//ví dụ tạo 1 mảng số integer chứa 200 phần tử trên global memory
int *d_Data = NULL;
Câu lệnh trên copy dữ liệu từ bộ nhớ host sang bộ nhớ device
Kiểu của dữ liệu được chuyển đổi có kích thước sizeof(int)*200
Tính toán trên thiết bị xong thì trả lại dữ liệu cho Host
cudaMemcpy(h_Array, d_Array, sizeof(int) * 200,
cudaMemcpyDeviceToHost);
Giải thích ý nghĩa :
Câu lệnh trên copy dữ liệu từ bộ nhớ device sang bộ nhớ host
Kiểu của dữ liệu được chuyển đổi có kích thước sizeof(int) * 200
Tầm vực và thời gian tồn tại của các biến khai báo trong bộ nhớ toàn cục:
- Tầm vực của biến: Các biến là public đối với mọi thread trên GPU
- Thời gian tồn tại: Thời gian tồn tại của các biến khai báo trong vùng nhớ này là lâu và tồn tại đến khi chương trình chấm dứt
Cách thức truy xuất bộ nhớ