运行命令:g++ -fopenmp xx.cpp -lgomp -lpthread -o xx.out

用例一:
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
void test (int n) {
    for(int i = 0; i < 100000; ++i) {
    }
    printf("%d, ", n);
}
int main(int argc,char* argv[])
{
omp_set_num_threads(4); //设置线程数
    #pragma omp parallel for
    for(int i = 0; i < 100; ++i)
       test( i );
}





用例二(转):
#include<iostream>
#include<omp.h>
#include<ctime>
using namespace std;
void test_omp(int times);
int main()
{
    cout << omp_get_num_procs() << endl;
    test_omp(1);
    test_omp(2);
    test_omp(4);
    test_omp(9);
    test_omp(17);
}
void test_omp(int times)
{
    omp_set_num_threads(times);
    printf("test get_num_threads result1: %d\n", omp_get_num_threads());
    printf("test get_num_procs result1: %d\n", omp_get_num_procs());
    clock_t start = clock();
#pragma omp parallel for
    for (int i = 0; i < 20; i++)
    {
        if(i==0)
        {
            printf("test get_num_threads result2: %d\n", omp_get_num_threads());
            printf("test get_num_procs result1: %d\n", omp_get_num_procs());
        }

        printf( "Hello from thread: No.%d \n", omp_get_thread_num());
            for (int j = 0; j < 1000000; j++)
            {
                double a = 1585876.058578545361;
                for (int k = 0;k < 10;k++)
                    a *= a;
            }

    }
    clock_t end = clock();
    printf("%d threads para use time: %fs\n", times, double((end - start)) / CLOCKS_PER_SEC);
}



OpenMP的环境变量:

环境变量

描述

示例

OMP_SCHEDULE

控制for循环任务分配结构的调度

OMP_SCHEDULE="guided,2"

OMP_NUM_THREADS

设置默认线程的个数

OMP_SCHEDULE=4

OpenMP的库函数

函数名称

描述

int omp_get_num_threads(void)

返回当前使用的线程个数,如果在并行区域外则返回1

int omp_set_num_threads(int i)

设置要使用的线程个数,它可以覆盖OMP_NUM_THREADS

int omp_get_thread_num(void)

返回当前线程号,0代表主线程

int omp_get_num_procs(void)

返回可用的处理核(处理器)个数,对于支持超线程技术的处理器被算作两个处理核

OpenMP的调度方案

调度类型

描述

static

将所有循环迭代划分成相等大小的块

dynamic

使用一个内部队列,当某线程可用时,为其分配由块大小所制定的一定数量的循环迭代

guided

与dynamic策略类似,但是块大小开始较大,后来逐步减小。可选参数chunk指定块大小的最小值,默认为1

runtime

运行时由OMP_SCHEDULE决定使用上面三种的哪种策略

OpenMP的编译

平台和编译器

命令

windows平台 intel C++编译器

icl /Qopenmp

linux平台 intel C++编译器

icl -openmp

gcc

gcc -fopenmp

_OPENMP宏可以用来判断OpenMP是否被支持,通过它可以写出任何C语言编译器(即使不支持OpenMP)都可以编译的代码。代码如下所示:

#ifdef _OPENMP

#include <omp.h>

#else

#define omp_get_thread_num() 0

#endif

