0%

从今年春节回来到现在,经历了不少事情。暑期勉强打赢了“复活赛”,不过主包也快到残血状态了。现在终于能腾出点时间,好好学习一下。

有很多想学的东西,技术方向包括 vllm、deepspeed、大模型、CUDA、模型量化等;非技术方面,想学剪视频和修图——毕竟手里攒了一堆素材,哈哈哈,慢慢来吧。

今天想聊聊信号量,这也是我在新工作中遇到的实际场景。信号量本质上是一个变量,常用于多线程环境中的同步控制。举个例子:假设有两个线程 A 和 B,A 在处理临界资源,当满足某些条件时,它会释放锁并通知 B;而 B 完全没必要一直轮询 “A 做完了吗?”。这样既浪费资源,又不够优雅。

就用 C++ 代码告别吧:

1
2
3
auto others.todo = std::move(my.work);
phone.give_back() && permission.is_denied();
return 0;

离职不是失败,而是换了一种选择。 其实我一直在等,等 leader 说一句:jw 你最近经常不在工位,是不是有什么想法;等 leader 说一句我给你机会,你好好工作今年给你晋升。我想了很多回答,也许是顺从也许是争论,但直到离职那天也没等到。

最近这半年实在是闲,秉承着下班少玩手机的目的,7 月开始学 cuda,8 9 月学了 C++,10 月懈怠了一个月,11 月学了 cuda 进阶,12 月我来祸害 nndeploy 了。

一来是学完 C++ 后看下我能看懂的优秀的开源项目,一方面在之前学校训练模型感觉没意思,是看看 AI 的工程化。

利用下班时间学完了 CUDA,Anyway 忙起来真的很大程度能缓解焦虑,能忘记和忽略很多烦恼。所以寻思着结合这一年来所学,写了一个简单的 CUDA 计算框架:CUFX

对于 C++ 中的匿名函数,除了写 auto 外,还可以使用 std::function 作为类型接受匿名函数:

1
2
3
std::function<void(int)> func = [](int x) {
std::cerr << x << "\n";
};

问题来了,刚开始的时候我以为 std::function<void(int)> 就是匿名函数的返回类型,在 github 上给别人发送 PR 时就发生了笑话。

实际上这两个类型并不相同,function 是一个类型擦除容器,而 lambda 匿名类型简单来说就是重载了 operator() 的类。由于 std::function 有转换构造函数,lambda 表达式得以调用这个转换构造函数,构造出这一个 std::function对象,所以这个赋值发生了隐式类型转换。

在一些代码中,我们可能无法保留原有的数据类型,上面的匿名函数就是典型的例子。这个时候需要用一种通用的类型去使用它们,需要去掉对象原有的数据类型,也就是类型擦除 (Type Erasure)。

C++ 漫游的第一部分,起因源于项目中错误的使用 std::ref 和 std::fowrad 导致了一些神奇的 bug。而 std::ref 又涉及到了引用,左右值引用又会联想到移动语义,std::forward 又常用于模板。所以以此为契机,不如仔细学习一下 C++ 中的新特性。

2018 年计算机组成原理的大作业,五级流水不会写,三级流水写不出来。竟然没想不到多年后还会用到多级流水的思路去设计代码。