NVIDIA GeForce RTX NVlink 簡單測試

| | 0 Comments| 13:13
Categories:

NVIDIA 在之前,一直都有名為「SLI」(Scalable Link Interface、維基百科)的多顯卡技術;透過這種技術,它可以讓多張顯示卡同時計算,藉此來提高 3D 繪圖的效能。

相對於 NVIDIA 的 SLI,AMD 則也有「CrossFire」(維基百科),可以有類似的效果。

不過老實說,在 Heresy 個人來看,這類的多顯卡技術基本上對於效能的增益上都還是滿有限的,不要說「1+1=2」了,在很多狀況下其實效能增進連 50% 都沒有,甚至還有可能出現效能不增反減的狀況。

而當 NVIDIA 在 2016 年推出 Pascal 架構的 Tesla P100 的時候,則是同時發表了「NVLink」這項新的架構,他採用點對點的架構,讓 CPU、GPU 之間,可以更快速地彼此溝通(官網維基百科)(主機板、CPU 也需要支援 NVLink,最初支援的主要是 IBM 的架構)。

同樣是採用 Pascal 架構的專用繪圖卡 Quadro GP100,雖然還是採用 PCI-Express 介面,但是也有使用 NVLink 取代既有的 SLI,成為兩張顯示卡之間的溝通橋樑(官網)。

而在 Heresy 來看,NVLink 最重要的是他可以把兩張顯示卡的記憶體結合起來,來處理更大的資料!這點是以往的 SLI 沒辦法做到的(SLI 是兩張顯示卡的記憶體內容維持同步)。

不過,由於 NVLink 最初的設計是放在高速計算(HPC)這種專業領域,當時採用 Pascal 架構的 GeForce GTX 10 系列顯示卡,依舊還是使用 SLI(SLI HB)、而非新的 NVLink,所以其實對於一般使用者的影響並不大。

到了最新的、採用 Turing 架構的 GeForce RTX 20 系列顯示卡上市後,NVIDIA 也終於把 NVLink 的功能下放到 GeForce 系列了!而這篇,就是 Heresy 這邊簡單測試 NVLink 在 GeForce RTX 2080 Ti 上面的狀況了~(好長的引言…)

不過,由於 Heresy 這邊不跑遊戲,所以也不會有什麼效能測試了。 ^^"


首先,實際上現在 NVIDIA 的 NVLink Bridge 就算不考慮 2-slot/ 3-slot 的差別,也已經有很多種了,很多又不完全相容,所以要買的時候,其實是需要稍微注意一下的。

而 Heresy 這邊買的是「NVIDIA TITAN RTX NVLink HB Bridge 3-Slot」,基本上是給 Titan RTX 用的,不過 GeForce RTX 也可以用。

它的外盒如下:

   

目前這張 Titan RTX NVLink Bridge 在 PCHome 上的售價是 2,790,已經不是以前那種會隨主機板附贈的東西了,所以在整體、包含外盒上,也都算是相對地有質感。

橋接器的本體基本上就是採用近年來 Titan 系列、暗金色與黑色的雙色搭配,中間的 NVIDIA logo 實際上也是一個會亮的 LED 燈。

    

橋接器上的插槽看起來有點像是 PCI-Express x8 的形式,不過實際上比對後,長度是不一樣的。

當把橋接器接上顯示卡之後,會讓顯示卡的高度再「長高」大約 1.5 公分,所以如果本來機殼的側板就和顯示卡快碰到的話,那可能會需要小心一點。
(不過相信會搞到要衝 NVLink 的人,機殼應該都不會太小才對 XD)

右圖就是把 NVLink Bridge 接到兩張 GeForce RTX 2080 Ti 後的照片~可以看到,NVIDIA 的 Logo 是會亮白光的。

在硬體安裝成功後,接下來就是驅動程式設定了。在有多張顯示卡的系統上,NVIDIA 控制面板中會有一個「設定 SLI、Surround、PhysX」的選項;在這邊如果是要發揮雙顯卡的計算能力,基本上就是要在「SLI 設定」這邊選「最大化3D 效能」了。

話說,這邊也可以看到,它的名稱還是叫做「SLI」,並沒有變成「NVLink」;某方面來,也可以看的出來,目前在 GeForce 上,NVLink 只是橋接器的硬體、溝通通道,內部的運作模式,還是和以前的 SLI 是一樣的。

 

在這邊設定好 SLI 的選項後,理論上就可以用了。

如果用 GPU-Z 看的話,則會看到「NVIDIA SLI」那邊會顯示「Enabled (2 GPUs)」。

在 WIndows 10 1709 以後的版本的話,在「工作管理員」的「效能」裡,也會看到 GPU 後面會加上「連結 0」的標記。

不過,由於 NVIDIA 為了保險起見,他的「SLI 呈現模式」預設是「NVIDIA 推薦使用」;沒記錯的話,在這個設定下,他會去根據內建的資料庫以及程式的回報,來判斷要使用哪種方法來加速,而對於沒有相關資料的程式則會繼續使用單一 GPU 來計算。

