Uygulamamı varsayılan olarak Yüksek performanslı GPU'da çalışacak şekilde nasıl ayarlayabilirim?


12

Günümüzde çok sayıda dizüstü bilgisayar 2 GPU ile geliyor - yüksek performanslı ve güç tasarrufu sağlayan (daha az güçlü). Dizüstü bilgisayarımda kullandığım uygulamanın çoğu entegre (güç tasarrufu) GPU'm ile çalışıyor, ancak yine de bazıları yüksek performanslı kartla açılmaya hazır. Varsayılan olarak yüksek performanslı GPU'da çalışacak şekilde oluşturduğum uygulamayı yapılandırmaya çalışıyorum, ancak konu hakkında hiçbir yerde hiçbir bilgi bulamıyorum. Umarım birisi buna biraz ışık tutabilir. Uygulamamı bir NSIS yükleyicisiyle dağıtacağım ve sanırım uygulamamın yolunu NVidia / ATI kartlar için bir uygulama listesine eklemem gerekecek. Uygulama C # programlanmıştır. Ayrıca, masaüstü bilgisayarlarda işlerin nasıl durduğunu bilen var mı? Bir bilgisayarda 2 GPU varsa ve daha güçlü olanı seçmek zorunda kalırsam ne olur?

Milcho

Yanıtlar:


7

: NVIDIA için yararlı olabilecek bazı stratejiler özetleyen burada bir belge var http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf ne yazık ki, aksi tavsiye ediyor biri - - NvOptimusEnablement dışa aktar - yalnızca C ++ için belgelenmiştir; bunu C # ile de yapmak mümkün olabilir, ama aslında bilen biri bilgi ile uyuşmak zorunda kalacaktı.

AMD için benzer bir şeyin farkında değilim.

Ne yazık ki, bunu yapmanın satıcı-agnostik bir yolu yok gibi görünüyor (ekran cihazlarını numaralandırmak bile, kullanıcıların maksimum kontrol için yapmak için talihsiz bir eğilime sahip oldukları sürücü kontrol panelleri aracılığıyla ayarları zorlayarak kullanıcıların merhametine bırakacaktır. tamamen yapılandırılabilir grafik ayarlarıyla gelmeyen oyunlar). Böyle bir şeyin yokluğunda bir benioku dosyasına güvenmeniz ve insanların gerçekten okumasını ummanız gerekebilir!


+1: Bu Optimus NvOptimusEnablementhilesini bilmiyordum ama yapmalıydım. Yeni bir şeymiş gibi geliyor (sürücü 302.x +) Teşekkürler.
Sean Middleditch

1
stackoverflow.com/questions/17458803/… AMD eşdeğerlerini merak eden herkes için bunu sordum (oyuna özgü olmadığından SO'da).
Sean Middleditch

1
Son çare olarak p / invoke komutunu kullanarak C # 'dan C ++ fonksiyonlarını çağırabilirsiniz.
BlueRaja - Danny Pflughoeft

@ BlueRaja-DannyPflughoeft - Bir C ++ işlevi değil; dışa aktarılan bir global değişkendir.
Maximus Minimus

5

Genel olarak yapamazsınız.

Çift GPU sürücüsü, iki GPU'yu tek bir arabirimin arkasına saklar, bu nedenle Nathan Reed gibi çözümler genellikle en yaygın yüksek hızlı / düşük güçlü çift GPU kurulumlarında çalışmaz.

GPU seçimi sürücü tarafından bir şekilde ele alınmalıdır. NVIDIA Optimus ile, genellikle EXE'yi sağ tıklatıp Özellikler'i tıklatarak uygulamayı ayrı GPU kullanan uygulamalar listesine eklemek için genellikle Optimus profillerini güncellersiniz. Optimus'a özgü çok özel çağrıları da kullanabilirsiniz. mh01 cevabına göre. AMD kurulumları ile bu tamamen farklı.

Diğer sistemlerde, hangi GPU'nun aktif olduğuna karar vermek için bir donanım anahtarı veya bir OS bayrağı vardır. Yine, uygulamanın hangi GPU'nun kullanıldığı üzerinde hiçbir kontrolü yoktur.

Bu, gelecekteki bir DirectX güncellemesinde gerçekten "sabit" olmasını umduğum bir şey. İdeal olarak, her iki GPU da Nathan'ın önerdiği gibi numaralandırılacak ve daha sonra hangilerinin yüksek hızlı veya düşük güç anlamına geldiğini belirtmek için ipuçları olacaktır, böylece bir uygulama akıllıca doğru olanı seçebilir ve hatta hangi cihazı kullandığına bağlı olarak değiştirebilir faktörler (örneğin, bir web tarayıcısının WebGL yüküne bağlı olarak seçim yapmasına izin verme).


Ahh, ilginç. Bu çift GPU sistemlerinden birini kullanmadım, bu yüzden sürücünün aynı gibi davrandığını bilmiyordum. Sürücünün belirli bir uygulama için GPU kullanım düzeyini izleyebileceğini ve gerekirse yüksek performansa geçebileceğini düşünürdünüz.
Nathan Reed

1
Yapamaz. Donanımın farklı yetenekleri vardır. Maksimum 2048 doku boyutuna sahip bir GPU'dan maksimum 1024 veya başka bir karakteristiğe geçiş yaptıysanız, tüm uygulamanızın kırılacağını düşünün. Her durumda daha yetenekli bir GPU'ya gidecek olsaydı, arabelleklerin geçişe (zaman alıp istenmeyen bir çerçeve aksamasına neden olması) ve gölgelendiricilerin yeniden derlenmesine ihtiyaç duyacaksa. Uygulamanın bu işlemden sorumlu olması ve herhangi bir anahtarın kapsamı dışında kalması gerekir. Ne yazık ki bunun için API'ler henüz gerçekten etli değil.
Sean Middleditch

1
Bu, kullanıcıların genellikle dizüstü bilgisayarlarında GPU anahtarlamasını geçersiz kılmak, belki de pil tasarrufu yapmak istemesiyle karmaşıktır. Bu, dizüstü bilgisayarın güç durumunu da bildiğinden, GPU anahtarını işletim sistemine devretmeyi tercih etmemin bir nedenidir.
Sahte İsim

4

Sistemdeki GPU'ları numaralandırabilmeli ve uygulamanız başladığında hangisini kullanacağınızı seçebilmelisiniz. Hangi API'yi kullandığınızı belirtmediniz, ancak örneğin D3D11'de GPU'ların listesini almak ve D3D11CreateDevice'e aktarmak istediğinizde IDXGIFactory :: EnumAdapters'ı kullanırsınız .

DXGI, GPU hakkında açıklama dizesi, satıcı kimliği ve cihaz kimliği gibi bazı sınırlı bilgiler verebilir. Sanırım bu bilgileri hangi GPU'nun yüksek performanslı olduğunu söylemek için kullanabilirsiniz, ancak GPU'ların bir tür veritabanını oluşturmanız veya tahmin etmek için bazı sezgisel yöntemler kullanmaya çalışmanız gerekir. Veya kullanıcının başlangıçta hangi GPU'yu kullanacağını seçmesine izin verebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.