码迷,mamicode.com
首页 > 编程语言 > 详细

mfc一个多线程实例

时间:2014-08-29 14:42:30      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:多线程   mfc   

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

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

bubuko.com,布布扣

在本人的程序中,多线程训练比单线程训练大约要快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

mfc一个多线程实例

标签:多线程   mfc   

原文地址:http://blog.csdn.net/hzq20081121107/article/details/38924969

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!