06.07
Sat
很早之前就有打算寫一篇來說說關於 NVIDIA Optimus 的運作方法,以及目前大部分玩家對「雙顯卡切換補丁」的運行方式出現的誤解,不過前陣子一直沒空,加上小艾不是很常用筆電,所以就一直擱著。

但是請特別注意幾個點,首先是 NVIDIA Optimus 技術一直有進行相關更新,小艾目前手上的 1215N 使用的 NVIDIA ION 是 最初版本的 Optimus ;但是朋友最近買的 X550LN 使用 Geforce 840M 是搭配已經改良過的 NVIDIA Optimus,文章裡面會特別標記目前新的 Optimus 已經修正的部份。

-------------------------------------------------------------------------------
前傳(?)

在開始講 NVIDIA Optimus 之前,得先介紹一下筆電的獨顯的進化史,這樣才比較好解釋為什麼會有這樣的技術出現。

首先,筆記型電腦配置獨立顯示晶片或內建顯示晶片,在一開始的時候是固定的,意思就是假如你買了一台效能級、遊戲級的筆電,那麼他就是配獨立顯示晶片;如果你買了一台輕薄型或強調電力的筆電那麼配的就是內建顯示晶片。

例如:小艾之前的筆電 ASUS G1S 就是當時的遊戲型筆電,而它只有配置 Geforce 8600M GT,意思就是就算這台筆電在只要作文書處理的情況下,它依舊是使用獨顯來顯示。

而這種情況使得當時的筆電很難同時兼顧效能和續航力,就算獨立顯示晶片能進步到自動調頻省電,依舊比不上內顯省電;而假如買了只用內顯的筆電,又會出現內顯性能不夠,如果有時想來個1080p的影片就會悲劇。

再來就是雙顯筆電進化的第一步,也就是讓筆電同時擁有獨顯和內顯,然後讓筆電能在兩者之間進行切換。

初期的雙顯筆電切換必須是在關機的情況下切換,這牽涉到獨顯和內顯使用不同記憶體的問題,因此最初是要關機之後透過硬體開關切換,再開機,筆電就會用指定的顯示晶片開機,以此達到雙顯的目的。

而這樣的操作方式非常不方便,假如你只是處理文書到一半想玩玩遊戲,那麼你必須存檔關機之後切換再開機,反之也是。

接著就是雙顯筆電的第二步,也就是希望能解決必須關機再開機的問題,因此這時候出現新的切換方式,這切換方式可以透過「硬體」或是「軟體」開關來切換,但是請注意這還不是 Optimus。

這時的雙顯筆電,透過內部通道(小艾沒找到相關文件)將圖形記憶體的資料在內顯和獨顯之間進行轉移,而前提是獨顯和內顯的記憶體資料在轉移的過程都不能有太大變動,就像是你用 Ghost 把一個分區完整的拷貝到另外一個分區一樣。

這時切換的步驟變成,當你正在用內顯想要開獨顯的時候,請確認畫面沒太大動靜,然後透過開關切換(有些用硬體有些用軟體),切換的過程畫面會黑一陣子(這時圖形資料會從內顯的記憶體跑到獨顯),之後當畫面再次出現的時候,就轉換到獨顯了。

但是這時的切換也有一些不方便,例如必須手動切換、必須確認畫面沒太大動靜、畫面閃爍。
一般所謂「可以關掉內顯」的筆電大部分是採用這樣的設計。


-------------------------------------------------------------------------------
NVIDIA Optimus 的時代

來到了雙顯筆電的第三步,也就是現在的 NVIDIA 獨顯筆電幾乎都搭載的技術,也就是 NVIDIA Optimus。

這個特殊的切換方式是透過 驅動層+硬體層 實現的,他需要解決上面所說的問題,實現同一個畫面底下內顯和獨顯可無接縫的切換,甚至能做到 A軟體用獨顯、B軟體用內顯。

那麼怎麼做到的?

NVIDIAOptimus_1.jpg


根據 NVIDIA 的白皮書(?) 內的圖能看到,螢幕實際上是直接接在內顯上,然後根據應用程式對圖形性能的要求來決定是否要將程式的資料轉移到獨顯上,而且不論使用獨顯還是內顯,這些畫面最終都是由內顯輸出。

那麼怎麼判斷?要怎麼轉移?這些則可以從底下這段話以及圖看出。

NVIDIAOptimus_3.jpg


