GPU hiện đại: Làm thế nào mà họ thông minh ra đời?


11

Có nhiều tài nguyên về lập trình 3D (OpenGL hoặc DirectX) và các đường ống đồ họa tương ứng có sẵn, nhưng tôi tự hỏi chúng được triển khai ở cấp độ nào trên GPU hiện đại.

Cho đến nay tôi đã có thể phát hiện ra rằng đã có một sự chuyển đổi từ công nghệ tuần hoàn rất chuyên biệt thực hiện các giai đoạn khác nhau của đường ống đồ họa sang một cách tiếp cận tổng quát hơn. Chuyển đổi này đã được phản ánh một phần trên các API 3D dưới dạng các trình tạo bóng lập trình. Hầu hết các bóng bán dẫn dường như được dành riêng cho các đơn vị SIMD song song thực thi các hướng dẫn đổ bóng thực tế.

Nhưng những gì về phần còn lại của đường ống đồ họa? Điều đó vẫn còn được thực hiện trong phần cứng?

Là một GPU hiện đại (nghĩ là Nvidia Fermi) về cơ bản là một tập hợp các mảng SIMD "ngu ngốc" được cung cấp với các hướng dẫn và dữ liệu từ CPU và các bộ nhớ cache khác nhau và tất cả logic thực tế ánh xạ đường ống đồ họa theo các hướng dẫn đó xảy ra trong trình điều khiển đồ họa ?

Hoặc có một số đơn vị điều khiển ở đâu đó trong GPU dịch các luồng dữ liệu và hướng dẫn cấp cao đến (chương trình đổ bóng được biên dịch, dữ liệu đỉnh và thuộc tính và kết cấu) thành các hướng dẫn SIMD thực tế và chăm sóc đồng bộ hóa, cấp phát bộ nhớ, v.v.?

Tôi nghi ngờ rằng thực tế nằm ở đâu đó giữa hai thái cực đó và câu trả lời sẽ khá dài và dựa trên rất nhiều suy đoán (phải có lý do để một số nhà cung cấp GPU từ chối xuất bản bất kỳ tài liệu nào về sản phẩm của họ, chứ đừng nói đến trình điều khiển mã nguồn ...), nhưng bất kỳ gợi ý nào đi đúng hướng và tài nguyên hữu ích sẽ được đánh giá cao.

Cho đến nay, tôi đã tìm thấy một loạt các bài đăng trên blog cực kỳ hữu ích để hiểu thêm về GPU hiện đại, nhưng tôi thiếu một số loại tổng quan cấp cao hơn về kiến ​​trúc tổng thể - Tôi có thể hiểu hầu hết các khái niệm được đề cập, nhưng đừng hiểu làm thế nào chúng khớp với nhau.

Câu trả lời:


8

Cho đến nay tôi đã có thể phát hiện ra rằng đã có một sự chuyển đổi từ công nghệ tuần hoàn rất chuyên biệt thực hiện các giai đoạn khác nhau của đường ống đồ họa sang một cách tiếp cận tổng quát hơn. Chuyển đổi này đã được phản ánh một phần trên các API 3D dưới dạng các trình tạo bóng lập trình. Hầu hết các bóng bán dẫn dường như được dành riêng cho các đơn vị SIMD song song thực thi các hướng dẫn đổ bóng thực tế.

Chính xác. Về cơ bản, do kích thước tính năng tương đối lớn trên các GPU cũ, cách duy nhất để thực hiện hiệu quả những thứ như ánh sáng cơ bản, khử răng cưa, ánh xạ kết cấu, hình học, v.v. là sử dụng đường ống "chức năng cố định". Họ đã hy sinh tính linh hoạt vì mục đích hiệu năng vì họ không có đủ mật độ chip để có thể triển khai nó bằng kiến ​​trúc SIMD song song rộng rãi hơn như GPU hiện tại.

