近期因为一些项目需要,有大量的矩阵相关的计算需要完成,考虑到实验室新进了八块V8000GPU,如果一直放着吃灰就太暴殄天物了,因此特意花时间学习了一下使用numba下的cuda库进行数据计算的操作,特此记录其中的一些关键点,以备将来使用。
参考资料:
https://blog.csdn.net/The_Time_Runner/article/details/103367674
https://numba.pydata.org/numba-doc/latest/cuda/kernels.html
https://gist.github.com/t-vi/2f4fe23a5b473b9dceb95b163378b4d5
https://people.duke.edu/~ccc14/sta-663/CUDAPython.html
很多资料在介绍的时候都会引入一个数据矩阵,然后以此为例,介绍这个库是如何工作的,这样做固然形象,但对于自己这样的数学渣渣来说,经常和自己要处理的数据混在一起,搞半天越搞越糊涂。经过一段时间的摸索后,我对numba下的cuda库的最终看法是:
形象点说,numba下的cuda库提供了一个“子线程矩阵”,这个矩阵可以是一二三维的,矩阵里的每一个元素都是一个子线程,每个子线程都可以执行一些简单的数据处理工作。
假定我们有大量的数据要处理,在c/Fortran等语言下,这些数据通过若干个for/do循环来完成数据处理,那么我们要做的工作就是把每一次循环的内容改写成子线程执行的操作(kernel function)。“子线程矩阵’’则是提供了一个方便的形式让你来改写。
至于multi-stream的操作则比较容易理解了,流水线的操作方式可以让数据传输和处理同时进行,因此效率也比较高。
网友评论