Làm cách nào để đặt ứng dụng của tôi chạy trên GPU hiệu suất cao theo mặc định?


12

Ngày nay, rất nhiều máy tính xách tay đi kèm với 2 GPU - một hiệu năng cao và một tiết kiệm năng lượng (ít mạnh hơn). Hầu hết các ứng dụng mà tôi sử dụng trên máy tính xách tay của tôi chạy với GPU tích hợp (tiết kiệm năng lượng) của tôi, nhưng vẫn có một số trong số chúng được thiết lập để mở bằng thẻ hiệu suất cao. Tôi đang cố gắng định cấu hình ứng dụng mà tôi đang xây dựng để chạy trên GPU hiệu suất cao theo mặc định, nhưng tôi không thể tìm thấy bất kỳ thông tin nào về chủ đề này ở bất cứ đâu. Tôi hy vọng rằng ai đó có thể làm sáng tỏ một chút về điều này. Tôi sẽ phân phối ứng dụng của mình với trình cài đặt NSIS và tôi đoán rằng tôi sẽ phải thêm đường dẫn ứng dụng của mình vào danh sách các ứng dụng cho thẻ NVidia / ATI. Ứng dụng này được lập trình bằng C #. Ngoài ra, có ai biết làm thế nào mọi thứ đứng với máy tính để bàn? Điều gì xảy ra nếu một PC có 2 GPU và tôi phải chọn loại mạnh hơn?

Milcho

Câu trả lời:


7

NVIDIA có một tài liệu ở đây phác thảo một số chiến lược có thể hữu ích cho bạn: http://developer.doad.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolaho.pdf - thật không may, một cách khác tôi sẽ đề xuất - NvOptimus xuất - chỉ được ghi lại cho C ++; cũng có thể làm điều này với C # nhưng ai đó thực sự biết sẽ phải truy cập thông tin.

Tôi không biết bất cứ điều gì tương tự cho AMD.

Thật không may, có vẻ như không có cách nào để thực hiện việc này (thậm chí việc liệt kê các thiết bị hiển thị sẽ khiến bạn phải chịu sự thương hại của người dùng khi buộc cài đặt thông qua bảng điều khiển trình điều khiển của họ, điều mà người dùng có xu hướng đáng tiếc phải làm để tối đa hóa trò chơi không đi kèm với cài đặt đồ họa có thể cấu hình đầy đủ). Trong sự vắng mặt của như vậy, bạn có thể phải dựa vào một readme và hy vọng rằng mọi người thực sự đọc nó!


+1: Tôi không biết NvOptimusEnablementthủ thuật Optimus này , nhưng tôi nên có. Có vẻ như đó là một điều gần đây (trình điều khiển 302.x +) Cảm ơn bạn.
Sean Middleditch

1
stackoverflow.com/questions/17458804/ đá Đối với bất kỳ ai khác tò mò về tương đương AMD, tôi đã hỏi điều này (trên SO vì không phải là trò chơi cụ thể).
Sean Middleditch

1
Bạn có thể gọi các hàm C ++ từ C # bằng cách sử dụng p / invoke, như là phương sách cuối cùng.
BlueRaja - Daniel Pflughoeft

@ BlueRaja-DannyPflughoeft - Đây không phải là chức năng C ++; nó là một biến toàn cầu xuất khẩu.
Maximus Minimus

5

Nói chung, bạn không thể.

Trình điều khiển GPU kép ẩn hai GPU phía sau một giao diện duy nhất, do đó, các giải pháp như của Nathan Reed thường không hoạt động trong hầu hết các thiết lập GPU kép tốc độ cao / năng lượng thấp phổ biến.

Việc lựa chọn GPU phải được xử lý bởi trình điều khiển theo một cách nào đó. Với NVIDIA Optimus, bạn thường cập nhật cấu hình Optimus để thêm ứng dụng vào danh sách các ứng dụng sử dụng GPU rời, thường bằng cách nhấp chuột phải vào EXE và nhấp vào Thuộc tính. Bạn cũng có thể sử dụng một số cuộc gọi rất cụ thể đến Optimus. theo câu trả lời của mh01. Với các thiết lập AMD, điều này là hoàn toàn khác nhau.

Trên các hệ thống khác, có một công tắc phần cứng hoặc cờ hệ điều hành để quyết định GPU nào đang hoạt động. Một lần nữa, ứng dụng không kiểm soát được GPU nào được sử dụng.

Đây là điều tôi thực sự hy vọng là "đã sửa" trong bản cập nhật DirectX trong tương lai. Lý tưởng nhất là cả hai GPU sẽ được liệt kê như Nathan đề xuất và sau đó sẽ có gợi ý để chỉ ra chúng có nghĩa là tốc độ cao hay năng lượng thấp, vì vậy một ứng dụng có thể chọn một cách thông minh hoặc thậm chí chuyển đổi thiết bị mà nó sử dụng dựa trên bất cứ thứ gì các yếu tố (giả sử, cho phép trình duyệt web chọn tùy thuộc vào tải WebGL).


À, thú vị. Tôi đã không sử dụng một trong những hệ thống GPU kép này vì vậy tôi không biết trình điều khiển giả vờ chúng giống nhau. Bạn sẽ nghĩ rằng trình điều khiển có thể theo dõi mức độ sử dụng GPU cho một ứng dụng nhất định và chuyển nó sang ứng dụng hoàn hảo nếu cần thiết.
Nathan Reed

1
Nó không thể. Phần cứng có khả năng khác nhau. Hãy tưởng tượng nếu bạn đã chuyển từ GPU có kích thước kết cấu tối đa là 2048 sang một với tối đa 1024 hoặc một số đặc điểm khác - toàn bộ ứng dụng của bạn sẽ bị hỏng. Nếu đi đến một GPU có khả năng cao hơn ở mọi phương diện, bộ đệm sẽ cần di chuyển (mất thời gian và gây ra một cú hích khung không mong muốn) và các shader sẽ cần recompilaton. Ứng dụng cần phải chịu trách nhiệm về quy trình này và chọn tham gia hoặc từ chối mọi chuyển đổi. Thật không may, các API cho nó chưa thực sự được bổ sung.
Sean Middleditch

1
Điều này phức tạp bởi thực tế là người dùng thường muốn ghi đè chuyển đổi GPU trên máy tính xách tay của họ, có lẽ để tiết kiệm pin. Đây là một lý do tôi thích ủy quyền chuyển đổi GPU cho HĐH, bởi vì nó cũng biết trạng thái năng lượng của máy tính xách tay.
Tên giả

4

Bạn sẽ có thể liệt kê các GPU trên hệ thống và chọn sử dụng GPU nào khi ứng dụng của bạn khởi động. Bạn đã không đề cập đến API nào bạn đang sử dụng, nhưng ví dụ trong D3D11, bạn sẽ sử dụng IDXGIFactory :: EnumAd chương để lấy danh sách GPU và chuyển giao API bạn muốn cho D3D11CreateDevice .

DXGI có thể cung cấp cho bạn một số thông tin hạn chế về GPU, chẳng hạn như chuỗi mô tả, ID nhà cung cấp và ID thiết bị. Tôi cho rằng bạn có thể sử dụng thông tin này để cho biết GPU nào là hiệu năng cao, nhưng bạn phải xây dựng một số loại cơ sở dữ liệu về GPU hoặc thử sử dụng một số phương pháp phỏng đoán để đoán. Hoặc bạn có thể cho phép người dùng chọn GPU nào sẽ sử dụng khi khởi động.

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.