wiki:adherelinux/installGPU

=Ubuntu下安裝CUDA (Tesla C1060)= Tesla並沒有顯示功能,所以需要另一張顯示卡。這裏用的是nvidia GeForce? 9800GT 支援CUDA的顯示卡。
安裝順序:

  1. CUDA驅動程式2. CUDA工具套件3. CUDA軟體開發工具(SDK)程式碼範例除了程式碼範例外,其他全詳細步驟如下:
  2. 安裝CUDA支援的Ubuntu 版本。目前支援到Ubuntu 9.04版。
  3. 安裝新的nvidia驅動程式

先檢查顯示卡的驅動程式。 檢查檔案 /etc/X11/xorg.conf: 進入終端機 (Terminal)後, $sudo less /etc/X11/xorg.conf 如果尚未安裝任何驅動程式, 可能會看到

# xorg.conf (X.Org X Window System server configuration file) # …… # ……

. . .

# sudo dpkg-reconfigure -phigh xserver-xorg

Section "Device"

Identifier "Configured Video Device"

Endsection Section "Monitor"

Identifier "Configured Monitor"

Endsection Section "Screen"

Identifier "Default Screen" Monitor "Configured Monitor" Device "Configured Video Device"

Endsection
如果已經安裝nvidia驅動程式,但不是自己編譯的,必須要移除$sudo apt-get remove nvidia-*

3.安裝編譯所需要的核心及相關套件
$sudo apt-get install build-essential linux-source linux-headers-uname -r

$sudo apt-get install xserver-xorg-dev libglut3-dev libglu1-mesa-dev libxi-dev libxmu-dev libc6-dev

如果尚未安裝 gcc 與 g++

$sudo apt-get install gcc-4.3 g++-4.3

4.下載CUDA安裝所需的所有檔案

(1)下載適合的驅動程式
http://www.nvidia.com.tw/Download/index.aspx?lang=tw NVIDIA IP
以手動尋找。
產品類型: 點選 Tesla
產品系列: 點選 GPU Computing Processor
產品家族: 點選 Tesla C1060
作業系統: 依Linux 系統32位元或64位元作選擇
點選搜尋後,會出現以下畫面:

Nvidia_product
點選下載NVIDIA-Linux-x86_64-195.36.24-pkg2.run

(2) 下載 CUDA Toolkit 及CUDA SDK
http://www.nvidia.com.tw/object/cuda_get_tw.html

toolkit

如果要安裝最新的套件,點選 “CUDA 工具套件3.0Beta版”。這個範例安裝的是2.3版的工具套件。點選適合的作業系統

cuda2.3

比較驅動程式的版本,選用較新版。這裏的版本比先前下載的還舊,所以只要下載工具套件和軟體開發套件。
下載後,可看到檔名是
cudatoolkit_2.3_linux_64_ubuntu9.04.run
cudasdk_2.3_linux.run

5.關掉圖形介面以安裝nvidia顯示卡驅動程式
按 Crl+Alt+F1進入終端機登入
$sudo /etc/init.d/gdm stop
6.假設所有的檔案都在目前所在目錄下

(1) $sudo sh ./NVIDIA-Linux-x86_64-195.36.24-pkg2.run

會進入nvidia授權頁,用Tab鍵選擇 “Accept” 。

(2)接著會看到以下畫面

There appears to already be a driver installed on your system (version: xxx.xx.xx). As part of installing this driver (version: xxx.xx.xx), the existing driver will be uninstalled. Are you sure you want to continue?

選擇 “Yes”。

(3)

Install NVIDIA's 32-bit compatibility OpenGL libraries?

這裏的版本是64位元的,選擇 “No”。

(4)

Would you like to run the nvidia-xconfig utility to automatically update your X configuration file so that the NVIDIA X driver will be used when you restart X? Any re-existing X configuration file will be backed up.

選擇 “Yes”。

(5) 完成後,在終端機模式下重新開機

$sudo reboot

7.檢查是否安裝成功
點選 system > preferences > NVIDIA X-Server Settings
如果看到Tesla 的資訊,代表安裝成功。

nvidia_xserver

