mfc一个多线程实例

在卷积神经网络的训练中,因为多个卷积核做卷积的时候互不干扰,可以并行。

直观的方法是采用多线程做卷积,每个线程负责一个featureMap的卷积计算。


在本人的程序中,多线程训练比单线程训练大约要快3倍。


工程名Dlg.cpp  (CCNN2Dlg.cpp)文件中,写好线程函数,第几个featureMap做卷积通过参数LPVOID lpPara指定。

DWORD WINAPI ConvolFun1(LPVOID lpPara)   
{   
	int i,j,ii,jj,k;
	k = (int)lpPara;
	for(i=0;i<=28-filter1[0].nSize;i++)
	{
		for(j=0;j<=28-filter1[0].nSize;j++)
		{
			float tempSum=0;
			for(ii=0;ii<filter1[0].nSize;ii++)
			{
				for(jj=0;jj<filter1[0].nSize;jj++)
				{
					tempSum+=filter1[k].mFactor[ii][jj]*pic[(i+ii)*28+(j+jj)];
				}
			}
			float tempu=tempSum+filter1[k].bias;;
			fm1[k].picMatrix[i*fm1[k].nSize+j]=tanh(tempu);//1.0/(1.0+exp(-tempu));	
		}
	}
	return NULL;
}

在单个CNN训练的前向过程中调用:

void CCNN2Dlg::cnnForward()
{
	int i,j,k,ii,jj,kk;
	//卷积层1
	HANDLE hThread[F1K];//设置F1K个句柄
	for(k=0;k<F1K;k++)
	{
		hThread[k] = CreateThread(NULL, 0, ConvolFun1, LPVOID(k), 0, NULL);  //开辟F1K个线程,线程的执行函数为ConvolFun1,参数为k
	}
	for(k=0;k<F1K;k++)
	{
		WaitForSingleObject(hThread[k],INFINITE);//等待各线程执行完返回
		CloseHandle(hThread[k]);                 //线程结束后一定要关闭句柄,不然程序会越跑越慢,句柄也是一种资源,用完要关闭释放
	}
。。。。
}


关于mfc环境下的多线程的学习,参看:

http://wenku.baidu.com/view/55660d6548d7c1c708a14500.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值