▶ 简单的计算和规约

● 第一种方法,将全局和的指针传入工作函数中进行加和,使用 critical 来控制临界区的访问

 #include <stdio.h>
#include <stdlib.h>
#include <omp.h> const int thread = ; void work(int* globalSum)
{
#pragma omp critical // 使用 critical 来控制临界区的访问
*globalSum += omp_get_thread_num();
return;
} int main(int argc, char* argv[])
{
int threadReal, globalSum;
if (argc > && *argv[] > ''&& *argv[] < '')
threadReal = atoi(argv[]);
else
threadReal = thread;
globalSum = ; // 初始化全局和 #pragma omp parallel num_threads(threadReal)
work(&globalSum); // 将全局和的指针传给每个线程进行计算 printf("\nglobalSum = %d\n", globalSum);
getchar();
return ;
}

● 输出结果,下面几种方法的输出结果均相同,不再重复罗列

globalSum = 

● 第二种方法,使用局部变量,在主函数中进行加和

 #include <stdio.h>
#include <stdlib.h>
#include <omp.h> const int thread = ; int work()
{
return omp_get_thread_num();
} int main(int argc, char* argv[])
{
int threadReal, globalSum;
if (argc > && *argv[] > ''&& *argv[] < '')
threadReal = atoi(argv[]);
else
threadReal = thread;
globalSum = ; #pragma omp parallel num_threads(threadReal)
{
int localSum = work(); // 使用局部变量
#pragma omp critical
globalSum += localSum; // 将局部和加到全局和中
} printf("\nglobalSum = %d\n", globalSum);
getchar();
return ;
}

● 第三种方法,使用规约子句

 #include <stdio.h>
#include <stdlib.h>
#include <omp.h> const int thread = ; int work()
{
return omp_get_thread_num();
} int main(int argc, char* argv[])
{
int threadReal, globalSum;
if (argc > && *argv[] > ''&& *argv[] < '')
threadReal = atoi(argv[]);
else
threadReal = thread;
globalSum = ; #pragma omp parallel num_threads(threadReal) reduction(+ : globalSum)// 要求对 globalSum 使用加法规约
globalSum += work(); printf("\nglobalSum = %d\n", globalSum);
getchar();
return ;
}

● 第四种方法,使用 parallel for 循环

 #include <stdio.h>
#include <stdlib.h>
#include <omp.h> const int thread = ; int work()
{
return omp_get_thread_num();
} int main(int argc, char* argv[])
{
int i, threadReal, globalSum;
if (argc > && *argv[] > ''&& *argv[] < '')
threadReal = atoi(argv[]);
else
threadReal = thread;
globalSum = ; #pragma omp parallel for num_threads(threadReal) reduction(+:globalSum)// 联用了规约子句和 parallel for 循环
for (i = ; i < threadReal; i++)
globalSum += work(); printf("\nglobalSum = %d\n", globalSum);
getchar();
return ;
}

▶ 单独的 parallel for 用法

 #include <stdio.h>
#include <stdlib.h>
#include <omp.h> const int thread = ; int main(int argc, char* argv[])
{
int i, threadReal, a[thread];
if (argc > && *argv[] > ''&& *argv[] < '')
threadReal = atoi(argv[]);
else
threadReal = thread; #pragma omp parallel for num_threads(threadReal)
for (i = ; i < threadReal; i++)// 注意,把下面的 a[i] = i 写到括号里来会报错 “OpenMP“for”语句中的增量格式不正确”
a[i] = i; for (i = ; i < thread; i++)
printf("a[%2d] = %2d\n", i, a[i]);
getchar();
return ;
}

● 输出结果

a[ ] =
a[ ] =
a[ ] =
a[ ] =
a[ ] =
a[ ] =
a[ ] =
a[ ] =

▶ 使用私有变量估计 π 的值

 #include <stdio.h>
#include <stdlib.h>
#include <omp.h> const int thread = , count = ; int main0(int argc, char* argv[])// 一般方法,使用局部变量
{
int i, threadReal;
double sum;
if (argc > && *argv[] > ''&& *argv[] < '')
threadReal = atoi(argv[]);
else
threadReal = thread;
sum = 0.0; #pragma omp parallel for num_threads(threadReal) reduction(+ : sum)
for (i = ; i < count; i++)
{
double sign = (i % ? -1.0 : 1.0);
sum += sign / ( * i + );
} printf("π = %.10f\n", sum * );
getchar();
return ;
} int main1(int argc, char* argv[])// 将已经声明了的 sign 作为私有变量
{
int i, threadReal;
double sign, sum;
if (argc > && *argv[] > ''&& *argv[] < '')
threadReal = atoi(argv[]);
else
threadReal = thread;
sum = 0.0; #pragma omp parallel for num_threads(threadReal) reduction(+ : sum) private(sign)
for (i = ; i < count; i++)
{
sign = (i % ? -1.0 : 1.0);
sum += sign / ( * i + );
} printf("π = %.10f\n", sum * );
getchar();
return ;
} int main2(int argc, char* argv[])// 使用 default(none) 子句,然后明确规定每个变量的作用域
{
int i, threadReal;
double sign, sum;
if (argc > && *argv[] > ''&& *argv[] < '')
threadReal = atoi(argv[]);
else
threadReal = thread;
sum = 0.0; #pragma omp parallel for num_threads(threadReal) reduction(+ : sum) default(none) private(i, sign) shared(count)// 多个变量用逗号隔开
for (i = ; i < count; i++)
{
sign = (i % ? -1.0 : 1.0);
sum += sign / ( * i + );
} printf("π = %.10f\n", sum * );
getchar();
return ;
}

