CUDA从入门到放弃.md

Install

Environment

  • system 105.4.15-2-MANJARO
  • kernel 5.4.0
  • cuda 10.2
  • bumblebee 3.2.1-22
  • GPU: NVIDIA GP107M [GeForce GTX 1050 Ti Mobile]
  • Driver: nvidia 440.44

install

  • 推荐直接从pacman中安装,
    1
    2
    3
    sudo pacman -S nvidia bumblebee cuda
    reboot
    nvidia-smi //test
  • 不推荐从官网下载.run文件安装(因为我装炸了)

Tag

  • 注意显卡驱动的版本与cuda版本的对应,430对应10.1,440对应10.2
  • 使用.run安装的时候注意gcc的版本,10.2应该用gcc-7安装
  • 修改gcc版本时应该將g++版本一并修改,否则会报错(.run安装)
  • 所以说pacman是个好文明

Basic

Step

  • malloc memory
  • calculate
  • free memory

Structure

  • Grid
  • Block
  • Thread

example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>

#define COUNT 2

__global__ void add(int *a, int *b, int *c){
int idx = threadIdx.x;
c[idx] = a[idx] + b[idx];
}

int main(){
int a[COUNT]={1,2};
int b[COUNT]={3,4};
int c[COUNT]={0};

int* d_a = NULL;
int* d_b = NULL;
int* d_c = NULL;


// Step 1 malloc
cudaMalloc(&d_a, COUNT * sizeof(int));
cudaMalloc(&d_b, COUNT * sizeof(int));
cudaMalloc(&d_c, COUNT * sizeof(int));

// Step 2 calculate
cudaMemcpy(d_a, a, COUNT * sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(d_b, b, COUNT * sizeof(int), cudaMemcpyHostToDevice);
cudaMemset(d_c, 0, COUNT * sizeof(int));

add<<<1,COUNT>>>(d_a, d_b, d_c);

cudaDeviceSynchronize(); // sync
cudaMemcpy(c, d_c, COUNT * sizeof(int), cudaMemcpyDeviceToHost);

// Step 3 free
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);

for(int i = 0; i < COUNT;i ++){
printf("%d ",c[i]);
}
printf("\n");

}

Execute

1
2
nvcc example.cu -o a.out
./a.out

Tag

  • cudaDeviceSynchronize()用于GPU的执行同步
  • __ global __ 表示必须由CPU调用,GPU执行,调用方式为 func<<<grid,thread>>>()
  • __ device __ 表示由GPU中一个线程调用的函数
  • __ host __ 表示CPU调用函数,CPU执行函数,一般省略。