利用下班时间学完了 CUDA,Anyway 忙起来真的很大程度能缓解焦虑,能忘记和忽略很多烦恼。所以寻思着结合这一年来所学,写了一个简单的 CUDA 计算框架:CUFX。
目录结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| ├── CMakeLists.txt ├── README.md ├── build_run.sh ├── inc │ ├── data_type │ │ └── data_type.cuh │ ├── log │ │ └── log.cuh │ ├── matrix │ │ └── matrix.cuh │ └── operator │ └── external.cuh ├── priv │ ├── runtime │ │ ├── inc │ │ │ └── runtime_info.cuh │ │ └── src │ │ └── runtime_info.cu │ └── time │ └── inc │ └── clock.cuh ├── src │ ├── CMakeLists.txt │ ├── log │ │ └── log.cu │ ├── matrix │ │ └── matrix.cu │ ├── reductsum │ │ ├── inc │ │ └── src │ │ └── reduct_sum.cu │ └── transpose └── test ├── CMakeLists.txt ├── inc │ ├── compare.cuh │ └── testcase.cuh ├── main.cu └── testcase └── reduct_sum_testcase.cu
|
从上面的目录结构可以看出来这个计算框架分几大模块:
- inc 是声明的头文件,包括数据类型、矩阵、日志、算子等
- priv 是对内的头文件,运行时信息,计时函数等
- src 是所有的实现代码
- test 是测试代码,GPU 的执行结果和 CPU 进行比对
可以开发一些算子,比如高斯滤波,图像翻转等。那么这个框架就可以用于高性能计算的落地和部署了,比如:
1 2 3 4 5 6
| 1. 读取图片 2. 颜色变换 3. 图像翻转 4. 模型推理 5. 后处理 5. 结果输出
|
除了模型推理这一步,其余颜色变换、后处理都可以写一些 cuda 算子来进行加速和优化。或者,你可以把 CUFX 理解为一个 OpenCV,不过目前还没那么多功能和接口。
TODO
- 线程池,这个网上很多,可以实现后添加进去
- 内存池,对 CUFX 内部的内存进行管理,避免碎片化,打印内存使用详情等信息
- 可以添加一些优雅的 C++ 实现,比如最近在学模板的特化和偏特化,也许哪天就加进去了
- 一些高性能 cuda 算子,核心也是灵魂,写好需要花很多时间
如果我上学的时候会这些多好啊,我就慢慢的每天学习一些新知识,然后添加代码,面试还能吹牛逼。