Xuất phát từ những nhu cầu trong mã hóa/giải mã âm thanh và xu thế tính toán hiệu năng cao trên các bộ xử lý đồ họa đa lõi, luận văn định hướng đến việc ứng dụng công nghệ tính toán đa d
Trang 1-
PHẠM XUÂN TOÁI
ỨNG DỤNG CÔNG NGHỆ TÍNH TOÁN ĐA DỤNG TRÊN CÁC BỘ XỬ LÝ ĐỒ HỌA ĐA LÕI CỦA NVIDIA TRONG BÀI TOÁN MÃ HÓA ÂM THANH CHUẨN AAC
Chuyên ngành : Công Nghệ Thông Tin
LUẬN VĂN THẠC SĨ KHOA HỌC Chuyên Ngành Công Nghệ Thông Tin
NGƯỜI HƯỚNG DẪN KHOA HỌC :
1 TS.Nguyễn Hữu Đức
Trang 2LỜI CAM ĐOAN
Tôi là Phạm Xuân Toái
Sinh viên lớp cao học Công Nghệ Thông Tin
Khóa 2009 Đại Học Bách Khao Hà Nội
Mã số Học Viên: CB091354
Tôi cam kết Luận Văn Tốt Nghiệp là kết quả nghiên cứu của bản thân tôi dưới
sự hướng dẫn của T.S.Nguyễn Hữu Đức
Các kết quả nêu trong Luận Văn Tốt Nghiệp là trung thực, không phải sao chép toàn văn của bất kì công trình nào khác
Trang 3Em cũng xin gửi lời cảm ơn tới anh Lê Đức Tùng, bạn Lê Đức Hùng cùng tập thể cán bộ, sinh viên Trung tâm Tính Toán Hiệu năng cao Đại Học Bach Khoa Hà Nội đã giúp đỡ, tạo mọi điều kiện cho em trong suốt quá trình thực hiện luận văn Tôi cũng gửi lời cảm ơn tới bạn Phạm Nguyễn Quang Anh cùng tập thể lớp Cao học Công Nghệ Thông Tin khóa 2009 Đại Học Bách Khoa Hà Nội vì đã có những đóng góp, chia sẻ rất kịp thời các thông tin rất hữu ích trong suốt quá trình học tập và thực hiện luận văn tốt nghiệp của tôi
Lời cuối cùng, tôi xin gửi lời cảm ơn tới người thân, gia đình, bạn bè đã luôn động viên, cổ vũ tôi trong suối thời gian tôi thực hiện bản luận văn này
Hà Nội, ngày 6 tháng 4 năm 2011
Phạm Xuân Toái Lớp Cao Học Công Nghệ Thông Tin 2009
Đại Học Bách Khoa Hà Nội
Trang 4MỤC LỤC
DANH MỤC HÌNH VẼ - 6 -
DANH MỤC CÁC BẢNG BIỂU - 7 -
DANH MỤC CÁC THUẬT NGỮ - 8 -
MỞ ĐẦU - 9 -
CHƯƠNG I ÂM THANH KĨ THUẬT SỐ - 12 -
1.1.Âm Thanh Kỹ Thuật Số - 12 -
1.1.1.PCM - 12 -
1.1.2.Lấy mẫu (Sampling) - 13 -
1.1.3 Độ Phân Giải (Resolution) - 13 -
1 1.4.Nén - 15 -
1.2 Định Dạng và Chuẩn Âm Thanh Số - 17 -
1.2.1 Các Chuẩn Âm Thanh Số - 17 -
1.2.2.Mã hóa - 18 -
1.2.3.Kiểu Tệp và Định Dạng Tệp - 18 -
1.2.4.Header và Siêu dữ liệu - 19 -
1.3.Chuẩn MPEG-AAC - 19 -
1.3.1.Tổng quan về MPEG-AAC - 19 -
1.3.2.Mã Hóa Mô Đun - 20 -
1.3.3.Các Định Dạng Chứa - 21 -
CHƯƠNG II LẬP TRÌNH ĐA DỤNG TRÊN CÁC BỘ XỬ LÝ ĐỒ HỌA ĐA LÕI CỦA NVIDIA - 22 -
2.1.Bộ Xử Lý Đồ Họa GPU - 22 -
2.2 Kiến Trúc Tính Toán trên GPU Tesla - 24 -
Trang 52.3 Mô Hình Lập Trình Song Song CUDA - 28 -
2.4 Những mặt hạn chế của CUDA - 35 -
2.5 Thiết Lập Môi Trường Tính Toán CUDA - 36 -
2.5.1 Môi trường phần cứng - 36 -
2.5.2.Bộ công cụ phát triển phần mềm - 37 -
CHƯƠNG III PHÂN TÍCH GIẢI THUẬT MÃ HÓA AAC - 38 -
3.1.Thuật Toán Mã Hóa AAC - 38 -
3.1.1.Mô hình âm thanh - 40 -
3.1.2.Điều chỉnh khuếch đại (Gain Control) - 43 -
3.1.3.Filter Bank và Block Switching - 43 -
3.1.4.Bộ Dự Đoán (Prediction) - 44 -
3.1.5.Định dạng nhiễu thời gian(Temporal Noise Shaping(TNS)) - 45 -
3.1.6.Mã hóa nối Stereo(Joint Stereo Coding) - 45 -
3.1.7.Lượng tử hóa và Mã Hóa - 46 -
3.1.8.Mã hóa không mất mát thông tin - 47 -
3.2.Khả Năng Song Song Hóa của quá trình mã hóa AAC - 48 -
3.3.Phân Tích Thời Gian Mã Hóa AAC - 51 -
CHƯƠNG IV CẢI THIỆN HIỆU NĂNG MÃ HÓA ACC VỚI CÁC BỘ XỬ LÝ ĐỒ HỌA ĐA LÕI NVIDIA - 58 -
4.1.Thực Hiện Biến Đổi Tuần FFT Trên Cuda - 58 -
4.2.Tăng Tộc Độ Mã Hóa AAC - 61 -
4.3.Kết Quả Thực Nghiệm - 64 -
CHƯƠNG V KẾT LUẬN VÀ ĐỊNH HƯỚNG - 67 -
Trang 6DANH MỤC HÌNH VẼ.
Hình 1.1 Chuyển đổi tương tự -thành số - 13 -
Hình 1.2 Tần số lấy mẫu và độ phân giải - 15 -
Hình 1.3 Hình minh họa phương pháp mã hóa MP3 - 16 -
Hình 1.4.Cấu trúc của một file âm thanh số - 19 -
Hình 2.1: GPU dành nhiều transitor hơn để xử lý dữ liệu - 22 -
Hình 2.2.: Biểu đồ số phép tính dâu chấm động trên giâyvà băng thông bộ nhớ giữa CPU và GPU - 24 -
Hình 2.3: Kiến trúc Tesla - 25 -
Hình 2.4 Đối chiếu hai đoạn mã xử lý tuần tự và song song - 30 -
Hình 2.5: Phân cấp bộ nhớ - 33 -
Hình 2.6 Mô hình các luông song song trên Cuda - 34 -
Hình 2.7.Môi trường tính toán Cuda - 36 -
Hình 3.1.Mô hình mã hóa AAC - 39 -
Hình 3.2.Giản đồ khối của mô hình âm thanh - 42 -
Hình 3.3.Công cụ Điều khiển khuếch đại - 43 -
Hình 3.4.Sơ đồ Prediction - 45 -
Hình 3.5.Mô hình mã hóa AAC với một file PCM - 48 -
Hình 3.6 Biểu đồ tỷ lệ thời gian thực hiện trong mã hóa AAC - 57 -
Hình 4.1.Mô hình thực AAC Encoder song song - 63 -
Hình 4.2.Biểu đồ tỉ lệ tăng tốc của biến đổi CudaFFT song song - 66 -
Trang 7DANH MỤC CÁC BẢNG BIỂU
Bảng 1.1 Các tần số lấy mẫu âm thanh chính - 14 -
Bảng 1.2 Một số chuẩn âm thanh phổ biến - 17 -
Bảng 3.1.Kết quả phân tích thời gian thực hiện mã hóa với tệp 1 - 53 -
Bảng 3.2.Kết quả phân tích thời gian thực hiện mã hóa với tệp 2 - 54 -
Bảng 3.3.Kết quả phân tích thời gian thực hiện mã hóa với tệp 3 - 55 -
Bảng 3.4.Kết quả phân tích thời gian thực hiện mã hóa với tệp 4 - 55 -
Bảng 3.5.Kết quả phân tích thời gian thực hiện mã hóa với tệp5 - 56 -
Bảng 4.1.Số thời gian tính CudaFFT - 60 -
Bảng 4.2.Thời gian mã hóa file 1 - 65 -
Bảng 4.3.Thời gian mã hóa file 2 - 65 -
Bảng 4.4.Thời gian mã hóa file 3 - 65 -
Bảng 4.5.Thời gian mã hóa file 4 - 66 -
Bảng 4.6.Thời gian mã hóa file 5 - 66 -
Trang 8DANH MỤC CÁC THUẬT NGỮ
1 MPEG – Moving Picture Experts Group: tên một nhóm phát triển
2 AAC – Advanced Audio Coding: Tên của một chuẩn mã hóa âm thanh kĩ thuật số
3 MP3 – MPEG Layer III: Tên của một chuẩn mã hóa âm thanh kĩ thuật số
4 CPU –Centre Processing Unit: Bộ xử lý trung tâm của máy tính
5 GPU- Graphic Processing Unit: Bộ xử lý đồ họa
6 FFT – Fast Fourier Transform: Viết tắt của thuật toán biến đổi fourier nhanh
7 MDCT – Modified Discrete Cosine Transform: Viết tắt của biến đổi phép biến đổi cô si rời rạc
8 PCM - pulse-code modulation: Định dạng âm thanh kĩ thuật số không nén
9 Bitrate – tỷ lệ bit: chỉ số tương ứng với số lượng bit dữ liệu cần để lưu trữ dữ liệu trong một đơn vị thời gian, thường được tính là kbit/s
Trang 9mã trên các hệ thống phần cứng này Xu hướng cho thấy các hệ thống vi xử lý đa lõi đi kèm với công nghệ tính toán song song đang dần dần được áp dụng vào công nghệ mã hóa/giải mã nói chung và cho bài toán mã hóa âm thanh nói riêng
Cùng với sự phát triển về mặt thuật toán, phần mềm thì lĩnh vực phần cứng cũng đã có những bước phát triển vượt bậc Khi các mạch điện tử gần như đã đạt tới tới hạn về tốc độ thì việc xây dựng các bộ xử lý đa lõi (2, 4, 8 lõi) và nhiều lõi (hàng chục tới hàng trăm lõi) đang trở thành xu hướng phát triển để nâng cao sức mạnh tính toán của hệ thống Sự ra đời của các bộ xử lý đồ họa (GPU) với hàm trăm bộ
xử lý vô hướng có khả năng xử lý song song cao đã mang lại một phương thức mới
Trang 10kiến trúc Tesla chuyên dụng cho tính toán hiệu năng cao của NVIDIA và bộ công
cụ lập trình Cuda đã làm cho việc lập trình tính toán trên các bộ xử lý đồ họa mạnh
mẽ và tiện lợi hơn cho các ứng dụng đồ họa cũng như phi đồ họa Vậy nên GPU đang là một lựa chọn mới để tăng tốc độ tính toán và giải quyết các bài toán tính toán hiệu năng cao
Xuất phát từ những nhu cầu trong mã hóa/giải mã âm thanh và xu thế tính toán hiệu năng cao trên các bộ xử lý đồ họa đa lõi, luận văn định hướng đến việc ứng dụng công nghệ tính toán đa dụng trên các bộ xử lý đồ họa của NVIDIA để áp dụng cho bài toán mã hóa, giải mã âm thanh chuẩn AAC nhằm tăng tốc độ cho quá trình
mã hóa/giải mã này
Bằng phương pháp phân tích, thử nghiệm, luận văn đã đi vào phân tích các khả năng song song hóa trong quy trình mã hóa chuẩn âm thanh AAC, đo đạc thời gian thực hiện của từng bước trong quy trình để xác định những pha cần được song song, từ đó đưa ra các giải pháp ứng dụng GPU nhằm tăng tốc độ mã hóa chuẩn âm thanh AAC
Qua quá trình tìm hiểu các vấn đề lý thuyết liên quan, phân tích và thực nghiệm, tác giả đã tìm hiểu được về lý thuyết âm thanh kĩ thuật số, mô hình triến trúc Tesla, kỹ thuật lập trình Cuda, tìm hiểu thuật toán mã hóa AAC, phân tích các khả năng song song của thuật toán Đóng góp chính của luận văn là :
đưa ra những kết quả phân tích về thời gian thực hiện của các bước trong quá trình mã hóa AAC trên giải thuật tuần tự;
đề xuất giải pháp song song hóa một phần trong quá trình mã hóa góp phần cải tiến tốc độ mã hóa lên gấp hơn hai lần (trên hệ thống thử nghiệm)
Các phần tiếp của đồ án sẽ được tổ chức như sau: Chương I trình bày các vấn
đề cơ bản về âm thanh kĩ thuật số Chương II trình bày về kiến trúc Tesla và mô
Trang 11hình lập trình song song Cuda Chương III đưa ra các phân tích về giải thuật mã hóa chuẩn âm thanh AAC Chương IV trình bày về giải pháp sử dụng GPU để tăng tốc
độ mã hóa AAC và kết quả thực nghiệm Chương V là kết luận và định hướng công việc tương lai
Trang 12CHƯƠNG I ÂM THANH KĨ THUẬT SỐ
Chương này trình bày các vấn đề cơ bản của âm thanh kĩ thuật số nói chung và giới thiệu các đặc tính của chuẩn âm thanh MPEG-AAC
1.1.Âm Thanh Kỹ Thuật Số
Âm thanh tự nhiên có thể được thu lại như là tín hiệu tương tự bởi microphone Để chuyển đổi tín hiệu tương tự này thành định dạng dữ liệu của các tệp âm thanh kĩ thuật số thì thường phải trải qua một số giai đoạn:
Tiền xử lý (pre-emphasis) (tùy chọn, có thể có hoặc không)
Lấy mẫu (sampling)
Chuyển đổi Tương tự sang Số (Analog to Digital Conversion)
Nén(Compression)
Đóng gói và bao bọc (Packetization and wrapping)
Hệ thống âm thanh kĩ thuật số đầu tiên sử dụng mã hóa tuyến tính không nén,
vì vậy chỉ cần thực hiện ba quá trình đầu tiên: tiền xử lý, lấy mẫu và chuyển đổi tương tự sang số Dạng dữ liệu được sử dụng rộng dãi nhất là PCM (pulse-code modulation)
1.1.1.PCM
PCM (pulse-code mudulation) là dạng cơ bản của âm thanh kĩ thuật số Các microphone sẽ sinh ra các điện áp tương ứng với áp suất (hoặc là tốc độ) của không khí Các mẫu này được lấy trong các khoảng thời gian đều nhau Giá trị của mẫu sẽ được chuyển thành dưới dạng số Các tham số cơ bản của mã hóa là tần số lấy mẫu (sampling rate) và độ phân giải (resolution) hoặc là độ sâu bit Bước tiền xử lý trong
Trang 13lược đồ lấy mẫu là để loại bỏ các âm thanh chói tai, hoặc là các nhiễu tần số cao,
trong các mạch điện tử Bằng cách nâng các nội dung tần số cao, tý lệ tín hiệu nhiễu
có thể được cải thiện Vì vậy tiền xử lý được sử dụng trong việc phát sóng FM, và
là một tùy chọn trong mã hóa kỹ thuật số Điều này làm giảm bớt năng lượng ở các
tần số cao với các nội dung điển hình Tuy nhiên giai đoạn này không thực sự cần
thiết đối với quá trình chuyển đổi và mã hóa Quá trình chuyển đổi từ sóng âm
thành tương tự thành số có thể được thực hiện như hình minh họa 1.1
Hình 1.1 Chuyển đổi tương tự -thành số 1.1.2.Lấy mẫu (Sampling)
Tần số lấy mẫu được thiết lập bởi bộ đáp ứng tần số Lý thuyết lấy mẫu chỉ ra
rằng tần số lấy mẫu nên lớn hơn hoặc bằng hai lần biên độ tín hiệu muốn thu Tần
số lấy mẫu là một giá trị thỏa hiệp: tần số cao hơn thì có nhiều mẫu được sinh ra
Con người có thể nghe được trong khoảng từ 20 đến 20000Hz, nhưng giọng nói
của con người chỉ sử dụng trong khoảng giới hạn ở giữa là từ 500 đến 3000Hz Đối
với các ứng dụng có độ trung thực cao, tần số lấy mẫu phải lớn hơn hoặc bằng
40kHz, nhưng đối với các kênh tiếng nói thì tần số có thể được sử dụng ở tỷ lệ thấp
là 6kHz
1.1.3 Độ Phân Giải (Resolution)
Quá trình mã hóa số sẽ chuyển các sóng tương tự (analog waveform), với các
giá trị liên tục, thành một số cấp độ rời rạc – một quá trình lượng tử hóa Số lượng
Trang 14Tần số lấy mẫu Bộ đáp ứng tần số Ứng dụng
8 kHz 200 Hz–3.3 kHz Điện thoại
16 kHz 100 Hz–7 kHz Truyền giọng nói băng thông rộng
32 kHz 50 Hz–15 kHz Thông tin đại chúng
44.1 kHz 20 Hz–20 kHz Tiêu dung
48 kHz 20 Hz–20 kHz Hệ thống chuyên nghiệp
Max 192 kHz Lên tới 96 kHz DVD-A
2.8224 MHz Lên tới 100 kHz SACD
Bảng 1.1 Các tần số lấy mẫu âm thanh chính
Giá trị bước tối thiểu thiết lập sàn tiếng ồn của tín hiệu được chuyển đổi Trong phần lớn các biến đổi, mỗi bước có cùng một giá trị, được gọi là PCM tuyến tính Các chương trình ứng dụng có yêu cầu thấp hơn thường sử dụng 16bit lấy mẫu Những người dùng chuyên nghiệp sẽ yêu cầu độ phân giải cao hơn là 20 hoặc 24bit Bảng 1.1 chỉ ra các khoảng lấy mẫu và ứng dụng Trong thực thế, điều này không thể đạt được, vì vậy vẫn có một số tiếng ồn được thể hiện trong bộ chuyển đổi tương tự thành số và trong các giai đoạn trước giữa bộ chuyển đổi microphone
và bộ chuyển đổi
Trang 15Hình 1.2 Tần số lấy mẫu và độ phân giải.
1 1.4.Nén
1 1.4.1.Nén không mất mát thông tin
Nhiều loại dữ liệu chứa các thông tin dư thừa mà có thể có cách thức biểu diễn khác hiệu quả hơn, đó chính là các phương pháp nén không mất mát thông tin Một trong các phương pháp thường được sử dụng đó là phương pháp mã hóa Huffman
Ưu điểm chính của phương pháp này đó là khi giải nén thì có thể khôi phục lại toàn bộ thông tin được mã hóa mà không có lỗi
Tuy nhiên nhược điểm của phương pháp này là tỷ lên nén thấp dẫn tới dữ liệu phải lưu trữ lớn
1 1.4.2 Nén mất mát thông tin
Nén mất mát thông tin hoạt động bằng các bỏ qua các thông tin không cần
Trang 16nghe thấy được) và sau đó áp dụng các kỹ thuật nén không mất mát thông tin để giảm kích thước dữ liệu nhiều hơn Với mã hóa mất mát thông tin, chất lượng âm thanh nhận được sẽ khác nhau tùy thuộc vào các yếu tố như là tỷ lệ bit, độ phức tạp của âm nhạc và kiểu phần mềm mã hóa
Hình 1.3 Hình minh họa phương pháp mã hóa MP3
Mã hóa mất dữ liệu là một quá trình chuyển đổi dữ liệu âm thanh dạng số chưa được nén, như là PCM, WAV, hoặc là AIFF, thành các định dạng được nén như là MP3, AAC Các phần mềm được sử dụng trong các quá trình mã hóa (hoặc giải mã) được xem như là một bộ CODEC trong mã hóa và giải mã (hoặc là một bộ nén/ giải nén) Thường có nhiều hơn một CODEC cho một định dạng âm thanh, thậm chí cùng một định dạng âm thanh,các bộ CODEC khác nhau cũng có thể có chất lượng
âm thanh và tốc độ mã hóa khác nhau
Ưu điểm chính của nén mất mát thông tin đó là tỉ lệ nén cao.Nhưng nhược điểm đó là sau khi giải nén thì không khôi phục lại được thông tin ban đầu và bộ giải mã, mã hóa phức tạp
Trang 171.2 Định Dạng và Chuẩn Âm Thanh Số
Từ định dạng trong có một vài nghĩa, tùy thuộc vào ngữ cảnh Khi nói về định dạng của âm thành là chúng ta nói đến cách thức nội dụng âm thanh được tổ chức
để lưu trữ và phải hồi lại thông tin
1.2.1 Các Chuẩn Âm Thanh Số
Các chuẩn của các định dạng âm thanh số có thể để chỉ ra các định dạng tệp, các phương pháp mã hóa, tỷ lệ lấy mẫu, độ phân giải, thiết bị vật lý và các đặc tính khác Các tham số như là tỷ lệ lấy mẫu, độ phân giải và số lượng các kênh có được chỉ định các giá trị cố định hoặc là một khoảng giá trị
Các chuẩn âm thanh số là cần thiết để đảm bảo khá năng tương thích giữa các thiết bị và phương tiện từ các nguồn khác nhau Ví dụ như một tệp dữ liệu MP3 bất
kì được tạo theo đúng chuẩn MP3 thì có thể được chơi trên bất kì chương trình hay thiết bị chơi nhạc nào có hỗ trợ chuẩn MP3
Một số chuẩn, ví dụ như là chuẩn âm thanh CD, lại cung cấp chỉ một phương pháp mã hóa, kiểu phương tiện, độ phân giải và tỷ lệ mẫu, trong khi một số chuẩn khác, ví dụ như chuẩn âm thanh DVD, lại chỉ định một kiểu phương tiện nhưng có thể bao gồm các độ phân giải và tỷ lệ lấy mẫu khác nhau
Chuẩn Phương pháp
mã hóa
Kiểu Phương Tiện
Số kênh Hệ số lấy
mẫu
Độ phân giải
CD audio PCM CD 2 (stereo) 44.1 kHz 16-bit
kHz
16-, 20-, 24-bit MPEG Audio
Layer-III (MP3)
MPEG
Đơn âm hoặc stereo 1648 kHz N/A
Bảng 1.2 Một số chuẩn âm thanh phổ biến
Trang 181.2.2.Mã hóa
Khi âm thanh tương tự được chuyển thành dữ liệu số, các mẫu (các đơn vị âm thanh rời rạc) được lưu trữ trong một tệp (hoặc luồng) không có bất kì một xử lý nào khác ngoại trừ việc sắp xếp chúng theo đúng thứ tự của một định dạng cụ thể Việc nhận lại dữ liệu để chơi chỉ đơn giản là phép xử lý lấy lại dữ liệu theo đúng thứ tự Kiểu âm thanh này thường được xem như là kiểu thô hoặc là kiểu chưa được nén
Mã hóa cung cấp thêm các xử lý ngoài việc lưu trữ một dữ liệu theo đúng thứ
tự một cách đơn thuần Các bộ mã hóa cung cấp các chương trình toán học phức tạp được gọi là các thuật toán tới một phần hoặc toàn bộ dữ liệu của tệp thay vì tới một mẫu âm thanh riêng lẻ Điều này cho phép các bộ mã hóa phân tích tệp âm thanh một cách tổng thể để có thể đưa ra các quyết định xem thông tin nào không thể nghe được và thông tin nào có thể được loại bỏ Các bộ mã hóa lưu trữ các kết quả âm thanh được mã hóa trong các tệp, hoặc gửi tới một máy chủ để được tạo luồng (stream) thông qua mạng máy tính
Trước khi được chơi, âm thanh cần phải được giải nén hoặc là giải mã Các chương trình có thể thưc hiện toàn bộ quá trình, từ mã hóa/nén tới giải mã/giải nén thì được gọi là các bộ CODEC Một định dạng thường có nhiều hơn một bộ mã
hóa,vì vậy từ phương pháp mã hóa thường để chỉ một định dạng nén cụ thể
1.2.3.Kiểu Tệp và Định Dạng Tệp
Từ định dạng có thể được sử dụng để mô tả một kiểu tệp âm thanh số cụ thể như là AIFF và WAV Có một cách gọi chính xác hơn là kiểu tệp Chúng ta có thể nhận biết kiểu tệp theo phần mới rộng của nó ví dụ như các tệp wav và aiff là các kiểu file WAV và AIFF
Trang 19Định dạng tệp để chỉ cấu trúc của dữ liệu trong tệp Ví dụ, dữ liệu bên trong một tệp âm thanh số bao gồm một chuỗi các bit theo thứ tự xác định
Đặc tả của một định dạng file có thể đơn giản chỉ là một tài liệu định nghĩa làm thể nào để lưu trữ và thể hiện được dữ liệu trong file
1.2.4.Header và Siêu dữ liệu
Dữ liệu âm thanh trong file có thể có nhiều cấu trúc khác nhau Ví dụ như một file AIFF hoặc WAV có thể chỉ một kênh hoặc hai kênh, hoặc có thể được ghi âm ở một số hệ số lấy mẫu, độ phân giải khác nhau
Trong nhiều kiểu tệp được sử dụng cho âm thanh số, ở đầu của các tệp chứa
dữ liệu thêm vào được gọi là một header, phần này xác định cấu trúc phần dữ liệu
dữ liệu âm thanh được lưu trong tệp Khi một chương trình mở tệp đó, đầu tiên nó đọc header để xác định xem nào sẽ đọc phần dữ liệu còn lại như thế nào
Hình 1.4.Cấu trúc của một file âm thanh số
1.3.Chuẩn MPEG-AAC
1.3.1.Tổng quan về MPEG-AAC
AAC (Advanced Audio Coding) là một lược đồ mã hóa và nén mất mát thông tin được chuẩn hóa của âm thanh kĩ thuật số Được thiết kế để với mục đích là phiên bản kế tiếp của định dạng MP3, nên một cách tổng quan thì định dạng AAC đạt được chất lượng tốt hơn nếu trong cùng tỉ lệ bít
Trang 20AAC được hợp tác phát triển bởi các công ti AT&T Bell Laboratories, Fraunhofer IIS, Dolby Laboratories, Sony Corporation và Nokia Và được công bố chính thức thành một chuẩn quốc tế bởi MPEG (Moving Picture Experts Group) vào tháng 4 năm 1997 AAC được đặc tả trong phần 7 của chuẩn MPEG-2 và trong phần 3 của MPEG-4.[3]
AAC hỗ trợ tới 48 kênh âm thanh Tỷ lệ mẫu được hỗ trợ bởi hệ thống AAC biến đổi trong khoảng từ 8kHz tới 96Khz Tỷ lệ bit trên một kênh tối đa phụ thuộc vào tần số lấy mẫu và biến đổi từ 48kb/s đến 576kb/s Có thể thỏa mãn các yêu cầu tối thiểu của chất lượng của âm thanh nổi (stereo) ở 96kbit/s, nhưng để đáp ứng được yêu cầu âm thanh hi-fi thì tỉ lệ bit tối thiểu là 128kbit/s
AAC cũng là định dạng chuẩn và mặc định của các thiết bị như là iPhone, iPod, iPad, Nintendo DSi, iTunes, DivX Plus Web Player và PlayStation 3
1.3.2.Mã Hóa Mô Đun
ACC đưa ra một cách tiếp cận Mođun để mã hóa Phụ thuộc vào độ phức tạp của luồng dữ liệu được mã hóa, hiệu năng mong muốn và yêu cầu đầu ra, các bộ thực thi có thể tạo ra một chuẩn mẫu (profile) để định nghĩa một tập các công cụ sẽ được sử dụng
Phần 7 của chuẩn MPEG-2 phát hành năm 1997 đã đưa ra ba chuẩn mẫu mặc định:
Low Complexity (LC) – Chuẩn đơn giản nhất và được sử dụng rộng rãi nhất
Main Profile (Main) – Chuẩn có chật lượng tốt nhất nhưng hiệu năng mã
hóa thấp nhất
Scalable Sample Rate (SSR): Có độ phức tạp lớn hơn LC nhưng hiệu năng
cao hơn Main
Trang 21Trong phần 3 của chuẩn MPEG-4 đã định nghĩa một số công cụ nén mới và ứng dụng trong một số chuẩn mẫu mới Sau đây là danh sách một các chuẩn mẫu được định nghĩa trong MPEG-4
Main Audio Profile
Scalable Audio Speech Audio Profile
Synthetic Audio Profile
High Quality Audio Profile
Low Delay Audio Profile
Mobile Audio Internetworking Profile
AAC Profile
High Efficiency AAC Profile
High Efficiency AAC v2 Profile
1.3.3.Các Định Dạng Chứa
Dữ liệu âm thanh AAC có thể được đóng gói trong nhiều hơn một định dạng
cơ bản được gọi là Định dạng Trao Đổi Dữ liệu Âm thanh (ADIF – Audio Data Interchange Format), bao gồm một header chung ở đầu và các khối dữ liệu âm thanh AAC ở sau Bên cạnh đó, dữ liệu AAC có có thể được đóng gói trong một định dạng kiểu luồng (streaming) được gọi là Luồng Truyền Dữ liệu Âm Thanh (ADTS – Audio Data Transport Stream), bao gồm một chuỗi các khung dữ liệu (frame), mỗi khung dữ liệu có một một header ở đầu và phần dữ liệu âm thanh ở sau Trong định dạng ADTS , tệp âm thanh không cần phải có một header chung mà chỉ là một tập các khung dữ liệu được sắp xếp theo đúng thứ tự
Trang 22CHƯƠNG II LẬP TRÌNH ĐA DỤNG TRÊN CÁC BỘ XỬ LÝ ĐỒ HỌA
ĐA LÕI CỦA NVIDIA
Chương này sẽ trình bày các vấn đề cơ bản về bộ xử lý đồ họa GPU, kiến trúc hợp nhất giữa tính toán và đồ họa Tesla, mô hình lập trình song song trên Cuda
và môi trường tính toán Cuda
2.1.Bộ Xử Lý Đồ Họa GPU
Trong những 90 của thế kỉ trước, chúng ta đã những bước phát triển không ngừng về tốc độ của bộ xử lý trung tâm (CPU – Centre Processing Unit), với tốc độ tăng từ 200Mz lên tới sấp xỉ 4Ghz, và tốc độ này gần như đã đạt tới tới hạn về mặt vật lý Do đó, để nâng cao sức mạnh tính toán của bộ xử lý thì cần có một hướng đi mới đó là tính toán song song Trong khi các nhà phát triển CPU đưa ra các bộ xử lý
đa lõi nhưng vẫn chỉ để cố gắng tăng tốc độ thực hiện cho một công việc đơn lẻ thì lại các nhà phát triển các bộ xử lý đồ họa GPU (Graphic Processing Unit) lại phát triển theo hướng làm thế nào để các công việc có thể thực hiện song song một cách tối đa Chính vì vậy, trong khi số lượng lõi tính toán trong CPU chưa đạt đến con
số 8 lõi thì số lượng lõi xử lý GPU đã đạt tới 1024 lõi vào đầu năm 2011.Tính đến tháng 6/2008, GPU thế hệ GT200 của NVidia đã đạt tới ngưỡng 933GFlops gấp hơn 10 lần so với bộ xử lý hai lõi Intel Xeon 3.2 GHz tại cùng thời điểm Hình 2.2 thể hiện sự tăng tốc về năng lực tính toán của các bộ xử lý đồ hoạ Nvidia so với bộ
xử lý Intel
Lý do phía sau sự khác biệt về khả năng tính toán dấu phẩy động giữa CPU và GPU chính là GPU được thiết kế cho mục đích tính toán mạnh, khả năng tính toán song song cao – và do đó được thiết kế sao cho có nhiều transistor được dùng để xử
lý dữ liệu hơn là dùng cho đệm dữ liệu và điều khiển luồng, như hình minh họa trong hình 2.1 và hình 2.2
Hình 2.1: GPU dành nhiều transitor hơn để xử lý dữ liệu
Trang 24Hình 2.2.: Biểu đồ số phép tính dâu chấm động trên giâyvà băng thông bộ nhớ
giữa CPU và GPU
Do đó, GPU đặc biệt phù hợp để giải quyết các bài toán có thể tính toán song song về dữ liệu – tức là cùng chương trình được thực hiện trên nhiều bộ dữ liệu một cách song song – với cường độ tính toán số học cao – tỷ lệ số thao tác số học trên số thao tác với bộ nhớ Bởi vì cùng chương trình được thực hiện cho mỗi bộ dữ liệu, nên không cần đòi hỏi cao về hoạt động điều khiển luồng, và bởi vì chương trình được thực hiện trên nhiều bộ dữ liệu và có cường độ số học cao, nên độ trễ truy cập
bộ nhớ có thể được ẩn đi cùng với các phép tính thay vì phải đệm một lượng dữ liệu lớn Do đó, bộ xử lý GPU không chỉ ứng dụng trong xử lý đồ họa mà còn được ứng dụng trong các tính toán hiệu năng cao để thực hiện tăng tốc cho các bài toán có yêu cầu tính toán lớn và có khả năng thực hiện song song
Và để mở rộng ứng dụng của GPU trong các tính toán chung và tính toán hiệu năng cao, Nvidia đã đưa ra dòng sản phẩm Tesla và bộ công cụ lập trình song song Cuda
2.2 Kiến Trúc Tính Toán trên GPU Tesla
Được Nvidia giới thiệu vào tháng 11 năm 2006, kiến trúc tính toán và đồ họa hợp nhất Tesla đã phát triển, gia tăng đáng kể về số lượng so với phạm vi của các GPU đồ họa không lập trình được – khả năng xử lý các mảng dữ liệu đa tiến trình của nó dần trở thành một nền tảng hợp nhất hiệu năng cao cho cả những ứng dụng tính toán đồ họa và ứng dụng tính toán song song thông thường trên GPU
Bằng cách chia tỉ lệ số các bộ xử lý (processor) và các thành phần bộ nhớ, kiến trúc Tesla đã mở rộng một dải thị trường các GPU bao gồm: những GPU có hiệu năng cao như GeForce 8800, những sản phẩm tính toán chuyên nghiệp như Quadro, Tesla và những dòng card đồ họa GeForce GPU Những đặc trưng tính toán của các dòng card này làm cho việc lập trình với các các lõi GPU trở nên dễ dàng hơn trong môi trường lập trình C và với môi trường CUDA Và việc nó sẵn có trong các máy
Trang 25laptop, desktop, workstation, và server với môi trường lập trình C và phần mềm CUDA, đã tạo nên những nền tảng kiến trúc siêu máy tính Tesla đầu tiên ở khắp mọi nơi
Hình 2.3: Kiến trúc Tesla
Kiến trúc Tesla được xây dựng xung quanh một mảng có thể mở rộng của các
SM (streaming multiprocessors – đa xử lý dòng lệnh) Những GPU hiện nay có thể thực hiện từ 768 cho tới 12288 tiến trình thực thi đồng thời Việc mở rộng qui mô thực thi song song hóa một cách trong suốt trên một dải rộng (của các dòng GPU)
sẽ là chìa khóa mục tiêu của cả kiến trúc GPU và mô hình lập trình CUDA Hình trên trình bày một GPU với 14 SMs - tương đương với 112 lõi SP (streaming processor), kết nối liên thông với 4 bộ nhớ DRAM bên ngoài Khi một chương trình CUDA trên host CPU gọi một lưới kernel – grid kernel (C dành cho CUDA là mở rộng của C, nó cho phép người lập trình có thể định nghĩa các hàm C được gọi là
nhân – kernel Và khi được gọi, nhân này sẽ được thực hiện N lần song song với nhau bởi N tiến trình CUDA (CUDA thread) khác nhau, trái ngược với chỉ có một
tiến trình được chạy như hàm C thông thường), đơn vị phân phát công việc tính
Trang 26trong khối này có nhiều thread, và trong một grid thì có nhiều block) của lưới và bắt đầu phân phối các block này tới các SM với khả năng sẵn sàng thực thi (sẵn sàng chạy) Các tiến trình (thread) trong một block thread (block chứa nhiều thread)
được thực hiện đồng thời trên một SM Và khi các block thread kết thúc, đơn vị CWD sẽ thực thi các block mới trên các bộ xử lý trống, rảnh rỗi Một SM có chứa 8 lõi xử lý vô hướng SP – scalar processor (SP), 2 đơn vị chức năng đặc biệt – special function units (SFUs), dành cho tính toán siêu việt, 1 đơn vị dòng lệnh đa tiến trình – multithreaded instruction unit (MT IU), và 1 bộ nhớ chia sẻ trên nó (on-chip shared memory) SM đảm nhiệm việc tạo, quản lý, và thực hiện tới 768 tiến trình đồng thời trên phần cứng mà không tốn kém chi phí lập lịch Nó có thể thực thi 8 block tiến trình CUDA nhiều lần và trong cùng một thời điểm, và được giới hạn bởi
số thread và các bộ nhớ tài nguyên SM cung cấp rào chắn CUDA syncthreads(), rào chắn này có tác dụng đồng bộ hóa bên trong SM với một lệnh đơn Rào chắn nhanh chóng đồng bộ cùng nhau việc tạo các tiến trình thấp hơn và sắp xếp tiến trình một cách hiệu quả và không làm giảm hiệu năng, cho phép một thread mới được tạo để tính toán mỗi véc-tơ, điểm ảnh và con trỏ dữ liệu
Để quản lý hàng trăm tiến trình chạy trong nhiều ứng
dụng khác nhau, Tesla SM sử dụng một kiến trúc mới gọi là
“đơn dòng lệnh đa tiến trình” – SIMT (single-instruction,
multiple-thread) SM ánh xạ mỗi thread tới một lõi vô hướng
SP, và mỗi một thread vô hướng sẽ chạy độc lập với nhau với
địa chỉ tập lệnh và trạng thái thanh ghi riêng của nó Đơn vị
SM SIMT tạo, quản lý, sắp xếp và thi hành các thread trong
một nhóm gồm 32 thread song song được gọi là warps (Thuật
ngữ này bắt nguồn từ dệt may, công nghệ song song các tiến
trình đầu tiên) Các thread riêng lẻ săp xếp theo trật tự thành
một SIMT warp khởi động cùng nhau tại cùng một địa chỉ
chương trình nhưng tự do rẽ nhánh và thực thi một cách độc lập Mỗi SM quản lý một nhóm gồm 24 warp với 32 thread trên mỗi warp, và tổng cộng có 768 thread
Trang 27Các lệnh được đưa ra cùng một thời điểm, đơn vị SMIT sẽ lựa chọn một warp
mà đã sẵn sàng thực hiện và đưa ra lệnh tiếp theo tới các thread đã được chuẩn bị trong warp Một warp thực thi một lệnh chung tại một thời điểm, do vậy hiệu quả cao nhất thu được khi cả 32 thread trong một warp phù hợp với nhau về đường dẫn thực thi của chúng Nếu các thread của một warp phân rẽ qua một dữ liệu phụ thuộc điều kiện rẽ nhánh, thì warp sẽ thi hành từng nhánh đường dẫn lấy được, vô hiệu hóa các thread mà không ở trên đường dẫn đó, và khi tất cả các đường dẫn được hoàn thành, các thread hội tụ trở lại để thực hiện trong cùng một đường dẫn Sự rẽ nhánh xảy ra chỉ trong một warp, các warp khác nhau thực thi độc lập với nhau và không chú ý tới chúng đang thực thi một đường dẫn chung hoặc đường dẫn đoạn code rời rạc Và như là một kết quả, kiến trúc GPU Tesla đột nhiên trở nên mềm dẻo và hiệu quả hơn trên các nhánh code so với các GPU trước đây, như các warp
32 thread của chúng bị hạn chế nhiều hơn so với độ rộng SIMD (single-instruction multiple-data) của các GPU trước kia.Kiến trúc SIMT gần giống như với cấu trúc véc-tơ SIMD mà trong đó một lệnh điều khiển nhiều quá trình xử lý các phần tử Một điều then chốt khác là cấu trúc véc-tơ SIMD bộc lộ độ rộng với phần mềm, trong khi các lệnh SIMT định rõ việc thực thi và trạng thái phân nhánh của một thread đơn Trong sự trái ngược với các máy véc-tơ SIMD, SIMT cho phép lập trình viên viết đoạn code song song phân cấp các thread một cách độc lập, các thread vô hướng, cũng như là code song song dữ liệu dành cho phối hợp các thread Dành cho các mục đích đúng đắn, lập trình viên có thể về căn bản lờ đi động thái SIMT; tuy nhiên, chắc chắn hiệu năng có thể được nhận thấy bởi việc chăm sóc đoạn code ít khi yêu cầu các thread trong warp phân rẽ Trong thực tiễn, nó tương
tự như vai trò của các dòng đệm trong code truyền thống: kích thước dòng đệm có thể lờ đi một cách an toàn khi thiết kế với tính chất đúng đắn nhưng phải được xem xét dưới cấu trúc đoạn code khi thiết kế cho hiệu năng tối đa Các kiến trúc véc-tơ, trên một hướng khác, yêu cầu phần mềm kết hợp một khối để load trong các véc-tơ
và điều khiển sự phân rẽ một cách thủ công
Trang 2816Kb SM có độ trễ truy cập thấp và băng thông cao tương tự như bộ nhớ đệm L1;
nó giữ các biến CUDA shared trên block để dành cho việc kích hoạt các block thread SM cung cấp việc nạp/lưu trữ các lệnh để truy cập biến CUDA device trên GPU có bộ nhớ DRAM gắn ngoài Nó kết hợp thành một khối truy cập riêng lẻ của các thread song song trong cùng một warp và ở trong vài truy cập block bộ nhớ khi các địa chỉ rơi vào trong cùng một block và gặp các tiêu chuẩn liên kết Bởi vì việc trễ của bộ nhớ chung có thể tới hàng trăm xung nhịp xử lý, các chương trình CUDA copy dữ liệu tới bộ nhớ chia sẻ khi nó phải được truy cập rất nhiều lần bởi một block thread Tesla nạp/lưu trữ các lệnh bộ nhớ sử dụng địa chỉ là các byte số nguyên để thuận tiện cho trình biên dịch chuyển đổi tối ưu các đoạn code Tiến trình lớn đếm trong mỗi SM, cũng như là hỗ trợ cho nhiều yêu cầu nạp còn tồn tại, giúp
đỡ che phủ độ trễ trong việc nạp và sử dụng tới các bộ nhớ DRAM gắn ngoài Kiến trúc GPU Tesla mới nhất cũng cung cấp các lệnh bộ nhớ đọc-sửa-ghi nguyên tử, thuận tiện cho sự giảm bớt song song và quản lý cấu trúc song song dữ liệu
Các ứng dụng CUDA thực hiện tốt trên các GPU kiến trúc Tesla bởi vì mô hình song song CUDA, sự đồng bộ, các bộ nhớ chia sẻ, và phân cấp của các nhóm thread ánh xạ hiệu quả tới các chức năng của kiến trúc GPU, và cũng bởi vì CUDA cũng là mô hình ứng dụng song song nhanh nhất
2.3 Mô Hình Lập Trình Song Song CUDA
CUDA là một trong những mở rộng của ngôn ngữ lập trình C và C++ Lập
trình viên viết một chương và gọi đó là các nhân song song (kernel), cái mà có thể
là một hàm đơn giản hay là một chương trình đầy đủ Một nhân được thực hiện song song thông qua một tập hợp các thread song song Người lập trình có thể tổ chức những thread này trong một lưới (grid) phân cấp của các thread block Một
thread block là một tập hợp của các tiến trình đồng thời mà có thể hợp tác giữu
chúng với nhau thông qua một rào chắn đồng bộ và chia sẻ truy cập tới một phân
vùng nhớ riêng tư trên block đó Một lưới – grid là tập hợp của các thread block mà
Trang 29có thể thực thi độc lập và theo cách đó nó có thể thực thi song song
Khi gọi một nhân, lập trình viên phải định rõ số thread trên mỗi block và số
block được tạo lên grid Mỗi thread đưa cho một số thread ID tĩnh threadIdx trong
mỗi thread block của nó, các số được đánh là 0, 1, 2, …, blockDim-1, và mỗi thread
block đưa ra một số block ID tĩnh blockIdx trong lưới của nó CUDA hỗ trợ các
thread block chứa tới 512 thread trong một block Và để thuận lợi, các thread block
và các grid có thể có một, hai hoặc ba chiều, được truy cập thông qua các trường chỉ
số x, y, z
Như một ví dụ đơn giản cho lập trình song song, giả sử rằng chúng ta cho hai
véc-tơ x và y với n số thực dấu phẩy động mỗi véc-tơ và cho rằng chúng ta tính toán
ra kết quả của y ax +y, cho một vài giá trị vô hướng a Lấy ví dụ hàm saxpy được
định nghĩa bởi thư viện BLAS(basic linear algebra subprograms) Đoạn mã thực hiện sự tính toán này trên cả bộ xử lý tuần tự và song song sử dụng CUDA được minh họa trong hình 25:
Trang 30Hình 2.4 Đối chiếu hai đoạn mã xử lý tuần tự và song song
Khai báo định rõ global chỉ ra cho chúng ta biết rằng nó là thủ tục để bắt
đầu vào một kernel Các chương trình CUDA thực thi các nhân song song với cú pháp gọi hàm mở rộng như sau:
kernel<<<dimGrid, dimBlock>>>(…parameter list …);
khi dimGrid and dimBlock là ba phần tử véc-tơ có kiểu dim3, và định rõ số chiều
của grid trong các block và số chiều của các block trong các thread, tách biệt hẳn ra Nếu không nói rõ thì số chiều mặc định là 1
Ví dụ, chúng ta chạy một lưới mà gán một thread tới mỗi phần tử của véc-tơ
và đặt 256 thread trong mỗi block Mỗi thread tính toán một chỉ số phần tử từ thread của nó và các block ID và sau đó sẽ thực hiện yêu cầu tính toán trên phần tử véc-tơ tương ứng Phiên bản tuần tự và song song của đoạn code này là giống nhau Đoạn
mã tuần tự có chứa một vòng lặp, nơi mà mỗi sự lặp lại là độc lập với tất cả vòng lặp khác Các vòng lặp có thể được biến đổi một cách máy móc trong các kernel song song: mỗi vòng lặp trở thành một thread độc lập Bằng cách gán một thread đơn cho mỗi phần tử đầu ra, chúng ta ngăn ngừa sự đồng bộ giữa các thread khi ghi kết quả vào bộ nhớ.Đoạn chương trình của một kernel CUDA đơn giản là một hàm
C cho một thread liên tục
Theo cách như vậy nó trở nên dễ hiểu để viết chương trình và đơn giản hơn so với code song song dành cho các thao tác véc-tơ Mô hình song song được xác định sáng sủa và rõ ràng bởi việc định rõ các chiều của một grid và các thread bock của
nó khi chạy một kernel
Việc thực thi song song và quản lý các thread đều hoàn toàn tự động Tất cả các thread được tạo, sắp xếp, và kết thúc được xử lý cho các lập trình viên bởi một
Trang 31hệ thống cơ sở nằm ở mức dưới Thực vậy, một kiến trúc GPU Tesla thực hiện quản
lý tất cả các thread độc lập trong một phần cứng Các thread trong một block thực thi đồng thời và có thể đồng bộ tại một rào chắn bằng cách gọi hàm syncthreads() bên trong Sau khi đi qua rào chắn, các thread này cũng được đảm bảo để cho các thread tham gia trước rào chắn xem thấy chúng ghi vào trong bộ nhớ Điều này đảm bảo rằng không có thread nào tham gia vào rào chắn có thể tiến hành cho tới khi tất
cả các thread tham gia đạt được tới rào chắn Như vậy, các thread trong một block
có thể kết nối với mỗi thread khác bằng cách ghi hoặc đọc trên bộ nhớ chia sẻ của mỗi block tại một rào chắn đồng bộ
Từ lúc các thread trong một block có thể chia sẻ bộ nhớ cục bộ và đồng bộ thông qua các rào chắn, chúng sẽ cư trú trên những bộ xử lý vật lý hoặc các multiprocessor giống nhau Tuy nhiên, số thread block có thể là rất lớn so với số lượng các processor Điều này thực chất là xử lý các phần tử và đưa cho lập trình khả năng mềm dẻo trong việc song song hóa tại các điểm nào là thuận tiện nhất Điều này cũng cho phép xem xét phân tích trực quan vấn đề, như là số block có thể được ra lệnh bởi kích thước của dữ liệu đang đươc xử lý hơn là bởi số bộ xử lý trong hệ thống Nó cũng cho phép cùng một chương trình CUDA co dãn rộng rãi hơn hay thay đổi số lõi bộ xử lý
Để quản lý việc xử lý phần thực sự và cung cấp khả năng mở rộng, CUDA yêu cầu các thread block tiến hành một cách độc lập Nó phải được thi hành trên các block theo nhiều kiểu, song song hay trong tuần tự Các block khác nhau không có nghĩa là kết nối độc lập với nhau, mặc dù chúng có thể phối hợp các hoạt động của chúng sử dụng các thao tác ở bộ nhớ nguyên tử trên bộ nhớ dùng chung của các thread – như việc gia tăng nguyên tử các con trỏ hàng đợi là một ví dụ
Sự độc lập này yêu cầu phải cho phép các thread block được sắp xếp trong bất
cứ thứ tự nào thông qua số các lõi, việc tạo mô hình CUDA có thể mở rộng thông qua một số tùy ý số lượng các lõi, chẳng khác gì thông qua một sự đa dạng của các kiến trúc song song Nó cũng giúp tránh xa khả năng “đồng hồ chết” (tức là một
Trang 32Các thread có thể truy cập dữ liệu từ nhiều phân vùng bộ nhớ trong khi chúng
thi hành Mỗi thread có một phân vùng bộ nhớ riêng (private local memory) CUDA
sử dụng bộ nhớ này cho các biến private-thread mà không làm lấp đầy các thanh ghi của thread, cũng giống như là cho các khung stack và các dãy thanh ghi Mỗi thread block có một bộ nhớ chia sẻ mà có thể thấy được bởi tất cả các thread block khác
mà có cùng thời gian tồn tại như block Cuối cùng, toàn bộ các thread truy cập vào cùng một bộ nhớ dùng chung Các chương trình khai báo các biến trong bộ nhớ chia
sẻ và dùng chung với từ khóa kiểu shared và device Trên một kiến trúc Tesla GPU, những phân vùng bộ nhớ này phù hợp với các bộ nhớ vật lý riêng biệt:
bộ nhớ chia sẻ trên mỗi block là RAM on-chip có độ trễ thấp, trong khi bộ nhớ dùng chung lại ở trong DRAM trên card đồ họa
Bộ nhớ chia sẻ được mở rộng thành bộ nhớ có độ trễ thấp gần mỗi bộ xử lý, chúng giống như một bộ đệm L1 (cache) Bởi vậy, nó có thể cung cấp một kết nối
có hiệu suất cao và chia sẻ dữ liệu giữa các thread trong một block Từ lúc nó có cùng thời gian tồn tại như các thread block tương ứng của nó, thì code kernel sẽ thường khởi tạo dữ liệu trong các biến chia sẻ, tính toán và sử dụng các biến chia sẻ
đó, và copy kết quả từ bộ nhớ chia sẻ tới bộ nhớ dùng chung Các thread block của các lưới liên tục kết nối với nhau qua bộ nhớ dùng chung và sử dụng nó để đọc đầu vào và ghi kết quả
Biểu đồ hình 26 thể hiện các tầng lồng nhau của các thread, các block thread,
và các lưới block Nó cho thấy các tầng tương ứng của bộ nhớ chia sẻ: bộ nhớ cục
bộ, chia sẻ, và bộ nhớ dùng chung trên thread, trên block thread, và trên các ứng dụng chia sẻ dữ liệu
Trang 33Hình 2.5: Phân cấp bộ nhớ
Một chương trình quản lý phân vùng bộ nhớ dùng chung có thể thấy được bởi
các kernel thông qua gọi các hàm CUDA thời gian thực, như là cudaMalloc() và cudaFree() Các kernel có thể thực hiện trên các thiết bị vật lý riêng biệt, như là sự
lựa chọn khi chạy các kernel trên GPU Do đó, ứng dụng phải sử dụng hàm
cudaMemcpy() để copy dữ liệu giữa các phân vùng định sẵn và trên bộ nhớ chủ hệ
thống (host system memory)
Mô hình lập trình CUDA là gần giống với kiểu của họ mô hình SPMD program multiple-data) – nó biểu diễn mô hình song song một cách nhanh chóng, rõ ràng, mỗi kernel chạy trên một số thread cố định Tuy nhiên, CUDA mềm dẻo hơn
Trang 34(single-trình viên có thể sử dụng một mức độ chuyển đổi mô hình song song cho mỗi kernel, hơn là thiết kế toàn bộ các phương diện của tính toán để sử dụng của cùng một số thread
Hình 2.6 thể hiện một ví dụ của một SPMD giống như đoạn mã trình tự
CUDA Đầu tiên nó thể hiện kernelF trên một lưới hai chiều của block có kích
thước 3x2, nơi mà mỗi block thread hai chiều chứa các thread kích cỡ 5x3 Sau đó
nó thể hiện kernelG trên một lưới một chiều của 4 block thread một chiều với 6 thread mỗi block Bởi vì kernelG phụ thuộc vào kết quả của kernelF, chúng được
tách biệt bởi một rào chắn đồng bộ liên kết các nhân
Các thread đồng thời trên một block biểu thị mô hình song song dữ liệu và thread mịn Các block độc lập trong một grid thì biểu thị mô hình song song dữ liệu thô Các grid độc lập biểu thị mô hình song song thao tác thô Một kernel là đoạn code C đơn giản cho một thread trong tầng
Hình 2.6 Mô hình các luông song song trên Cuda