Tính song song trong quá trình rasterization của GPU


7

Dựa trên bài viết này, tôi đã hiểu nguyên tắc cơ bản bên trong thuật toán Rasterization:

For every triangle
Compute Projection, color at vertices
Setup line equations
Compute bbox, clip bbox to screen limits
For all pixels in bbox
Increment line equations
Compute curentZ
Compute currentColor
If all line equations>0 //pixel [x,y] in triangle
If currentZ<zBuffer[x,y] //pixel is visible
 Framebuffer[x,y]=currentColor
zBuffer[x,y]=currentZ 

Điều tôi không hiểu là cách nó được triển khai song song bên trong GPU.

Tôi xem xét 2 triển khai có thể của thuật toán bên trong GPU:

  1. Cách đầu tiên là vẽ từng tam giác lần lượt (trong 1 luồng) vì tất cả các pixel bên trong chúng được chạy song song. Điều làm phiền tôi về cách này là nó thực sự chậm đối với một lượng lớn hình tam giác.

  2. Cách thứ hai là vẽ mọi tam giác song song vì với mọi tam giác, tất cả các pixel bên trong nó cũng được chạy song song. Điều này có vẻ hiệu quả với tôi, nhưng tôi thấy một vấn đề trong cách dữ liệu zBufferFramebuffer được đồng bộ hóa như thể 2 pixel cố gắng chiếm 1 điểm sẽ có 2 luồng cố gắng ghi trên cùng một dữ liệu. Xem xét rằng có 2 bộ đệm cần được cập nhật, tôi không thấy cách nó có thể xảy ra nguyên tử.

Một quan sát khác mà tôi có là khi tôi vẽ 2 hình tam giác ở cùng tọa độ thì đó luôn là hình cuối cùng được vẽ. Điều này khiến tôi không nghĩ rằng có một số cách nguyên tử để thực hiện tính toán pixel như thể có các pixel đầu ra của tam giác sẽ là ngẫu nhiên dựa trên 2 màu tam giác đầu vào.

Điều mà tôi đoán là việc triển khai là một cái gì đó ở giữa 2 lần đoán của tôi, nhưng đó là tôi đã từ bỏ và hỏi ở đây.


đụng ai? ...
user2377766

Câu trả lời:


3

Các GPU khác nhau sử dụng các thủ thuật và kỹ thuật khác nhau, vì vậy câu trả lời này sẽ cố ý rất chung chung và một số chi tiết có thể không áp dụng cho một số GPU, quá khứ, hiện tại (2017) và tương lai.

Điều này chủ yếu áp dụng cho GPU máy tính cá nhân. GPU di động (điện thoại, máy tính bảng) cố gắng thông minh hơn, ít lãng phí hơn và tiết kiệm băng thông bộ nhớ nhưng vẫn tuân theo quy trình tương tự. Bao gồm tất cả các GPU chi tiết sẽ làm cho một câu trả lời rất dài.

Các giai đoạn kết xuất là cố ý không theo thứ tự.

In đậm là những phần bao gồm song song

Các giai đoạn có thể chạy trong một đường ống nơi cuộc gọi rút thăm tiếp theo bắt đầu được xử lý trước khi kết thúc trước đó và trong khi các lõi GPU khác đang vẽ.


Vẽ pixel

GPU hiện đại không vẽ một hình tam giác rồi tiếp theo nữa. Nó phức tạp hơn nhiều để tối đa hóa song song:

GPU chia bản vẽ thành các ô WxH (điều này phụ thuộc vào GPU nhưng hãy dùng ví dụ với 8x8).

Mỗi ô có thể được vẽ song song bởi GPU bất kể chế độ vẽ.

Các lõi GPU (thường) được sắp xếp theo các nhóm WxH (ví dụ: 8x8 = 64 lõi) khớp với ô, một nhóm có thể kết xuất thành một ô trong khi nhóm kia kết xuất một ô khác .

