Làm cách nào để tối ưu hóa hiệu suất của chương trình khi không có công cụ định hình nào?


8

Tôi hiện đang làm việc trên một chương trình OpenGl có hiệu suất mà tôi muốn cải thiện. Hiệu suất ổn nhưng không lý tưởng trên các GPU chuyên dụng mạnh mẽ, nhưng lại rất tệ trên đồ họa tích hợp (<10 khung hình / giây). Trong một chương trình bình thường (dựa trên CPU, không có OpenGl hoặc API GPU khác), tôi sẽ chạy một trình lược tả (có lẽ là chương trình được tích hợp vào CLion) trên chương trình, xem phần lớn thời gian được sử dụng và sau đó làm việc với thuật toán tốt hơn cho các khu vực đó hoặc tìm cách giảm số tiền mà khu vực đó được gọi.

Sử dụng kỹ thuật này trên chương trình OpenGl của tôi cho thấy phần lớn thời gian của chương trình (~ 86%) trên luồng chính của nó (cái mà tôi muốn tối ưu hóa) được sử dụng trong tệp .so của trình điều khiển OpenGl. Ngoài ra, mức sử dụng CPU của chương trình trong khi nó đang chạy rất thấp, nhưng mức sử dụng GPU dao động trong khoảng từ 95% đến 100%. Kết hợp lại với nhau, những thông tin này cho tôi biết rằng nút cổ chai nằm trong GPU, vì vậy đó là nơi tôi nên tối ưu hóa.

Đây là một vấn đề xảy ra. Tuy nhiên, kỹ thuật bình thường của tôi là sử dụng trình lược tả để hướng dẫn tối ưu hóa của tôi sẽ không hoạt động nếu không có trình lược tả GPU cụ thể. Như vậy, tôi đã thực hiện một số nghiên cứu để tìm ra một hồ sơ sẽ cho tôi biết thời gian xử lý GPU đang được sử dụng. Tôi không thể tìm thấy bất cứ thứ gì có thể sử dụng từ xa. Mọi thứ đều chỉ dành cho Windows (Tôi chỉ chạy Linux và chương trình của tôi chưa được chuyển sang Windows - cũng sẽ không cho đến khi nó đi xa hơn), không còn được cập nhật và / hoặc chi phí cao hơn ngân sách cho Dự án này là.

Như vậy, tôi hỏi: làm thế nào tôi có thể tối ưu hóa hiệu suất của chương trình khi trình hồ sơ có liên quan không tồn tại? Tôi đã cố gắng đoán xem các vấn đề đang ở đâu và tối ưu hóa từ đó, tuy nhiên nó không có gì khác biệt mặc dù tôi có thể chắc chắn rằng việc tối ưu hóa của mình (loại bỏ sự thất vọng) đã làm cho GPU giảm một nửa công việc. Một câu trả lời tốt sẽ cung cấp một số kỹ thuật định hình có thể áp dụng cho Opengl trên Linux hoặc sẽ cung cấp một kỹ thuật hoạt động mà không cần trình lược tả.


Cách thức bình luận thời trang cho đến khi bạn tìm thấy bit chậm?
Ewan

@ewan trình kết xuất khá tối thiểu. Bình luận bất cứ điều gì sẽ làm cho nó không hoạt động.
john01dav

Đối với phần "công cụ bình luận", bạn có thể chia mã thành các phần, sau đó nhận xét mọi thứ trừ phần đầu tiên. Các phần này nên có một số đầu ra để xác minh rằng nó hoạt động như mong đợi. Khi bạn đã có điều đó, bạn có thể bước qua các phần để xem liệu phần đó có phải là nút cổ chai tiềm năng hay không. Với phương pháp này, bạn kết thúc với kiểu thử nghiệm và lỗi cơ bản.
eparham7861

Nếu bạn có quyền truy cập vào pin phần cứng trên GPU, bạn có thể chuyển đổi nó khi vào và thoát khỏi các chức năng. Sau đó, một máy hiện sóng sẽ chỉ ra thời gian dành cho chức năng đó và tần suất nó được gọi, v.v.
Ant

Câu trả lời:


7

Làm cách nào để tối ưu hóa hiệu suất chương trình của tôi khi trình hồ sơ có liên quan không tồn tại?

Bằng cách định hình mã của bạn. Tìm kiếm tắc nghẽn GPU không phải là đặc biệt khó khăn.

Giả sử bạn có phiên bản OpenGL kém hơn ( không có truy vấn hẹn giờ ), thì bạn sẽ làm những gì mọi người đã làm trong nhiều năm: thay đổi công cụ và xem cách thức hoạt động của nó.

Có ba vị trí cơ bản cho các tắc nghẽn trong kết xuất: CPU (nghĩa là: gửi dữ liệu không hiệu quả), T & L đỉnh và xử lý từng đoạn. Xác định nút thắt nào chỉ là vấn đề nhìn thấy tác động hiệu suất khi bạn thay đổi điều gì đó.

Ví dụ: nếu bạn muốn xem liệu xử lý theo từng mảnh có phải là nút cổ chai hay không, hãy giảm số lượng các mảnh được tạo ra (ví dụ: độ phân giải của màn hình). Nếu hiệu suất cải thiện ở tốc độ tuyến tính liên quan đến số lượng pixel trong độ phân giải màn hình, thì đó là nút cổ chai của bạn.

Nếu bạn muốn biết liệu xử lý đỉnh của bạn có phải là nút cổ chai hay không, sau đó kết xuất cùng một đối tượng nhiều lần (lần lượt từng đối tượng). Giả sử bạn đã kiểm tra độ sâu hoạt động và không thực hiện trộn, các đoạn từ các kết xuất tiếp theo sẽ được loại bỏ trước khi gọi trình đổ bóng mảnh. Vì vậy, nếu hiệu suất giảm tuyến tính từ việc liên tục hiển thị tất cả các đối tượng, thì bạn có một nút cổ chai xử lý đỉnh.

Và nếu cả hai đều không phải là nút cổ chai, thì theo quá trình loại bỏ, CPU là vấn đề.

Nếu bạn có quyền truy cập vào các truy vấn hẹn giờ, thì bạn có thể trực tiếp điều khiển GPU hoạt động. Bạn không thể tính thời gian cụ thể, nhưng bạn có thể xác định thời gian cần thiết để hoàn thành các lệnh GPU. Bạn cũng có thể tìm thấy độ trễ giữa hoàn thành lệnh GPU và khi luồng CPU hoàn thành việc gửi các lệnh đó. Nhìn chung, những thứ này sẽ giúp bạn biết GPU mất bao lâu để xử lý công cụ so với CPU gửi nó.

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.