Là một GPU hiện đại (nghĩ là Nvidia Fermi) về cơ bản là một tập hợp các mảng SIMD "ngu ngốc" được cung cấp với các hướng dẫn và dữ liệu từ CPU và các bộ nhớ cache khác nhau và tất cả logic thực tế ánh xạ đường ống đồ họa theo các hướng dẫn đó xảy ra trong trình điều khiển đồ họa ?

Một số điều vẫn được thực hiện trong phần cứng; những người khác thì không. Ví dụ, ROP vẫn được sử dụng ở giai đoạn cuối cùng để đẩy dữ liệu pixel vào chipset VGA. Lưu ý Tôi đang sử dụng "chipset VGA" ở đây như một thuật ngữ chung để chỉ cơ chế truyền tín hiệu video đến màn hình của bạn, bất kể đó có thực sự là "VGA" hay không.

Nói chung, sự thật là các kiến ​​trúc GPU hiện tại như Nvidia Fermi và AMD Southern Islands, phần lớn, là các CPU song song ồ ạt nơi chúng có một bộ hướng dẫn tùy chỉnh và mỗi "lõi" riêng lẻ đều rất yếu, nhưng có một toàn bộ rất nhiều lõi (đôi khi vài ngàn). Nhưng vẫn còn phần cứng dành riêng cho đồ họa:

  • Giải mã video phần cứng thường được thực hiện, phần lớn, sử dụng chip chức năng cố định. Điều này đặc biệt đúng khi DRM (Quản lý hạn chế kỹ thuật số) có liên quan. Đôi khi giải mã video "phần cứng" thực sự có nghĩa là một bộ hướng dẫn được điều khiển bằng phần sụn, được phục vụ như các tác vụ cũ thông thường cho các lõi SIMD. Nó thực sự phụ thuộc.

  • Ngoại trừ rất ít bo mạch Nvidia dành riêng cho máy tính (Tesla), hầu như tất cả các card đồ họa "SIMD chung" đều có một loạt phần cứng hoàn chỉnh dành riêng cho đầu ra video. Đầu ra video không giống như kết xuất; các yếu tố đầu ra chức năng cố định bao gồm codec LVDS / TMDS / HDMI / DisplayPort, HDCP và thậm chí xử lý âm thanh (về cơ bản là một chút DSP), vì HDMI hỗ trợ âm thanh.

  • "Bộ nhớ đồ họa" vẫn được lưu trữ trên bo mạch với GPU, do đó chúng không phải đi qua bus PCIe có độ trễ tương đối cao và tương đối cao để đạt RAM hệ thống, bản thân nó chậm hơn và mất nhiều thời gian hơn để đáp ứng hơn là đắt hơn, chất lượng cao hơn, bộ nhớ đồ họa nhanh hơn (ví dụ GDDR5) có dung lượng nhỏ hơn nhưng tốc độ cao hơn bộ nhớ hệ thống. Quá trình lưu trữ nội dung trong bộ nhớ đồ họa và truy xuất nó từ đó đến GPU hoặc CPU vẫn là một hoạt động chức năng cố định. Một số GPU có loại "IOMMU" riêng, nhưng đơn vị quản lý bộ nhớ này khác biệt (tách biệt) với CPU. Tuy nhiên, điều này không đúng đối với các GPU Intel gần đây được tích hợp vào bộ xử lý của chúng (Sandy và Ivy Bridge), nơi kiến ​​trúc bộ nhớ gần như hoàn toàn "mạch lạc" bộ nhớ hệ thống) và đọc từ bộ nhớ đồ họa là rẻ cho CPU cũng như cho GPU.

Hoặc có một số đơn vị điều khiển ở đâu đó trong GPU dịch các luồng dữ liệu và hướng dẫn cấp cao đến (chương trình đổ bóng được biên dịch, dữ liệu đỉnh và thuộc tính và kết cấu) thành các hướng dẫn SIMD thực tế và chăm sóc đồng bộ hóa, cấp phát bộ nhớ, v.v.?

