CUBLAS/CUFFT还是自己写的kernel?

在使用CUDA时,经常碰到一个抉择:使用CUBLAS/CUFFT还是自己写的kernel?
CUBLAS和CUFFT无疑拥有很多优势,功能强大,稳定,通用性好,与CPU库基本兼容(调用起来要分配一次存储器,还是挺麻烦的)
但是,其性能与kernel相比其实并不太高.
以大家入门用的matrixmul为例,使用kernel(官方说明,不是最优算法)做两个512 512 矩阵相乘需要七点几个毫秒,而simpelBLAS(即使是将sgemm换成sgymm)里需要八个多毫秒。无疑使用library在获得通用性与稳定性的同时也在性能上有了下降.
更大的性能损失是由硬件造成的.shared memory是cuda里最有魅力的一块,如果将数据存在shared memory里就可以省掉不少代价高昂的数据交换.使用CUBLAS和CUFFT时用户只能操作缓慢的global memory,许多宝贵的中间量没有办法取出来利用,提高了系统开销.
这并不是说CUBLAS和CUFFT不好.在问题的尺寸不是一个定值时,使用自己编写的核往往很难适应各种情况,甚至引发灾难,而library则可以帮我们处理这方面的烦恼。
如果你需要处理的问题尺寸是固定的,精心编写的kernel可以将速度提高几倍,如果你的问题尺寸经常在变化,使用Library可以不用花多少精力就编写出性能不错的程序