首先 Optimus 這技術分成四個組件,兩個屬於軟體另外兩個屬於硬體;軟體上的 Optimus Routing 和 Optimus Profiles 搭配,硬體上 Copy Engine (無視系統優勢,系統優勢就是指針對這技術訂製的硬體配置)。

那麼現在這篇要講得只有軟體的部份,為什麼呢?因為 Routing 以及 Profiles 才是真正影響程式能不能"觸發"獨顯的關鍵。

從底下這圖可以看到當一個程式在啟動的當下就已經被 Optimus Routing 攔截,並且透過 Optimus Profiles 來決定這個應用程式需要不需要使用獨顯。

NVIDIAOptimus_2.jpg


從圖上可以發現這個運作機制底下,一個程式需要不需要獨顯完全不是程式本身可以決定的,而是透過 Optimus Routing 與 Profiles 決定。

然後 Routing 透過應用程式對 CUDA Call、DXVA Call、CUDA Call 的相關指令進行偵測,然後如果沒有這些呼叫,則再比對 Profiles 確認應用是否需要獨顯。而 Profiles 則是來自 NVIDIA Update 進行更新,確保需要使用獨顯的應用都能在名單上。


-------------------------------------------------------------------------------
如何準確判斷應用程式是否運行在獨顯

從前面那段可以知道,整個判斷過程都是 NVIDIA 的驅動程式進行的;那麼要怎麼確認你的應用程式到底是用獨顯還是使用內顯?靠應用程式本身的提醒嗎?不,應用程式對獨顯的提示和偵測在 Optimus 上很容易出包(後面會提到為何)。

既然整個 Optimus 的運作都是基於 NVIDIA 的技術來判斷的,那麼由 NVIDIA 自己作的驅動來告訴你,這些應用程式到底有沒有真的運行在獨顯上才是最精準的方式。

判斷的方法如下:

首先打開 NVIDIA 控制面板。
NVIDIA_Optimus_Setting_1.jpg


找到上方的「檢視」->「在通知區域顯示GPU活動圖示」
NVIDIA_Optimus_Setting_2.jpg


隨後就可以在工作列的通知區域,看到這一個 GPU的圖示。
點擊圖示之後,就會顯示目前正在使用GPU的應用程式。
NVIDIA_Optimus_Setting_3.jpg


這是一個判斷 Optimus 技術有沒有對單一應用程式啟動獨顯的最精確的方式。
而且這個方式對於新舊的 NVIDIA Optimus 都有同樣的效果。

-------------------------------------------------------------------------------
為什麼有啟用,但是遊戲提示卻說顯示卡不支援?

這個部份在新的 Optimus 裡面已經修正,而且根據朋友實測,他手上有一台 Geforce GT520M 以及一台 Geforce 840M 的機器,兩者使用同樣版本的驅動程式,其中 Geforce GT520M 依舊有這個問題,而 Geforce 840M 則沒有出現這問題能正常顯示顯示卡型號,因此最近新出的 NVIDIA Optimus 技術的筆電應該有透過硬體上對這個問題作修正了。

以下情況是適用於沒有修正過的 NVIDIA Optimus 。

這問題得先講到 Windows (或大部分系統) 對「輸出」和「GPU」的排列方式。

現在系統上都支援多個 GPU,就跟多個CPU一樣,CPU邏輯核心數量從 CPU0 代表第一個,CPU1為第二個;GPU 的標記方式也是一樣,假如使用 SLI 的話 GPU0 和 GPU1 個別代表 SLI 的兩張卡。

通常一台電腦上是「一個GPU,一個螢幕輸出」,當然也有可能會有「一個GPU、兩個螢幕輸出」或是「兩個GPU、一個螢幕輸出」這樣的配置方式,最終來說不論如何通常是以「主要輸出」的顯示為主要GPU,也就是 GPU0 通常是主要GPU。

但是 Display 也就是輸出螢幕的部份,則是以「1」為初始,意思就是只接了一個螢幕輸出的話,會標記成 Display 1。

因此可以理解,一般的桌上型電腦,或是以往的雙顯卡切換不會有無法正常偵測獨顯的問題,主要就是因為,對於這些電腦來說當一個應用程式要求硬體的 GPU0 資訊的時候系統會返回「NVIDIA Geforce GTX770 - Display1」這樣的資訊,程式就會偵測到顯示卡。

那麼在 Optimus 上,情況就不一樣了,上面有提到這些用了 Optimus 技術的筆電它們的 螢幕是接在內顯上,意思就是在 Optimus 上一樣的命令要求 GPU0 的硬體資訊,系統會返回「Intel Graphics Media Accelerator 3150 - Display1」,而不是「NVIDIA ION - Display none」,這樣的返回資料會直接讓應用程式判斷成你使用的是 Intel 的內顯。

