如何制作多库群岛API(例如CublasDgemm)确实在多cudastream中同时执行



我想制作两个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>

相关内容

  • 没有找到相关文章

最新更新