Ngôn ngữ "bản địa" của SIMD hầu như luôn được trình điều khiển tạo ra trong phần mềm chứ không phải bởi phần sụn riêng của GPU. Điều này đặc biệt đúng với các tính năng cấp DirectX 9 / OpenGL 2.x. Các trình tạo bóng được viết bằng các ngôn ngữ cấp cao như trình biên dịch trình tạo bóng ARB, GLSL hoặc OpenGL ARB cuối cùng được dịch, theo trình điều khiển GPU, bằng cách đập vào các thanh ghi nhất định và thực hiện các vòng PCIe cần thiết để gửi qua bộ đệm tính toán và / hoặc kết xuất các lệnh.

Một vài điều, như phần cứng phần cứng (DirectX 11 / OpenGL 4.0) một lần nữa được đẩy vào phần cứng theo cách có chức năng cố định, tương tự như cách họ thường làm gần như mọi thứ trong những ngày xưa. Điều này là do, một lần nữa, các hạn chế về hiệu suất yêu cầu cách hiệu quả nhất để thực hiện các tính toán này là phải có mạch chuyên dụng cho nó, thay vì có chương trình cơ sở hoặc trình điều khiển "lập trình" SIMD để thực hiện.

Tôi nghi ngờ rằng thực tế nằm ở đâu đó giữa hai thái cực đó và câu trả lời sẽ khá dài và dựa trên rất nhiều suy đoán (phải có lý do để một số nhà cung cấp GPU từ chối xuất bản bất kỳ tài liệu nào về sản phẩm của họ, chứ đừng nói đến trình điều khiển mã nguồn ...), nhưng bất kỳ gợi ý nào đi đúng hướng và tài nguyên hữu ích sẽ được đánh giá cao.

AMD và Intel có tài liệu rất mạnh mẽ về các GPU gần đây của họ, cũng như các trình điều khiển đồ họa nguồn mở hoạt động đầy đủ cho Linux (xem các dự án Mesa và Direct Rendering Manager). Nếu bạn nhìn vào một số mã trong các trình điều khiển này, bạn sẽ cười, bởi vì người viết trình điều khiển đồ họa thực sự phải thực hiện hình học của những thứ như vẽ các hình dạng hoặc mẫu khác nhau, trong "phần mềm" (nhưng sử dụng lệnh phần cứng để gửi thực xử lý phần cứng để xử lý), vì phần sụn GPU cũng như các chức năng cố định không còn tồn tại để xử lý nó hoàn toàn trong phần cứng :) Thật là buồn cười những gì họ phải làm để hỗ trợ OpenGL 1.x / 2.x mới phần cứng.

