2012年5月7日 星期一

How to install CUDA 4.0 12.2 on Ubuntu 10.10




目前測試Ubuntu 10.10版本安裝CUAD,其主要原因是OpenCV 2.3.1所使用的CUDA toolkit版本為4.0.17,而nvidia所以提供的Cuda toolkit 4.0.17版本號僅支援ububtu 10.10,因此先拿10.10做測試,如果測試OK未來將使用11.10版本進行測試安裝

Step1.首先安裝ubuntu
注意:OpenCV_2.3.1使用的CUDA Toolkit 為CUDA 4.0版本,所以ToolKit 與SDK版本均要下載4.0版本,不然Make將會出錯
下載檔案如下

NVIDIA-Linux-x86_64-285.05.33.run
cudatoolkit_4.0.17_linux_64_ubuntu10.10.run
gpucomputingsdk_4.0.17_linux.run


Step2.安裝Cuda
a.安裝CUDA時須先離開xwindow,
ubuntu 10.10離開方式

#sudo stop gdm
ubuntu 11.04離開方式

#sudo stop lightdm
b.安裝Nvidia 驅動程式
#sudo ./NVIDIA-Linux-x86_64-285.05.33.run
c.安裝Nvidia Cuda toolkit 4.0
#sudo cudatoolkit_4.0.17_linux_64_ubuntu10.10.run
非常注意,這邊使用的OpenCV2.3.1一定要對應Toolkit 4.0版本
d.安裝CUDA SDK 4.0
#sudo gpucomputingsdk_4.0.17_linux.run
e.設定相關系統path
#sudo vi /etc/bash.bashrc
於最下面加入
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/lib:$LD_LIBRARY_PATH

# The following line should on the last line of this file.
export PATH=.:$PATH
f.安裝編譯相關程式
#sudo apt-get install build-essential gcc-4.4 g++-4.4 libxi-dev libxmu-dev freeglut3-dev
g.將SDK進行編譯測試
預設SDK安裝於'/home/user/NVIDIA_GPU_Computing_SDK'資料夾當中,user為你的使用者名稱。
#cd NVIDIA_GPU_Computing_SDK/C/
#make
若編譯過程中無出現任何錯誤,將可編譯出下列執行檔。
測試編譯的執行檔。
#./deviceQuery
若出現下列訊息,表示該平台可以正常運作CUDA

 


Step3.安裝OpenCV 2.3.1
至官方網站下載OpenCV tar套件OpenCV-2.3.1a.tar.bz2
Step a.安裝相關有用之lib庫
#sudo apt-get install cmake-gui libjpeg62 libjpeg62-dev libgtk2.0-0 libgtk2.0-dev libjpeg62-dev libtiff4-dev libjasper-dev libopenexr-dev cmake python-dev python-numpy libtbb-dev libeigen2-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libtbb-dev

Step b.安裝OpenCV
建立opencv安裝目錄

#mkdir /usr/local/opencv2.3.1
#ln -s /usr/local/opencv2.3.1 /usr/local/opencv

Symbolic Link (符號連結,亦即是捷徑)相對於 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在建立一個獨立的檔案,而這個檔案會讓資料的讀取指向他 link 的那個檔案的檔名!由於只是利用檔案來做為指向的動作, 所以,當來源檔被刪除之後,symbolic link 的檔案會『開不了』, 會一直說『無法開啟某檔案!』。實際上就是找不到原始『檔名』而已啦!
ln指令:連結檔案或目錄
語法:ln -[可選參數] 原始檔案/目錄 目的檔案/目錄

參數說明:
  1. 不加:預設值;只限於相同檔案系統間的連結,且不能連結目錄
  2. s:可作不同檔案系統間的連結,且能連結目錄
  3. f:如果要連結成的檔案已存在,則砍掉這個已存在的檔案
  4. n:如果要連結成的檔案已存在,則停止連結,不會砍掉該檔案

上述動作於/usr/local/資料夾中建立opencv資料夾,在將opencv2.3.1指向 opencv資料夾,可以有效管理安裝的資料夾,若需更改其他版本,請直接指向另外一個版本之資料夾,將可以不需更改PATH資料夾。

