不,不可能使用 CUBLAS 执行像 gemm 这样的就地操作(事实上,我不知道有任何并行的 BLAS 实现可以保证这样的操作会起作用)。
话虽如此,这条评论:
.... 大量时间花在 malloc 空间和将数据从设备复制到设备以用于这些临时矩阵。
让我觉得你可能忽略了显而易见的事情。虽然有必要为临时矩阵分配空间,但在使用此类分配时当然没有必要执行设备到设备的内存复制。这个:
// If A, B & C are pointers to allocations in device memory
// compute C = A*B and copy result to A
multiply(C, A, B);
cudaMemcpy(A, C, sizeA, cudaMemcpyDeviceToDevice);
// now A = A*B
可以替换为
multiply(C, A, B);
float * tmp = A; A = C; C = tmp;
即。您只需要在主机上交换指针即可执行设备到设备内存复制的等效操作,而无需 GPU 时间成本。这不能在所有情况下都使用(例如,有一些就地块操作可能仍需要显式内存传输),但在大多数情况下,可以避免显式设备到设备内存传输。
如果使用 CUBLAS 进行大型密集运算的内存成本限制了您的应用程序,请考虑调查 "out of core" approaches 以处理大型密集矩阵。