基本的に、デバイス内からストリームを同期する方法を探しています。ストリームを使用して同時に実行したいカーネルの実行をシリアル化するため、cudaDeviceSynchronize() の使用は避けたいです。
より詳細な説明: 安定化された双共役勾配ソルバーであるカーネルを作成しました。ストリームを使用して、このカーネルを異なるデータで同時に起動したいと考えています。
このカーネルは cublas 関数を使用します。それらはカーネル内から呼び出されます。
ソルバーが必要とする操作の 1 つは、2 つのベクトルの内積の計算です。これは 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() の挿入は機能しますが、前述したように、カーネルの実行をストリーム間でシリアル化します。