参考这里
echo 'options nvidia "NVreg_RestrictProfilingToAdminUsers=0"' >> /etc/modprobe.d/nsys.conf
后续在使用过程中会出现 /tmp/nsight-compute-lock
文件存在导致其他用户想要使用 ncu
时必须删掉该文件 (多数情况下是没有权限的). 解决方法:
TMP=$HOME/tmp ncu ...
参考这里
echo 'options nvidia "NVreg_RestrictProfilingToAdminUsers=0"' >> /etc/modprobe.d/nsys.conf
后续在使用过程中会出现 /tmp/nsight-compute-lock
文件存在导致其他用户想要使用 ncu
时必须删掉该文件 (多数情况下是没有权限的). 解决方法:
TMP=$HOME/tmp ncu ...
实验室使用网络需使用个人账号密码在特定网页上进行验证, 在 OpenWrt 上可以使用 curl
进行验证.
但使用 opkg install curl
安装的 curl
需要使用 64bit libc 的 API, 而目前使用的架构 (mt7621) 是 32 位的架构, 因此需要使用交叉编译将 curl
编译到目标架构上.
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
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
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 下效率软件推荐的文章已是恒河沙数, 本文将从另一个角度入手, 介绍一系列我本人正在使用且认为能够切实提高 “生产力” (当提到 Apple 产品时, 这个词貌似成了贬义词) 又小而美的软件.
支持正版软件从你我做起.
一款能在菜单栏显示日历事件的软件, 能够根据选择的日历显示将要到来的事件, 并且能够在软件界面直接向 Apple Calendar 中添加事件.
一款图片上传工具, 支持绑定快捷键快速从剪贴板上传图片, 配合 Typora 等支持图片自动上传的编辑器可大大提高写作体验.
此外, uPic 还支持适配 Amazon S3 接口的对象存储服务, 可以配合 BackBlaze ➕ Cloudflare 实现免费图床功能 (详见这篇博客).
设置切换到不同软件时的默认输入法, 例如, 可以设置当切换到微信、Telegram 等聊天软件时, 自动启用到中文输入法; 当切换到 VSCode、CLion 等 IDE 时, 则默认设置为英文输入法, 省去了手动切换的烦恼 😣.
此外, Input Source Pro 还可设置在切换输入法时在鼠标旁显示当前输入法, 省去了👀眼睛往右上角菜单栏查看输入法的开销.
最近在尝试使用 NVIDIA A100 GPU 上的新特性,想使用 cmake 作为编译构建系统。
cmake 从 3.8 版本开始就将 CUDA 一等语言提供原生的支持,具体设置方法可以参考这两篇博客:
然后使用 CLion 等 IDE 打开项目,就能原生支持 CUDA 文件解析了。CLion 中如何添加 .cu
文件:
https://www.jetbrains.com/help/clion/cuda-projects.html
将某台机器的内核版本从 4.9 升级到了 5.4.56.bsk.11-amd64, 升级完成后 NVIDIA GPU 驱动无法使用, 需要重新安装, 但通过 .run 文件默认安装方式进行安装时, 在编译 peermem.ko 内核模块时报错.
原因是 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
上述两个内核模块无法在系统重启后自动加载, 可以通过将对应的 insmod
命令添加到 /etc/rc.local
文件中达到自动加载的功能.
英伟达在前不久 @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 线程。