目录
使用pragma omp parallel for提高训练速度
本项目由以下四部分组成,本节是第4节:
3、MPI优化
4、OpenMP优化
OpenMP并行设计
在串行代码的基础上,OpenMP通过# pragma omp parallel for num_threads(thread_count) 指令,对所有涉及大型数组的for循环进行多线程处理,以此达到并行效果。
用OpenMP进行共享内存并行计算
使用pragma omp parallel for提高训练速度
由于本项目串行需要多次通过for(i=0;i<dataLen;i++)循环遍历整个数组来求值,因此十分适合使用pragma omp parallel for指令来进行共享内存编程。该指令表示所有线程平分(dataLen / comm_sz)个数据,并以这些数据进行循环计算,各线程再将数据返回主线程,与MPI的MPI_Scatterv()函数异曲同工。
pragma omp parallel for指令后面的子句有:num_threads(thread_count)、reduction(+:maleNum)、shared(dataSet,dataLen) 、private(i)。num_threads(thread_count)表示线程数,reduction(+:A)表示maleNum是归约变量,最后要将所有线程计算的A累加。shared(dataSet,dataLen) 表示dataSet,dataLen数组数所有线程都可以共享的,private(i)则表示每个线程的i都是私有的,不受其它线程影响。
参考代码如下(求sum[2]为例):
/*初始化,reduction内的变量一定要有初始值*/
double A,B;
A=0;B=0;
double sum[2]={0,0};
# pragma omp parallel for num_threads(thread_count) \
reduction(+:A) reduction(+:B)\
shared(dataSet,dataLen) private(i)
for(i=0;i<dataLen;i++){ ;
A+=dataSet[i*EIGEN_NUM+1];
B+=dataSet[i*EIGEN_NUM+2];}
# pragma omp barrier
sum[0]=A;sum[1]=B;
程序代码
#include <iostream>
#include <vector>
#include <cstdlib>
#include <time.h>
#include <cassert>
#include <cstring>
#include <cmath>
#include<omp.h&g

博客围绕OpenMP并行设计展开,介绍了用其进行共享内存并行计算。在串行代码基础上,通过# pragma omp parallel for指令对涉及大型数组的for循环多线程处理。使用pragma omp parallel for可提高训练速度,还给出指令子句含义,并提供参考代码及编译方式。
最低0.47元/天 解锁文章
1545





