个人技术和科研历程

解决 Linux 下多用户使用 Nsight Compute 时的权限问题

2022/09/11

参考这里

echo 'options nvidia "NVreg_RestrictProfilingToAdminUsers=0"' >> /etc/modprobe.d/nsys.conf

然后重新加载 NVIDIA 驱动.

后续在使用过程中会出现 /tmp/nsight-compute-lock 文件存在导致其他用户想要使用 ncu 时必须删掉该文件 (多数情况下是没有权限的). 解决方法:

TMP=$HOME/tmp ncu ...

将 curl 交叉编译到 OpenWrt 上

2022/09/07

背景

实验室使用网络需使用个人账号密码在特定网页上进行验证, 在 OpenWrt 上可以使用 curl 进行验证. 但使用 opkg install curl 安装的 curl 需要使用 64bit libc 的 API, 而目前使用的架构 (mt7621) 是 32 位的架构, 因此需要使用交叉编译将 curl 编译到目标架构上.

Steps

  1. 下载交叉编译工具链
wget https://archive.openwrt.org/snapshots/trunk/ramips/mt7621/OpenWrt-Toolchain-ramips-mt7621_gcc-5.3.0_musl-1.1.16.Linux-x86_64.tar.bz2
tar -zxvf OpenWrt-Toolchain-ramips-mt7621_gcc-5.3.0_musl-1.1.16.Linux-x86_64.tar.bz2
  1. 设置环境变量:
export PATH=$HOME/tmp/openwrt-toolchain/toolchain-mipsel_1004kc+dsp_gcc-5.3.0_musl-1.1.16/bin:$PATH
export STAGING_DIR=$HOME/tmp/openwrt-toolchain
  1. 下载 curl 源码, 编译:
wget https://curl.se/download/curl-7.85.0.tar.gz
tar -zxvf curl-7.85.0.tar.gz
cd curl-7.85.0
LDFLAGS="-static" ./configure --build=x86_64-unknown-linux-gnu -host=mipsel-openwrt-linux-musl --without-ssl --without-zlib --prefix=$PWD/install --disable-shared --enable-static
make && make install

curl 的可执行文件将会被放到 install/bin, 可通过 file 查看其格式, 将其拷贝到路由器上执行即可.

macOS 小而美软件推荐

2022/08/21

关于 macOS 下效率软件推荐的文章已是恒河沙数, 本文将从另一个角度入手, 介绍一系列我本人正在使用且认为能够切实提高 “生产力” (当提到 Apple 产品时, 这个词貌似成了贬义词) 又小而美的软件.

支持正版软件从你我做起.

📅 Itsycal: 菜单栏日历显示

一款能在菜单栏显示日历事件的软件, 能够根据选择的日历显示将要到来的事件, 并且能够在软件界面直接向 Apple Calendar 中添加事件.

🏞 uPic

一款图片上传工具, 支持绑定快捷键快速从剪贴板上传图片, 配合 Typora 等支持图片自动上传的编辑器可大大提高写作体验.

此外, uPic 还支持适配 Amazon S3 接口的对象存储服务, 可以配合 BackBlaze ➕ Cloudflare 实现免费图床功能 (详见这篇博客).

⌨️ Input Source Pro

设置切换到不同软件时的默认输入法, 例如, 可以设置当切换到微信、Telegram 等聊天软件时, 自动启用到中文输入法; 当切换到 VSCode、CLion 等 IDE 时, 则默认设置为英文输入法, 省去了手动切换的烦恼 😣.

此外, Input Source Pro 还可设置在切换输入法时在鼠标旁显示当前输入法, 省去了👀眼睛往右上角菜单栏查看输入法的开销.

在现代 CMake 中使用 CUDA

2022/12/09

最近在尝试使用 NVIDIA A100 GPU 上的新特性,想使用 cmake 作为编译构建系统。

cmake 从 3.8 版本开始就将 CUDA 一等语言提供原生的支持,具体设置方法可以参考这两篇博客:

然后使用 CLion 等 IDE 打开项目,就能原生支持 CUDA 文件解析了。CLion 中如何添加 .cu 文件: https://www.jetbrains.com/help/clion/cuda-projects.html

Linux 特定内核版本安装 NV GPU 驱动失败

2022/12/09

将某台机器的内核版本从 4.9 升级到了 5.4.56.bsk.11-amd64, 升级完成后 NVIDIA GPU 驱动无法使用, 需要重新安装, 但通过 .run 文件默认安装方式进行安装时, 在编译 peermem.ko 内核模块时报错.

