首页 > 代码库 > mfc一个多线程实例

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

mfc一个多线程实例