● 输出结果

π = 3.1415826536

OpenMP 简单的规约的更多相关文章

  1. 基于GCC的openMP学习与测试(2)

    一.openMP简单测试 1.简单测试(1) #include<omp.h> #include<time.h> #include<iostream> using n ...

  2. 基于GCC的openMP学习与测试

    (一).openMP简述 Open Multiprocessing (OpenMP) 框架是一种功能极为强大的规范,可以帮助您利用 C.C++ 和 Fortran 应用程序中的多个核心带来的好处,是基 ...

  3. CUDA01 - 硬件架构、warp调度、指令流水线和cuda并发流

    这一部分打算从头记录一下CUDA的编程方法和一些物理架构上的特点:从硬件入手,写一下包括线程束的划分.流水线的调度等等微结构的问题,以及这些物理设备是如何与软件对应的.下一部分会写一下cuda中的几种 ...

  4. 应用OpenMP的一个简单的设计模式

    小喵的唠叨话:最近很久没写博客了,一是因为之前写的LSoftmax后馈一直没有成功,所以在等作者的源码.二是最近没什么想写的东西.前两天,在预处理图片的时候,发现处理200w张图片,跑了一晚上也才处理 ...

  5. OpenMP的简单使用教程

    转自:http://binglispace.com/2015/01/09/openmp-intro/ OpenMP的简单使用教程 今天有幸参加了一个XSEDE OpenMP的workshop讲座,真是 ...

  6. 并行编程OpenMP基础及简单示例

    OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...

  7. VS2010+OpenMP的简单使用

    OpenMP是把程序中的循环操作分给电脑的各个CPU处理器并行进行.比如说我要循环运行100次,我的电脑有两个处理器,那OpenMP就会平均分给两个处理器并行运行,每个处理器运行50次.使用方法 1. ...

  8. 基于OpenMP的C++并行编程简单示例

    示例要求:在整数A和B之间找到符合条件的值X,使f(X)=C. 示例代码(需要在VS中开启OpenMP支持): #include<iostream> #include<time.h& ...

  9. [OpenMP] 并行计算入门

    OpenMP并行计算入门 个人理解 OpenMP是一种通过共享内存并行系统的多处理器程序设计的编译处理方案,通过预编译指令告诉编译器哪些代码块需要被并行化,通过拷贝代码块实现并行程序.对于循环的并行化 ...

随机推荐

  1. Mysql中FIND_IN_SET和REPLACE函数简介

    一  FIND_IN_SET() SELECT * from u_user where FIND_IN_SET('32',tags) 上面的sql是精确查找,查找表中tags中含有32的记录(注意这里 ...

  2. STL空间配置器那点事

    STL简介 STL(Standard Template Library,标准模板库),从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其 ...

  3. 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。(System.Data)

    Sql server2012连接Sql server2008时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误.(provider:SSLProvider,error:0-接收到的消息异常, ...

  4. 本地RUN Page时报无法显示该网页

    经检查,是我本地安装了浏览器广告屏蔽插件引起的,关闭该插件即可.

  5. windows下查看端口是否被占,以及端口被哪个程序占用

    如何查看端口被是否被占用 在 “ 命令提示符 ” 中输入 “netstat -an”, 即可显示本机所有开放端口.下表是具体的说明. 数据列 说明 propo 指连接使用的协议名称 local add ...

  6. 李氏滑动事件冲突解决方案 之 处理子ViewGroup的超棒方案

    父ViewGroup(CurView) 和 子 ViewGroup(ParentView) 滑动事件冲突解决方案 之 处理子ViewGroup的超棒方案: 子ViewGroup 以 SlipRelat ...

  7. 仿智能社官网:原生JS实现简单又酷炫的3D立方体时钟

    先放一下我做的效果:https://linrunzheng.github.io/3Dclock/3Dclock/new.html 至于3D立方体怎么做这里就不在阐述了,可以看一下我之前的博客. 这里默 ...

  8. python一条语句分析几个常用函数和概念

    前言 过年也没完全闲着,每天用一点点时间学点东西,本文为大家介绍几个python操作的细节,包含all.any.for in等操作,以及介绍我解决问题的思路. 一.开篇 先从我看到的一个简单的语句开始 ...

  9. php 文件上传$_FILES中error返回值详解

    用PHP上传文件时,我们会用程序去监听浏览器发送过来的文件信息,首先会通 过$_FILES[fieldName]['error']的不同数值来判断此欲上传的文件状态是否正常.$_FILES[field ...

  10. erp中三大订单CO、PO、MO

    ERP即 企业资源计划 (Enterprise Resource Planning),由美国 Gartner Group 公司于1990年提出. ERP系统是指建立在信息技术基础上,以系统化的管理思想 ...