我想制作两个cublas apis(例如cublasdgemm),真的在两个cudastreams中同时执行。
我们知道,Cublas API是异步的,例如CublasDgemm(例如CublasDgemm)不会阻止主机,这意味着以下代码(在默认的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"显示的结果为:
多流程的多cublasdegmm执行结果
结果表明他们仍然有序地运行。如何使多酷库API真正同时在多个cudastreams中运行,例如:
多核执行结果具有多流,它们在真正同时运行
有人有任何想法吗?谢谢。
首先,感谢@Robert Crovella的评论。
根据@Robert Crovella的帮助和我的研究,在某些特殊情况下,我们可以同时运行Multi Cublas Apis(例如CublasDgemm),但大多数情况不能。
。案例1:当我执行cublasdgemm时,k40上的较大的昏暗(m = n = k = 1024*8)时,profiler显示结果如下:cublasdgemm,带有dims(m = n = k = k = 1024*8))
案例2:当我执行cublasDgemm,k40上的小昏暗(m = n = k = 64)时,探测器显示结果如下:cublasDgemm,dims dims(m = n = k = 64)
案例3:但是,当我执行cublasdgemm时,dims(m = n = k = k = 256)在K40上时,profiler显示结果如下:cublasdgemm,昏暗为(m = n = k = 256)
从情况1和案例2的结果来看,它表明我们不仅不能以较大的昏暗和小的昏暗状态同时运行cublas apis。案例1的原因是GPU资源已经用完了,因此没有左室来运行其他例程,对于案例2,正是两个内核发射的延迟导致很难看到Con。
<</p>