GPU đã phát triển từ trạng thái triển khai cố định đƣờng ống dẫn đồ họa ở phần cứng tới trạng thái là một hệ thống tính toán hỗ trợ lập trình và có khả năng triển khai đƣờng ống dẫn đồ họa trên nó. Các đơn vị cố định chức năng để chuyển hóa đỉnh và kết cấu pixel đƣợc gộp lại bằng hệ thống bộ xử lý đồng nhất hoặc các shader là các đoạn chƣơng trình có thể thực hiện các chức năng này và hơn thế nữa. Cuộc cách mạng này đã đƣợc tiến hành trên vài thế hệ GPU bằng cách thay thế dần dần các trạng thái của đƣờng ống dẫn đồ họa bằng số lƣợng tăng dần các đơn vị hỗ trợ lập trình.
Ví dụ NVIDIA GeForce 3 đƣợc công bố vào tháng 2 năm 2011 và lần đầu tiên shader đỉnh hỗ trợ tính năng lập trình [9]. Những shader này cung cấp các đơn vị
33
tính toán cho lập trình viên có thể sử dụng cho việc nhân các ma trận véc tơ, các tính toán hàm mũ và căn bậc hai cũng nhƣ các chƣơng trình nhỏ mặc định để sử dụng các đơn vị này thực hiện các chức năng chuyển hóa đỉnh và ánh sáng.
Ngoài ra GeForce 3 cũng có một sự cải tiến khác đó là khả năng tùy chỉnh có giới hạn ở giai đoạn xử lý pixel, thể hiện chức năng kết cấu trƣớc đây mặc định cho phần cứng dƣới dạng một tổ hợp các thanh ghi với lập trình viên. Các thế hệ GPU tiếp theo càng ngày càng có khả năng linh động tăng dần, hỗ trợ các đoạn chƣơng trình dài hơn, nhiều thanh ghi hơn và điều khiển luồng hình học nguyên thủy nhƣ nhánh, vòng lặp và chƣơng trình con.
ATI Radeon 9700 (tháng 6/2002) và NVIDIA GeForce FX (tháng 1/2003) đều thay thế tổ hợp các thanh ghi bất tiện bằng các shader pixel lập trình đƣợc hoàn toàn [9]. Chip GeForce 8800 (tháng 11/2006) cập nhật thêm khả năng lập trình đƣợc vào trạng thái tái tạo hình học nguyên thủy cho phép lập trình viên có thể điều chỉnh cách GPU tạo ra các tam giác từ các véc tơ đã đƣợc chuyển hóa.
Việc cải thiện về độ chính xác trong các GPU cũng góp phần tăng tính lập trình. Đƣờng ống dẫn đồ họa cổ điển chỉ hỗ trợ số nguyên 8 bit cho các kênh màu do đó giá trị màu chỉ trải từ 0 tới 255. Chip ATI Radeon 9700 đã tăng dải màu hiển thị lên 24 bit dấu phẩy động và NVIDIA GeForce FX cũng bén gót với cả hai chế độ 16 bit và 32 bit dấu phẩy động [20]. Hiện nay GPU của ATI và NVIDIA đều đã hỗ trợ dấu phẩy động có độ chính xác kép 64 bit.
Đồng thời để thỏa mãn nhu cầu về hiệu năng, GPU ngày càng có thiết kế tận dụng triệt để tính song song. Thời kì đầu, GPU đã sử dụng các thanh ghi có độ rộng 4 véc tơ và theo thời gian số lƣợng các thanh ghi tăng dần từ 4 ở GeForce FX đến 16 ở GeForce 6800 (tháng 4/2004) đến 24 ở GeForce 7800 (tháng 5/2005) [20]. GeForce 8800 có đến 128 bộ xử lý shader có hƣớng chạy ở xung shader đặc biệt gấp 2,5 lần xung đồng hồ bình thƣờng (tƣơng ứng với tốc độ pixel đầu ra) cho một chip tiêu chuẩn, do đó hiệu năng tính toán tƣơng ứng với 128 x2.5/4=80 shader pixel có độ rộng 4 véc tơ [20].
34
Bƣớc cuối cùng trong cuộc cách mạng chuyển hóa đƣờng ống dẫn đồ họa từ phần cứng sang một kết cấu tính toán linh động là sự giới thiệu shader hợp nhất. Shader hợp nhất lần đầu tiên xuất hiện ở chip ATI Xenos cho máy chơi game Xbox 360 và NVIDIA cũng triển khai shader hợp nhất ở chip GeForce 8800 cho máy tính cá nhân.
Ở các thế hệ GPU trƣớc shader đỉnh, shader pixel và shader hình học là các đơn vị riêng rẽ còn kiến trúc shader hợp nhất cung cấp một đơn vị tập các bộ xử lý dấu phẩy động song song dữ liệu đủ tính chất “chung chung” để xử lý hết toàn bộ công việc của các shader trên. Các dữ liệu đỉnh, tam giác và pixel sẽ đƣợc lƣu thông trong tập các bộ xử lý của shader hợp nhất thay vì phải chạy qua các tầng cố định độ rộng của đƣờng ống dẫn đồ họa.
Sự cải tiến này đem đến kết quả tốt hơn trên hiệu suất sử dụng phần cứng tổng thể vì nhu cầu cho các shader khác nhau có biên độ thay đổi tƣơng đối lớn giữa các ứng dụng thậm chí ngay trong một khung hình của một ứng dụng. Ví dụ một video game khi bắt đầu xử lý một hình ảnh, GPU phải sử dụng một lƣợng lớn tam giác để vẽ bầu trời và cảnh vật ở xa và công đoạn này nhanh chóng chiếm phần lớn tài nguyên của shader pixel trong mô hình đƣờng ống dẫn đồ họa cổ điển trong khi đó shader đỉnh “rảnh rỗi”. Một miligiây sau, game lại chuyển sang xử lý các hình học có độ chi tiết cao để vẽ các nhân vật và vật thể phức tạp. Lúc này shader đỉnh lại hoạt động với khối lƣợng công việc lớn và shader pixel lại ở trạng thái “rảnh rỗi”.
Sự thay đổi đến chóng mặt về nhu cầu tài nguyên ngay trong cùng một khung cảnh là một cơn ác mộng với vấn đề cân bằng tải cho những nhà thiết kế game và cũng thay đổi không lƣờng trƣớc đƣợc dựa vào vị trí quan sát của ngƣời chơi và sự thay đổi hành động. Về phƣơng diện cân bằng tải thì kiến trúc shader hợp nhất chính là lời giải cho sự thay đổi tỷ lệ số lƣợng bộ xử lý cho từng loại shader.
35
Hình 13: Shader hợp nhất – Tiến hóa của đƣờng ống dẫn đồ họa
Ví dụ, một chiếc cạc GeForce 8800 có thể sử dụng 90% trong số 128 bộ xử lý của nó cho shader pixel và 10% còn lại cho shader đỉnh trong khi vẽ bầu trời và đổi ngƣợc tỷ lệ này khi vẽ các khối hình học của một nhân vật. Chính sự hợp nhất này đã đem đến sự linh động cho kiến trúc song song của GPU và các nhà thiết kế game đồng thời góp phần cải thiện tính hiệu quả trong sử dụng tài nguyên của GPU.
Trong hơn sáu năm qua, các chƣơng trình vector và chƣơng trình mảnh đã đƣợc cải tiến với nhiều tính năng, với giới hạn lớn hơn về kích thƣớc và tiêu thụ tài nguyên với bộ chỉ thị (tập lệnh) đầy đủ tính năng và với các phép toán điều khiển luồng linh hoạt hơn.
Sau nhiều năm sử dụng các bộ chỉ thị lệnh riêng rẽ cho các phép toán trên vector và mảnh, GPU hiện tại hỗ trợ mô hình đổ bóng thống nhất 4.0 (unified Shader Model 4.0) trên cả đổ bóng vector và mảnh:
Các phần cứng phải hỗ trợ các chƣơng trình shader ít nhất là 65 nghìn (65k) chỉ thị tĩnh và chỉ thị động không giới hạn.
Các tập lệnh, lần đầu tiên, hỗ trợ cả số nguyên 32 bit và số dấu phẩy động 32 bit.
36
Các phần cứng phải cho phép thao tác đọc trực tiếp và gián tiếp với số lƣợng tùy ý từ bộ nhớ toàn cục (kết cấu - texture).
Cuối cùng điều khiển luồng động trong các dạng vòng lặp và rẽ nhánh đƣợc hỗ trợ.
Khi mô hình shader hợp nhất ra đời và phát triển mạnh hơn, tất cả các loại ứng dụng GPU đã tăng độ phức tạp chƣơng trình vector và mảnh, kiến trúc GPU ngày càng tập trung vào các bộ phận lập trình đƣợc của đƣờng ống dẫn đồ họa. Quả thực, trong khi các thế hệ trƣớc đây, GPU là một đƣờng ống dẫn đồ họa với chức năng cố định ở các bộ phận, khả năng hỗ trợ lập trình chỉ là một tính năng phụ thêm vào thì ngày nay GPU có thể đƣợc coi là một công cụ hỗ trợ lập trình bao quanh bởi các đơn vị hỗ trợ có chức năng cố định.