使用Openmp并行化的更多相关文章

  1. OpenMP 并行化处理测试

    OpenMP 并行化处理测试 #pragma omp parallel for 这条语句是用来指定后面的for循环语句变成并行执行的,将for循环里的语句变成并行执行后效率会不会提高呢?还是测试一 下 ...

  2. OpenMP并行化实例----Mandelbrot集合并行化计算

    在理想情况下,编译器使用自动并行化能够管理一切事务,使用OpenMP指令的一个优点是将并行性和算法分离,阅读代码时候无需考虑并行化是如何实现的.当然for循环是可以并行化处理的天然材料,满足一些约束的 ...

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

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

  4. 【并行计算】基于OpenMP的并行编程

    我们目前的计算机都是基于冯偌伊曼结构的,在MIMD作为主要研究对象的系统中,分为两种类型:共享内存系统和分布式内存系统,之前我们介绍的基于MPI方式的并行计算编程是属于分布式内存系统的方式,现在我们研 ...

  5. 【openmp】for循环的break问题

    问题描述:在用openmp并行化处理for循环的时候,便无法在for循环中用break语句,那么我们如何实现这样的机制呢?在stackoverflow上看到一个不错的回答总结一下. volatile ...

  6. 并行求pi (C++实现)

    用OpenMP并行化求pi的代码,这里用的是公式法求pi.具体如下: //公式法 #include<omp.h> #include<stdio.h> #include<s ...

  7. 密码破解工具John the Ripper使用说明

    John the Ripper John 包描述 John the Ripper 既功能丰富又运行快速. 它在一个程序中结合了几种破解模式,并且可以根据您的特定需求进行全面地配置(你甚至可以使用支持C ...

  8. OpenMP并行程序设计——for循环并行化详解

    在C/C++中使用OpenMP优化代码方便又简单,代码中需要并行处理的往往是一些比较耗时的for循环,所以重点介绍一下OpenMP中for循环的应用.个人感觉只要掌握了文中讲的这些就足够了,如果想要学 ...

  9. 方阵行列式并行化计算(OpenMP,MPI),并计算加速比

    00][100].在创建方阵时,方阵的阶数N(N<100)由外部输入.然后用两层"for循环"来给方阵 p左上角 N×N个位置赋值.具体实现如下: /* * 定义矩阵阶数N ...

随机推荐

  1. SpringBoot整合Prometheus

    SpringBoot整合Prometheus 一.需求 二.实现步骤 1.引入jar包 2.application.prometheus文件配置 3.查看指标数据 4.接入到 prometheus 中 ...

  2. Noip模拟71 2021.10.7

    T1 签到题 结论题,找到规律就会做 规律是每个点的度数$\mod$颜色种数,如果不是$0$则贡献一个答案 1 #include<bits/stdc++.h> 2 #define int ...

  3. Noip模拟59 2021.9.22

    新机房首模拟变倒数 T1 柱状图 关于每一个点可以做出两条斜率分别为$1,-1$的直线, 然后题意转化为移动最少的步数使得所有点都在某一个点的两条直线上 二分出直线的高度,判断条件是尽量让这条直线上部 ...

  4. Noip模拟36 2021.8.11

    刚题的习惯还是改不了,怎么办??? T1 Dove打扑克 考场上打的动态开点线段树+并查集,考后发现自己像一个傻子,并查集就行.. 这几天恶补数据结构疯了 用树状数组维护后缀和,$siz_i$表示编号 ...

  5. USB OTG原理和 ID 检测原理

    OTG 检测的原理是: USB OTG标准在完全兼容USB2.0标准的基础上,增添了 电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG).USB OTG技术可实现没有主机 ...

  6. AOP源码解析:AspectJExpressionPointcutAdvisor类

    先看看 AspectJExpressionPointcutAdvisor 的类图 再了解一下切点(Pointcut)表达式,它指定触发advice的方法,可以精确到返回参数,参数类型,方法名 1 pa ...

  7. linked-list-cycle leetcode C++

    Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...

  8. Atcoder 题目泛做

    我思维越来越菜了,这样下去感觉要退役了. 听说Atcoder的题练思维?那就试着做一做吧. 坚持每天一两道吧.(很有可能咕掉.) AGC036 官方题解 ---A-Triangle          ...

  9. Go语言并发模型 G源码分析

    Go 的线程实现模型,有三个核心的元素 M.P.G,它们共同支撑起了这个线程模型的框架.其中,G 是 goroutine 的缩写,通常称为 "协程".关于协程.线程和进程三者的异同 ...

  10. elementUI合并表格span-method用法

    官方文档 参考链接一 参考链接二