2013-05-18 30 views
36

Tôi có nên tính toán ma trận trên CPU hoặc GPU không? Giả sử tôi có các ma trận sau P * V * M, tôi có nên tính toán chúng trên CPU để tôi có thể gửi ma trận cuối cùng đến GPU (GLSL) hay tôi nên gửi ba ma trận đó riêng biệt với GPU sao cho GLSL có thể tính toán ma trận cuối cùng?Tôi có nên tính toán ma trận trên GPU hoặc trên CPU không?

Tôi có nghĩa là trong trường hợp này GLSL sẽ phải tính toán ma trận MVP cho mỗi đỉnh, do đó, có lẽ nhanh hơn để tính toán trước nó trên CPU.

Nhưng giả sử GLSL chỉ tính toán ma trận MVP một lần, liệu GPU có tính toán ma trận cuối cùng nhanh hơn CPU không?

+1

Bạn có thể cho ví dụ rằng bạn chỉ thực hiện phép tính này một lần trong GPU không? – Amadeus

+2

1. Tối ưu hóa cuối cùng. Bạn có chắc bạn không chỉ trì hoãn? :) 2. Nếu bạn không thể đo lường hiệu suất và xác định tắc nghẽn, đừng nghĩ về tối ưu hóa. –

+0

Chỉ cần lưu ý, nếu bạn đang nhân trực tiếp một vectơ, như trong mô hình 'chiếu * xem * * đỉnh' Sau đó, thực sự không có phép nhân' ma trận'. Chỉ các phép nhân 'matrix * vector' vì nó được đánh giá từ phải sang trái' (phép chiếu * (xem * (mô hình * đỉnh))) '. Điều này là ít nặng nề hơn về tính toán. –

Trả lời

50

Quy tắc chung: Nếu bạn có thể chuyển nó đến trình đổ bóng dưới dạng đồng phục, luôn luôn tính toán trước trên CPU; không có ngoại lệ. Các tính toán trên mặt đổ bóng chỉ có ý nghĩa đối với các giá trị thay đổi giữa các đỉnh và các đoạn. Mọi thứ liên tục giữa một loạt các đỉnh được xử lý hiệu quả nhất trên CPU.

GPU không phải là máy ảo "có thể làm mọi thứ nhanh hơn". Có một số nhiệm vụ mà CPU có thể dễ dàng làm tốt hơn GPU, ngay cả đối với các tập dữ liệu rất lớn. Vì vậy, một hướng dẫn rất đơn giản là: Nếu bạn có thể di chuyển nó vào CPU mà không cần tốn nhiều thời gian CPU để thực hiện tính toán hơn mức cần thiết cho GPU trong tổng chi phí để xử lý nó, sau đó thực hiện nó trên CPU. Việc tính toán một ma trận đơn là một trong những nhiệm vụ đó.

+6

GPU thường nhanh hơn cho các sự cố "song song". – fluffels

+3

Không phải là nhân ma trận song song? Mỗi phần tử có thể được tính toán độc lập. – Calmarius

+4

@Calmarius: Có, bạn có thể song song tính toán ma trận và trên thực tế hầu hết các CPU sẽ song song nó bằng cách sử dụng các tập lệnh vector của chúng. Nhưng các ma trận chỉ cần được tính toán chính xác * một lần * và giữ nguyên cho tất cả các đỉnh của một mô hình sử dụng phép biến đổi cụ thể đó. Chi phí trên một mình chỉ để tạo ra một GPU thực hiện phép nhân ma trận 4 × 4 có thêm hướng dẫn (và thời gian) hơn là thực hiện phép tính đó trên CPU. Nếu bạn muốn song song một phép nhân ma trận 2k × 2k, thì GPU sẽ song song với nhau. Nhưng đối với ma trận 4 × 4, chi phí trên không đơn giản là không đáng. – datenwolf

13

Giống như hầu hết các tình huống với OpenGL, điều đó tùy thuộc.

Trong hầu hết các trường hợp, một phép tính đơn có thể được thực hiện nhanh hơn trên CPU so với trên GPU. Ưu điểm của GPU là nó có thể thực hiện nhiều phép tính song song.

Mặt khác, nó cũng phụ thuộc vào điểm nghẽn cổ chai của bạn. Nếu CPU của bạn đang thực hiện nhiều công việc khác, nhưng trình đổ bóng của bạn không phải là nút cổ chai trên hệ thống đích thấp nhất, thì bạn có thể dễ dàng thấy một số cải tiến hiệu năng bằng cách di chuyển một số phép nhân ma trận đến đổ bóng đỉnh.

Nói chung, bạn nên tránh bất kỳ tác phẩm nào trong trình đổ bóng phân đoạn cũng có thể được thực hiện trong trình đổ bóng hoặc trên CPU, nhưng ngoài ra, nó phụ thuộc vào tình huống. Trừ khi bạn đang gặp phải các vấn đề về hiệu suất, chỉ cần làm điều đó bất kỳ cách nào là dễ dàng nhất cho bạn và nếu bạn gặp sự cố về hiệu suất, hãy thực hiện theo cả hai cách và lập hồ sơ hiệu suất để xem hoạt động nào hiệu quả hơn.

+4

Tính toán một cách dễ dàng các ma trận, đặc biệt là ma trận MVP, không bao giờ là một nút cổ chai trên CPU. – datenwolf

+7

@ datenwolf không có, nhưng cũng không miễn phí. Vì vậy, nếu chương trình không đòi hỏi đồ họa, nhưng có các phần khác đòi hỏi tính toán, cho phép GPU tính toán một vài ma trận MVP dư thừa có thể là tốt. Như tôi đã nói, tất cả đều phụ thuộc vào tình hình. – bcrist

+7

Toàn bộ chi phí làm cho GPU tính toán điều gì đó phải mất nhiều chu kỳ hơn so với tính toán ma trận ma trận đơn giản. Bạn có thể thực hiện phép tính 4 × 4 · 4 × 4 trong 16 hướng dẫn trên CPU hiện đại.Đó là ít hơn so với những gì cần thiết để chọn một chương trình đổ bóng, thiết lập đồng phục và có được bánh răng của GPU quay bằng cách gửi trong một nguyên thủy để render. Chi phí cho việc tạo ra GPU thực sự làm điều gì đó khá cao, do đó bạn cố gắng thực hiện các công việc hàng loạt lớn nhất có thể cho GPU. – datenwolf

Các vấn đề liên quan