OpenMP并行优化高斯朴素贝叶斯算法 - 通过身高、体重和肺活量推测性别(机器学习)

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

目录

OpenMP并行设计

用OpenMP进行共享内存并行计算

使用pragma omp parallel for提高训练速度

程序代码

结果


本项目由以下四部分组成,本节是第4节:

1、通过身高、体重推测性别

2、通过身高、体重、肺活量推测性别

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值