▶ 简单的计算和规约

● 第一种方法,将全局和的指针传入工作函数中进行加和,使用 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. JS学习笔记(模态框JS传参)

    博主最近基于django框架的平台第一版差不多完成了 今天整理下开发过程中遇到的前端知识 基于前端bootstrap框架模态框传参问题 上前端html代码: <div class="m ...

  2. 豆知识扩展:HTML<meta> tag

    豆知识: HTML<meta> tag Metadata 是关于数据的信息. The <meta> tag provides metadata关于网页.Metadat不会显示在 ...

  3. freemarker多个checkbox一个以上被选中示例

    <tr> <td class="handColumn" colspan="5" > <#list deptHandNotConta ...

  4. UVA-10369 Arctic Network (最小生成树)

    题目大意:n个村庄的坐标已知,现在要架光纤使所有的村庄都能上网,但受光纤的参数d所限,每根光纤只能给距离不超过d的村庄之间连接.但是有s个信号机,信号机之间能无限畅连.考虑到光纤的价格和参数d有关,现 ...

  5. 改变VO中的sql

    cuxOptionVO.setFullSqlMode(cuxOptionVO.FULLSQL_MODE_AUGMENTATION); cuxOptionVO.setQuery(null); cuxOp ...

  6. js搜索算法——二分搜索

    二分搜索算法就是折半查找,是一种效率较高的查找方法.前提条件是要查找的数组是有序的.算法的实现还是相对简单的: function binarySearch(arr,item){ var min = 0 ...

  7. Chrome插件(Extensions)开发实践

    内容摘自:http://www.cnblogs.com/mfryf/p/3701801.html

  8. History of programming language

    1940之前 第一个编程语言比现代的计算机还早诞生.首先,这种语言是种编码(en:code). 于1801年发明的提花织布机(或称甲卡提花织布机,英文:en:Jacquard loom),运用打孔卡上 ...

  9. 有效二叉查找树判断(java实现)

    leetcode 原题 :(即判断二叉树是否为二叉查找树) Given a binary tree, determine if it is a valid binary search tree (BS ...

  10. ansible入门01

    1.批量操作 1.操作系统选型与安装: 1.安装在实体机上: 批量安装: PXE(预引导执行环境):需要网卡上有DHCP客户端去加载bootloadder cobbler: kickstack: 2. ...