Bộ xử lý đồ họa

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