Sự tiến hóa đã diễn ra như thế này:

  • Cách đây rất lâu (trước khi kết xuất 3d thời gian thực được coi là có thể): Truy tìm tia trên CPU là bình thường đối với kết xuất không theo thời gian thực. Đối với đồ họa đơn giản như bạn thấy trong các phiên bản Windows đầu tiên, CPU đủ nhanh để vẽ các hình đơn giản (hình chữ nhật, ký tự của phông chữ, mẫu tô bóng, v.v.) mà không cần phần cứng chức năng cố định, nhưng nó không thể vẽ những thứ quá phức tạp.
  • Từ lâu (OpenGL 1.x): hầu hết mọi thứ được thực hiện bởi phần cứng trạng thái rắn; Các chức năng cố định "bằng điện" là tiêu chuẩn ngay cả đối với các hoạt động cơ bản
  • Cách đây một thời gian (OpenGL 2.x): Một quá trình chuyển đổi sang làm cho GPU trở nên lập trình hơn đã bắt đầu. "Shader shader" (hay còn gọi là pixel shader) trên phần cứng 5 năm gần như có thể thực hiện các phép tính tùy ý như CPU, nhưng nó bị giới hạn bởi kiến ​​trúc, vốn vẫn rất hướng đến đồ họa. Do đó, OpenCL / DirectCompute không có sẵn trên phần cứng này.
  • Gần đây (OpenGL 3.x): Việc chuyển đổi sang GPU mục đích chung hầu như đã hoàn tất, nhưng tất nhiên chúng được tối ưu hóa cho khối lượng công việc liên quan đến ma trận dữ liệu lớn (nghĩ đại số tuyến tính) được gửi theo lô, thay vì CPU có thể hoạt động hiệu quả trên các chuỗi dài dữ liệu rất nhỏ (1 + 1, 2 * 4, 5 * 6 theo thứ tự, v.v.) Tính toán mục đích chung có sẵn thông qua OpenCL, CUDA, v.v. nhưng phần cứng vẫn không phải là "bộ đồng xử lý SIMD" đầy đủ bởi vì (a) bạn vẫn phải đóng các thanh ghi dành riêng cho phần cứng để có được chức năng GPU; (b) đọc từ GPU VRAM rất chậm do quá tải bus PCIe (đọc từ GPU không được tối ưu hóa cho kiến ​​trúc hiện tại); (c) kiến ​​trúc bộ nhớ và bộ nhớ cache không kết hợp với CPU; rất nhiều phần cứng chức năng cố định di sản vẫn còn nằm xung quanh.
  • Hiện tại (OpenGL 4.x): Loại bỏ rất nhiều phần cứng chức năng cố định cũ. Cải thiện độ trễ đọc GPU một chút. IOMMU cho phép ánh xạ hỗ trợ phần cứng (được dịch) giữa VRAM và bộ nhớ hệ thống. Cũng giới thiệu phần cứng, mang lại các yếu tố của chức năng cố định.
  • Tương lai ( HSA): GPU về cơ bản là một bộ đồng xử lý. Đó là tất cả nhưng được tích hợp hoàn toàn với CPU với rất ít trở kháng (để đọc / ghi) giữa GPU và CPU, ngay cả đối với các GPU chuyên dụng trên bus PCIe. Kiến trúc bộ nhớ hoàn toàn mạch lạc - "mi memoria es su memoria" (bộ nhớ của tôi là bộ nhớ của bạn). Các chương trình không gian người dùng có thể đọc từ "VRAM" giống như họ đọc từ bộ nhớ hệ thống mà không có trình điều khiển shim và phần cứng sẽ chăm sóc nó. Bạn có CPU để xử lý "nối tiếp" (làm điều này, sau đó làm điều đó, sau đó làm điều đó) cho số lượng dữ liệu khiêm tốn và GPU để xử lý "song song" (thực hiện thao tác này trên tập dữ liệu khổng lồ này và chia nó lên làm thế nào bạn thấy phù hợp). Bảng mạch mà GPU ngồi vẫn có thể có ROP, codec HDMI, v.v. nhưng công cụ này là cần thiết cho đầu ra hiển thị,

Điểm cuối cùng của bạn là tuyệt vời và nó cũng áp dụng cho nhiều thứ chứ không chỉ là loại OpenGL1.x / 2.x. Do tính phức tạp đáng kinh ngạc của logic trong GPU, gần như chắc chắn rằng sẽ có lỗi ở đâu đó. Thông thường hầu hết các lỗi trong logic được trêu chọc trước khi nó trở thành một con chip vật lý, nhưng có thể có một số trường hợp góc kỳ lạ vẫn có thể mọc lên. Khi điều này xảy ra, các trình điều khiển sẽ phải tự thực hiện tính năng này để bỏ qua phần lỗi của phần cứng. Những thứ như thế này thường là lý do tại sao bạn có thể nhận được các cải tiến về tính năng / hiệu suất trong các bản cập nhật trình điều khiển.
Ben Richards
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.