Giải ngố: GPU tạo nên thế giới 3D kỳ ảo như thế nào?

    Nguyễn Hải,  

    Dù GPU không còn là điều quá xa lạ, nhưng tại sao bộ phận này có thể làm nên những hình ảnh ba chiều mượt mà như vậy trên màn hình vẫn còn là điều bí ẩn đối với không ít người.

    GPU là bộ phận đặc biệt của phần cứng, có khả năng thực hiện các phép tính toán học rất nhanh, đặc biệt là dấu chấm động, vector và các phép tính ma trận. Nó có thể chuyển đổi thông tin mô hình 3D thành đại lượng 2D trong khi áp dụng các kết cấu khác nhau và các hiệu ứng ánh sáng.

    Mô hình 3D được tạo nên từ các tam giác nhỏ. Mỗi góc của tam giác được định nghĩa bởi tọa độ của X, Y, và Z, còn được biết đến như một đỉnh (một vertex). Để tạo ra một tam giác bạn cần ba đỉnh. Khi dựng nên các mô hình phức tạp, các đỉnh này có thể được chia sẻ giữa hai tam giác với nhau, điều đó nghĩa là nếu mô hình của bạn có 500 tam giác, có thể sẽ không có đến 1.500 đỉnh.

    Để chuyển đổi một mô hình 3D từ một ý tưởng trừu tượng đến một vị trí trong thế giới 3D của bạn, có 3 điều nó cần làm được. Nó cần di chuyển được (hay tịnh tiến được), có thể xoay được theo cả ba chiều, và có thể phóng to thu nhỏ được (scale được). Các hành động này còn được gọi là bộ biến đổi. Để không phải làm quá nhiều phép tính phức tạp, cách tốt nhất để xử lý các bộ biến đổi này là sử dụng các ma trận 4x4.

    Hành trình đi từ thông tin mô hình 3D đến các pixel trên một màn hình đều bắt đầu và kết thúc trong một quy trình đồ họa (pipeline). Còn được gọi quy trình kết xuất, nó là một chuỗi các bước mà GPU thực hiện để kết xuất một khung cảnh. Trước đây, quy trình kết xuất được cố định và không thể thay đổi. Dữ liệu về các đỉnh được nạp vào đầu quy trình kết xuất, được xử lý bởi GPU và một vùng đệm khung hình sẽ được tạo ra ở phía cuối quy trình, sẵn sàng để gửi đến màn hình hiển thị. GPU có thể áp dụng một số hiệu ứng nhất định vào khung cảnh, tuy nhiên chúng bị cố định bởi các nhà thiết kế GPU và chỉ cung cấp một số giới hạn các tùy chọn.

    Các bộ đổ bóng (Shader) lập trình được

    Tuy nhiên, trong thời điểm thai nghén của Android, các GPU trên máy bàn đã phát triển đến mức cho phép các phần của quy trình kết xuất có thể lập trình được. Điều này cuối cùng xuất hiện trên di động với việc công bố tiêu chuẩn OpelGL ES 2.0. Các phần có thể lập trình được này của quy trình đồ họa còn được biết đến với tên các bộ đổ bóng (shader), và hai bộ đổ bóng quan trọng nhất là bộ đổ bóng đỉnh (vertex shader) và bộ đổ bóng điểm (fragment shader).

    Bộ đổ bóng đỉnh sẽ được gọi lên cho mỗi đỉnh khác nhau. Vậy để kết xuất một tam giác, bộ đổ bóng đỉnh sẽ được gọi lên ba lần, mỗi lần cho một góc. Để đơn giản chúng ta có thể tưởng tượng rằng mỗi điểm là một pixel trên màn hình, vì vậy bộ đổ bóng điểm sẽ được gọi lên cho mọi pixel tạo ra.

    Hai bộ đổ bóng này có vai trò khác nhau. Trong khi bộ đổ bóng đỉnh chủ yếu sử dụng để chuyển đổi dữ liệu mô hình 3D thành một vị trí trong thế giới ba chiều cũng như lập bản đồ kết cấu hay các nguồn sáng, hay sử dụng các bộ biến đổi. Còn bộ đổ bóng điểm được sử dụng để tạo màu sắc cho các pixel, ví dụ, bằng cách gắn bộ màu lên mỗi pixel từ bản đồ kết cấu.

    Nếu bạn nhận ra, mỗi đỉnh được xử lý một cách độc lập so với các đỉnh khác. Điều tương tự cũng đúng cho các điểm. Điều này có nghĩa là GPU có thể chạy nhiều bộ đổ bóng song song nhau, và trên thực tế, đó là điều nó đang làm. Đa phần các GPU di động có nhiều hơn một lõi đổ bóng. Lõi đổ bóng dùng để chỉ một bộ phận độc lập, có thể được lập trình để thực hiện các hàm đổ bóng.

    Đối với các GPU ARM Mali, số lõi đổ bóng được đánh dấu bằng hậu tố “MP” ở cuối tên của GPU, ví dụ Mali T880MP12, có nghĩa là 12 lõi shader. Bên trong mỗi lõi này, là một quy trình phức tạp, điều đó có nghĩa là các phép tính đổ bóng mới có thể được đưa ra trong khi các phép tính khác đang được hoàn thành. Cộng với việc có hơn một engine số học bên trong mỗi lõi, có nghĩa là lõi có thể thực hiện hơn một phép tính tại một thời điểm.

    Các GPU thuộc dòng Mali Midgard của ARM (bao gồm Mali series T600, T700, T800) có thể đưa ra một câu lệnh cho mỗi quy trình trên mỗi xung nhịp, vì vậy đối với một lõi đổ bóng điển hình, nó có thể đưa ra song song bốn câu lệnh. Và đó mới chỉ là cho mỗi lõi đổ bóng, trong khi GPU Midgard có thể tăng đến 16 lõi đổ bóng.

     Lộ trình cho các GPU của ARM.

    Lộ trình cho các GPU của ARM.

    Tất cả điều này nghĩa là GPU hoạt động bằng cách xử lý song song cường độ cao, khác biệt hoàn toàn với CPU, thường xử lý một cách tuần tự. Tuy nhiên, vẫn có một vấn đề nhỏ. Các lõi đổ bóng có thể lập trình được, nghĩa là các hàm thực thi bởi mỗi bộ đổ bóng sẽ được xác định bởi ứng dụng của nhà phát triển, chứ không phải bởi các nhà thiết kế GPU. Điều này có nghĩa là một người viết bộ đổ bóng kém có thể làm cho GPU chạy chậm. Rất may, hầu hết các nhà phát triển game 3D hiểu điều này và đang làm tốt nhất có thể để tối ưu hóa dòng code chạy trên các bộ đổ bóng.

    Những lợi thế của bộ đổ bóng lập trình được dành cho các nhà thiết kế game 3D là vô cùng lớn, tuy nhiên, nó cũng cho thấy một số vấn đề thú vị do các nhà thiết kế GPU, khi giờ GPU cần hoạt động tương tự như cách của một CPU. Nó có câu lệnh để chạy, có nghĩa là sẽ cần giải mã và thực thi.

    Ngoài ra còn có các vấn đề về kiểm soát dòng chảy khi code trên bộ đổ bóng có thể thực hiện câu lệnh “IF” hay các vòng lặp, và tương tự như vậy. Điều đó có nghĩa là lõi đổ bóng sẽ trở thành một engine điện toán nhỏ có thể thực hiện bất kỳ tác vụ nào được lập trình bên trong nó. Nó không được linh hoạt như CPU, nhưng nó có đủ lợi thế để có thể thực hiện các tác vụ hữu ích, không chỉ đồ họa.

    Điện toán GPU

    Khi nói đến điện toán GPU, là nơi khả năng tính toán song song cao của GPU được sử dụng để thực hiện nhiều tác vụ toán học nhỏ một cách đồng thời. Những lĩnh vực tăng trưởng hiện tại cho điện toán GPU là máy học và thị giác máy tính. Khi khả năng sử dụng điện toán GPU được mở rộng, vai trò của GPU sẽ mở rộng và nó sẽ thoát khỏi vị thế là một nô lệ của CPU để trở thành một đối tác.

    Vào tháng Mười năm 2015, ARM công bố các chi tiết về giao thức kết nối SoC mới nhất của họ, được gọi là Corelink CCI-550. Vai trò của giao thức này là nó kết nối CPU, GPU, bộ nhớ chính và hàng loạt bộ nhớ đệm với nhau.

    Trong một phần của thông báo, ARM đề cập đến một GPU mới, với tên mã Mimir. GPU này sẽ hoàn toàn thống nhất với các bộ phận khác của SoC, nghĩa là nếu GPU cần điều gì đó từ bộ nhớ đệm, thậm chí điều gì đó đã bị CPU thay đổi gần đây, GPU sẽ nhận được cùng dữ liệu với CPU, mà không phải đi tới bộ nhớ chính nữa. Giao thức CCI-550 cũng cho phép CPU và GPU chia sẻ cùng bộ nhớ, sẽ giúp loại bỏ nhu cầu sao chép dữ liệu giữa CPU và các vùng đệm của GPU.

    Các bộ đổ bóng hợp nhất và Vulkan

    Một trong những thay đổi lớn nhất giữa OpenGL ES 2.0 và OpenGL ES 3.0 (và các phiên bản DirectX tương đương) là sự ra đời của Unified Shader Model (mô hình đổ bóng hợp nhất). Nếu bạn nhìn sơ đồ mô hình này của Mali-470, bạn sẽ thấy GPU tương thích với OpenGL ES 2.0 này có hai loại đổ bóng, được gọi là “bộ xử lý đỉnh” và “bộ xử lý điểm”, đó chính là các bộ đổ bóng đỉnh và bộ đổ bóng điểm mà ta đã đề cập ở trên.

    Mali-470 có một bộ đổ bóng đỉnh có đến 4 bộ đổ bóng điểm. Nhưng nếu bạn vào sơ đồ cho Mali-T860 ở trên, bạn có thể thấy nó hỗ trợ lên tới 16 bộ đổ bóng hợp nhất, với các bộ đổ bóng hoạt động vừa như các bộ đổ bóng đỉnh và vừa như các bộ đổ bóng điểm. Điều đó có nghĩa là vấn đề về tình trạng nhàn rỗi của các bộ đổ bóng (bởi vì chúng bị xếp nhầm loại) sẽ được loại trừ.

    Điều thú vị lớn tiếp theo về các API cho đồ họa 3D là Vulkan. Được phát hành vào tháng Hai năm 2016, và nó mang đến hai sáng kiến quan trọng. Đầu tiên, bằng cách giảm driver phát sinh thêm và cải thiện việc sử dụng CPU đa luồng, Vulkan có thể mang đến những cải tiến đáng chú ý về hiệu năng. Thứ hai, nó đưa ra một API đơn hợp nhất cho cả máy để bàn, di động, và máy chơi game cầm tay. Vulkan hỗ trợ Windows 7, Windows 8 và 10, SteamOS, Android và cả một số nhà phân phối Linux cho máy để bàn. Smartphone Android đầu tiên hỗ trợ Vulkan là Samsung Galaxy S7.

    Năng lượng tiêu thụ

    Nếu bạn thấy một card đồ họa hiện đại cho chiếc PC, bạn sẽ nhận thấy nó khá to. Chúng có chiếc quạt lớn, hệ thống tản nhiệt phức tạp, một số thậm chí còn cần bộ nguồn riêng kết nối trực tiếp từ nguồn cung cấp điện. Trên thực tế, các card đồ họa trung bình còn lớn hơn phần lớn các smartphone và tablet.

    Sự khác biệt lớn nhất giữa GPU trên desktop (hay máy chơi game cầm tay) và GPU trên smartphone là năng lượng tiêu thụ. Smartphone chạy bằng pin và chúng có một giới hạn về nhiệt độ. Không giống như GPU trên desktop, chúng không thể ngốn năng lượng và sản sinh ra quá nhiều nhiệt được.

    Tuy nhiên, người tiêu dùng chúng ta luôn muốn có ngày càng nhiều đồ họa tinh vi hơn trên các thiết bị di động của chúng ta. Vì vậy, một trong những thách thức lớn nhất cho các nhà thiết kế GPU, là không cần bổ sung các hỗ trợ cho API 3D mới nhất, nhưng vẫn phải tạo ra hiệu năng xử lý đồ họa cao mà không sản sinh ra quá nhiều nhiệt, cũng như không làm cạn kiệt pin chỉ trong vài phút.

    Tổng kết

    Tóm lại, đồ họa 3D cho di động cũng dựa trên các tam giác. Mỗi góc của tam giác đó được gọi là một đỉnh (một vertex). Các đỉnh này cần được xử lý để mô hình có thể di chuyển, thay đổi kích thước, … Bên trong GPU là một bộ phận thực thi có thể lập trình, được gọi là một lõi đổ bóng. Các nhà thiết kế game có thể viết code để chạy trên lõi đó nhằm xử lý các đỉnh theo cách nào họ muốn. Sau khi bộ đổ bóng đỉnh đưa vào một quy trình được gọi là rasterization, tác vụ chuyển các đỉnh thành các điểm ảnh, các pixel (các mảnh). Cuối cùng các pixel đó sẽ được gửi đến bộ đổ bóng điểm để tạo ra mầu sắc cho chúng.

    Những nhà phát triển viết các game 3D (hay ứng dụng) có thể lập trình bộ đổ bóng đỉnh và bộ đổ bóng điểm để xử lý dữ liệu theo nhu cầu của họ. Do khả năng lập trình được của các bộ đổ bóng này, nó cũng có nghĩa là các GPU có thể được sử dụng cho các tác vụ song song cường độ cao khác hơn là chỉ đồ họa 3D, trong đó bao gồm máy học và thị giác máy tính.

    Tham khảo Androidauthority

    Tin cùng chuyên mục
    Xem theo ngày

    NỔI BẬT TRANG CHỦ