Step c.使用cmake-gui 建立 makefile

#cd ~/opencv_2.3.1/
#mkdir release
#cd release/
#cmake-gui ../


CMAKE_BUILD_TYPE=RELEASE


CMAKE_INSTALL_PREFIX=/usr/local/opencv

WITH_CUDA=1


點選configure進行設定,這邊我們先手動啟動一些設定值,還有安裝的目錄很重要。

使用預設的compilers進行編譯

當點選Finish 之後會進行初步設定,此時有一個值要手動建立Path for CUDA_SDK_ROOT_DIR,請用瀏覽的方式,將該設定值設定為你所安裝SDK的位置,如下圖所示。


再度點選Configure若無出現錯誤,將可點選Generate進行建立該MakeFile檔案



#make
若安裝過程中無出現錯誤,代表所有設定值與安裝之lib未出現錯誤,此時將可進行install動作
#sudo make install
注意:
cmake-gui中設定opencv安裝目錄"CMAKE_INSTALL_PREFIX=/usr/local/opencv",若make install後發現並無安裝置/usr/local/opencv中,可檢查MakeFile.cmake檔案,並修改INSTALL_PRFIX路徑位置

#gedit cmake_install.cmake
修改CMAKE_INSTALL_PREFIX="/use/local" 為 "/usr/local/opencv"


修改設定檔
因為安裝路徑有修改,所以prefix=/usr/local將改成/usr/local/opencv

並加-lopencv_gpu加入引用程式庫。



Step d. 修改系統變數

#sudo gedit /etc/bash.bashrc
加入下列紅色字串。
export PATH=/usr/local/cuda/bin:/usr/local/opencv/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/lib:
/usr/local/opencv/lib:$LD_LIBRARY_PATH

export PKG_CONFIG_PATH=/usr/local/opencv/lib/pkgconfig:${PKG_CONFIG_PATH}

# The following line should on the last line of this file.
export PATH=.:$PATH


Step e. 加入動態連結管理員
請於/etc/ld.so.conf.d/資料夾當中新增opencv.conf檔案,檔案內容
/usr/local/opencv/lib
新增後重新啟動ldconfig即可

#sudo ldconfig

Step4. OpenCV 2.3.1 with CUDA test

a.建立簡單應用gpu開啟影像並做基本處裡,原始碼如下圖所示,檔名為main.cpp。

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/gpu/gpu.hpp>

int main (int argc, char* argv[])
{
    try
    {
          int num_device=cv::gpu::getCudaEnabledDeviceCount();
          std::cout<< "Number of GPU device " << num_device<<std::endl;

        cv::Mat src_host = cv::imread("beach.jpg",CV_LOAD_IMAGE_GRAYSCALE);

        cv::gpu::GpuMat dst, src;
        src.upload(src_host);

        cv::gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY);

        cv::Mat result_host = dst;
        cv::imshow("Result", result_host);
        cv::waitKey();
    }
    catch(const cv::Exception& ex)
    {
        std::cout << "Error: " << ex.what() << std::endl;
    }
    return 0;
}

編譯c++
#g++ main.cpp -o gpu_test `pkg-config --cflags --libs opencv`
執行如下圖所示。



b.GPU Device info
#include <opencv2/opencv.hpp>
#include <opencv2/gpu/gpu.hpp>
#include <iostream>

int main() {
     int num_device= cv::gpu::getCudaEnabledDeviceCount();
     std::cout << "Number of CUDA device: " << num_device << std::endl;
     if (num_device>0) {
          int dev_id=cv::gpu::getDevice();
          cv::gpu::DeviceInfo dev_info;

          dev_info=cv::gpu::DeviceInfo::DeviceInfo(dev_id);
          std::cout << "Device information" << std::endl;
          std::cout << "Device name: " << dev_info.name() << std::endl;
          std::cout << "Number of Processor: " << dev_info.multiProcessorCount() << std::endl;
          std::cout << "Total Memory: " << dev_info.totalMemory()/1024 << " (Mb)" << std::endl;
     }
     return 0;
}

沒有留言:

張貼留言