而事實上 Optimus 基於自己的 API 進行資料分流的情況下,他等於是對應用程式輸出給內顯的資料進行攔截再輸出給獨顯,最後獨顯算完之後再從 System Memory 傳輸回內顯進行"合併",因此應用程式確實是將資料輸出給內顯。

這也是最初 Optimus 剛出現的時候,幾乎全部的遊戲和應用,包含 3DMark 這類的程式都不能正常判斷他使用的是獨顯還是內顯,而現在所謂能支援的遊戲都是新的遊戲或是對引擎更新過,讓判斷方式從「只判斷 GPU0」變成「判斷 GPU0 和 GPU1」。

不過目前不太清楚新的 Optimus 怎麼修好這個問題的,畢竟機器不是小艾的;小艾目前週邊能使用的有 Optimus 的筆電都還是不能正常辨識的版本。

-------------------------------------------------------------------------------
那麼獨顯切換DLL做什麼用的呢?

基於上面所寫的內容可以得知,使用 Optimus 技術的筆電對於一個應用程式要不要啟用獨顯是由驅動控制而不是應用程式,意思就是就算應用程式要求使用獨顯,只要 NVIDIA 的驅動設定成不使用,這個應用程式就叫不到獨顯。

那麼這個網路上流傳的「獨顯切換DLL」到底是什麼呢?為什麼他看起來很神奇的讓獨顯啟動呢?因為「遊戲不會再提醒你使用的是內顯」?

首先根據前一段寫得,使用 Optimus 的電腦會讓系統在返回顯示卡資訊的時候返回「Intel Graphics Media Accelerator 3150 - Display1」而導致判斷錯誤,誤以為你使用 Intel 的內顯打開遊戲;這個「獨顯切換 DLL」的作用就是讓這個返回的值被替換成「NVIDIA Geforce 8800GS」,因此你會發現不論你原本用的顯示卡是哪一張,只要用了這個 DLL 之後遊戲內的顯示卡偵測全部都會顯示「NVIDIA Geforce 8800GS」。

簡單的說這個 DLL 對於獨顯切換最大的作用就是讓遊戲不再哀號關於內顯獨顯的事情,它所作的事情只是替換了顯示卡的名稱;簡單的說 就算你真的用 Intel 的內顯,它也不知道,而遊戲也會誤以為你用獨顯,因為它根本沒動到任何實際驅動層的設定。

那麼怎麼驗證到底是驅動讓獨顯有作用,還是 DLL 讓獨顯有作用呢?

首先 GPU-Z 以及 NVIDIA Inspector 內可以顯示「GPU Load」來得知目前查看的GPU被使用了多少的程度,因此如果這個 DLL 真的對獨顯切換起到作用,也就是讓每個使用它的人都可以在不用去驅動內調整的情況下正常使用獨顯,那麼它應該要能無視驅動的設定才對;意思就是如果這 DLL 有作用,那麼它應該能在任何環境下都讓獨顯的 GPU 產生 Load 才對,反之就代表它其實沒效果。

因此設計幾個方案來測試這個檔案的效果到底如何,因此底下會包含
「不使用 DLL 的情況下、使用 NVIDIA 驅動調整為使用獨顯」
「不使用 DLL的情況下、使用 NVIDIA 驅動調整為使用內顯」
「使用 DLL 的情況下、使用 NVIDIA 驅動調整為使用獨顯」
「使用 DLL 的情況下,使用 NVIDIA 驅動調整為使用內顯」

判斷方式如下
「NVIDIA 驅動本身的 GPU活動圖示」
「GPU-Z 和 NVIDIA Inspector 的 GPU Load 查看 NVIDIA 獨顯是否有啟動」
「GPU-Z 查看 Intel 內顯的 GPU Load 狀態」
「透過瑪奇遊戲內的"設定視窗"來確認是不是有套用了這個 DLL」


下圖就是「不使用 DLL 的情況下、使用 NVIDIA 驅動調整為使用獨顯
NVIDIA_Optimus_1.png

可以看到 遊戲內顯示為 Intel Graphics Media Accelerator ,遊戲會在啟動的時候出現顯示卡不支援的提示,但是 NVIDIA GPU 活動提示顯示現在 Client.exe 正在使用獨顯。
在使用率的部份,GPU-Z 顯示現在 NVIDIA ION 被使用了 51%、NVIDIA Inspector 也顯示 NVIDIA GPU Load 有 49%, NVIDIA ION 的運行頻率提高到"運作中"的 475Mhz 頻率;而 Intel 內顯的使用率為 10%。