Toàn bộ nhóm thực hiện cùng một shader cùng một lúc; Hiển thị tất cả các pixel của gạch cùng một lúc . Nếu một số pixel không được vẽ (ví dụ: tam giác chỉ bao gồm một phần của ô) thì các lõi đó vẫn thực thi nhưng trong chế độ bị tắt mà bỏ qua kết quả và không ghi gì cả. GPU di động thường hoạt động với các nhóm lõi nhỏ hơn để ít lãng phí hơn nhưng vẫn hiển thị nhiều pixel trong lát xếp cùng một lúc.

  • Trên một số GPU, hai hoặc nhiều hình tam giác không chồng lấp bằng cách sử dụng cùng một shader được hiển thị trong cùng một lệnh gọi bao phủ cùng một ô sẽ được kết hợp và hiển thị cùng một lúc trong ô đó .

  • Các GPU khác sẽ phải thực hiện một lượt cho mỗi tam giác.

Điều này có nghĩa là trường hợp xấu nhất nếu bạn có hình tam giác có kích thước 1 pixel, bạn sẽ có 1 lõi trong nhóm vẽ thứ gì đó hữu ích và 63 lõi khác trong ô ở chế độ "bỏ qua kết quả" không "làm gì".


Biến đổi đỉnh

Các nhóm cốt lõi tương tự (GPU hợp nhất) cũng xử lý các đỉnh đến (shader đỉnh).

Các lô đỉnh đến được xử lý N đỉnh tại một thời điểm (ví dụ: 64 hoặc bội số của nó tại một thời điểm trong cách sắp xếp lõi 8x8 ở trên của chúng tôi) và đổ vào bộ đệm tạm thời đã chuyển đổi.

GPU có thể bắt đầu chuyển đổi các đỉnh của lệnh gọi tiếp theo trước khi chuyển đổi đầu tiên được thực hiện để chuyển đổi đỉnh hoạt động trên các lệnh gọi khác nhau có thể được thực hiện song song .


Cắt và hình học Shader

Các đầu ra tạm thời từ biến đổi đỉnh được loại bỏ và cắt thành nhiều hình tam giác hơn, tùy ý chạy một shader hình học trước khi cắt và được ghi vào một bộ đệm tạm thời khác.

Mỗi bộ đệm xử lý từ biến đổi đỉnh có thể chạy song song.

Trình điều khiển GPU có thể kết hợp các giai đoạn đỉnh, hình học và / hoặc cắt với nhau thành một giai đoạn thực hiện chương trình đổ bóng bên trong.


Xô tam giác

Các hình tam giác được biến đổi và cắt bớt được đặt vào "các thùng" (danh sách, mảng, bộ đệm tròn hoặc các phương thức khác), của mỗi ô mà chúng bao phủ. Một nhóm cho mỗi ô kết xuất hoặc nhiều hơn (có thể là một cho mỗi shader trong hàng đợi, tùy thuộc vào GPU & Driver).

Khi một lát đã sẵn sàng để vẽ một nhóm lõi GPU "lấy" nó từ hàng đợi và bắt đầu vẽ các lát đó, nhóm lõi GPU tiếp theo có thể lấy các ô tiếp theo , v.v.

Về cơ bản có hai cách:

  • Khi các hình tam giác đi vào, chúng bị xô vào các nhóm gạch và các nhóm lõi GPU "chộp" gạch khi chúng đến và vẽ các hình tam giác trong danh sách.
  • Tất cả các hình tam giác được sắp xếp vào các thùng gạch trước và sau đó các lõi GPU bắt đầu vẽ.

Những điều trên thường phụ thuộc nếu đó là GPU điện thoại di động (di động) hay GPU máy tính để bàn / máy tính xách tay nhưng không nhất thiết phải như vậy.

  • Trên một số GPU, công việc xô này được thực hiện bởi một hoặc nhiều CPU điều phối chính nằm trong GPU, điều phối tất cả các nhóm lõi GPU "giả" (nhưng tốt hơn là vẽ pixel) và cho chúng biết phải làm gì khi nào.

  • Trên các GPU khác, các lõi có tính tổng quát hơn và đủ khả năng để tự làm việc này hoặc ít nhất là một phần của công việc phối hợp này.

  • Trên một số máy, công việc phối hợp này được thực hiện bởi chính CPU máy tính chính.

  • Và trên các máy khác (GPU cũ hoặc tích hợp), công việc đỉnh, hình học và cắt được thực hiện bởi chính CPU và các lõi GPU chỉ thực hiện công việc đổ bóng pixel.


Tất cả các công việc được cắt thành các khối lượng công việc nhỏ và càng nhiều giai đoạn càng tốt (và thực tế) để tối đa hóa song song và tạo ra sự cân bằng giữa chi phí song song và chi phí phối hợp.

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.