OpenMP系列
发布日期:2021-06-29 18:38:24 浏览次数:2 分类:技术文章

本文共 3535 字,大约阅读时间需要 11 分钟。

文章目录

OpenMP百度百科

  • OpenMP Architecture Review Board牵头提出,已被广泛接受,
  • 用于共享内存并行系统的多处理器程序设计的一套指导性编译处理方案(Compiler Directive) [1] 。
  • OpenMP支持C、C++和Fortran;
  • 支持OpenMp的编译器包括Sun Compiler,GNU Compiler和Intel Compiler等。
  • OpenMp提供了对并行算法的高层的抽象描述,
  • 程序员通过在源代码中加入专用的pragma来指明自己的意图,
  • 编译器自动将程序并行化,并在必要之处加入同步互斥以及通信。
  • 当选择忽略这些pragma,
  • 或编译器不支持OpenMp时,
  • 程序又可退化为通常的程序(串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。

canci

OpenMP 小玩玩

OpenMP 在VS中开启!

在这里插入图片描述

  • 如果还出错,就来这个

在这里插入图片描述

示例

#include
#include"omp.h" using namespace std; void main(){
#pragma omp parallel{
cout << "Test" << endl;}system("pause");}

在这里插入图片描述

  • 说明parallel后的语句被4个线程分别执行了一次,4个是程序默认的线程数,
  • 可通过num_threads显式控制创建的线程数:

pragma omp parallel num_threads(6)

#include
#include"omp.h" using namespace std; void main(){
#pragma omp parallel num_threads(6){
cout << "Test" << endl;}system("pause");}

pragma omp parallel for num_threads(252)

#include
#include"omp.h"using namespace std;void main(){
#pragma omp parallel for num_threads(252) for (int i = 0; i < 12; i++) {
printf("OpenMP Test, 线程编号为: %d\n", omp_get_thread_num()); } system("pause");}

设置不同线程

#include
#include"omp.h"using namespace std;void test(){
for (int i = 0; i < 80000; i++) {
}}void main(){
float startTime = omp_get_wtime(); //2#pragma omp parallel for num_threads(2) for (int i = 0; i < 80000; i++) {
test(); } float endTime = omp_get_wtime(); printf("指定 2 个线程,执行时间: %f\n", endTime - startTime); startTime = endTime; //4#pragma omp parallel for num_threads(4) for (int i = 0; i < 80000; i++) {
test(); } endTime = omp_get_wtime(); printf("指定 4 个线程,执行时间: %f\n", endTime - startTime); startTime = endTime; //8#pragma omp parallel for num_threads(8) for (int i = 0; i < 80000; i++) {
test(); } endTime = omp_get_wtime(); printf("指定 8 个线程,执行时间: %f\n", endTime - startTime); startTime = endTime; //12#pragma omp parallel for num_threads(12) for (int i = 0; i < 80000; i++) {
test(); } endTime = omp_get_wtime(); printf("指定 12 个线程,执行时间: %f\n", endTime - startTime); startTime = endTime; //不使用OpenMP for (int i = 0; i < 80000; i++) {
test(); } endTime = omp_get_wtime(); printf("不使用OpenMP多线程,执行时间: %f\n", endTime - startTime); startTime = endTime; system("pause");}

OPmp牛逼的reduction

#include
#include"omp.h"#include
using namespace std;# define N 99999999void main(){
int FinalSum = 0; int* sum = (int *)malloc(sizeof(int)*N); for (int j = 0; j < N; j++) {
sum[j] = rand()%100; } float startTime = omp_get_wtime();#pragma omp parallel for reduction(+: FinalSum) for (int i = 0; i < N; i += 1) FinalSum += sum[i]; // Reduce to a single number* printf("%d\n",FinalSum); float endTime = omp_get_wtime(); printf("并行执行时间: %f\n", endTime - startTime); FinalSum = 0; startTime = omp_get_wtime(); for (int i = 0; i < N; i += 1) FinalSum += sum[i]; // Reduce to a single number* printf("%d\n", FinalSum); endTime = omp_get_wtime(); printf("串行执行时间: %f\n", endTime - startTime);}

在这里插入图片描述

参考链接

OpenMP 线程同步之临界区

  • 多核/多线程编程中肯定会用到同步互斥操作。除了互斥变量以为,就是临界区。

\newline

\newline

  • 临界区是指在用一时刻只允许一个线程执行的一段用{…},包围的代码段。
  • OpenMP中临界区声明方法如下:
    #pragma omp critical [(name)] //[]表示名字可选
    {
    //需要同一时刻只能有一个线程访问的代码
    }

代码

#include 
#include
int main(){
int sum = 0;#pragma omp parallel printf("Hello World!!!\n");#pragma omp parallel for for (int i = 0; i < 10000; ++i) {
#pragma omp critical {
sum = sum + i%7; } } printf("Sum: %d\n" ,sum); return 0;}
  • 按道理是可以用g++ a.cpp -o a -fopenmp

  • 生成的,但是我失败了

  • 我用VS吧!!

  • 结果是

    在这里插入图片描述

  • 若将某行注释掉,执行结果中的Sum基本就是不确定的。

在这里插入图片描述

  • 的确不确定了哈。

转载地址:https://cyj666.blog.csdn.net/article/details/103213090 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ipad测网速还可以告诉你内外网ip+网关是啥+默认网关和路由
下一篇:5 Markov链

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月14日 14时07分12秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章