Thiết bị xử lý đồ họa (GPU, graphics processing unit) là một vi mạch chuyên dụng được thiết kế để thao tác và truy cập bộ nhớ đồ họa một cách nhanh chóng, đẩy nhanh việc tạo ra các hình ảnh trong bộ đệm khung hình (framebuffer) trước khi xuất ra màn hình hiển thị. GPU được sử dụng trong các hệ thống nhúng, điện thoại di động, máy tính cá nhân, máy trạm và máy chơi trò chơi điện tử video (console).
GPU hiện đại rất hiệu quả trong các thao tác đồ họa máy tính và xử lý hình ảnh. Kiến trúc song song ở mức độ cao làm cho nó hiệu quả hơn so với các CPU đa dụng vì việc xử lý một khối lượng lớn dữ liệu được thực hiện song song. Trong một máy tính cá nhân, một GPU có thể nằm trên một bo mạch đồng rời, được nhúng vào bo mạch chủ hoặc tích hợp trong một số CPU.
Vào những năm 70, ban đầu thuật ngữ 'GPU' có ý nghĩa là 'graphics processor unit', được sử dụng để mô tả các bộ xử lý đồ họa, chúng hoạt động độc lập với CPU và đảm nhận các nhiệm vụ đồ họa và xuất video. Sau đó vào năm 1994, Sony sử dụng thuật ngữ 'graphics processing unit' để chỉ bộ xử lý đồ họa của Toshiba trong PlayStation. Thuật ngữ này trở nên phổ biến sau khi Nvidia quảng cáo GeForce 256 của họ là 'GPU đầu tiên trên thế giới' vào năm 1999. Một đối thủ cạnh tranh, ATI Technologies, đưa ra thuật ngữ khác là đơn vị xử lý hình ảnh (VPU, visual processing unit) sau khi phát hành Radeon 9700 vào năm 2002.
Lịch sử
Những năm 1970
Các bo mạch của các hệ thống arcade đã sử dụng các mạch đồ họa chuyên dụng từ những năm 1970. Trong phần cứng cho các trò chơi video đầu tiên, do chi phí cao của bộ nhớ đệm hình ảnh (thực chất là RAM) nên các vi xử lý đồ họa chỉ tạo ra hình ảnh khi chúng đang được vẽ lên màn hình.
Một mạch barrel shifter đặc biệt đã được sử dụng để giúp CPU tạo ra hình ảnh động từ bộ nhớ đệm hình ảnh trong nhiều trò chơi arcade của Midway và Taito trong những năm 70, như Gunfight (1975), Sea Wolf (1976), Space Invaders (1978). Hệ thống arcade Galaxian của Namco đã sử dụng phần cứng đặc biệt hỗ trợ màu RGB, sprite đa sắc và bản đồ hình nền. Phần cứng Galaxian đã được sử dụng rộng rãi trong thời kỳ hoàng kim của các trò chơi arcade, được phát triển bởi các công ty như Namco, Centuri, Gremlin, Irem, Konami, Midway, Nichibutsu, Sega và Taito.
Tại thị trường gia đình, máy chơi trò chơi video Atari 2600 ra đời năm 1977 với việc sử dụng một vi mạch đơn giản có tên là TIA (Television Interface Adaptor). Các máy tính 8 bit của Atari (1979) được trang bị ANTIC, một bộ xử lý video chuyên biệt, đọc các chỉ thị mô tả một 'danh sách hiển thị' và sử dụng nó để tạo ra tín hiệu video phức tạp.
Trải qua thập niên 1980
NEC µPD7220 là vi xử lý đồ họa đầu tiên trên máy tính cá nhân dưới dạng một vi mạch VLSI duy nhất, cho phép các nhà sản xuất như Number Nine Visual Technology phát triển các bo mạch đồ họa với chi phí thấp và hiệu suất cao. Nó đã trở thành GPU phổ biến nhất trong nửa đầu thập niên 80 và mô hình thiết kế này đã được cấp phép cho việc sản xuất các vi mạch khác như Intel 82720, đánh dấu sự ra đời của bộ xử lý đồ họa đầu tiên của Intel.
Năm 1983, Hitachi giới thiệu ARTC HD63484, vi xử lý đồ họa CMOS đầu tiên. ARTC có khả năng hiển thị hình ảnh 4K ở chế độ đơn sắc và được sử dụng rộng rãi trong các bo mạch đồ họa của PC và các terminal vào cuối thập niên 80. Năm 1985, máy tính cá nhân Commodore Amiga xuất hiện với một bộ xử lý đặc biệt, bao gồm khả năng bit blit để tăng tốc quá trình thay đổi bitmap, các hàm vẽ đường thẳng và tô màu. Ngoài ra, nó còn có một bộ xử lý đồng thời với tập lệnh riêng, cho phép thay đổi trực tiếp các thanh ghi phần cứng đồ họa mà không cần thông qua CPU chính. Năm 1986, Texas Instruments ra mắt TMS34010, một vi xử lý đầu tiên cho đồ họa có khả năng lập trình. Nó có thể thực thi các chương trình giống như CPU thông thường, nhưng điểm nổi bật là các tập lệnh hướng đồ họa. Trong giai đoạn từ 1990 đến 1992, nhiều bo mạch đồ họa sử dụng TMS34010 với tiêu chuẩn đồ họa TIGA (Texas Instruments Graphics Architecture) được phát triển để tăng tốc hệ điều hành Windows.
Năm 1987, IBM giới thiệu hệ thống đồ họa IBM 8514 sau khi ra mắt tiêu chuẩn đồ họa VGA (Video Graphics Array). Đây là một trong những tiêu chuẩn đầu tiên của IBM PC cho đồ họa 2D được cải tiến trên phần cứng.
Trong khoảng thời gian 1990-1999
Năm 1991, S3 Graphics giới thiệu S3 86C911, được đặt tên theo chiếc Porsche 911, cho thấy sự cải tiến rõ rệt về hiệu năng. 86C911 mở ra thời đại của các chip đồ họa mới, được biết đến như là bộ gia tốc 2D. Vào khoảng năm 1995, hầu hết các nhà sản xuất chip đồ họa cho PC đã phát triển bộ gia tốc 2D. Vào thời điểm này, các bộ gia tốc giá rẻ đã đạt được hiệu suất tương đương với các bộ xử lý đồ họa đa năng.
Suốt thập niên 90, công nghệ phần cứng 2D tiếp tục phát triển với sự cải tiến trong công nghệ sản xuất, cho phép tích hợp nhiều chức năng hơn vào các vi mạch. Đồng thời, xuất hiện của các API đồ họa như WinG của Microsoft cho Windows 3.x và DirectDraw cho các trò chơi trên Windows 95 và các phiên bản sau.
Trong nửa đầu thập niên 90, đồ họa 3D thời gian thực trở nên phổ biến trong các trò chơi arcade, console và PC, tạo nên nhu cầu lớn về phần cứng 3D. Các nền tảng đầu tiên bao gồm Sega Model 1, Namco System 22 và Sega Model 2 cho arcade; Sega Saturn, Playstation và Nintendo 64 cho console. Các sản phẩm đáng chú ý bao gồm Reality Coprocessor của Nintendo 64 năm 1996 và Fujitsu Pinolite, bộ xử lý hình học 3D đầu tiên cho PC năm 1997.
Thuật ngữ 'graphics processing unit' (GPU) lần đầu tiên được đề cập trong tài liệu kỹ thuật của Sony PlayStation vào năm 1994.
Đối với PC, các sản phẩm tiên phong nhưng không thành công như S3 ViRGE, ATI Rage và Matrox Mystique cần được nhắc đến. Những chip này ban đầu là các bộ gia tốc 2D với tính năng 3D được tích hợp sau. Các nền tảng mạnh mẽ 3D ban đầu như PowerVR và 3dfx Voodoo thường phải kết hợp với phần cứng 2D truyền thống. Tuy nhiên, với sự phát triển của công nghệ, tất cả các chức năng từ hiển thị đến 2D và 3D đã được tích hợp vào một chip duy nhất. Ví dụ điển hình là chipset Verite của Rendition, một trong những thành tựu đầu tiên của điều này.
OpenGL ra đời vào đầu những năm 90, là một API được sử dụng rộng rãi trong đồ họa chuyên nghiệp, tuy nhiên gặp phải các vấn đề về hiệu suất. Điều này đã tạo điều kiện cho sự phát triển của API Glide và nó đã trở thành tiêu chuẩn trong đồ họa máy tính vào cuối những năm 90. Tuy nhiên, các vấn đề của OpenGL đã nhanh chóng được giải quyết và API Glide dần dần bị thay thế. Đồng thời, DirectX cũng trở nên phổ biến trên nền tảng Windows.
2000 - 2010
Với sự xuất hiện của Nvidia GeForce 8xxx và đơn vị xử lý dòng (stream processing unit), các GPU đã trở thành các thiết bị tính toán đa dụng hơn. Ngày nay, các GPU song song đã bắt đầu mở rộng vào lĩnh vực tính toán, cạnh tranh trực tiếp với CPU. Điều này đã mở ra một lĩnh vực nghiên cứu mới, được biết đến như tính toán GPU (GPGPU), được áp dụng rộng rãi trong nhiều lĩnh vực như học máy, thăm dò dầu khí, xử lý hình ảnh khoa học, đại số tuyến tính, thống kê, tái tạo hình ảnh 3D và thậm chí cả định giá tùy chọn cổ phiếu.
Nền tảng CUDA của Nvidia, xuất hiện lần đầu vào năm 2007, đã là mô hình lập trình đầu tiên được sử dụng rộng rãi trong tính toán GPU. Gần đây, OpenCL đã bắt đầu nhận được sự hỗ trợ rộng rãi. OpenCL là một tiêu chuẩn mã nguồn mở do Kronos Group phát triển, cho phép phát triển phần mềm cho cả GPU và CPU. Các giải pháp OpenCL được hỗ trợ bởi Intel, AMD, Nvidia và ARM.
2010 - nay
Năm 2010, Nvidia hợp tác với Audi để tích hợp dòng GPU Tegra vào các bảng điều khiển của ô tô, cung cấp thêm tính năng cho các hệ thống dẫn đường và giải trí trong xe (infotainment). Sự phát triển của công nghệ GPU trong xe đã thúc đẩy công nghệ lái tự động.
Chức năng tính toán
Các GPU hiện đại sử dụng hầu hết transistor của mình để thực hiện các tính toán liên quan đến đồ họa 3D. Ngoài phần cứng 3D, các GPU ngày nay còn tích hợp phần cứng 2D và bộ đệm khung hình (framebuffer), thường với chế độ tương thích VGA. Các GPU mới có thể không có phần cứng 2D và sử dụng giả lập 2D trên phần cứng 3D. Ban đầu, GPU được sử dụng để tăng tốc các tác vụ trọng tải như texture-mapping và render các đa giác, sau đó mới bổ sung các thành phần để tính nhanh các phép tính hình học như phép quay, dịch chuyển các đỉnh vào các hệ tọa độ khác nhau. Các tiến bộ gần đây trên GPU bao gồm hỗ trợ các shader lập trình, chúng có thể biến đổi các đỉnh và texture tương tự như sử dụng kỹ thuật nội suy, oversampling để giảm aliasing. Bởi vì các tính toán này sử dụng nhiều vector và ma trận, các kỹ sư và nhà khoa học đã bắt đầu quan tâm đến việc sử dụng GPU cho các tính toán ngoài đồ họa; chúng rất phù hợp với các bài toán song song toàn phần (embarassingly parallel).
Vài yếu tố trong cấu trúc của một GPU ảnh hưởng đến hiệu suất của nó trong việc kết xuất thời gian thực (real time rendering). Những yếu tố phổ biến bao gồm kích thước của quy trình bán dẫn, tần số dao động của xung nhịp và dung lượng bộ nhớ cache trên chip. Hiệu suất của một GPU được đo bằng số phép toán dấu phẩy động mỗi giây (FLOPS), và các GPU trong giai đoạn 2010-2020 thường đạt mức tera-flops.
Với sự ra đời của học sâu (deep learning), vai trò quan trọng của GPU đã được nâng lên. Theo nghiên cứu của Indigo, khi huấn luyện mạng neuron sâu, việc sử dụng GPU có thể nhanh gấp 250 lần so với việc sử dụng CPU. Mặc dù đã có sự cạnh tranh từ các ASIC, nhưng GPU vẫn giữ được ưu thế nhờ khả năng lập trình linh hoạt.
Phân loại
Có hai loại GPU chính:
- GPU tích hợp - integrated GPU (IGP), hay còn gọi là kiến trúc bộ nhớ chung/unified memory architecture (UMA)
- GPU rời - discrete GPU, hay còn gọi là dedicated GPU
Bảng mạch đồ họa rời
Các GPU mạnh nhất thường kết nối với bảng mạch chủ qua các khe mở rộng như PCI Express (PCIe) hoặc Accelerated Graphics Port (AGP) và thường có khả năng thay thế hoặc nâng cấp một cách tương đối dễ dàng.
Một GPU rời không cần thiết phải được tháo rời, hoặc phải liên kết với bo mạch chủ theo cách thông thường. GPU rời có tính chất là hệ thống cung cấp bộ nhớ riêng cho chúng. Hơn nữa, bộ nhớ này thường được thiết kế đặc biệt cho việc xử lý đồ họa (xem thêm GDDR). GPU rời trong các laptop thường sử dụng các giao diện không chuẩn do hạn chế về kích thước và trọng lượng của thiết bị. Tuy nhiên, về phần mềm, chúng vẫn là PCIe hoặc AGP.
Bộ xử lý đồ họa tích hợp
Các GPU tích hợp này sử dụng một phần của bộ nhớ hệ thống. Thường được tích hợp trên bo mạch chủ trong các chipset (northbridge) hoặc trên die của CPU. Chúng được bán trên thị trường dưới tên gọi APU (AMD) hoặc Intel HD Graphics. Từ đầu năm 2007, máy tính sử dụng GPU tích hợp (IGP) chiếm 90% thị phần PC. IGP thường có chi phí sản xuất thấp và hiệu suất kém hơn so với GPU rời. Trước đây, IGP được cho là không đủ mạnh để chơi game 3D hoặc chạy ứng dụng đồ họa nặng, nhưng có thể thực hiện các tác vụ thông thường như chạy Adobe Flash. Tuy nhiên, các IGP hiện đại như Intel HD Graphics hoặc APU đã đủ mạnh để xử lý đồ họa 2D hoặc 3D cấu hình thấp.
Xử lý dòng dữ liệu (Stream processing) và GPU đa dụng (GPGPU)
Sử dụng GPU đa năng (GPGPU) như một bộ xử lý dòng chảy (hoặc bộ xử lý vectơ) để chạy các kernel tính toán ngày càng phổ biến. Ý tưởng này biến sức mạnh tính toán khổng lồ của GPU hiện đại thành sức mạnh tính toán chung, không chỉ để đồ họa. Trong một số ứng dụng, yêu cầu phép tính vectơ lớn, điều này có thể mang lại hiệu suất cao hơn nhiều so với CPU thông thường. Hai nhà thiết kế GPU lớn nhất (xem phần 'Cạc đồ họa chuyên dụng' ở trên), AMD và Nvidia, đang bắt đầu theo đuổi cách tiếp cận này với nhiều ứng dụng. Cả Nvidia và AMD đều hợp tác với Đại học Stanford để phát triển một ứng dụng khách dựa trên GPU cho dự án Folding@home, phục vụ cho tính toán gấp protein. Trong một số trường hợp, GPU tính toán nhanh hơn CPU gấp 40 lần trong cùng ứng dụng.
GPGPU có thể được sử dụng cho nhiều tác vụ song song hoàn toàn như ray tracing. Chúng thường phù hợp với các phép tính thông lượng cao với dữ liệu song song để tận dụng kiến trúc vectơ rộng SIMD của GPU.
Hơn nữa, các máy tính hiệu suất cao dựa trên GPU đang đóng vai trò quan trọng trong việc xây dựng mô hình quy mô lớn. Ba trong số 10 siêu máy tính mạnh nhất thế giới tận dụng sức mạnh gia tốc từ GPU.
GPU hỗ trợ các API mở rộng cho ngôn ngữ lập trình C như OpenCL và OpenMP. Ngoài ra, mỗi nhà cung cấp GPU đưa ra API riêng của họ, chỉ hoạt động trên card của mình: AMD APP SDK và CUDA của Nvidia và AMD. Các công nghệ này cho phép các hàm đã được định sẵn, gọi là kernel tính toán từ một chương trình C chuẩn để chạy trên GPU. Điều này giúp các chương trình C có thể tận dụng khả năng của GPU để thực hiện tính toán song song trên các bộ đệm lớn, đồng thời sử dụng CPU khi cần thiết. CUDA cũng là API đầu tiên cho phép ứng dụng dựa trên CPU truy cập trực tiếp vào tài nguyên của GPU để tính toán mục đích chung mà không bị ràng buộc bởi API đồ họa.
Kể từ năm 2005, sự quan tâm đến việc sử dụng hiệu suất của GPU để tính toán tiến hóa nói chung và để tăng tốc đánh giá độ phù hợp trong lập trình di truyền nói riêng ngày càng tăng. Hầu hết các phương pháp đều biên dịch các chương trình cây hoặc tuyến tính trên máy tính chủ và chuyển tệp thực thi sang GPU để thực thi. Thông thường, lợi ích về hiệu suất chỉ đạt được khi chạy chương trình duy nhất trên nhiều dữ liệu mẫu một cách song song, sử dụng kiến trúc SIMD của GPU. Tuy nhiên, cũng có thể đạt được tăng tốc đáng kể bằng cách không biên dịch chương trình, thay vào đó diễn dịch trực tiếp trên GPU. Sau đó, có thể tăng tốc bằng cách diễn dịch nhiều chương trình đồng thời hoặc chạy song song nhiều bài toán mẫu, hoặc kết hợp cả hai phương pháp. Một GPU hiện đại có thể diễn dịch hàng trăm nghìn chương trình rất nhỏ một cách dễ dàng.
Các GPU máy trạm hiện đại như Nvidia Quadro với kiến trúc Volta và Turing, có các lõi xử lý dành riêng cho các ứng dụng học sâu dựa trên tensor. Trong dòng GPU hiện tại của Nvidia, các lõi này được gọi là Lõi Tensor. Các GPU này thường có hiệu suất FLOPS tăng đáng kể, sử dụng phép nhân và chia ma trận 4x4, dẫn đến hiệu suất phần cứng lên đến 128 TFLOPS trong một số ứng dụng. Các lõi tensor này cũng được cho là có mặt trong dòng sản phẩm người tiêu dùng với kiến trúc Turing và có thể sẽ xuất hiện trong dòng sản phẩm người tiêu dùng Navi của AMD.