接著是 「不使用 DLL的情況下、使用 NVIDIA 驅動調整為使用內顯
NVIDIA_Optimus_2.png

可以看到遊戲內一樣顯示為 Intel Graphics Media Accelerator ,遊戲也會在啟動的時候出現顯示卡不支援的提示。
現在這樣的設定之下 GPU-Z 顯示 NVIDIA ION 使用率為 0%、NVIDIA Inspector 也顯示 NVIDIA GPU Load 為 0%
,NVIDIA ION 的頻率降低到 135Mhz 處於睡眠中;另外 Intel 內顯的部份使用率為 68%。

這代表,在不使用 DLL 的情況下,透過 NVIDIA 的驅動來對應用程式進行調整是否使用獨顯是有效果的,只是遊戲無法正確判斷使用的顯示晶片為哪個。


再來開始就是套用這個流傳的「獨顯DLL」的實際作用到底有多少?

下圖是「使用 DLL 的情況下、使用 NVIDIA 驅動調整為使用獨顯
NVIDIA_Optimus_3.png

可以看到遊戲內的顯示卡判斷已經被替換成 NVIDIA Geforce 8800GS,遊戲在啟動的時候不再出現顯示卡不支援的提示。
然後 NVIDIA ION 確實正確被啟用了,GPU-Z 顯示佔用率為 48%,而 NVIDIA Inspector 也顯示 NVIDIA GPU Load 為 32%;Intel 內顯的部份則和沒套用 DLL 的時候一樣為 10%。


接著就是「使用 DLL 的情況下,使用 NVIDIA 驅動調整為使用內顯
NVIDIA_Optimus_4.png

從圖中可以看到,它的結果和沒有使用 DLL 的情況一樣,雖然顯示正在使用 NVIDIA Geforce 8800GS,但是它其實正在使用內顯進行運算而不是獨顯。

-------------------------------------------------------------------------------
結果統合

透過 NVIDIA Optimus 白皮書的推論和實際測試的結果顯示:

1. NVIDIA Optimus 由驅動來判斷是否需要使用獨顯
2. 應用程式就算得知自己使用內顯也不能在不修改驅動設定的情況下直接運行獨顯
3. 應用程式提示顯示卡不支援為誤判,其實應用程式沒真正抓到自己正在用的顯示卡
4. 雙顯卡切換 DLL 無法對 NVIDIA Optimus 的驅動設定起作用
5. 使用 Optimus 的筆電不能關閉內顯,因為畫面由內顯輸出

這並不表示「雙顯卡切換DLL」無用,例如對於瑪奇這樣只要偵測到顯示卡名稱有「Intel」就會彈出不支援的提示的遊戲來說,這個切換的 DLL 能夠繞過這個提示,避免每次啟動遊戲都要點一下的困擾。

假如 NVIDIA 驅動內設定了你的程式不使用獨顯,你的程式不會因為使用了 DLL 而變成獨顯。

再來就是這個 NVIDIA Optimus 技術一直有在更新和改善,它確實是目前應用於「雙顯卡切換」技術上一個蠻好的東西,但是小艾不認為「遊戲筆電」會需要這種東西,因此很無法理解為何有廠商在 GTX770M 等級的筆電上使用這種技術。

然後以上資料來自 NVIDIA Optimus 白皮書,可以點此查閱


-------------------------------------------------------------------------------
後記

話說小艾為什麼知道 DLL 可能只是替換名稱而已?因為小艾前陣子無聊的時候用 HEX 修改打開它,發現 NVIDIA Geforce 8800GS 直接寫在裡面,所以就做了底下的事情:

DLL_GTX780.jpg

DLL_290X.jpg

所以以後可以訂製要顯示的顯示卡(欸!!

comment 0
06.05
Thu
_(:3 」∠ )_ 聽說又要更新了,不過這次沒新的封面圖,因為上次小更新就把封面圖用掉了,而且這張太讚決定多放一陣子(欸

然後給維護工具加了個比較美觀的新版本提醒方式,以前 Ver4 的時候版本更新提醒是直接彈出訊息視窗,這次用的方式比較理想一點。

這完全就是從 iOS 上偷來的,因為小艾最近用手機的熱點用很兇,發現那個提醒方式還不錯,就抄過來了(欸!!


comment 0
back-to-top