我想让两个 CUBLAS API(例如.cublasDgemm)真正在两个 cudaStreams 中同时执行。
众所周知,CUBLAS API 是异步的,像 cublasDgemm 这样的 3 级例程不会阻塞主机,这意味着以下代码(默认为 cudaStream)将同时运行:
cublasDgemm();
cublasDgemm();
但是,当我使用“NVIDIA Visual Profiler”分析程序时,它表明它们运行有序。
然后,我尝试让它们绑定到不同的 cudaStreams,伪代码是:
// Create a stream for every DGEMM operation
cudaStream_t *streams = (cudaStream_t *) malloc(batch_count*sizeof(cudaStream_t));
for(i=0; i<batch_count; i++)
cudaStreamCreate(&streams[i]);
// Set matrix coefficients
double alpha = 1.0;
double beta = 1.0;
// Launch each DGEMM operation in own CUDA stream
for(i=0; i<batch_count; i++){
// Set CUDA stream
cublasSetStream(handle, streams[i]);
// DGEMM: C = alpha*A*B + beta*C
cublasDgemm(handle,
CUBLAS_OP_N, CUBLAS_OP_N,
dim, dim, dim,
&alpha,
d_A[i], dim,
d_B[i], dim,
&beta,
d_C[i], dim);
}
当 batch_count=5 时,“NVIDIA Visual Profiler”显示的结果是:
Multi-CublasDegmm Routines 多流执行结果
结果表明,它们仍然有序地运行。如何使多个 cublas api 在多个 cudaStreams 中真正同时运行,如下所示:
有人知道吗?谢谢。