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