Trái ngược với xử lý nối tiếp, dỏi hỏi phải xử lý các công việc theo thứ tự tuần tự Có hai kiểu song song đó là ¥ Song song vé dét liéu data parallelism: 14 co ché sử dụng nhiều don
Trang 1
ĐẠI HỌC QUÔC GIÁ HÀ NỘI
'TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
HOANG DINH THANG
LAP TRINH SONG SONG
TREN NEN DON VI XU LY ĐỎ HỌA
VA UNG DUNG
LUẬN VĂN THẠC SĨ
Ila NGi — 2010
Trang 2
ĐẠI HỌC QUÔC GIA HÀ NỘI
TRƯỜNG DẠI HỌC CÔNG NGHỆ
HOANG DINH THANG
LAP TRINH SONG SONG
TREN NEN DON VI XU LY BO HOA
VA UNG DUNG
Ngành: Công nghệ Thông tin
Chuyên ngành: IIệ thống Thông tin
Mã số: 60 48 05
LUẬN VĂN THẠC SĨ NGƯỜI HƯỚNG DẪN KIIOA HỌC: TS Nguyễn Trí Thành
Ila Ndi — 2010
Trang 3
MUC LUC LỜI CAM ĐOANG uc neneeie wl MỤC LỤC “2
DANH MỤC HÌNH VỀ 4
KY TU VIET TAT 5 LOICAMON 6
MO DAU _- aT CHUONG 1: GIGT THIRU, 9 1.1 Mục đích của lập trình song song 9 1.2 Mục tiêu của luận văn 12
1.3 Lễ chức của luân văn bees we DZ CHUONG 2: TONG QUAN VE DON VIXUT.Y BO HOA (GRAPHIC PROCESSING UNIT-GPU) 14
2.1 Tóm tắt lịch sử phát triển của đơn vị xử lý dé hoa (GPU) - 14 2.2 Sự khác nhau giữa ŒPU và CPU - 15 2.3 Mũö hình xứ lý song song dữ liệu - 17
2.4 Lợi ích sự thực thi tính toán song song 21
2.5 Phân cấp bộ nhớ S520 5 BE 2.5.1 Bộ nhớ toàn cục (plebal memory) và bộ nhớ cục bộ (local memory) 23 2.5.2 Bộ nhớ chia sẽ (sharcd memery) 24 2.5.3 Bộ nhớ texture và constant " 24 2.6 Các chiến lược tôi ưu hóa trên GPU "—
2.6.1 Tối da hóa thực thì song song, - 25 2.6.2 Tối ưu hỏa sử đụng bộ nhứ - 25
2.6.3 Tối ưu hỏa thực thi các thread 26
2.6.4 Tôi ưu hóa sử dụng chỉ lệnh - - 27
2.7 nVidia CUDA - 27
2.8 Thrust 28
Trang 4CHƯƠNG 3: MÔ HÌNH TRƯỜNG NGẪU NHIÊN CỎ ĐIÊU KIỆN
(CONDITIONAL RANDOM FIELDS -CRFS)
3.1, M6 hinh ly thuyét CRFs "
3.2 Ước lượng tham số mô hình CRES
3.3 Ứng dụng CRFs trong trich chon thong tin
CHƯƠNG 4: ỨNG DUNG GFU SONG SONG TUNG FILAN CONG CU
Trang 5Hinh 4: Vi dy vé luéi 5 chiều của thread 19
Hình 5: Luật Amdahls — tăng tốc phụ thuộc vào phần mã song song và số
Hình 6: Thu thập và phân tản các hoạt dộng bộ nhớ | 3/ - 22
Hình &: Phân cấp bộ nhớ theo khía cạnh phần mềm (trải) và phần cứng (phải)
Hinh 11: 5o sánh mô hình TĨMĂMS, XIEMEMS và CRES 29
Hình 12: VI dụ tộp tin huân huyện 38 Hình 13: Tệp tin mau (template) - - 39
Hình 16: So sảnh thời gian thực hiện tinh todn trén GPU-CPU - 49
Hình 17: Biểu đồ thời gian thực hiện tình toán trên (PU-OCPL - 50
Hình 1A: Biểu dỗ hình cật so sánh thời gian thực hiền tính toán trên GPU-CPL
inh 19: Tap dit liéu CoNLL 2000-shared task 51
Hình 20: So sánh thời gian thực hiện phan training 32
Trang 6
3D Three Dimensional
ALU Arithmetic Logic Unit
API Application Programming Interface
CPƯ Central Processing Unit
CRIs Conditional Random Fields
CUBLAS CUDA Basic Linear Algebra Subprograms
CUDA Compute Unified Device Architecture
CUDPP CUDA Data Parallel Primitives
CUFFT CUDA Fast Fourier Transform
DRAM Dynamic Random Access memory
GPGPU General-Purpose computing on Graphics Processing Units
GPU Graphics Frocessing Unit
LBFGS Limited memory BI'GS
MIRA Margin Infused Relaxed Algorithm
MPI Message Passing Interface
OpenCL Open Computation Language
OpenMP Open Multi-Provessing
PVM Parallel Virtual Machine
SIMD Single Instruction Multiple Data
SIMT Single Instruction Multiple Thread
VLSI Very Large Scale Integration
Trang 7LỚI CẢM ƠN
Để hoàn thành luận văn này tác giả đã nhận được sự giúp đã từ rất nhiều cơ
quan, doàn the và cả nhân
đã trực tiếp hưởng đẫn tôi trong suốt quá trình xây dựng và hoàn thành luận văn
'Lôi xm bảy tỏ lòng biết ơn sâu sắc đến 'LB Nguyễn ˆ
nay
Đồng thời, xin chân thánh cảm ơn lãnh đạo Viện Công nghệ Thông tin
thuộc Viện Khoa học và Công nghệ Quân sự đã tạo điều kiện để tôi thực hiện
thành công luận văn tốt nghiệp này
Hà Nội, tháng 1Ô năm 2010
Toe vién
Hoàng Đình Thắng
Trang 8Tỉnh toán song song hay xử lý song song là quả trinh xử lý thông tin trong,
đó nhắn mạnh việc nhiều dơn vị dữ liệu dược xử lý đồng thời bởi một hay nhiều
bộ xử lý dễ giái quyết một bải toán Trái ngược với xử lý nối tiếp, dỏi hỏi phải
xử lý các công việc theo thứ tự tuần tự
Có hai kiểu song song đó là
¥ Song song vé dét liéu (data parallelism): 14 co ché sử dụng nhiều don
vị xử lý thực hiện củng một thao tác trên nhiêu đơn vị dữ liệu
¥ Song song I&nh (control parallelism): 14 co ché trong dé nhiều tháo tác khác nhau tác dộng lên nhiều dơn vị đữ liệu khác nhau một cách ding thời
Chip đồ họa, với hàng chục lõi được sử dựng để tạo ra hình ánh thực trên màn hình máy tính, rất phủ hợp cho các nhiệm vụ xử lý song song Trong khi đó thi bộ xử lý, với nhữ
lai phù hợp hơn cho các ứng dụng xử lý nói tiếp
Xử lý song song là hưởng nghiên cứu quan trọng, nó giúp cho việc thực
hiện áo bài toán được nhanh hơn rất nhiễu so với xử lý tuần tự Luận văn sẽ
hướng tới tìm hiểu bải toán xứ lý song song trên nên đơn vị xứ lý đổ họa (Graphic Processing Llnit-GPU), một trong những hướng xử ly song song đang,
được phát triển mạnh trong thởi gian gần đây
Đồng thời luận văn nảy cũng tìm hiểu về mô hình trường ngẫu nhiên có diều kiện (Conditional Random Fields-CRFs), một mô hình được ứng dụng thành công trong rất nhiễu lĩnh vực như tin-sinh học, xứ lý ngôn ngữ tự nhiên và khai phá text/web
CRI+† là một công cụ được xây dựng cho mô hình CRE, áp dụng chơ các tác vụ xử lý ngôn ngữ tự nhiên như nhận dạng thực thể tên (Named Entity Recognition), trich chon théng tin (Information Extraction) va ‘Text Chunking
CRE++ là một phần mêm nguồn mở, được xây dựng bằng ngôn ngit C++.
Trang 9§
Luận văn này sẽ nghiên cứu cách mà tác giả của CRE++ thực hiện mô hình
CRE ly thuyết 'Từ đó đề xuất cách song song một số phần của CRE++ sử dụng
mô hình song song trên đơn vị xử lý đồ họa
Trang 101.1 Mục đích của lập trình song song
Yêu cầu thực tế cần thực hiện khối lượng tính toán lớn: bài toán xử lý ngôn
ngữ tự nhiên, bài toán xử lý ảnh 3I3, thăm dò dầu khí, dự báo thời tiết, (máy
tính xử lý tuần tự kiếu von Neumann là không đáp ứng yêu cầu)
Thân biết xử lý song song với tuần tự
¥ Trong xử lý tuần tự với một bộ xử lý thì tại mỗi thời điểm chỉ thực
hiện được một phép toán
ˆ Trong xử lý song song thì nhiều bộ xử lý cùng kết hợp với nhau để
lên tính toán nhanh én co sé sit
dựng nhiều bộ xử lý đồng thời Củng với tốc độ xử lý nhanh hơn, việc xử lý
Mục đích của xử lý song song: là thực
song song cũng sẽ piải dược những bài toán phức tạp yêu cầu khối lượng tỉnh
toán lớn
Ba yêu tả chính dẫn đến việc xây dựng các hệ thông xử lý song song
*⁄ Tốc độ xử lý của các bộ xử lý theo kiểu von Neumamn đã dần tiễn tới
giới hạn, không thế cải tiến thêm được do vậy dẫn tới đòi hỏi phải
thực hiện xử lý song song
/ THiện nay giá thành của phần cứng (CPU) giảm mạnh, tạo diéu kiện
đễ xây dựng những hệ thống có nhiều bộ xử lý với tá (hành hợp lý
vˆ Sự phát triển của công nghệ mạch tích hợp (VI.SI) cho phép tạo ra những hệ thống có hảng triệu bỏng bán dẫn (transistor) trên một chíp
Vấn dề xử lý song song liên quan trực tiếp đến: kiến trúc máy tính, phần
mềm hệ thẳng (hệ điều hành), thuật Loán và ngôn ngữ lập trình,v.v
HỆ thống tính song song; là một tập các bộ xử lý (thường là cùng một loại)
kết nỗi với nhau theo một kiến trúc nào đó để có thể hợp tác với nhau trong hoạt
động và trao dải đữ liệu được với nhau
Trang 1110
Chúng ta dễ nhận thấy là độ phức tạp của xử lý song song sẽ lớn hơn xử lý
tuần tự rất nhiều, và tập trung chủ yếu ở phương diện trao đối đữ liêu và đồng bộ
các tiến trình
Tổ cải dặt các thuật toán sơng song trên các máy tính song song chúng ta
phải sử dụng những ngôn ngữ lập trính song song Nhiều ngôn ngữ lập trình
song song đang được sử dụng nhw: Fortran 90, Pthread [24] voi Fortran/C++,
MPI [21] voi C/C++, PVM [22] voi C/CH, OpenMP [23] voi CICH, wr
Mật số khó khăn của lập trình song song truyền thông:
® Khó khăn thứ nhất — Suy nghĩ tuần tự
Chimg ta có thể thấy rằng tư duy tuần tự lá do môi trường lập trình quyết định Từ thập niên 80 đến khoảng pần dây, chúng ta chủ yếu làm việc với may
tính cá nhân, và mô hỉnh thực thi trên đó lả từng bước một Cũng có máy tính
song song, nhưng hiếm người được dùng nó trong công việc hằng ngày, vì
chuyện xây dụng một hệ máy tỉnh như vậy ở mức quốc gia đã cực kỷ tốn kém chứ đừng nói là công ty hay cá nhân
Cũng chính vì thói quen suy nghĩ tuần tự đã ăn sâu như vậy nên giờ chuyển
sang suy nghĩ kiểu song song rất lả mệt mỏi, vỉ sẽ phải chú ý tới các lỗi đặc thù
của nó, như bế tắc (deadlock), khóa sống (livelock), điều kiện cạnh tranh,v.v
© _ Khó khăn thử ha1- Mở rộng hiệu năng
Qui tic Amdahl [3] trong lấp trình song song cho chúng ta biết là lượng
lăng tốc tổi đa có thể đạt được bằng việc song sang hóa thuậi toán thì tỳ lệ
nghịch với phần mã chương trình không thế chuyên sang dợng song song Tức là cho đủ chỉ còn 10% mã chương trình không thể song song hóa, thì sự tăng tốc chương trỉnh đó cũng không vượt quá l0 lần Tuy nhiên để ước lượng mức độ
cái tiến thoo kiểu này rẤt khó, vì không thể xác định chính xác bao nhiêu phần
trầm mã chương trình thật sự chạy song song, do trong lúc thực thi song song,
mọi thứ lại rất có thể bị chuyển ngược lại thành tuần tự, như khi có tranh chấp
tài nguyễn dùng chung, hay có truy cập dến nhiều vị trí khá cách xa nhau trong,
bô nhớ Đây chính là một trong những hạn chế chính của mô hình lập trình song
truyền thống (vến thưởng cải đặt cách điều khiển tiểu trính qua cơ chế khóa, hay qua giao điên truyền thông điệp, hay nhiễu cách khác nữa đòi hỏi sự đẳngbộ hóa
tức là là tiên trình này đọi tiễn trình kia hadn tat công việc rồi mới làm tiếp
phân việc tiếp theo của mình) khi áp dụng cho nhiều nhâni Nói một cách dé
hiểu, nếu chúng ta chỉ phải đợi từng người một hoàn tải công việc của họ một cách đặc lập, thì thời gian chờ đợi có thé coi lé tang tuyén tinh với số người cần
Trang 12đợi/động bộ Nhưng nếu chúng ta phải doi cùng lúc nhiều người, và kết quả
công việc của họ lại phụ thuộc lẫn nhau, thì thời gian chờ đợi sẽ tăng tễ hợp và
rất khó xác định, chứ không đơn giản chỉ là tăng tuyến tinh,
Còn có một khó khăn cơ bắn hơn nữa trong mở rộng hiệu năng với số
nhân/lỗi Mô hinh lập trình song song truyền thống tiếp cận bài toán cần giải
quyết theo kiểu top-down, bằng cách chia một bài toán lớn thảnh nhiễu tác vụ
con, và mỗi tác vụ nảy sẽ được giao cho một bồ xử lý/nhân/lõi Van đề rắc rồi ở đây là khi số lượng bộ xử }ý/nhân/õi tăng lên đến hang chục, hay hang trăm như
hiện nay, thì số tác vụ con đã được thiết kế để giao nhằm tận dụng sức mạnh
tính toản của chúng lại không có đủ Cách tiếp cận phố biến nhất cho tỉnh huỗng
này là lại cố chia nhỏ các tác vụ con đó thành nhiều đơn vị thực thi nhỏ hơn
Nhu vậy, cách làm này bị phụ thuộc vào từng thể hệ phần cứng bộ xử lý, dẫn
đến chuyển không thể mỡ rộng việc thực thi chương trình một cách dé ding thea
kiếu không cẩn phải thay đổi, sửa chữa gì về mặt thuật toán hay mã nguồn cài
đất Vã suy cho cùng thỉ nếu một bài toán mà được chia thành vài chục tác vụ
con chay song song sẽ vô cùng khó quản lý và gỡ rối
s Khókhănthửba Tuần tự sang song song
Việc cố gắng chuyến mã từ tuần tự sang song song dựa trên tác vụ là quá
trình này cần rất nhiều thời gian, có khi cä vải năm trời l2o tốc độ gia tăng số
nhân/lõi hiện tại quá nhanh, nên nhiều khi thuật toán song song ma ching ta đã
bổ ra vài năm kể từ năm nay để thiết kế lại không mở rộng tốt với số nhân/lõi của vải năm nữa, ở thời điểm chúng ta hoàn tất việc cải đặt nó một cách song
song,
Ý tưởng gán một công việc nhỏ cho từng bộ xử lý/nhân/lõi trong máy tỉnh nhằm tăng hiệu năng phần mềm chạy trên đó là hoàn toàn tự nhiên và được đúc kết từ kinh nghiệm trong đời sống hàng ngày Tuy nhiên để tận dụng được hết
sức mạnh của hàng trăm, rồi hàng ngàn nhân/lõi trong tương lai, chứng ta có lễ
cần phái “đi trước đón đầu” bằng cách tạo ra hàng chục ngàn, hàng trăm ngàn
công việc nhỏ lï tỉ ung cấp cho đội quân nhân/lõi đông đảo và ngày một gia
Trang 131.2 Mục tiêu của luận văn
Vì giới hạn của phần cửng, xu hướng tăng số lõi (cores) thay vì tăng xung nhip (clock rate) đang trở nên phổ biến CPU thì có mulficores, còn GPU thi có many-cores Ngày nay, GPU 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 B của
CPU), tốc độ truy xuất bộ nhớ nhanh (85GB/s véi G80, 1S0GB/s voi GTX200) Thờ thể, vai trò của GPU đã vượt ra ngoài phạm vị truyền thông, đó là chạy các ứng dụng tỉnh toán Tuy nhiên, GPU vẫn chưa thay thế hoàn toàn được CPU, do
cỏ nhiều tác vụ thực hiện hiểu quả hơn trên CPU Do do, GPU chi dong vai trò
Mô hình trường ngẫu nhiên có diễu kiên (Conditional Random Ficlds- CRFs), mộL mõ hình được ứng dụng thánh gông trong rất nhiều lĩnh vực như tin- sinh học, xử lý ngôn ngữ tự nhiên và khai phả tcxt
CRFI ! là một công cụ xây dựng cho mô hình CRT, được viết bằng ngôn
ngit C++ Luận văn này sẽ ứng dụng GPU để song song hóa lừng phần của
CRE++, nhằm mục đích cải thiển tốc độ tỉnh toan cia CRF++, nhất là trong, trưởng hợp xử lý số liệu lớn (hàng chục nghìn câu, hảng triệu thuộc tínb)
1.3 Tổ chúc của luận văn
Luận văn này gồm 4 chương, với nội dung sơ hộ như sau
Chương 1 - Giới thiệu nêu lên mục đích của lập trình song song, những khó
khăn của lập trình song song truyền thống, dẫn đến yêu cầu một mô hình lập
trình song song kiểu mới linh hoạt hơn Chương này cũng trình bảy mục liêu của luận văn, tổ chức của luận văn
Chương 2 - Tổng quan về đơn vị xử lý dd hoa (GPU), cung cấp cái nhin
tổng quan về tính toán song song đa dụng trên đơn vị xừ lý đỗ họa Mô tá sự
khác nhau cơ bán giữa dơn vị xứ lý trung tâm (CPU) vả dơn vị xử lý đồ họa
(GPU) Phần lớn của chương nảy đành cho việc giai thích các nguyên tắc cơ bân của tính toán song song da đụng trên đơn vị xử lý dỗ họa và giao diễn lập trình ứng dụng (API) trén GPU
Trang 14Chương 3 - A4ô hình trường ngẫu nhiên có điều kiện (CRH), trình bày mô hình lý thuyết CRE, phương pháp ước lượng tham số của mô hình CRE và một
số ng đụng của CRF
Chương 4 - Ứng dụng GPU song song hỏa từng phẩn công cụ CRE++, giới thiệu công cụ RE+t, cách thức mà tác giả của CRELt thực hiện, từ đó đề xuất chiến lược song song CRF++ bing GPU thông qua các thư viện lập trình
cho GPU nhu CUDA, Thrust Phần cuối của chương sẽ đưa ra kết quả thực
nghiệm cũng như một số đánh giá, nhận xét.
Trang 1514
CHUONG 2: TONG QUAN VE
DON VI XU LY DO HOA (GRAPHIC PROCESSING UNIT-GPU)
2.1 Tóm tắt lịch sử phát triển của đơn vị xứ lý dé hoa (GPU)
"Irong suốt 20 năm qua GPUs di trãi qua những phát triển lớn Bắt đầu phát
triển từ đơn vị xứ lý đồ họa 2D đơn giản, đến đa mục đích, có thể lập trinh được,
song song mire dé cao, có nhiều lỗi đơn vị xử lý với khả năng tính toán phi thường và băng thông bộ nhở rất cao
Lịch sử của ŒPUs những năm 1970 với các máy tính có Atari 8-bit Những
chip đồ họa này được sử dụng dé hỏa trộn đồ họa và đữ liệu văn bản rồi hiến thị
chúng lên mản hình Những năm 1980, kiến trúc của chíp này trở thành nền tầng
của sản xuất chip hàng loạt tiếp theo, được tích hợp trong Commodore Amiga
Chip nay là chấp đầu tiên có đầy đủ các đặc tính tăng tốc đồ họa nó chứa các
đặc tính như: vẽ hình ảnh gốc, tô màu hình ảnh, chuyển khối hình ảnh,
ất cã vidoo được đẩy vào phần cứng, Năm 1984,
v.v Đặc tính cách mạng lả l
gần 10 năm sau khi phần cứng tăng tốc dỗ họa trở thành chuẩn, IBM giới thiệu tăng tốc 2D/3D dau tién dudi cai ttn IBM Professional Graphics Controller, nhưng thành công thì không dược như mong đợi Việc thiếu tính tương thích, xử
lý chậm vả giá cao (54.500) lâm cho dự án này thất bại [7]
Trong suốt những năm 1990, nhu cầu tăng tốc đồ họa trở nên cấp thiết, bởi
vì số lượng máy trạm ngày càng tăng với nền tảng công nghệ của Microsoft
Windows Năm 1993, $3 Graphics giới thiệu chíp đơn 2l tăng tốc đầu tiên - 53
860911, đưới tên mã là Porsche 911 Chíp này thiết lập chuẩn tăng tốc 212 trong
vòng vải năm Năm 1995 gần như tất cả các nhả sản xuất chíp đã bổ sung hỗ trợ tăng tốc 2D vào sin phẩm của họ
Giữa những năm 1990 đỗ họa 31) thời gian thực trở nên phố biến hơn trong, máy tính và trỏ chơi điều khiển Nhu cầu đỗ họa 312 thời gian thực dẫn đến phát
triển tăng, tắc 3D thời gian thực đầu tiên Các chíp giá rẻ như 53 ViRGE, Matrox Mystique hay Ati Rage duge dya trên 2D tắng tốc và thêm các đặc tính 3D Bước đột phá đầu tiên đến năm 1996, khi 3Dfx Iateractive giới thiệu tăng tốc 3D
đầu tiên đầu đủ tính năng có tên là Voodoo [8] Gia tăng tốc độ này xác định
tiêu chuẩn mới ch chip đồ họa 3D cho ba năm tiếp theo Bước đột phá lớn thứ hai đến năm 1999 khi tổng công ty nVidia giới thiệu GPU đầu tiên — NV10,
Trang 16dưới tên mã GeForce 256 Tắt cả các con chíp hiện nay về cơ bản đều xuất phát
từ kiến trúc này
Vào cuối năm 2006 nVidia giới thiệu kiến trúc thiết bị hợp nhất cho tính
toán đầu tién - Compute Unified Device Architecture (CUDA) Các công ty đối
thủ AMD/ATI giới thiệu kiến trúc của họ (ATI FireStream) vài tháng sau đó
Thời điểm này GPU trở nên dễ tiếp cận để phát triển phần mềm bằng các ngôn ngữ lập trình chuẩn công nghiệp và thiết lập cách thức mới cho tính toán hiệu
năng cao [2]
2.2 Sự khác nhau giữa GPU và CPU
Ý tưởng chính của tính toán song song đa dụng trên GPU (GPGPU) là sử
dụng nhiều bóng bán dẫn (transistor) để xử lý dữ liêu và xử lý dữ liêu song song
Đây là sự khác biệt chính giữa CPU và GPU GPU chủ yếu định hướng các thao tác song song dữ liệu hơn là trữ dữ liệu (caching data) và điều khiển luồng [2] Nhu cầu này chủ yếu xuất phát từ dựng hình đồ họa, bởi vì thiết bị đồ họa bắt
buộc phải xử lý một lượng lớn các phần tử dữ liệu đồ họa (như các điểm ảnh,
đỉnh và mảnh) và thao tác trên các phân tử nay (lightning, blending, clipping,
texturing, .), Song song là cách để giảm lượng thời gian cần thiết để xử lý dữ liệu và giảm chi phí tổng thể bằng cách phân phối nó trong xử lý các phần tử Nguyên tắc cơ bản là quá trình dựng hình đồ họa là cố định Dữ liệu được xử lý
bởi phần cứng đồ họa đi qua nhiều giai đoạn trước khi chúng được hiển thị và
chuỗi sự kiện nảy là không thay đổi
_ _ Ms
Hình 1: Sự khác nhan giữa CPU và GPU ~ GPU có nhiều bộ xử lý: để định
hướng xử l' song song dữ liệu [2]
Trang 17
GeForce Gre 480
PS NVIDIA GPU Single Precision
1250 NVIDIA GPU Double Precision
—eIntel CPU Single Precision
“Intel CPU Double Precision
tiến trình đang chay Tất cả các tác vụ được cung cấp một thời gian xử lý xác
định trước để thực thi mã của chúng Khi đến thời gian này, hệ điều hành chuyển CPU sang tiến trình tiếp theo Chuyển đổi ngữ cảnh giữa các tiến trình đang chạy có thể được tính toán với cường độ lớn
Trang 18Ngược lại, GPU xử lý nhiều nhất một nhiệm vụ tại một thời điểm nhưng
thực hiện nhiều lần song song GPU sử dụng mô hình song song dữ liêu để có thể giải quyết các vân đề số học cường độ cao hơn CPU Khi cùng một đoạn mã GPU được thực hiên song song nhiễu lần thì không cần kiểm soát luồng và quản
lý bộ nhớ đệm (cache) Thục thi tác vụ sơng song không được hỗ trợ trong GPU
€ó nghĩa là, không thể thực thi hai hoặc nhiều chương trình khác nhau trên cùng
GPU vào cùng một thời điểm
Mô hình xứ lý dữ liệu song song ánh xạ các phần tử đữ liệu vào các đơn vị
làm việc cơ sở được gọi là các luồng (thread) Tính song song thread cùng với
phân cấp bộ nhứ chỉa sẽ vả hàng rào đồng bộ hóa giữa các luỗng làm nên khái
niệm trừu tượng về mô hinh lap trinh song song da dung cia GPU [2]
2.3 Mö hình xử lý song song dữ liệu
Mục này sẽ trình bày các khái niệm cơ bản trong đơn vị xử lý đỗ họa
Kernel 14 mét doan mã chương trình, được thể hiện bởi một hàm hay thủ
tục việt bằng một ngồn ngữ lập trình cụ thể 7read là một thực thể chạy mã nhị
phân, được thực thi song song nhiều lần [2] Cé thé nói kernel là một “mẫu
ham” cho một nhóm thread, TTái thuật ngữ quan trọng tiếp theo là hosi và device
Tlost 14 bao gồm bộ xử lý trung tâm và DILAM của CPU, còn đevice gom các bộ
xứ lý và DRAM cia GPU Host va device duve phan tach béi khéng gian dia chí
của hai DRAM #os thực thi chương trình chính (mã tuần tự) còn đewice thực thi kernel (mã song song) Device trong mô hình này làm việc giống như môt bộ
đồng xử lý (eo-processor) dối với host Hình 3 thể hiện cách thức thực thi mã
tuân ty va song song
GPU thrcad dùng xử lý dữ liệu song song và mô hình lập trình Trong mô hình nảy, các phần tử dữ liệu cơ sở dược lưu trong bộ nhớ GPU được ảnh xa vào thread đang chạy Bộ nhớ CPU (không gian địa chỉ) là một máng tuyến tính của
các phan tử cơ bản (bytes) Dễ ánh xạ thread vào bộ nhở đối tượng chúng ta cần
biết cách tổ chức thread Cơ cấu tổ chức này phải có khả năng xác định rõ đối
tượng bộ nhớ từ các giá trị định dánh thread được sinh ra một cách tự động Dé
làm được điều nay, cach dé dang nhất là tổ chức thread thành lưới (griđ) ảo đa
các đươad Với công nghệ CUDA, lưới này có 5 chiều và để định
hướng tốt hơn, lại dược chia thành 2 loại: khối 3 chiều của thrcad và lưới 2 chiều
của khối cua thread
chiều củi
Trang 19€ Program Sequential Execution
Serial code
Parallel kernel Kernel0<<<>>>()
Serial code
Parallel kernel Kernell<<<>>>()
Hình 3: Nguyên lý lập trình trên GPU [2]
Số định danh duy nhất của thread có thể ước lượng từ một số biến liên quan, được khởi tạo khi lưới của khối thread được liệt kê Các biến này có thể
truy cập từ bên trong mỗi kernel Mỗi thread có biến riêng của nó, chứa tọa độ
Trang 20ba chiều †„, fy„ f„trong khối Khối thread chứa các biến chiều D,, 2y, D; ứng với các trục +, y, Z và tọa đô 2 chiều b„, by trong lưới khối thread Các chiều của lưới khối thread cũng có thể truy cập từ trong các biến G„, Œy Các chiều của
khôi thread và của lưới phải được thiết lập trước khi chạy các tính toán Số định
danh duy nhất của thread trong khối thread và số định danh duy nhất của block
trong grid được tính như sau [2]
Grid of thread blocks
“| rac rn
Grid dimension x
Hinh 4: Vi dụ về lưới 5 chiều của thread
Cơ cấu phân cấp cung cấp phương tiên để tính toán trên các cầu trúc dữ liêu như véctơ, ma trận hay mảng ba chiều Tuy nhiên do hạn chế của phần
cứng, kích thước của khối thread hay số thread trong mỗi block là giới hạn!
* Đối với nVidia CUDA tương thích với 1.x, kích thước lớn nhắt của khối thread là 512x512x64, nhưng
có nhiều nhất 512 thread trong mỗi block.
Trang 2120
Nghĩa là chúng ta không thể gọi khối thread với kích thước bất kỳ Đây là một
hạn chế, nhưng chúng ta có thể “lợi dụng” tính toán theo một số khối của các
thread Néu lam điểu này, chúng ta luôn phải xác định kích thước của grid dé
thực hiện các tính toán Tối đa kích thước của khối thread luôn luôn có nghĩa là
giảm thiểu kích thước của grid và ngược lại Vậy làm thé nao dé chúng ta chọn kích thước của khối thread, mà vẫn tuân theo giới hạn của phần cứng Ví dụ, nếu
chúng ta muốn ánh xạ véctơ kích thước Ñ với khối kích thước Dx, chúng ta cần xác định kích thước Œx của grid của khối thread Có thể tính toán như sau:
Dxe N and | < Dx < maxBlockDimensionX
Dy€N and 1 < Dy <maxBlockDimensionY
1 < Dx*Dy*Dz < maxThreadsPerBlock
Trang 222.4 Lợi ích sự thực thi tính toán song song
Để đạt được lợi ích tối đa từ tính toán song song chúng ta cần tìm giải pháp
làm thé nao dé song song ma tuần tự Trong GPGPU điều này được thực hiện
bởi song song thread và mô hình thực thi song song dữ liệu Lợi ích tối đa (tăng
tốc lý thuyết) có thể được diễn tả bởi luật Amdahl's [3]
1
(—P)+T
Trong đỗ P là một phần của chương trình có thể được thực hiện song song,
1— P tượng trưng cho phần mã được thực hiện tuần tự vả # là số bô xử lý hoặc
thread thực hiên phần song song Hình 5 minh hoa ting tốc lý thuyết cho các phần khác nhau của mã song song phụ thuộc vào số lượng thread thực hiện song
và số lượng thread [3]
Trang 232
2.5 Phân cấp bộ nhớ
Ngày này, GPUs hỗ trợ đánh địa chỉ bộ nhớ byte-wise và hỗ trợ thu thập
(gather) và phân tán (scatter) các hoạt động bộ nhớ Truy cập bộ nhớ song song
là giải pháp chính cho thông lương bộ nhớ lớn và xử lý dữ liệu song song, Điều quan trọng cần đề cập đến là tất cả các hoạt đông bộ nhớ phải được hợp nhất
Hợp nhất truy cập bộ nhớ nghĩa là đọc từ một tập địa chỉ liên tục phải tương ứng
với tổ chức thread (số định danh thread) Cách tốt nhất để hợp nhất bộ nhớ truy
cập là ánh xa thread và block vào bộ nhớ đối tượng Không hợp nhất hoặc truy
cập bộ nhớ ngẫu nhiên dẫn đến đọc và ghi tuần tự dữ liệu và làm mắt hiệu suất
[21
CS CĐ
Scatter
Hình 6: Thu thập và phân tán các hoạt động bộ nhớ [3]
Có thể xem xét bộ nhớ GPU từ hai khía cạnh: phần cứng và phần mềm Với khía cạnh phần mềm, cần phân biệt giữa các bộ nhớ global, local, shared,
texture và constant Mỗi loại bộ nhớ có chức năng đặc thủ và mục đích sử dụng riêng Với cái nhìn phần cứng, chỉ cần phân biệt giữa bộ nhớ thiết bị (DRAM),
bộ nhớ chia sẻ (shared memory) với constant và texture cache
Trang 242.5.1 Bộ nhớ toàn cục (global memory) và bộ nhớ cục bộ (local memory)
Bô nhớ toàn cục là phần bộ nhớ lớn nhất trong thiết bị GPU Bộ nhớ này
nằm trong DRAM của thiết bị và có thể truy cập từ tất cả các thread trong grid
và từ host-device thông qua thư viên runtime đặc thù Các đối tượng bộ nhớ khai
báo trong không gian bộ nhớ toản cục có thời gian tổn tại là thời gian của ứng
dụng Bộ nhớ toàn cục có thông lượng bộ nhớ rất lớn (hàng trăm gigabyte/giây))
Hạn chế chính của loại bô nhớ này là độ trễ rất lớn khi đọc và ghi dữ liệu (hàng
Trang 2524
trăm chu kỳ đồng hé-bundreds of clock cycles) Nguyên nhãn là do bộ nhớ toàn
cục không có bộ nhớ đệm (cache) Vì thế, nên hạn chế làm viếc trực tiếp với bộ
nhớ toàn cục, thay vào đó sử đựng bộ nhớ chia sẻ Ứu điểm của loại bộ nhớ toàn
cục là tải đữ liệu, lưu trữ chỉ lệnh vả sử dụng con trổ thông thường và con trỏ số
học
Bộ nhớ cục bộ cũng tương tự như bộ nhớ toản cục Nó thuộc về DRAM
của thiết bị nhưng chỉ truy câp bên trong mỗi thread và có kích thước giới han (hàng chục kilobytes), Dối tượng khai báo trong bộ nhớ này có thời gian tổn tại
là thời gian của khối thread Điểm mạnh và điểm yếu của bệ nhớ này giống với
bộ nhớ toàn cục
2.5.2 Hộ nhớ chia sẻ (shared memory)
Bộ nhớ chia sẻ là bộ nhớ nhỏ (chục kilobytes) có thể truy cập từ tất cả các
thread trong một khối thresd, vì thế đối tượng khai báo trong bộ nhớ nảy có thời
gian tồn tại cùng với khối thread Bộ nhớ chia sẻ làm việc giếng như Lì cache trên CPU chuẩn Nó cung cấp độ trễ truy cập rất thấp và thông lượng bộ nhớ rất
cao (gần như tương đương với thông lượng của thanh ghỉ nếu không có truy cập xung đột giữa các thread) Cách sử dụng shared mermory khó hơn so với global
memory Dé đạt được hiệu suất lỗi đa người lập trình phải giải quyết vấn đề
xung đột truy cập shared memory và lễ chức cấu trúc đữ liệu
2.5.3 Bé nhé texture va constant
Dây là hai bộ nhớ chuyên biết, Cả hai thuộc vé DRAM va cé thé truy cập
từ tất cã các thread trong grid và từ host thông qua thư viện thời gian chạy đặc thù Không giống như global va local memory, c4 hai bộ nhớ này déu la cached,
vì thế truy cập đến hai bộ nhớ này nhanh hơn nhiều so với truy cap global memory Ilơn nữa, một số phần cứng đồ họa có thể truy cập đữ liệu trong bộ
nhớ Iexture và thực hiện các thao tác chuyên biệL Đối tượng khai báo trong
texture va oonstan memory có vòng đời của ứng dụng,
2.6 Các chiến lược tối ưu hóa trên GPU
Không cân nhắc trước khi sử dựng GPU có thể dẫn đến kết qủa không như
ý muốn Trong trường hợp xấu nhất có thể cho kết quả sai hoặc tiêu tốn quá nhiều thời gian Ví dụ, sẽ không hiệu quả nếu chạy thuật toán sử dụng một
thread Irong trường hợp này phải thực biện sao chép dữ liệu vào device, thực thi thuật toán trên device vả sao chép đữ liệu trở lại host l3ữ liệu di chuyển giữa host va device la tốn nhất trong quá trình nảy, mặc dù với công nghệ ngày nay
có thể cung cấp băng thông đữ liệu rất cao Chúng ta can nhận thấy ring băng
Trang 26thông trên device cũng như trên host lớn hơn nhiều so với bing trong kết nối
giữa host va device
Trước khi viết một chương trình GPU, cần phái xem xét các khía cạnh kết quả từ kiến trúc GPU Kiểu lập trình GPU yêu cầu cách tiến cần khác với lập
trình CPU Đó là do kiến trúc phần cứng và mô hình thực thi chương trinh GPU
hoạt động như một bộ xử lý song song với CPU CPU Tất mạnh trong thực thí
mã tuần tự, trữ dữ liệu và xử ly luồng '1rong chương trình GPU, CPU đóng vai trò như là đối tượng giám sát mã GPU Nghĩa là CPU chỉ đảm nhận các hoạt động bộ nhớ cơ bản (cấp phát, giải phóng bộ nhớ GPU, chuyển đữ liệu giữa host
va device) và gọi komol Cáo tính toán khác được thực hiện trong bộ nhớ GPU
Có 4 chiến lược thực thi chính để đạt được lợi ích thời gian lớn nhất từ GPGPU [3]:
~_ Tối đa hóa thực thi song song,
- _ Tôi ưu hóa sử dụng bộ nhớ,
-_ ôi wu hóa thực thị thread,
- _ Tổi ưu hóa st dung chỉ lệnh
2.6.1 Tôi đa hóa thực thi song song
Tổi đa hóa thực thì song song là chiến lược cơ bản nhất, và chiến lược trừu
h dễ song song hiệu quả bài toán Đầu tiên bao gầm phân rã vấn dề thánh các vấn dễ
tượng nhất trong nhiều trường hợp trong tính toán song song Có hai c
con và ảnh xa chúng vảo các thực thì nguyên thúy (các khối thread, thread) Tiép
theo ánh xạ các thực thi nguyên thủy vào cấu trúc dữ liệu trong bộ nhớ Chiến
lược thứ hai là ngược lại của chiến lược thứ nhất Cần phải tim cach anh xa dit
liệu vào các thực thi nguyên thủy để giải quyết bài toàn Tùy thuộc vào bài toán
đưa ra để chọn chiến lược cụ thé
Nói chung, thuật toán bằng cách nảo đó phản ánh được thực hiện phần
cứng của thiết bị để đạt được hiệu quả lớn nhất, hơn nữa phải chắc chắn rằng
thuật toán được ánh xạ vào hiệu quả phần cứng
2.6.2 Tối ưu hóa sử dụng bộ nhớ
tối ưu hóa sử dụng bộ nhớ lả giăm thiểu việc
hơn rất nhiễu so với chuyển đữ liệu trong đevicc và hoat Tiếp đến là vi
truy cập bê nhớ toàn cục hiên đàng bộ nhớ chia sẽ, kết hợp với bộ nhớ toàn cục
Trang 2726
Bộ nhớ chia sẻ làm việc giống LIcache trong một bộ đa xử lý và hầu như
có chỉ phí truy cập bằng không, vì thế rất nhanh Mỗi khối thread truy cập bộ
nhớ chia sẻ của nó Tối ưu gồm chuyền di liệu từ bộ nhớ toàn cục sang bộ nhớ
chia sẽ, thực hiện các tỉnh toán trên dữ liệu của bộ nhớ chia sẽ, sau đó chuyển kết quả ngược lại bộ nhớ toàn cục Một điều quan trọng là, truy cập đến bộ nhớ
chia sẻ phải được tổ chức hợp lý đề tránh xung đột, vì bộ nhớ chia sẻ có thể truy
cập song song bởi nhiều thread Xung đột truy cập giữa các thread có thé dẫn
đến thực thi tuần tự các yêu cầu bộ nhớ và làm mất hiệu suất tính toán
Truy cập đến bộ nhớ toàn cục độ trễ rất lớn (hàng trăm chu kỳ đồng hỏ), vì
thể phải cần thận khi làm việc với dữ liêu trên bộ nhớ nay Hop nhất truy cập bộ
nhớ nghĩa là đọc từ một tập địa chỉ liên tục phải tương ứng với tổ chức thread (số định danh thread) Hợp nhất truy cập bộ nhớ là vẫn đề phụ thuộc thiết bị và không có chiến lược chung
Kỹ thuật tối ưu bộ nhớ tiếp theo là sử dụng bộ nhớ constant và texture Bộ
nhớ constant và texture là bộ nhớ chỉ đọc (từ thiết bị-device), có thể bộ nhớ đệm,
nên truy cập loại bộ nhớ này tương đối nhanh Ví dụ, để tiết kiêm bộ nhớ chia
sẽ, chúng ta lưu trữ một số đối số của kernel vào trong bộ nhớ constant Bộ nhớ
texture dùng cho các thao tác đồ họa
2.6.3 Tối ưu hóa thực thi các thread
Thread được tổ chức trong khối (block), được thực thi trên bộ đa xử lý Mỗi khối của các thread được phân chia thành từng phần gồm 32 thread bởi đơn
vị chỉ dẫn trong bộ đa xử lý và được thực thi trên bộ xử lý vô hướng Việc đầu
tiên để cải thiên hiệu suất là tạo khối thread (chứa số lượng thread là bội của 32)
Điều này sẽ cung cấp hiệu quả tính toán tối ưu và sẽ tạo điều kiên hợp nhất truy
cập bộ nhớ
Chiến lược tối ưu quan trọng nhất là tránh các đường thực thi khác nhau trong cùng một warp (warp là một nhóm gồm 32 thread) Nếu một đường thực
thi của thread phân rã ở nhánh phụ thuộc dữ liệt At cd cac thread không ở trên
đường này được dừng lại cho đến khi tất cả các đường hội tụ lại cùng đường
Trang 28Hình 9: Phân rã tại nhành phụ thuộc đữ liệu
Tắt cả các lệnh diễu khiển (nhánh, lặp) có thể lâm cho warp dang hoạt động
phân rã
2.6.4 Tối ưu hóa sử dụng chỉ lệnh
Ti ưu hóa các chỉ lệnh sử dụng trong hầu hết các trường hợp là kỹ thuật tối ưu có độ ưu tiên thấp nhất và được thực hiện sau khi xong các tối ưu trên GPU được tối ưu hóa cao cho các phép toán dấu phẩy động Vì thế cần cân nhắc
việc ưu tiên cho tốc độ hay cho độ chính xác IIiện nay GPU hỗ trợ số đấu phẩy
động độ chính xáo kép, nên gó thể cung cấp chính tính toán chính xáo hơn với chỉ phi thực hiện
Tên cần thận khi chuyển đổi số chính xác đôi sang số chính xác đơn Tránh dùng phép chia, phép chua lấy dư, thay vì thế nên dùng phép địch chuyển
2.7 nVidia CUDA
CUDA là từ viết tất trong tiếng Anh của thuật ngữ Compute Unifed
Device Architecture, tam dich la kién trúc thiết bị hop nhất cho tính toán
CUDA bit đầu xuất hiện Lừ tháng 11 năm 2006 với vai trò ban đầu là một bộ
công cu phát triển phần mềm dựa trên ngôn ngữ lập trình , và piờ dây cuối năm
2010, sau bốn năm phát triển, CUDA dang Hiến hóa thành kiến trúc diện toán
GPU, hay còn gợi là GPGPU, của NVTDIA CUIDA có mặt trên hầu hết các
GPU ddi méi cia NVIDIA, tir dong 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ụ như trong thiết kế và sáng
tạo và mới nhất là dỏng Iesla cho tính toán hiệu năng cao
Hình dưới đây cho chúng ta thấy bức tranh toàn cảnh về điện toán CPU xét trên khía cạnh phần mềm từ quan điểm và công nghệ của NVII2IA 'Irong hình
nảy, ở lớp thấp nhật của kiên trúc phân mềm giành cho điện toán CPU, 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ị CLDA vốn được nhúng bên trong trình điều
khiển thiết bị đề họa đo NVIDIA cung cấp.