矩阵运算的GPU加速!!求教各位大神帮忙!在此谢过

最近在做计算机视觉的问题,里面涉及到矩阵的乘法,包括A*B, A'B 和AB', 我们稍微改了下内容,不知道如何用GPU加速,希望大神指导一下,谢谢啦!

void gemm_nn(ptrdiff_t M, ptrdiff_t N, ptrdiff_t K,
			float ALPHA,
			float const *A, ptrdiff_t lda,
			float const *B, ptrdiff_t ldb,
			float *C, ptrdiff_t ldc,
			ptrdiff_t numGroup, ptrdiff_t filtersVolume_step)
{
	int i, j, k, g;
	for (g = 0; g<numGroup; ++g)
	{
		ptrdiff_t filterGrpOffset = K * N * g;
		ptrdiff_t tempGrpOffset = M*filtersVolume_step*g;
		ptrdiff_t outputGrpOffset = M*N*g;
		for (j = 0; j < N; ++j){
			for (k = 0; k < K; ++k){
				register float temp = ALPHA * (*(B + filterGrpOffset + j*ldb + k));
				for (i = 0; i < M; ++i){
					*(C + outputGrpOffset + j*ldc + i) += temp * (*(A + tempGrpOffset + k*lda + i));
				}
			}
		}

	}

}

void gemm_tn(ptrdiff_t M, ptrdiff_t N, ptrdiff_t K,
			float ALPHA,
			float const *A, ptrdiff_t lda,
			float const *B, ptrdiff_t ldb,
			float *C, ptrdiff_t ldc,
			ptrdiff_t numGroup, ptrdiff_t filtersVolume_step)
{
	int i, j, k, g;
	for (int g = 0; g<numGroup; ++g)
	{
		ptrdiff_t filterGrpOffset = M * N * g;
		ptrdiff_t tempGrpOffset = K * filtersVolume_step * g;
		ptrdiff_t derOutputGrpOffset = K *N *g;
		for (j = 0; j < N; ++j){
			for (i = 0; i < M; ++i){
				register float sum = 0;
				for (k = 0; k < K; ++k){
					sum += (*(A + tempGrpOffset + i*lda + k)) * (*(B + derOutputGrpOffset + j*ldb + k));
				}
				*(C + filterGrpOffset + j*ldc + i) += ALPHA*sum;
			}
		}
	}

}

void gemm_nt(ptrdiff_t M, ptrdiff_t N, ptrdiff_t K,
			float ALPHA,
			float const *A, ptrdiff_t lda,
			float const *B, ptrdiff_t ldb,
			float *C, ptrdiff_t ldc,
			ptrdiff_t numGroup, ptrdiff_t filtersVolume_step)
{
	int i, j, k, g;
	for (int g = 0; g<numGroup; ++g)
	{
		ptrdiff_t filterGrpOffset = N * K * g;
		ptrdiff_t tempGrpOffset = M * filtersVolume_step *g;
		ptrdiff_t  derOutputGrpOffset = M * K *g;
		for (j = 0; j < N; ++j){
			for (k = 0; k < K; ++k){
				register float temp = ALPHA*(*(B + filterGrpOffset + k*ldb + j));
				for (i = 0; i < M; ++i){
					*(C + tempGrpOffset + j*ldc + i) += temp * (*(A + derOutputGrpOffset + k*lda + i));
				}
			}
		}

	}

}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值