ubuntu下集顯做顯示nvidia獨顯做計算的一種解決方案

  nvidia顯卡對linux系統一直不是很友好。在衆多的桌面發行版上,安裝nvidia獨立顯卡驅動後總是出現各種各樣的與集成顯卡不兼容的問題。爲此,查了很多解決方案,都不是很理想。
  有一個需求是這樣的:爲了減少桌面對nvidia獨立顯卡性能的消耗,我們想使用集成顯卡做顯示,獨立顯卡只用來做gpu的加速處理。但是在ubuntu系統上安裝了獨顯驅動後,boise上設置以集成顯卡作爲主要顯示硬件時(boise中顯示輸出選項中選擇IGFX),就會出現界面循環登陸的現象(該問題在網上給到的方案大多是重新安裝顯卡驅動,boise設置獨顯爲主要顯示設備)。
  爲了這個需求,我查閱的很多解決方案,都沒有成功。後來自己將ubuntu系統換成了Lubuntu後,在程序中做了些改動可以得到一個還不算完美的解決方案:

1. 切換Ubuntu16.04到Lubuntu16.04

  首先Lubuntu是相對於Ubuntu更輕量更穩定和更快速的系統,使用的是xfce桌面系統,性能更好。其次,我在使用Lubuntu後沒有出現循環登陸的現象,這個應該和桌面系統有關係,具體原因不詳。但其算是解決了循環登陸界面的一個方案吧。接下來,我們需要解決的是怎樣在集成顯卡作爲顯示設備的情況下,讓獨顯可以作爲gpu加速處理主要設備(使用cuda進行加速計算)呢。

2. 安裝cuda,運行cuda示例程序,並查看示例代碼

  在我們安裝完cuda後,爲了驗證cuda是否可以正常的使用,會編譯一下官方給的示例代碼,並做運行驗證。這裏我編譯了一下
NVIDIA_CUDA-9.1_Samples\NVIDIA_CUDA-9.1_Samples\0_Simple\asyncAPI目錄下的程序,運行成功,並顯示了獨顯設備的相關信息。後來從這個示例中我們可以證明,使用集成顯卡做顯示,獨顯做cuda計算時可行的,至少這個demo程序時運行成功的。所以我就查看了下demo程序的源代碼:

 int devID;
   cudaDeviceProp deviceProps;

   printf("[%s] - Starting...\n", argv[0]);

   // This will pick the best possible CUDA capable device
   devID = findCudaDevice(argc, (const char **)argv);

   // get device name
   checkCudaErrors(cudaGetDeviceProperties(&deviceProps, devID));
   printf("CUDA device [%s]\n", deviceProps.name);

  上面是它的一段示例代碼,發現該程序使用的是findCudaDevice去尋找顯卡設備的,並且函數的參數與主程序main函數的參數相同。說面我們可以通過該接口可以找到顯卡設備,並讓獨顯專門針對該應用程序做gpu加速計算。但是我在查找這個api接口的時候,發現它並不是cuda內部提供的接口,而是sample示例中提供的。它的引用頭文件是:

#include <helper_cuda.h>

  通過find命令查找到該頭文件的位置在cuda-9.1/samples/common/inc/下,所以在我們的工程中需要引用這個目錄,才能編譯通過。

3. 不完美的地方

  通過以上,對顯卡設備的初始化可以在自己的程序中使用cuda進行加速,但是如果你的gui使用的是qt的話,執行程序後,終端會顯示如下的錯誤信息:

Xlib: extension “GLX” missing on display “:0.0”.

  然後你如果使用qtcreater作爲ide編譯程序的話,直接輸入qtcreater是無法打開的,還是會報如上的信息。需要使用

./qtcreator -noload Welcome

來進行啓動纔可以。

4. 其他解決方案

  網上有說使用大黃蜂bumblebee軟件對顯示設備的使用進行控制,這個需要裝一堆軟件,所以沒有使用過,不過需要的人可以嘗試下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章