▶ 简单的计算和规约

● 第一种方法,将全局和的指针传入工作函数中进行加和,使用 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. 递归--练习6--noi1755菲波那契数列

    递归--练习6--noi1755菲波那契数列 一.心得 二.题目 1755:菲波那契数列 总时间限制:  1000ms 内存限制:  65536kB 描述 菲波那契数列是指这样的数列: 数列的第一个和 ...

  2. hdu1846巴什博弈

    巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物, 规定每次至少取一个,最多取m个.最后取光者得胜. 结论:只要不能整除,那么必然是先手取胜,否则后手取胜. #include<map> ...

  3. Alpha阶段第1周 Scrum立会报告+燃尽图 07

    作业要求与https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246相同 一.小组介绍 组长:刘莹莹 组员:朱珅莹 孙韦男 祝玮琦 王玉潘 周 ...

  4. cousera 深度学习 吴恩达 第一课 第二周 学习率对优化结果的影响

    本文代码实验地址: https://github.com/guojun007/logistic_regression_learning_rate cousera 上的作业是 编写一个 logistic ...

  5. 浅谈SQL Server---1

    浅谈SQL Server优化要点 https://www.cnblogs.com/wangjiming/p/10123887.html 1.SQL Server 体系结构由哪几部分组成? 2.SQL ...

  6. python的pip源在windows和linux修改

    windows和linux修改python的pip源 https://www.cnblogs.com/cwp-bg/p/8497075.html windows和linux修改python的pip源 ...

  7. Mac下忘记mysql的root密码

    cd /usr/local/mysql/bin sudo su sudo /usr/local/mysql/support-files/mysql.server stop # ./mysqld_saf ...

  8. wpf 客户端【JDAgent桌面助手】业余开发的终于完工了。。晒晒截图

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...

  9. 排列组合算法(基于c++实现)

    排列 全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个.现以{1, 2, 3}为例说明如何编写全排列的递归算法 第一层S1表示第一个数分别与第1.2.3个数交换位置,如123 ...

  10. 【转】ubuntu中没有/etc/inittab文件探究

    原文网址:http://blog.csdn.net/gavinr/article/details/6584582 linux 启动时第一个进程是/sbin/init,其主要功能就是软件执行环境,包括系 ...