0%

下面的代码继承了 std::streambuf 改变了 ostream 的行为,并自定义了打印操作将结果送到 stdout,而不是 std::cout 中(当然也可以更改逻辑修改打印的细节)。

其中的 print 函数是仿 C++23 std::print 的,功能仅仅是打印参数,在笔记 实现简单的花括号插值打印 中实现。

struct membuf : std::streambuf {
    membuf(char *p, size_t n) {
        setg(p, p, p + n);  // set read pointers
        setp(p, p + n);
    }

    void flush() {
        auto p = pbase(), e = pptr();
        fwrite(p, 1, e - p, stdout);
        setp(p, e);  // reset write pointers
    }

   private:
    int overflow(int c) override {
        flush();
        if (c != '\0') fputc(c, stdout);
        return c;
    }
};

// A little slower since we have to maintain a different buffer.
template <class... Ts>
void print_stdout(const char *s, Ts... args) {
    char buf[512];
    membuf mbuf(buf, sizeof(buf));
    std::ostream os(&mbuf);
    print(os, s, args...);
    mbuf.flush();
}

https://developer.nvidia.com/blog/cuda-pro-tip-understand-fat-binaries-jit-caching/

CUDA 程序有两种代码:一是设备无关的 PTX,二是设备有关的二进制代码。在运行之前将 PTX 编译成二进制代码就是 JIT 过程。(当然,nvcc 会在文件系统里面存储 cache。)用 -arch=sm_xx 可以只为给定的架构编译,从而运行时不需要 JIT 这一步。

禁用 cache(不允许本次运行读取和写入 cache):

export CUDA_CACHE_DISABLE=1

然后分别使用 -arch=native 选项和不使用,可以明显感受到程序在启动速度上的差别。

格式解析

根据维基百科,deb 包是一个标准的 ar 归档。

因此,对于 Modern CMake for C++ 中示例代码用 CPack 创建的包 CPackPackage-1.2.3-Linux.deb,可以直接解压。

ar x CPackPackage-1.2.3-Linux.deb

解压可以得到三个东西:

.
├── control.tar.gz
├── data.tar.gz
└── debian-binary

tar 的时候可以指定压缩,要注意打包的时候如果用了压缩,解包的时候需要用同样的算法来解压。这个并不是自动识别的。比如:

tar -zcf xxx.tar.gz files 对应于 tar -zxf xxx.tar.gz

而且,如果不压缩就不要用 .tar.gz 来命名,而是用 .tar。(如果是其他压缩格式就用其他的命名方式。)

tar -C targetFolder ... 可以将文件解压到目标目录,但是要求目标目录首先存在。tar 命令不会帮助我们创建目录。

下载整个站点

# https://stackoverflow.com/a/11514515/
wget -r -p -np -k ${URL}

感觉 CMake 的语法不是很容易格式化,感觉怎么都别扭。现在我看到一种格式的思路比较好,就是把命令的每个选项都当成 yaml 配置文件去写,比如:

install(FILES
    src/include/calc/calc.h
    src/include/calc/nested/calc_extended.h
  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/calc
)

这种列表就换行+缩进。

find-exec 选项中,以 ; 结尾(注意 shell 转义)是对每个文件单独运行命令。而 + 结尾是对所有文件用 xargs 的形式运行命令。可以从以下例子看出:

$ find . -name '*.cu' -exec echo {} +
./basic_interop.cu ./ripple.cu ./heat.cu
$ find . -name '*.cu' -exec echo {} \;
./basic_interop.cu
./ripple.cu
./heat.cu

-depth 选项让 find 以深度优先的顺序访问文件,这样文件夹就一定比其包含的子文件后访问,这对于删除等工作非常重要。

find 有一些 global options,要在正确位置使用,不清楚可以 man find 查一下。比如 -mindepth-maxdepth-depth 都是 global options。

To prevent confusion, global options should specified on the command-line after the list of start points, just before the first test, positional option or action.

默认的是 emacs 模式的行编辑。

ctrl _          yank
ctrl y          yank
ctrl /          undo
alt  f          word-level forward
alt  b          word-level backward
alt  d          word-level delete      这个可能会更好用,因为 d 按键更近
alt  backspace  word-level backspace

LLVM 项目中有个文件:.git-blame-ignore-revs

说明是:

# Since version 2.23 (released in August 2019), git-blame has a feature
# to ignore or bypass certain commits.
#
# This file contains a list of commits that are not likely what you
# are looking for in a blame, such as mass reformatting or renaming.
# You can set this file as a default ignore file for blame by running
# the following command.
#
# $ git config blame.ignoreRevsFile .git-blame-ignore-revs

这个文件可以指定要在 blame 时忽略的那些提交(比如对工程整体的格式化)。因为 git 配置是本地的,所以需要手动跑一次。

可能是因为上次对 wsl2 vdisk compact 之后造成的?还是因为升级之后造成的?

尝试过以下方法:

  • 删除 ~/.vscode 和 ~/.vscode-server 里面的所有东西然后重新下载。不行。
  • 禁用所有扩展,不行。

发现在 vscode 的终端使用 code 打开文件夹就有问题,但是在 code 之外的终端用 code 命令就没有问题。一看在 vscode 终端中的 code 命令竟然还是 windows 文件系统中的 code 命令,并不是 vscode-server 提供的 code 命令。

后来发现是我在 ~/.bashrc 中提供了 CLEAN_PATH(一个我预设的包含了大多数重要路径的 PATH),本来是想要解决多次载入 ~/.bashrc 因此 PATH 被反复追加的问题,但是这也让 vscode-server 设置好的 PATH 丢失了。同时我还在 PATH 的前面添加了 windows 文件系统的 code 命令,而不是在后面追加,这也是有问题的地方。