利用ChatGPT来加速对简单图形算法的CUDA加速与多线程实现
前言
大概是两年前实现过一个景深融合的算法,当时C++的功底很差,属于多线程用起来都需要百度辅助的人,算法也是现成的,只是是Matlab实现的,我只需要转成OpenCV实现就可以了,当时用了快一个月,走错了不少弯路,比如切分图像,然后通过计算图像清晰度,拆出来最清晰的图像,然后高斯金字塔实现图像融合,效果很差,融合的边缘效果也不好,图像之间的亮度不同。
最后实现的时候,也没有能够理解他的数学原理,只是大概记得求均值,求最优点,叠加,计算的过程是通过对点阵运算的1:1仿真实现的,主要的转换内容是在两个深夜,喝着咖啡,听着音乐,就这么出来。余下的时间基本是在修修补补,这个环节涉及的人就多了。
算法的主体实现是单线程的,输入和输出都是限死的,当时优化的时候,只注意了内存泄漏的问题,对于代码的速度上,因为在14张图的情况下, 可以做到2s,加上后来用的也比较少,基本都可以直接开一个线程,等待结果就可以了,也没什么优化的动力,属于那种很稳定的代码屎山。
对其进行CUDA加速的优化,大概一年前我就在想着这个事情,虽然中间也和他们调试几次CUDA计算的问题,改了几个Demo,但是始终写不下来,搞不懂里面到底是怎么分配的,总感觉时机不到。加上事情一直很多,抽不出来时间重构,所以就一直拖着。
上周末有空,整理文件的时候,又看到了这个项目,重新研究了一下这个东西,发现当时准备的还挺充分的,除了这个,还有几个CUDA的Demo,对着跑了跑,google找了一个Mat加速的实现,在Demo中测试没什么问题,但是后续的代码改起来还是很麻烦,好多个函数都要一个一个写成核函数,然后我就想到了chatgpt,尝试了超级方便,基本运算都可以直接丢进去,然后生成的代码还有示例。可以单独运行。
于是大概花了1个点,把原来算法的一部分改成了cuda 运算,速度大概提升了不到1倍的样子,还有几个复杂的函数就摆在那里,因为丢进去的话,申请的显存存太多了。
后来突然想到,这个算法可以优化一下,当时为了计算方便写的,这个大函数也可以拆成若干个小计算,于是优化了好几个小时。
结果大概如果不算是申请内存的时间,大概提速2倍的样子,许多的opencv内置函数没法用cuda,所以加不了速。
又因为通常这个函数执行不会超过2s,之前的算上申请内存的时间基本加速不明显,又停了一段时间。
晚上的时候突然想到,多线程这里没用,然后又让chatgpt帮我实现了几个函数部分的多线程加速,算上之后,终于在即使算上申请内存的时间,速度也可以到1倍左右了。
找沈德同帮我整了点图,测试了下极限可以到5倍左右,虽然和全cuda 动辄几十倍还是不能比,不过还是可以的。
算是可以使用了。
算是弄明白CUDA加速了。
对于基本的算法优化,降低wei,多线程,中间值存库,以及cuda加速,应该够用了。
更详细的,如果以后可能做这块的东西在研究好了。