Bagaimana cara mengatur aplikasi saya agar berjalan pada GPU kinerja tinggi secara default?

12

Saat ini banyak laptop datang dengan 2 GPU - yang berkinerja tinggi dan yang hemat daya (kurang kuat). Sebagian besar aplikasi, yang saya gunakan pada laptop saya berjalan dengan GPU terintegrasi (hemat daya), tetapi masih ada beberapa yang dibuka dengan kartu berkinerja tinggi. Saya mencoba mengonfigurasi aplikasi yang sedang saya buat agar berjalan pada GPU kinerja tinggi secara default, tetapi saya tidak dapat menemukan informasi tentang topik di mana pun. Saya harap seseorang dapat sedikit menjelaskan hal ini. Saya akan mendistribusikan aplikasi saya dengan installer NSIS dan saya kira saya harus menambahkan jalur aplikasi saya ke daftar aplikasi untuk kartu NVidia / ATI. Aplikasi ini diprogram dalam C #. Juga, apakah ada yang tahu bagaimana keadaan dengan PC desktop? Apa yang terjadi jika PC memiliki 2 GPU dan saya harus memilih yang lebih kuat?

Milcho

Milcho
sumber

Jawaban:

7

NVIDIA memiliki dokumen di sini yang menguraikan beberapa strategi yang mungkin bermanfaat untuk Anda: http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf - sayangnya, yang saya sarankan - NvOptimusEnablement ekspor - hanya didokumentasikan untuk C ++; dimungkinkan juga untuk melakukan ini dengan C # tetapi seseorang yang benar-benar tahu harus berpadu dengan info.

Saya tidak mengetahui hal serupa untuk AMD.

Jadi sayangnya sepertinya tidak ada cara vendor-agnostik untuk melakukan ini (bahkan menghitung perangkat tampilan akan membuat Anda berada di bawah belas kasihan pengguna yang memaksakan pengaturan melalui panel kontrol driver mereka, yang cenderung disayangkan oleh pengguna untuk memaksimalkan game yang tidak datang dengan pengaturan grafis yang sepenuhnya dapat dikonfigurasi). Dalam ketiadaan seperti itu Anda mungkin harus mengandalkan readme dan berharap orang benar-benar membacanya!

Maximus Minimus
sumber
+1: Saya tidak tahu NvOptimusEnablementtrik Optimus ini , tetapi seharusnya saya tahu. Kedengarannya seperti hal baru (driver 302.x +) Terima kasih.
Sean Middleditch
1
stackoverflow.com/questions/17458803/... Bagi orang lain yang penasaran dengan AMD, saya menanyakan hal ini (pada SO karena tidak khusus untuk game).
Sean Middleditch
1
Anda dapat memanggil fungsi C ++ dari C # menggunakan p / invoke, sebagai upaya terakhir.
BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft - Ini bukan fungsi C ++; ini adalah variabel global yang diekspor.
Maximus Minimus
5

Secara umum, Anda tidak bisa.

Driver dual-GPU menyembunyikan dua GPU di belakang antarmuka tunggal, sehingga solusi seperti Nathan Reed biasanya tidak bekerja di pengaturan dual-GPU berkecepatan tinggi / daya rendah yang paling umum.

Pilihan GPU harus ditangani oleh pengemudi dengan cara tertentu. Dengan NVIDIA Optimus, Anda biasanya memperbarui profil Optimus untuk menambahkan aplikasi ke daftar aplikasi yang menggunakan GPU diskrit, umumnya dengan mengklik kanan EXE dan mengklik Properties. Anda juga dapat menggunakan beberapa panggilan yang sangat spesifik untuk Optimus. sesuai jawaban mh01. Dengan pengaturan AMD, ini sangat berbeda.

Pada sistem lain, ada saklar perangkat keras atau bendera OS untuk memutuskan GPU mana yang aktif. Sekali lagi, aplikasi tidak memiliki kendali atas GPU mana yang digunakan.

Ini adalah sesuatu yang saya benar-benar berharap "diperbaiki" dalam pembaruan DirectX di masa depan. Idealnya kedua GPU akan disebutkan seperti yang disarankan Nathan dan kemudian akan ada petunjuk untuk menunjukkan mana dari mereka yang dimaksudkan untuk berkecepatan tinggi atau berdaya rendah, sehingga aplikasi dapat secara cerdas memilih yang tepat atau bahkan mengganti perangkat yang digunakan berdasarkan apa pun faktor (katakanlah, membiarkan browser web memilih tergantung pada memuat WebGL).

Sean Middleditch
sumber
Ahh, menarik. Saya belum pernah menggunakan salah satu dari sistem dual-GPU ini jadi saya tidak tahu drivernya berpura-pura sama. Anda akan berpikir pengemudi dapat memantau tingkat penggunaan GPU untuk aplikasi yang diberikan dan mengubahnya ke yang berperforma tinggi jika perlu.
Nathan Reed
1
Tidak bisa. Perangkat keras memiliki kemampuan yang berbeda. Bayangkan jika Anda beralih dari GPU dengan ukuran tekstur maksimal 2048 menjadi satu dengan maks 1024, atau karakteristik lain - seluruh aplikasi Anda akan rusak. Jika jika pergi ke GPU yang lebih mampu di mana-mana, buffer akan perlu migrasi (mengambil waktu dan menyebabkan frame hitch yang tidak diinginkan) dan shader akan membutuhkan kompilasi ulang. Aplikasi perlu bertanggung jawab atas proses ini dan memilih atau memilih keluar dari sakelar apa pun. Sayangnya, API untuknya belum benar-benar disempurnakan.
Sean Middleditch
1
Ini diperumit oleh fakta bahwa pengguna sering ingin mengganti pergantian GPU pada laptop mereka, mungkin untuk menghemat baterai. Ini adalah salah satu alasan saya lebih suka mendelegasikan GPU-switching ke OS, karena ia juga mengetahui status daya laptop.
Nama Palsu
4

Anda harus dapat menghitung GPU pada sistem dan memilih GPU mana yang akan digunakan ketika aplikasi Anda mulai. Anda tidak menyebutkan API mana yang Anda gunakan, tetapi misalnya di D3D11 Anda akan menggunakan IDXGIFactory :: EnumAdapters untuk mendapatkan daftar GPU dan mengirimkan yang Anda inginkan ke D3D11CreateDevice .

DXGI dapat memberi Anda beberapa informasi terbatas tentang GPU, seperti string deskripsi, ID vendor, dan ID perangkat. Saya kira Anda dapat menggunakan informasi ini untuk mengetahui GPU mana yang berkinerja tinggi, tetapi Anda harus membangun semacam basis data GPU, atau mencoba menggunakan beberapa heuristik untuk menebak. Atau Anda bisa membiarkan pengguna memilih GPU mana yang akan digunakan saat startup.

Nathan Reed
sumber