所以如果要測試自己的程式的話,可能就需要自己去修改「SLI 呈現模式」了。


基本上大概就是這樣了,Heresy 前面也有提過了,Heresy 沒打算進行遊戲的測試,這部分就請自己上網找其他網站的比較了~

而老實說,Heresy 個人本來是比較期望當透過 NVLink 開啟 SLI 後,能變把兩張有 11GB RAM 的 RTX 2080 Ti、在系統上變成一張有 22GB 的顯示卡,然後可以直接讓現有的程式使用;但是看來,這點應該是沒戲了。

因為以實際的狀況來看,NVIDIA 應該是沒有針對 SLI 的實作做修改,僅僅是變成改走更快的 NVLink 通道來加速而已…

另外一提,以 GFXBench 來說,在使用 Vulkan 的時候,也還是可以看到有兩張 RTX 2080 Ti,可以選擇要用哪張來做測試。

不過,這點應該是由於 Vulkan 也是目前少數可以直接去接觸底層的圖形 API,像是 OpenGL 似乎也沒辦法做到就是了。


此外,如果看產品官網的話,也可以注意到,Quadro RTX(連結)和 TITAN RTX(連結)針對 NVLink 的說明,都有提到記憶體的結合;但是在 GeForce RTX(連結)上,卻僅有看到他強調速度比較快。

所以感覺上,NVIDIA 在這部分,似乎是有針對高階產品(Quadro、TITAN)和消費級產品(GeForce)之間,做出產品的功能性區隔吧?

不過,後來又查了一下資料,看來 NVLink 所提供的記憶體結合功能(看到比較多似乎是叫做「memory pooling」)應該也不是像 SLI 那樣開啟就能用的東西,而是要自己(用 CUDA 之類、非圖形 API)去寫才能用的東西;也就是說,不特別去修改程式的話是沒有用的,而在 3D 繪圖上不能用的機會也是比較大的。

而如果是在這方面的應用的話,以看到的資料的結論來說,在 Windows 10 上 GeForce RTX NVLink 的功能似乎是不完整的?這部分的內容,可以參考《NVLink on NVIDIA GeForce RTX 2080 & 2080 Ti in Windows 10》這篇文章。

在這篇文章中,可以看到主要似乎是因為在 Windows 10 上沒有辦法把 GeForce RTX 切換成 TCC(Tesla Compute Cluster)模式,所以在某些狀況下會導致裝置對裝置(Peer 2 Peer)的直接存取會有問題、無法使用。

像是如果執行 CUDA 10.0 的「simpleP2P.exe」這個範例的話,它的結果會是:

[simpleP2P.exe] - Starting...
Checking for multiple GPUs...
CUDA-capable device count: 2
> GPU0 = "GeForce RTX 2080 Ti" NOT capable of Peer-to-Peer (P2P)
> GPU1 = "GeForce RTX 2080 Ti" NOT capable of Peer-to-Peer (P2P)
Two or more GPUs with SM 2.0 or higher capability are required for simpleP2P.exe.
Also, a TCC driver must be installed and enabled to run simpleP2P.exe.

不過,這點可能是 CUDA 10.0 的 bug?因為如果是執行最新的 CUDA 10.1 的同一個範例的話,他就可以正確的運作:

[simpleP2P.exe] - Starting...
Checking for multiple GPUs...
CUDA-capable device count: 2
Checking GPU(s) for support of peer to peer memory access...
> Peer access from GeForce RTX 2080 Ti (GPU0) -> GeForce RTX 2080 Ti (GPU1) : Yes
> Peer access from GeForce RTX 2080 Ti (GPU1) -> GeForce RTX 2080 Ti (GPU0) : Yes
Enabling peer access between GPU0 and GPU1...
Allocating buffers (64MB on GPU0, GPU1 and CPU Host)...
Creating event handles...
cudaMemcpyPeer / cudaMemcpy between GPU0 and GPU1: 38.34GB/s
Preparing host buffer and memcpy to GPU0...
Run kernel on GPU1, taking source data from GPU0 and writing to GPU1...
Run kernel on GPU0, taking source data from GPU1 and writing to GPU0...
Copy data back to host from GPU0 and verify results...
Disabling peer access...
Shutting down...
Test passed

而另一方面,如果是「p2pBandwidthLatencyTest.exe」這個範例的話,不管是 10.0 或是 10.1,都可以正確地跑出結果來…

[P2P (Peer-to-Peer) GPU Bandwidth Latency Test]
Device: 0, GeForce RTX 2080 Ti, pciBusID: 17, pciDeviceID: 0, pciDomainID:0
Device: 1, GeForce RTX 2080 Ti, pciBusID: 65, pciDeviceID: 0, pciDomainID:0
Device=0 CAN Access Peer Device=1
Device=1 CAN Access Peer Device=0
***NOTE: In case a device doesn't have P2P access to other one, it falls back to normal memcopy procedure.
So you can see lesser Bandwidth (GB/s) and unstable Latency (us) in those cases.
P2P Connectivity Matrix
     DD     0     1
     0       1     1
     1       1     1
