我基本上寻找一种方法来同步设备内的流。我想避免使用cudaDeviceSynchronize(),因为它会序列化我想要使用流同时执行的内核的执行;CUDA Dynamic Parallelizm;从设备流同步
更详细的描述:我写了一个内核,这是一个稳定的双共轭梯度解算器。我想在不同的数据流上同时吃这个内核。
该内核使用cublas函数。它们在内核中被调用。
解算器需要的操作之一是计算两个向量的点积。这可以用cublasdot()完成。但是由于这个调用是同步的,因此不同流中的内核的执行会被序列化。我不用调用点积函数,而是使用cublasspmv()来计算点积,这是异步调用的。问题是这个函数在结果计算之前返回。因此,我想要同步来自设备的流 - 我正在寻找相当于cudaStreamSynchronize()但可从设备调用的流。
__device__ float _cDdot(cublasHandle_t & cublasHandle, const int n, real_t * x, real_t * y) {
float *norm; norm = new float;
float alpha = 1.0f; float beta = 0.0f;
cublasSgemv_v2(cublasHandle, CUBLAS_OP_N ,1 , n, &alpha, x, 1, y, 1, &beta, norm, 1);
return *norm;
}
我能做些什么来确保结果是在函数返回之前计算的?当然,cudaDeviceSynchronize()的插入工作,但正如我所提到的,它串行化我的内核跨流的执行。
感谢, 马辛
你说'cublasdot()'调用是同步的。你什么意思? cuBLAS调用异步执行。我认为没有其他方法可以使用'cudaDeviceSynchronize()'来实现设备的主动等待。 – JackOLantern
事实上,cuBLAS API除了少量的1级例程返回一个标量值外,在写入时是异步的。感谢您的回答,但也许有人有其他想法? – user3100782