总结自己的基于gpu的异构程序开发流程

来源:互联网 发布:mysql 5.7 key buffer 编辑:程序博客网 时间:2024/05/17 08:26

 

异构程序开发的特点决定了开发与传统开发手段还是有一些列不同的,通俗的说有一定的讲究。针对本项目,本章列出几条重要的值得注意的地方,从开发过程上指导整个流程,以保证程序的质量+和优化。对异构程序的开发,针对自己的开发业务,简单的叙述整个开发流程如图:

这个过程文字叙述为:

过程1:数据准备

准备需要处理的业务的原始数据,比如你的数据来源为mysql或者app或者mongodb或者其他的,通常为了测试,我都会写一个生产随即浮点数的函数来模拟自己的项目

过程2:业务逻辑设计

更加业务需求的功能,设计业务层的类,投资组合类大体上有4个功能,每个功能直接又是有依赖关系的,这个过程产生的软件产品是——类图。

过程3:业务逻辑实现

指的是在CPU中实现,可以被其他APP调用的接口;我建议将可并行和非可并行的事物逻辑都封装在这个业务类中,如果有并行的处理模块,在下一个软件过程中处理。这个过程产生的软件产品是——类的.h.cpp。我时刻提醒自己——不急于求成并行模块的内核程序书写。

过程4:数据词典设计

为什么把这个过程放在这个地方,其实是不对的,因为数据从数据库中出来,到最后计算出来的数据存入数据库,这个整个过程都涉及到的东西,不应该放到这个地方。就像图中表示的一样,数据词典贯穿始终。

但是,放在这个过程中是有一定意义的,因为一个数据块放到一个gpu中进行并行计算,并且要从设备中拷贝出来,一个好的数据类型,对设备与主机传递的带宽和设备内存的使用都是具有重要意义的。很简单的说,谁都不愿意把一群没计算意义的string类型的字符串拷贝到gpu中,只作为标示一个计算结果的id来用,对吧。所以,数据词典设计也是一个迭代的过程,开发过程中发现数据词典可以优化,尽量优化!

数据词典的设计,原则是以设备gpu为服务对象,青睐设备原则。

何谓轻重之分,数据词典的设计,在异构开发中显得很重要。我们不求一步到位,但求改进。

过程5:内核程序设计

内核程序就是在gpu上开发的并行计算程序。

过程3中如果某个功能模块发现并行粒度很大,那么,我们要开始做真正有意义的事情了。

为了强调程序架构的清晰——

我们先建立.cuh文件,声明要并行计算的功能模块,注意,我们过程3中的业务功能只需要包含这个.cuh文件,就可以调用封装好的并行计算模块啦。

接着我们建立.cu文件,注意,所有内核操作的符号,必须在cu文件中实现。我们在cu文件中实现内核函数,处理并行的数据。

是的,内核程序我们不要嫌多写个头文件,多一个头文件,对于程序的架构是很有帮助的,工程化!

过程6:迭代优化

这里有两个意义上的优化:

第一,我们始终不能忘记业务上是否还可以进一步的优化;

第二,我们最期待的内核程序算法上的优化。

也许第二个是我们会更加有挑战,很简单的例子,我的排序算法就是比你的排序算法高级、快速;或者我的程序就是比你的程序使用的内存少、指令吐量大。我们在开发内核程序时,尽量不要浪费内核的资源,更杜绝可能的情况下内存越界和显露,这个后果不是软件崩溃,而是系统蓝屏!

最后一条,图中没有加,就是每一个版本,我们都保存记录,分析效率,作为自己优化程序的阶段性产品。我试图从cpu到gpu的每个版本都进行了版本定稿,这样,整个过程将是有趣的,我看到每个版本都在提升,会很得意。是的,原来——

我提醒自己注意,异构程序,步步为营,一步一个版本,逐个比较,稳定提高效率和质量!

原创粉丝点击