不,不可能使用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與大型密集矩陣工作。