根据书上说和我的经验,要将CUDA计算发挥到最大,就必须尽量多的使用sharedmemory
有这么一个问题,比如你要将一个矩阵中的各行(共n行)两两间进行处理(科学计算中经常遇到的问题)
如果一个sharedmemory里面只存两行,那么就需要n/2个block,进行n-1次计算
但可能一个sharedmemory里面可以放更多的,比如7行,那么就只需要n/7个block,进行(n-1)/6次计算
这是什么概念呢?两个划分block的方式计算量相同,但是第二种方式的存储器访问可以节省84%,在我的应用中,两种方式性能差距达到了一倍!
这就涉及到一个排列组合问题,千年数学难题:女生散步问题。
15个女生,每天晚上3个一组出去散步,如何分组,使得经过一定次数后,恰好使得每个女生与其他女生散步且只散布一次?
在CUDA的官方例程特征值分解中,在最后的性能提高改进方法中也提到了分组问题,但是没有给出解决方法。
这个问题的计算量是非常大的,事实上,要得出512行的7个一组分组方式如果使用递归回溯方法可能需要几个月。如果可以得到这样一张组合表,无疑对解决CUDA架构下的shared memory利用率问题产生巨大帮助。我的思路是使用神经网络方法或者放宽约束条件,允许数据在一轮组合内被使用数次。
不知诸位在使用shared memory时还有什么好的想法