C++性能优化系列——3D高斯核卷积计算(十二)Intrinsic实现

void GaussSmoothCPU3DOptZYXSplitZIntrinsic(float* pSrc, int iDim[3], float* pKernel, int kernelSize[3], float* pDst, float* pBuffer)
	{
		//计算结果正确
		//16 thread dynamic GaussSmoothCPU3DOptZYXSplitZIntrinsic cost Time(ms) 145.8
		int iSliceSize = iDim[1] * iDim[0];
		int nCenter = kernelSize[0] / 2;
		const unsigned int InnerSize = 16*2;
#pragma omp parallel for num_threads(16) schedule(dynamic)
		for (int z = 0; z < (iDim[2] - kernelSize[0] + 1); z++)
		{
			float* pBuffSlice = pBuffer + (z + nCenter) * iSliceSize;
			float* pDstSlice = pDst + (z + nCenter) * iSliceSize;
			{
				for (unsigned int iSliceIt = 0; iSliceIt < iSliceSize; iSliceIt += InnerSize)
				{
					float* pSrcSlice = pSrc + z * iSliceSize + iSliceIt;
					__m256 DST1 = _mm256_setzero_ps();
					__m256 DST2 = _mm256_setzero_ps();
					__m256 DST3 = _mm256_setzero_ps();
					__m256 DST4 = _mm256_setzero_ps();
					for (unsigned int kx = 0; kx < kernelSize[0]; kx++)
					{
						__m256 SRC1 = _mm256_loadu_ps(pSrcSlice + kx * iSliceSize);
						__m256 SRC2 = _mm256_loadu_ps(pSrcSlice + kx * iSliceSize + 8);
						__m256 SRC3 = _mm256_loadu_ps(pSrcSlice + kx * iSliceSize + 16);
						__m256 SRC4 = _mm256_loadu_ps(pSrcSlice + kx * iSliceSize + 24);
						__m256 KER = _mm256_broadcast_ss(pKernel + kx);
						DST1 = _mm256_fmadd_ps(KER, SRC1, DST1);
						DST2 = _mm256_fmadd_ps(KER, SRC2, DST2);
						DST3 = _mm256_fmadd_ps(KER, SRC3, DST3);
						DST4 = _mm256_fmadd_ps(KER, SRC4, DST4);
					}
					_mm256_store_ps(pBuffSlice + iSliceIt, DST1);
					_mm256_store_ps(pBuffSlice + iSliceIt + 8, DST2);
					_mm256_store_ps(pBuffSlice + iSliceIt + 16, DST3);
					_mm256_store_ps(pBuffSlice + iSliceIt + 24, DST4);

				}
			}
			int tid = omp_get_thread_num();
			memset(yBuf[tid], 0, sizeof(float) * iDim[0] * iDim[1]);
			Conv2D_Fuse(pBuffSlice, iDim, pKernel, kernelSize[0], yBuf[tid], pDstSlice, NULL);
		}

	}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值