Unidirectional P2P=Disabled Bandwidth Matrix (GB/s)
   DD     0      1
     0 514.89   6.60
     1   9.47 509.95
Unidirectional P2P=Enabled Bandwidth (P2P Writes) Matrix (GB/s)
   DD     0      1
     0 507.86  45.96
     1  46.96 340.86
Bidirectional P2P=Disabled Bandwidth Matrix (GB/s)
   DD     0      1
     0 521.69   7.27
     1  11.42 522.06
Bidirectional P2P=Enabled Bandwidth Matrix (GB/s)
   DD     0      1
     0 521.09  91.76
     1  91.83 518.61
P2P=Disabled Latency Matrix (us)
   GPU     0      1
     0   4.43 242.40
     1 160.84   2.87
   CPU     0      1
     0   5.01 172.51
     1 181.01   4.08
P2P=Enabled Latency (P2P Writes) Matrix (us)
   GPU     0      1
     0   5.70   2.18
     1   1.46   4.85
   CPU     0      1
     0  10.34   4.83
     1   4.93  10.01
NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

可以看到,實際上 P2P 還是可以啟用,而且雙向傳輸的速度也可以到達 91.x GB/s、也算是接近理論值的 100 GB/s 了!(RTX 2080 的話只有 50 GB/s)

而同一張卡內是 500GB/s 左右,所以透過 NVLink 傳遞的話,頻寬大概只有 1/5;雖然還是掉很多,但是和以往相比,應該已經算是相當好了!

不過,如果是執行「deviceQuery」的話,也可以看到「 Cooperative Kernel Launch」以及「MultiDevice Co-op Kernel Launch」這兩項是顯示不支援的;而看到的說法,這項功能在 Linux 似乎也是支援的。

所以,感覺上 GeForce RTX 這些計算相關的功能,似乎是要到 Linux 上會比較完整了…


以結論來說,目前以 GeForce RTX 2080 Ti 來測試 NVLink 的結論:

  1. 感覺就是比較快的 SLI,沒有特別的功能
  2. 在 GeForce RTX 上應該是沒有可以直接使用記憶體擴張(memory pooling)的功能
  3. 在 Windows 10 上似乎有功能會受限,在 Linux 上功能比較完整?

另外,Heresy 這邊用 1000W 的 PSU 在推兩張 RTX 2080 Ti 再加一顆 Intel Core i9 7980XE,在兩張卡全速運轉的時候,似乎會直接斷電(發生過一次,不敢再測了 :p),感覺可能是電源推不動?所以,如果真要玩的話,可能得找更高瓦數的了。

感想…多顯示卡在現在,除了特殊應用外,看來還是一個效益很低的東西啊…


最後抱怨一下,個人覺得 NVIDIA 現在的驅動程式期很多地方沒有寫好…

第一個,是要變更 SLI 模式的時候。這時候如果系統有開啟有占用 GPU 資源的程式的話,他會要求關閉再繼續。

 

但是感覺上,這個對話框似乎是在 busy-waiting,不接受任何的滑鼠介入(內容倒是會更新)…就算是把所有應用程式都關閉了,還是沒辦法按繼續,就連取消也按不了。

解決方法,就是先把所有相關程式都先強制關閉,在切換 SLI 模式了。

第二個,則是在 Heresy 剛裝上第二張 RTX 2080 Ti、開啟 SLI 後,雖然大部分東西都運作正常,但是部分應用程式(主要是微軟自己 UWP 的)會出現不穩定的顯示錯誤:

而當 Heresy 移除第二張卡後,整個驅動程式更是進入詭異的狀況,完全不法正常運作,就連手動移除重新安裝都沒用…

後來還是得用 DDU 全部移掉重來,才正常修復。而上面詭異的程式顯示問題,在使用 DDU 移除、重新安裝後也就消失了。


附註:

  1. NVLink Bridge 目前有六款(不包括寬度),包括 Quadro GP100 用的 NVLink GP100、Quadro GV100 用的 NVLink GV100、Quadro RTX 5000 用的 Quadro RTX NVLink、Quadro RTX 6000 用的 Quadro RTX NVLink HB、GeForce RTX 用的、Titan RTX 5000 用的。

    其中,Quadro GP100 和 Quadro RTX 5000 的版本最特別,基本上不能用在其他產品上,而其他的在某種程度上則有相容性;尤其是 RTX 系列的 NVLink Bridge,除了 Quadro RTX 5000 的因為比較小之外,其他的理論上都可以共用。

    這部分可以參考:《NVIDIA NVLink Bridge Compatibility Chart》這篇文章。

  2. SLI Bridge 的頻寬應該是 1GB/s(參考),相較於此,NVLink GP100 的頻寬是 160GB/s、NVLink GV100 則到達 200GB/s!
    不過 Quadro RTX NVLink 的頻寬又掉到 50GB/s,Quadro RTX NVLink HB 也只有 100GB/s。

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *