我基本上尋找一種方法來同步設備內的流。我想避免使用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