Workaround

原因是 NVIDIA 驱动不兼容某些特定版本的内核 (😓好吧…理解 Linus 的 F-word 了), 一种解决办法是将 run 文件解压, 手动手动编译其中的内核模块并加载, 最后再使用原始的 .run 文件安装除内核模块之外的部分.

bash .run -x
cd NVIDIA-Linux-Driverxxx/kernel
vim Makefile

将其中的 nvidia-modeset、 nvidia-drm 以及 nvidia-peermem 这三个需要现场编译的内核模块删掉, 然后执行:

make -j`nproc`
insmod ./nvidia.ko
insmod nvidai-uvm.ko

最后再通过 .run 文件安装其余部分:

bash .run --no-kernel-module

Drawbacks

上述两个内核模块无法在系统重启后自动加载, 可以通过将对应的 insmod 命令添加到 /etc/rc.local 文件中达到自动加载的功能.

NVIDIA H100 GPU 功能介绍

2022/12/09

英伟达在前不久 @March 21, 2022 发布了新一代数据中心 GPU 架构 GH100,相比于上一代 GA100 架构 (其实我才刚用上没多久) 新增了不少有趣的特性,本文记录了我阅读完白皮书的一些想法 💡。

从 SM 架构图上也能看出来,采用了 TSCM 新一代工艺的 GH100 拥有更多的 FP32 CUDA 核心以及更大的片上缓存,还有新一代的 Tensor Core,整个 GPU 上的晶体管数目达到了 800 亿。同时这也让 H100 的 TDP 从上一代的 400 W 来到了 700 W。

白皮书上宣称 H100 上 Tensore Core 的纸面性能比 A100 番了一番,还能通过调整 GPU 频率和利用混合精度达到最高 3 倍的吞吐量。此外,H100 上还支持新的浮点数据格式 FP8,又细分为两种:E4M3:4 exponent bits + 3 mantissa bits + 1 sign bit, E5M2:5 exponent bits + 2 mantissa bits + 1 sign bit.

毕设刚好涉及到了一点 [Needleman-Wunsch](https://zh.wikipedia.org/wiki/尼德曼-翁施算法) 算法,它正是利用了动态规划来求解两个序列的最佳匹配,在生物信息学上通常用于 DNA 或蛋白质的匹配。此外,还有注重序列局部比对的 [Smith-Waterman](https://zh.wikipedia.org/wiki/史密斯-沃特曼算法) 算法,也利用了动态规划来找出两个序列中具有高相似度的片段。此外,[Floyd-Warshall](https://en.wikipedia.org/wiki/Floyd–Warshall_algorithm) 算法也利用动态规划的思想解决图论中的多源最短路问题。

白皮书上说 H100 提供了一种新的指令能够加速动态规划算法的内层循环,从而达到最高 7 倍的加速比。不过目前没有相应的代码示例,暂时不知道这个新特性的价值以及该如何使用。

新的 GH100 架构在 thread block 和 grid 两个执行单元层级之间增加了新的一级:thread block cluster (TBC),在更大的粒度上提供了控制局部性的可能。

一个 TBC 是指与一组 SM 绑定的线程块,同时这些 SM 在硬件上相互接近,因此在同步和数据拷贝方面提供了协作的可能。

同一个 TBC 中的线程块能够读写其他 (SM 上的) 线程块中共享内存的数据,还支持原子操作。原理是一个 TBC 中所有线程块的共享内存地址被组织到了同一个寻址空间中。因此一个线程块访问另一个线程块中的数据无需绕道全局内存,可以通过 SM to SM Network 实现。DSMEM 的数据访存可通过简单的指针进行寻址。

CUDA 9.0 提出的协作组 (Cooperative Group) 机制提供了跨线程块执行同步的能力 (即网格级别的同步),H100 又提供了线程块间数据同步的能力,看起来 NVIDIA 是想打破线程块之间的壁垒。

NVIDIA 在 A100 引入了基于共享内存的异步内存拷贝机制,由 CUDA 线程发起异步内存拷贝请求,然后执行其他任务,等待拷贝完成后执行同步即可。H100 在此基础上新增了一个硬件单元 Tensor Memory Accelerator (TMA),它使得线程只需设置异步拷贝的描述符 (base_addr、 width、 height 等参数),至于内存寻址和数据移动等工作则全部由硬件单元代劳,可以说更大程度上解放了 CUDA 线程。

粤ICP备2021124244号-1