Kom i gang med CUDA på Ubuntu

Kom i gang med CUDA på Ubuntu

Wed 20 February 2013

I denne artikkelen tar jeg en rask gjenomgang av hva som måtte til for å kompilere mitt første cuda program på Ubuntu 12.10 Quantal. Om du ikke har nvidia kort i maskinen din så er det ikke mer å hente her. Men tips meg gjerne om en tilsvarende guide for OpenCL.

1: Installere diverse greier. Dette er klipp og lim kommandoer stort sett.

$ sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev

$ sudo apt-get install nvidia-cuda-*

$ sudo apt-get install nvidia-current

2: Sett opp stier til biblioteker.

$ vi ~/.bash_profile

Legg inn følgende to linjer:

export LD_LIBRARY_PATH=/usr/lib32/nvidia-current:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/lib/nvidia-current:$LD_LIBRARY_PATH

Om du bruker noe annet for å sette miljøvariabler må du justere så du får det riktig for ditt oppsett.

3: Verifiser oppsettet ditt.

$ printenv | grep LD_
LD_LIBRARY_PATH=/usr/lib64:/usr/lib:

Sjekk at du har nvidia c compileren i pathen din:

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2012 NVIDIA Corporation
Built on Thu_Apr__5_00:24:31_PDT_2012
Cuda compilation tools, release 4.2, V0.2.1221

Om den mangler må du finne den:

$ whereis nvcc
nvcc: /usr/bin/nvcc /etc/nvcc.profile /usr/bin/X11/nvcc

4: Kode kode kode.

For å teste at tingene i det hele tatt fungerer trenger vi en fil som vi kan kompilere. Vi går for en standard "hello world cuda" tilnærming, og jeg kom heldigvis over en på dette nettstedet: http://computer-graphics.se/hello-world-for-cuda.html

Denne er skrevet av Ingemar Ragnemalm 2010, og gjør ikke så mye annet en å initiere et par minneallokeringer (cudaMalloc) samt noe kopiering til og fra host (cudaMemcpyHostToDevice og cudaMemcpyDeviceToHost).

// This is the REAL "hello world" for CUDA!
// It takes the string "Hello ", prints it, then passes it to CUDA with an array
// of offsets. Then the offsets are added in parallel to produce the string "World!"
// By Ingemar Ragnemalm 2010

#include <stdio.h>

const int N = 16;
const int blocksize = 16;

__global__
void hello(char *a, int *b)
{
a[threadIdx.x] += b[threadIdx.x];
}

int main()
{
char a[N] = "Hello \0\0\0\0\0\0";
int b[N] = {15, 10, 6, 0, -11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

char *ad;
int *bd;
const int csize = N*sizeof(char);
const int isize = N*sizeof(int);

printf("%s", a);

cudaMalloc( (void**)&ad, csize );
cudaMalloc( (void**)&bd, isize );
cudaMemcpy( ad, a, csize, cudaMemcpyHostToDevice );
cudaMemcpy( bd, b, isize, cudaMemcpyHostToDevice );

dim3 dimBlock( blocksize, 1 );
dim3 dimGrid( 1, 1 );
hello<<<dimGrid, dimBlock>>>(ad, bd);
cudaMemcpy( a, ad, csize, cudaMemcpyDeviceToHost );
cudaFree( ad );
cudaFree( bd );

printf("%s\n", a);
return EXIT_SUCCESS;
}

Klipp og lim koden over inn en fil som du kallar hello.cu.

5. Kompiler, link og kjør.

Kompiler og link:

$ nvcc -L /usr/lib/nvidia-current/ -lcudart -o hello hello.cu

Verifiser resultatet:

$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x73adbc182971258e21554393d9e687908fa1d028, not stripped

Kjør show:

$ ./hello
Hello World!

6. Konklusjon.

Det å få CUDA til å kjøre på Ubuntu 12.10 er egentlig ikke så vanskelig, men jeg brukte litt tid på å finne ut hvor biblioteker og diverse var. Følger man de uttaliige oppskrifter på nettet vil de fleste henvise til andre stier som ikke fungerer på Ubuntu 12.10 Quantal.

Det er også mange guider på hvordan man skal få CUDA 5 til å fungere på Ubuntu 12.10 Quantal, men dette fikk jeg ikke til. Jeg endte opp med et ubrukelig system som måtte fikses via text-mode i GRUB. CUDA 5 er foreløbig ikke offisielt støttet på Ubuntu heller, men for å lære seg CUDA fungerer vesjon 4 like så bra vil jeg tro.