服务器

0. 前言

第一个思路是

  • 服务器OS->Docker Container->Ubuntu中运行GPGPU-Sim。
  • Docker Container update Docker Image->Docker Image->XXX.tar->复制到你的电脑Windows->复制到你的虚拟机Ubuntu->XXX.tar->Docker Image->Docker Container->Ubuntu中运行GPGPU-Sim->修改GPGPU-Sim
  • 然后同样使用上述过程移植到服务器,运行

这样是有问题的。首先这个过程没有意义,如果这样在你自己的虚拟机里面运行Docker, 那么仍然是命令行界面,和在服务器上运行的区别在哪?

这样实现了Docker的其中一个作用

  • 我在服务器上能跑,在我自己的虚拟机上也能跑。实现了在不同的环境下运行,而且无需安装多余的依赖。因为本质上我用的是 Docker 中的 Ubuntu 14
  • 但我没有实现自己的目的

我的目的是什么?

  • 在自己的Ubuntu上使用VScode修改模拟器,简单地编译测试性能。修改后需要跑大量benchmark, 这个时候我不能用自己的电脑跑了,我需要移植了。

  • 把跑benchmark需要用到的东西放在服务器上,用服务器的计算资源运行。需要用到的东西是什么?

    • benchmark: 一般是一些 .cu/.cl 代码编译后生成的可执行文件

    • 编译成功gpgpusim以后,实际上主要是生成了一个libcudart.so

      那么就需要这个 libcudart.so

  • 所以理论上来说如果我使用一台固定的服务器,好像不需要一直更新Docker?无需安装 gcc4.5.1, cuda4.2。每次把这几个文件拷贝过去即可。

0.1 测试

在 gpgpu-sim_distribution 目录下只放置 lib 文件夹

也是可以 Run 的,说明程序运行时只会 call libcudart.so 这个文件

修改 gpgpu-sim_distribution 文件夹的名字之后,ISPASS 中的 benchmark application 就还走不到 libcudart.so 文件了,这个应该和脚本写的文件路径有关

1. 虚拟机–Windows

都在脚本 d/gpgpusim/script/host2vbox.sh

1.1 从Windows到虚拟机

如果有这个必要的话,当然最好还是就在虚拟机里面直接编程。就是 VB 的虚拟机环境实在太慢了,后期思考一下解决方法

mv gpgpu-sim_distribution backup_gpgpu-sim_distribution
cp shared/gpgpu-sim_distribution ~/gpgpu-sim_distribution
cd ~/gpgpu-sim_distribution
source setup_environment release
make
make docs

1.2 从虚拟机到Windows

使用 Windows 和 VirtualBox 之间的共享文件夹,Win的共享文件夹放在 d/gpgpusim/pchsare.

将vbox虚拟机里编译好的/home/gpgpu-sim/gpgpu-sim_distribution/lib/gcc-4.6.4/cuda-4020/release/libcudart.so及其软链接 (这里是 libcudart.so2/3/4) 拷贝到 /home/shared/libsim, 将 /home/gpgpu-sim/cuda/toolkit/4.2/cuda/bin文件夹拷贝到 /home/shared/cuda, i.e. /home/shared/cuda/里只有一个bin文件夹