如果沒出現GPU的資訊,則安裝失敗,重新確認硬體是否支援,下載的驅動程式是否版本不符, 安裝程序是否錯誤、遺漏,或試不同版本的驅動程式。
如果只出現GPU 0 (也就是顯示卡的GPU),但沒偵測到Tesla,可先關閉電源,取出Tesla,重新插入主機版,再開機,就可以看到Tesla的資訊。
如果要看GPU的資訊,還有另一個方法。
進入終端機, 使用指令 “nvidia-xconfig”
$nvidia-xconfig -query-gpu-info
你將會看到下面的畫面

query_gpu

8.安裝CUDA 工具套件和CUDA 軟體開發套件
進入終端機
$sudo sh ./cudatoolkit_2.3_linux_64_ubuntu9.04.run
$sudo sh ./cudasdk_2.3_linux.run
過程中,所有選項按Enter會使用預設的設定。
修改 etc 目錄下的 profile 檔
$cd /etc/
$cudo emacs profile (可用任意的編輯器)
依照CUDA所在目錄,在檔案的最後加上
PATH=/usr/local/cuda/bin:$PATH
LD_LIBRARY_PATH=/usr/local/cuda/lib64
export PATH
export LD_LIBRARY_PATH
這四行。
如果是32 位元的作業系統,第二行改成LD_LIBRARY_PATH=/usr/local/cuda/lib
如果是64 位元的作業系統,第二行改成LD_LIBRARY_PATH=/usr/local/cuda/lib64
登出,再登入, 用CUDA程式測試,如果正確無誤,即完成安裝。

若出現以下錯誤訊息

./a.out: error while loading shared libraries: libcudart.so.2: cannot open shared object file: No such file or directory

若是64位元 命令列
$sudo ln -sf /usr/local/cuda/lib64/libcudart.so.2.3 /lib64/libcudart.so.2
如果是32位元可能需要加此行
$sudo ln -sf /usr/local/cuda/lib/libcudart.so.2.3 /lib/libcudart.so.2

可以檢查(option)
$emacs /etc/ld.so.conf
include /usr/local/cuda/lib

若32位元 include /usr/local/cuda/lib
若64位元 include /usr/local/cuda/lib64

可用以下程式測試。
用nvcc 編譯cuda 程式 number_add_1.cu。
如果CPU的執行結果和GPU相同,代表GPU成功運作。

$nvcc number_add_1.cu
$./a.out

number_add_1.cu程式碼:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <sys/time.h>
#include <iostream>
#include <iomanip>
using namespace std;
#define DATA_SIZE 1048576
int data[DATA_SIZE];

global static void sumOfSquares(int *num, int* result){

int sum = 0;
int i;
for(i = 0; i < DATA_SIZE; i++) {

sum += num[i] * num[i];

}

*result = sum;

}
void GenerateNumbers? (int *number ,int size){

int i;
for(i=0;i<size;i++){

number[i]=rand() % 10;
value = 0 to 9

}

}

double wallclock(void){

struct timeval tv;
struct timezone tz;
double t;

gettimeofday(&tv, &tz);
t = (double)tv.tv_sec*1000;
t += ((double)tv.tv_usec)/1000.0;

return t;

} millisecond

int main(){

cudaSetDevice(0);
set device number
GenerateNumbers?(data, DATA_SIZE);

int* gpudata,*result,sum;
double t1,t2;

cudaMalloc((void) &gpudata, sizeof(int) * DATA_SIZE);
cudaMalloc((void
) &result, sizeof(int));
cudaMemcpy(gpudata, data, sizeof(int) * DATA_SIZE,cudaMemcpyHostToDevice);

t1 = wallclock();

sumOfSquares<<<1, 1, 0>>>(gpudata, result);
cudaMemcpy(&sum, result, sizeof(int), cudaMemcpyDeviceToHost);

t2 = wallclock();

printf("Elapsed time = %f(ms) in GPU\n",t2-t1);

cudaFree(gpudata);
cudaFree(result);

printf("sum: %d\n", sum);

sum = 0;
for(int i = 0; i < DATA_SIZE; i++) {

sum += data[i] * data[i];

}
printf("sum (CPU): %d\n", sum);

}

Last modified 14 years ago Last modified on Jul 17, 2010, 10:29:31 PM

Attachments (6)

Download all attachments as: .zip