利用下班时间学完了 CUDA,Anyway 忙起来真的很大程度能缓解焦虑,能忘记和忽略很多烦恼。所以寻思着结合这一年来所学,写了一个简单的 CUDA 计算框架:CUFX。
重返C++:C++ 类型擦除
本文字数: 6k 阅读时长 ≈ 5 分钟
对于 C++
中的匿名函数,除了写 auto
外,还可以使用 std::function
作为类型接受匿名函数:
1 | std::function<void(int)> func = [](int x) { |
问题来了,刚开始的时候我以为 std::function<void(int)>
就是匿名函数的返回类型,在 github
上给别人发送 PR
时就发生了笑话。
实际上这两个类型并不相同,function
是一个类型擦除容器,而 lambda
匿名类型简单来说就是重载了 operator()
的类。由于 std::function
有转换构造函数,lambda
表达式得以调用这个转换构造函数,构造出这一个 std::function
对象,所以这个赋值发生了隐式类型转换。
在一些代码中,我们可能无法保留原有的数据类型,上面的匿名函数就是典型的例子。这个时候需要用一种通用的类型去使用它们,需要去掉对象原有的数据类型,也就是类型擦除 (Type Erasure)。
重返C++:从 ref 挖到移动语义,在从 forward 挖到可变参数模板
本文字数: 13k 阅读时长 ≈ 12 分钟
C++ 漫游的第一部分,起因源于项目中错误的使用 std::ref 和 std::fowrad 导致了一些神奇的 bug。而 std::ref 又涉及到了引用,左右值引用又会联想到移动语义,std::forward 又常用于模板。所以以此为契机,不如仔细学习一下 C++ 中的新特性。
任务流水:加快程序运行和减少内存占用我全都要
本文字数: 2.3k 阅读时长 ≈ 2 分钟
2018 年计算机组成原理的大作业,五级流水不会写,三级流水写不出来。竟然没想不到多年后还会用到多级流水的思路去设计代码。
移动端算法优化
本文字数: 8.3k 阅读时长 ≈ 8 分钟
移动端算法优化是个很庞大的话题。从计算机体系到指令,涉及到非常广而深的东西。本文尝试以常见的算法为例,阐述算法在单线程场景下的加速与优化,多线程是最后的收尾,没啥可说的。而至于具体的场景,如金字塔、滤波、降噪等,优化的思路都是相同的:减少 IO,一次 IO 完成尽可能多的计算。
本文会使用 Neon, OpenCL
来优化算法,如果有可能也会引入 DSP
。本文持续更新,整理算法优化相关的经验。额外的,确保打开了 O3
编译选项,打开 release
模式等,否则会影响算法的执行时间。
C 语言中的黑魔法:宏
本文字数: 9.1k 阅读时长 ≈ 8 分钟
之前对 C
语言中宏定义的认知十分简单,包括但不限于停留在以下浅薄的层面:
1 | #define PI 3.14 |
上述代码完全是大学课本中的用法。但当我看到实际项目中宏的用法后完全是一头雾水,所以自己也要写出那种高逼格让别人看不太懂的代码。宏远远比我想象的要强大,所以本文为每个宏技巧都配备了一个实用场景。
- 字符串化操作符,实现一个简单的自动化测试样例
- 字符串连接,实现一个具备计时功能的宏
- X 宏,实现根据输入执行不同的函数
- 特殊宏
__VA_ARGS__
,实现一个简单的日志函数
一次不太愉快的软件开发
本文字数: 1.6k 阅读时长 ≈ 1 分钟
整体的开发感受是:缺乏一个合理的、完整的软件开发流程或规范。