mfc一个多线程实例
2014-08-29 14:22
239 查看
在卷积神经网络的训练中,因为多个卷积核做卷积的时候互不干扰,可以并行。
直观的方法是采用多线程做卷积,每个线程负责一个featureMap的卷积计算。
在本人的程序中,多线程训练比单线程训练大约要快3倍。
工程名Dlg.cpp (CCNN2Dlg.cpp)文件中,写好线程函数,第几个featureMap做卷积通过参数LPVOID lpPara指定。
在单个CNN训练的前向过程中调用:
关于mfc环境下的多线程的学习,参看:
http://wenku.baidu.com/view/55660d6548d7c1c708a14500.html
直观的方法是采用多线程做卷积,每个线程负责一个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多线程和Opencv库的打开两个摄像头实例
- MFC程序只能运行一个实例
- 一个基于MFC的自动化(Automation)实例
- MFC:一个简单的多线程传送文件的实现 client端(2)
- MFC中应用程序只允许运行一个实例方法二与三
- MFC中应用程序只允许运行一个实例方法一
- 【推荐实例】一个典型的多线程的程序
- GDB 多线程调试基本命令和一个实例问题的解决(转贴)
- 一个关于多线程的简单实例(抄书)
- WCF 第五章 一个单一实例中的多线程
- 多线程程序设计------一个实例(SDES破解)
- 用MFC编写多线程程序实例
- MFC 程序最小化到系统托盘区的一个简单实例
- [置顶] MFC 程序最小化到系统托盘区的一个简单实例
- MFC 程序最小化到系统托盘区的一个简单实例 .
- 一个多线程web服务器实例(C,Linux,详细的web服务器原理) 转
- MFC程序只能运行一个实例
- 一个MFC Console程序实例
- MFC中应用程序只允许运行一个实例
- 多线程之三:MFC多线程及实例