cp gpgpu-sim_distribution/lib/gcc-4.6.4/cuda-4020/release/* ~/shared/libsim/

2. 从 Windows 到服务器

此时 Win d/gpgpusim/pchsare 中已经有了 libsim, cuda 两个文件夹,直接通过 mobaxterm 拖拽上传到服务器 ~/huweim/gpgpusim 目录下即可

3. 从服务器到 Docker

3.1 挂载文件夹

已经在服务器上配置了可以运行GPGPU-Sim的Docker容器,且环境和编译GPGPU-Sim的虚拟机环境一致。把服务器上的外部文件夹挂载到Docker里面,

$ docker run --name gpgpusim -it -v /home/vsp/huweim/gpgpusim:/root/sim/ huweim/gpgpu-sim:v2 /bin/bash
#--name 给容器命名
#/home/huweim/gpgpusim:/home/sim/ 本地的绝对路径:容器的绝对路径
#huweim/gpgpu-sim:v2  镜像名:Tag 不指定Tag会尝试从Reposity pull latest, 因为是本地镜像没有远程reposity, 会报错,因此加上tag

3.2 在服务器上跑起来

$ cp ~/sim/libsim/* ~/gpgpu-sim_distribution/lib/gcc-4.4.7/cuda-4020/release/
$ cd ~/test
$ ~/ispass2009-benchmarks/bin/release/LPS | tee ~/output/LPS.log
$ ~/ispass2009-benchmarks/bin/release/RAY 4 4 | tee ~/output/RAY.log

4. 压榨性能

4.1 Shell 并发

wait 相当于 syncthread()

# !/bin/bash
for i in `seq 1 10` 
do
    echo $i &
done

wait
echo "----end----"

4.2 减少输出的屏幕

减少在屏幕上的输出是否能有优化呢?做一个时间测试

非引用,自己猜想。有一种把输出重定向到垃圾池 > /dev/null 的操作,是否可以看做为了减少输出到终端的开销而采取的方式。那么是不是可以说明输出到终端会造成开销。

改用重定向的方式而非 tee, 观察能够加速多少。测试总共6个比较快的benchmark

  • tee: 180s
  • > : 不到1s

看来终端打印的确开销很大啊

5. PTXPlus 支持

直接修改 gpgpusim.config 会报错

GPGPU-Sim PTX: ERROR ** could not execute $GPGPUSIM_ROOT/build/$GPGPUSIM_CONFIG/cuobjdump_to_ptxplus/cuobjdump_to_ptxplus _cuobjdump_2.ptx _cuobjdump_2.sass _cuobjdump_2.elf _ptxplus_pRcNmc

5.1 解决方法

  • src/cuda-sim/ptx_loader.cc 中,将 $GPGPUSIM_ROOT/build/$GPGPUSIM_CONFIG/cuobjdump_to_ptxplus/cuobjdump_to_ptxplus 修改为 cuobjdump_to_ptxplus
  • make 并生成相应的 libcudatr.so 文件,copy to Docker。将文件 gpgpusim-dev/build/gcc-4.4.7/cuda-4020/release/cuobjdump_to_ptxplus/cuobjdump_to_ptxplus 复制到 Docker /root/cuda/bin/ 文件夹下
  • 即每次 make,除了 copy lobcudart.so,还要 copy cuobjdump_to_ptxplus
    • 也有可能 copy 一次就行,猜测对 gpgpu-sim 的改动不会影响 cuobjdump_to_ptxplus
  • 给权限,chmod 777 ~/cuda/bin/cuobjdump_to_ptxplus
  • cd ~/test; ./ispass_run.sh MUM lrr;成功运行

Docker

0. 前言

编译在自己的虚拟机上完成,在服务器的 Docker 环境中运行。

1. Ubuntu20.04 in Docker

1.1 Pull

为了保证运行环境和编译环境一致,拉取 Ubuntu20.04 的 docker image。启动镜像的同时挂载上共享文件夹

$ docker pull ubuntu:20.04
$ docker run -it -v /home/vsp/huweim/gpgpusim:/root/share ubuntu:20.04 /bin/bash

1.2 工作文件

进入 /root 目录,需要一个 library 文件夹用来放 动态链接库 (libcudart.so),然后把自己的工作目录 test 拷贝到 /root 目录

$ mkdir library
$ mkdir test
$ cp ~/share/libsim/lib* ~/library
$ cp ~/share/test.tar ~/
$ tar -xvf ~/share/test.tar -C ~/test

1.3 环境

1.3.1 安装 vi, make

$ apt-get update
$ apt-get install vim
$ apt-get install make

1.3.2 LD_LIBRARY_PATH

LD_LIBRARY_PATH 这个系统变量需要指向动态链接库所在的文件夹

$ vi ~/.bashrc
#添加一行 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/library
$ source ~/.bashrc

尝试运行 shared_matrix,发现还缺少 libGL.so.1

linux-vdso.so.1 (0x00007fff8ecfb000)
libcudart.so.4 => /root/library/libcudart.so.4 (0x00007f68b3596000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f68b33b2000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f68b3263000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f68b3248000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f68b3056000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f68b303a000)
libGL.so.1 => not found	#缺少这个
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f68b3015000)
/lib64/ld-linux-x86-64.so.2 (0x00007f68b395b000)

1.3.3 libGL.so.1

$ apt install libgl1-mesa-glx
$ ldd hello
        linux-vdso.so.1 (0x00007ffdf7743000)
        libcudart.so.4 => /root/library/libcudart.so.4 (0x00007fa0358cd000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa0356e8000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa035599000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa03557e000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa03538c000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fa035370000)
        libGL.so.1 => /lib/x86_64-linux-gnu/libGL.so.1 (0x00007fa0352e6000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa0352c3000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa035c92000)
        libGLdispatch.so.0 => /lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007fa03520b000)
        libGLX.so.0 => /lib/x86_64-linux-gnu/libGLX.so.0 (0x00007fa0351d7000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa0351d1000)
        libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007fa035092000)
        libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fa035068000)
        libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007fa035062000)
        libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fa03505a000)
        libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007fa035040000)

不过运行时还是有问题,看来还是需要把 CUDA 文件夹拷贝过来

1.3.4 拷贝 cuda 文件夹

$ cd ~
$ mkdir cuda
$ cp -r ~/share/cuda/bin/ ~/cuda/
$ vi ~/.bashrc
#添加
# export CUDA_INSTALL_PATH=/root/cuda/
# export PATH=$PATH:/root/cuda/bin/
$ source ~/.bashrc
#给权限
$ chmod +x /root/cuda/bin/*
$ 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
$ ./hello 
#这个时候运行 hello 程序已经可以了

1.3.5 ISPASS'09 ❗ 其实无需编译只需运行

2021-11-02 14:03:43,好像又不需要这一步了,我不用再编译一次 ISPASS benchmark,直接运行即可。那就不要这一步,越简单越好

不过 SDK 也可以放在那里

这个 benchmark 拷贝过来,猜测还需要配置 NVIDIA_COMPUTE_SDK_LOCATION 的路径,还是拷贝过来即可。SDK 文件比较大

$ cp ~/share/sdk.tar ~/
$ cp ~/share/ispass2009-benchmarks.tar ~/
$ mkdir ~/cuda/sdk
$ mkdir ~/ispass2009-benchmarks
#tar 没有解压同时新建文件夹的选项
$ tar -xvf ~/sdk.tar -C ~/cuda/sdk
$ tar -xvf ~/ispass2009-benchmarks.tar -C ~/ispass2009-benchmarks
#设置 NVIDIA_COMPUTE_SDK_LOCATION 的路径
$ vi ~/.bashrc
#添加
# export NVIDIA_COMPUTE_SDK_LOCATION=/root/cuda/sdk/4.2
$ source ~/.bashrc

1.4 备份可以成功运行的容器

1.4.1 导出容器

根据制作好的容器 ID 5c4152ae7b05 到处。大小也就是1G,非常轻便

$ docker export 5c4152ae7b05 > ubuntu_gpgpusim.tar

这里备份压缩包即可,下次更换环境时只需将压缩包再次导入为镜像