抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

环境

  • ubuntu18.04
  • cuda11
  • gcc5.5

流程

安装依赖, 安装gcc5

GPGPU-sim所需的依赖如下

GPGPU-Sim dependencies:

1
sudo apt-get install build-essential xutils-dev bison zlib1g-dev flex libglu1-mesa-dev

GPGPU-Sim documentation dependencies:

1
sudo apt-get install doxygen graphviz

AerialVision dependencies:

1
sudo apt-get install python-pmw python-ply python-numpy libpng12-dev python-matplotlib

CUDA SDK dependencies:

1
sudo apt-get install libxi-dev libxmu-dev libglut3-dev

安装gcc, 这里使用gcc-5和g++-5, 高版本可能会在执行时seg fault

1
sudo apt install gcc-5 g++-5

修改系统gcc版本, 添加到可用项, 最后的100表示优先级(越大优先级越高)适用于自动模式

1
2
3
4
5
6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100

# 删除用
sudo update-alternatives --remove /usr/bin/gcc gcc /usr/bin/gcc-5 100
sudo update-alternatives --remove /usr/bin/g++ g++ /usr/bin/g++-5 100

选择版本

1
2
sudo update-alternatives --config gcc
sudo update-alternatives --config g++

此时gcc和g++的默认版本应该是5: gcc -v

高版本ubuntu装gcc5

  1. 加软件源vim /etc/apt/sources.list
    1
    2
    deb http://dk.archive.ubuntu.com/ubuntu/ xenial main
    deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe
  2. 包管理器更新数据sudo apt update
  3. 安装sudo apt install gcc-5 g++-5
  4. 根据上述步骤调整主次

安装CUDA和驱动

官网下载安装程序

下载CUDA安装包

1
wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cuda_11.1.0_455.23.05_linux.run

执行安装, 记得参数指定安装驱动和其他工具

1
2
chmod +x cuda_11.1.0_455.23.05_linux.run
sudo ./cuda_11.1.0_455.23.05_linux.run --silent --verbose --driver --toolkit --samples

键入accept后, 仅选择安装Toolkit即可。之后cuda会安装到/usr/local/cuda。不同版本cuda的安装路径不同, 可以使用sudo find / -name "nvcc"命令查找一下。

ref

安装GPGPU-sim

下载GPGPU-sim源代码

1
2
git clone https://github.com/gpgpu-sim/gpgpu-sim_distribution
cd gpgpu-sim_distribution

配置环境, 让gpgpu找到cuda, 可以在gpgpu-sim_distribution/setup_environment文件的开头添加

1
2
3
4
# setup_environment
export CUDA_INSTALL_PATH=/usr/local/cuda
export PATH=$CUDA_INSTALL_PATH/bin:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64

执行安装

1
2
source setup_environment
make -j $(nproc)

测试程序

创建目录

1
2
mkdir test
vim test/test.cu

编辑测试程序test.cu: 对0..31逐个加1, 输出1..32

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// test.cu
#include<stdio.h>
#include<cuda.h>

typedef double FLOAT;
__global__ void sum(FLOAT *x) {
int tid = threadIdx.x;
x[tid] += 1;
}

int main() {
int N = 32;
int nbytes = N * sizeof(FLOAT);

FLOAT *dx = NULL, *hx = NULL;
int i;
// 申请显存
cudaMalloc((void**)&dx, nbytes);

// 申请成功
if (dx == NULL) {
printf("GPU alloc fail");
return -1;
}

// 申请CPU内存
hx = (FLOAT*)malloc(nbytes);
if (hx == NULL) {
printf("CPU alloc fail");
return -1;
}

// init: hx: 0..31
printf("hx original:\n");
for(int i=0;i<N;i++) {
hx[i] = i;
printf("%g\n", hx[i]);
}

// copy to GPU
cudaMemcpy(dx, hx, nbytes, cudaMemcpyHostToDevice);

// call GPU
sum<<<1, N>>>(dx);

// let gpu finish
cudaThreadSynchronize();

// copy data to CPU
cudaMemcpy(hx, dx, nbytes, cudaMemcpyDeviceToHost);

printf("hx after:\n");
for(int i=0;i<N;i++) {
printf("%g\n", hx[i]);
}
cudaFree(dx);
free(hx);
return 0;
}

拷贝gpgpu-sim配置文件到当前工程, 配置顾名思义是某些型号显卡的模拟

1
2
cd test
cp ../gpgpu-sim_distribution/configs/tested-cfgs/SM2_GTX480/* ./

编译运行

1
2
nvcc --cudart shared -o test test.cu
./test

这里指定cudart库是动态链接的, 有因为sourcet setup_environment配置了动态链接的方法, 使用ldd工具看到编译后的二进制使用的是gpgpu-sim提供的动态库:

1
libcudart.so.11.0 => /home/ub/gpgpu-sim_distribution/lib/gcc-5.5.0/cuda-11010/release/libcudart.so.11.0 (0x00007f7d44ae4000)

TODO:

之后运行测试程序前记得要source setup_environment, 它会配置动态链接的一些设置

  • gcc-5.4编译不行❌
  • gcc-9编译不行❌, 编译出来seg fault
  • gcc-5.5编译行✅

其他

  • 目前gpgpu-sim 4.0没有支持cudaMallocManaged

评论