0%

CUFX(CUDA Framework eXtended): CUDA 计算框架

利用下班时间学完了 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                                      # 根目录 CMakeLists.txt
├── README.md
├── build_run.sh # 编译运行脚本
├── inc # 外部接口,外部可见
│ ├── data_type # 数据类型
│ │ └── data_type.cuh
│ ├── log # 日志声明
│ │ └── log.cuh
│ ├── matrix # 矩阵声明
│ │ └── matrix.cuh
│ └── operator # cuda 算子
│ └── 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

  1. 线程池,这个网上很多,可以实现后添加进去
  2. 内存池,对 CUFX 内部的内存进行管理,避免碎片化,打印内存使用详情等信息
  3. 可以添加一些优雅的 C++ 实现,比如最近在学模板的特化和偏特化,也许哪天就加进去了
  4. 一些高性能 cuda 算子,核心也是灵魂,写好需要花很多时间

如果我上学的时候会这些多好啊,我就慢慢的每天学习一些新知识,然后添加代码,面试还能吹牛逼。

感谢上学期间打赏我的朋友们。赛博乞讨:我,秦始皇,打钱。

欢迎订阅我的文章