Openmp编程练习
火车卖票
#include "stdio.h"
#include "omp.h"
#include <windows.h> //使用Sleep()函数需要包含此头文件
int num;
omp_lock_t lock;
int getnum()
{
int temp = num;
//omp_set_nest_lock(&lock);
num--;
//omp_unset_nest_lock(&lock);
return num + 1;
}
void chushou(int i)
{
int s = 1;
while (s >= 0)
{
omp_set_lock(&lock);
s = getnum();
printf("站点%d卖掉了第%d张票\n", i, s);
omp_unset_lock(&lock);
Sleep(500);
}
}
int main()
{
num = 100;
int myid;
omp_init_lock(&lock);
#pragma omp parallel private(myid) num_threads(4)
{
myid = omp_get_thread_num();
//printf("my id is:%d\n", myid);
chushou(myid);
}
omp_destroy_lock(&lock);
return 0;
}
生产消费循环队列
#include "stdio.h"
#include "omp.h"
#include <windows.h> //使用Sleep()函数需要包含此头文件
int buf[5];//缓冲区的大小
int poi;
int poi2;
int num;
omp_lock_t lock;
void shengchan()
{
puts("shengchan");
while (true)
{
omp_set_lock(&lock);
if (num < 5)
{
while (buf[poi] == 1)poi = (poi + 1) % 5;
printf("生产者在%d位置上放置了一个\n", poi);
buf[poi] = 1;
num++;
poi = (poi + 1) % 5;
}
omp_unset_lock(&lock);
Sleep(500);
}
}
void xiaofei()
{
puts("xiaofei");
while (true)
{
omp_set_lock(&lock);
//printf("%d\n", num);
if (num>=1)
{
while (buf[poi2] == 0)poi2 = (poi2 + 1) % 5;
printf("消费者在%d位置上消费了一个\n", poi2);
buf[poi2] = 0;
num--;
}
omp_unset_lock(&lock);
Sleep(500);
}
}
int main()
{
omp_init_lock(&lock);
#pragma omp parallel sections num_threads(2)
{
#pragma omp section
shengchan();
#pragma omp section
xiaofei();
}
omp_destroy_lock(&lock);
return 0;
}
蒙特卡洛圆周率
#include "stdio.h"
#include "omp.h"
#include <windows.h> //使用Sleep()函数需要包含此头文件
#include<time.h>
#include<iostream>
using namespace std;
double distance(double x, double y)
{
return sqrt((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5));
}
bool judge(double x,double y)
{
return distance(x, y) <= 0.5;
}
int in_num;
int main()
{
/*
for (int i = 1; i <= 5; i++)
{
cout << rand() / (double)RAND_MAX << endl;
}*/
bool flag = false;
double x;
double y;
#pragma omp for private(flag,x,y)
for (int i = 1; i <= 10000; i++)
{
x = rand() / (double)RAND_MAX;
y = rand() / (double)RAND_MAX;
flag = judge(x,y);
if (flag)
{
#pragma omp atomic
in_num++;
}
}
double ans = (double)in_num / 10000;
cout << ans*4 << endl;
}
多线程二维数组和解法1 firstprivate+atomic
#include "stdio.h"
#include "omp.h"
#include <windows.h> //使用Sleep()函数需要包含此头文件
#include<time.h>
#include<iostream>
using namespace std;
int a[5][5] = { {1,1,1,1,1},{2,2,2,2,2},{3,3,3,3,3},{4,4,4,4,4},{5,5,5,5,5} };
int final_ans = 0;
void increase(int temp_sum)
{
#pragma omp atomic
final_ans += temp_sum;
}
int main()
{
int temp_sum=0;
int i,j;
#pragma omp parallel for private(i,j) firstprivate(temp_sum) num_threads(5)//每个线程必须一致,或者采用ppt上的例子进行划分
// firstprivate(temp_sum) reduction(+:temp_sum) 这两个不能同时出现
for (i = 0; i <= 4; i++)
{
//temp_sum += 1;
//printf("%d 当前的temp_sum值为%d\n",i, temp_sum);
for (j = 0; j <= 4; j++)
{
temp_sum += a[i][j];
}
printf("temp_sum is %d\n", temp_sum);
increase(temp_sum);
}
printf("%d\n", final_ans);
return 0;
}
多线程二维数组解法2 线程可以不用对应数量
#include "stdio.h"
#include "omp.h"
#include <windows.h> //使用Sleep()函数需要包含此头文件
#include<time.h>
#include<iostream>
using namespace std;
int a[5][5] = { {1,1,1,1,1},{2,2,2,2,2},{3,3,3,3,3},{4,4,4,4,4},{5,5,5,5,5} };
int ans_buf[5];
int main()
{
int i, j;
#pragma omp parallel for num_threads(3) private(j)
for (int i = 0; i <= 4; i++)
{
for (int j = 0; j <= 4; j++)
{
ans_buf[i] += a[i][j];
}
}
int sum = 0;
for (int i = 0; i <= 4; i++)
sum += ans_buf[i];
printf("%d\n", sum);
}
Openmp编程练习的更多相关文章
- openMP编程(上篇)之指令和锁
openMP简介 openMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的. 当计算机升级到多核时,程序中创建的线程数量需要随CPU核数变化,如在CPU核数超过线程数 ...
- openMP编程(上篇)之并行程序设计
openMP简介 openMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的. 当计算机升级到多核时,程序中创建的线程数量需要随CPU核数变化,如在CPU核数超过线程数 ...
- 一个openMP编程处理图像的示例
一个openMP编程处理图像的示例: 从硬盘读入两幅图像,对这两幅图像分别提取特征点,特征点匹配,最后将图像与匹配特征点画出来.理解该例子需要一些图像处理的基本知识,我不在此详细介绍.另外,编译该例需 ...
- OpenMP编程总结表
本文对OpenMP 2.0的全部语法——Macro(宏定义).Environment Variables(环境变量).Data Types(数据类型).Compiler Directives(编译指导 ...
- openMP编程(下篇)之数据私有与任务调度
title: openMP编程(下篇)之数据处理子句与任务调度 tags: ["openMP"] notebook: 分布式程序_Linux --- openMP并行编程中数据的共 ...
- OpenMP编程的任务调度控制
在OpenMP的for任务分担中,各个线程的任务划分是可以由程序员控制调整的.考虑这样一种情况,当在一个循环中每次迭代的计算量不相等时,如果根据系统默认简单的给每个线程分配相同次数的迭代量的话,会导致 ...
- OpenMP共享内存并行编程详解
实验平台:win7, VS2010 1. 介绍 平行计算机可以简单分为共享内存和分布式内存,共享内存就是多个核心共享一个内存,目前的PC就是这类(不管是只有一个多核CPU还是可以插多个CPU,它们都有 ...
- openMP多线程编程
OpenMP(Open Muti-Processing) OpenMP缺点: 1:作为高层抽象,OpenMp并不适合需要复杂的线程间同步和互斥的场合: 2:另一个缺点是不能在非共享内存系统(如计算机集 ...
- 并行编程OpenMP基础及简单示例
OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...
随机推荐
- mysql数据库设计规则总结
MySQL数据库设计总结 规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎. 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的 ...
- C语言复习————基本数据类型、运算符和表达式
数据类型/运算符/表达式 主要分两部分介绍,第一部分介绍常用的数据类型,例如:常量和变量/整型/实型/字符型:第二部分介绍算数运算符和算数表达式以及赋值运算符和逗号运算符. 一. 常用的数据类型 1. ...
- golang 你所不知道的 log 和 fmt
直接点说,就是由于fmt 是线程不安全的, 如果你在多协程场景下使用fmt打印信息可能会得到乱序的结果 就是说 不按代码里的顺序打印. 下面看示例 代码示例 golang fmt 多线程 乱序: fu ...
- 一致性hash (PHP)
<?php /** * Flexihash - A simple consistent hashing implementation for PHP. * * The MIT License * ...
- SpringBoot运行时动态添加数据源
此方案适用于解决springboot项目运行时动态添加数据源,非静态切换多数据源!!! 一.多数据源应用场景: 1.配置文件配置多数据源,如默认数据源:master,数据源1:salve1...,运行 ...
- js对象参考手册 -戈多编程
今天来总结下常用的熟记的js api (一)JavaScript对象 (1)Array 对象属性:(3个) constructor lengh prototype 对象方法:(14个) contat( ...
- e课表项目第二次冲刺周期第十天
昨天完成了什么? 昨天还有一天第一次冲刺周期就结束了,我们的工作也接近尾声了,所以今天我利用之前的方法,完成了对监听的设置,以及对修改界面的编写,可以实现相应的删除和修改的功能,然后我和我们组的成员商 ...
- 【POJ2001】Shortest Prefixes
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 18724 Accepted: 810 ...
- 复杂模型可解释性方法——LIME
一.模型可解释性 近年来,机器学习(深度学习)取得了一系列骄人战绩,但是其模型的深度和复杂度远远超出了人类理解的范畴,或者称之为黑盒(机器是否同样不能理解?),当一个机器学习模型泛化性能很好时 ...
- insert增数据详解
查看表结构: desc 表名; describe的缩写,意为描述 增加数据不会改变表的结构,只是增加了行. 创建一张表: mysql> create table class( -> id ...