3D矩陣中的數據是由層(從頂部到底部)生成的,我想將該數據與2D矩陣相乘,但不是採取每個需要拍攝的圖層來自第1層的矢量,來自第2層的矢量等等。乘以3D矩陣和2D矩陣CUDA
目前我在做什麼是對那些矢量從3D矩陣複製到一個二維矩陣TMPA然後用乙(使用CUBLAS),結果存儲在繁殖tmpB終於逐行復制回到它在3D矩陣中對應的位置C。總體而言,我的整個應用程序運行速度至少比CPU版本快兩倍,但在我看來,從設備到設備製作的這些內存拷貝(甚至是)對於性能來說並不是很好。
什麼是更好的方式來做這種計算?我在考慮在乘數之前重新排列數據,以避免內存拷貝。
的3D矩陣甲和Ç和2D矩陣乙已經在GPU的存儲器中。
EDIT
設M,N,P是三維矩陣存儲以行優先順序上該設備的存儲器中的線性陣列中的甲的尺寸。我的代碼如下所示:
cudaMalloc((void**)&d_tmpIn, sizeof(float)*M*P);
cudaMalloc((void**)&d_tmpOut, sizeof(float)*M*P);
cudaMalloc((void**)&d_C, sizeof(float)*M*N*P);
for (int iN = 0; iN < N; iN++)
{
dst = d_tmpIn;
for (int iM = 0; iM < M; iM++)
{
cudaMemcpy(dst, &(d_A[iN*P+0+iM*N*P]), sizeof(float)*P, cudaMemcpyD2D);
dst += P;
}
cublasDgemm(cublasHandle, CUBLAS_OP_N, CUBLAS_OP_N, P, M, M, &alpha, d_tmpIn, P, d_B, M, &beta, d_tmpOut, P);
src = d_tmpOut;
for (int iM = 0; iM < M; iM++)
{
cudaMemcpy(&(d_C[iN*P+0+iM*N*P]), src, sizeof(float)*P, cudaMemcpyD2D);
src += P;
}
}
希望這會有所幫助。
您能描述一下數據如何存儲在GPU內存中以及CUBLAS調用您用來執行此計算的內容嗎?這並不是所有這些都清楚你實際上試圖從文本中做什麼(提示:方程式和短代碼片段勝過千言萬語) – talonmies
通常情況下,cudaMemcpyD2D應該很快。你有沒有分析應用程序,以確定時間花在哪裏? –
@RobertCrovella的確他們很快,但我想知道是否有更好的方法來避免這些內存拷貝。我會看看給出的答案,看看是否有幫助。 – BRabbit27