运行命令: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. Noip模拟84 2021.10.27

    以后估计都是用\(markdown\)来写了,可能风格会有变化 T1 宝藏 这两天老是会的题打不对,还是要细心... 考场上打的是维护\(set\)的做法,但是是最后才想出来的,没有维护对于是没有交. ...

  2. 单片机I/O口推挽与开漏输出详解(力荐)

    推挽输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止. 开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电 ...

  3. 今天学习了BootStrap

    今天学习了BootStrap 一.BootStrap介绍 Bootstrap是一个前端开发的框架,来自 Twitter,是目前很受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.Java ...

  4. (继承)Program2.1

    覆盖和重写的意思是一样?结果是一样的 例如: 1 class Parent: # 定义父类 2 def myMethod(self): 3 print('调用父类方法') 4 5 6 class Ch ...

  5. SI Macro

    获取 buf 里的 symbol cbuf = BufListCount() msg(cbuf) ibuf = 0 while (ibuf < cbuf) { hbuf = BufListIte ...

  6. JAVA笔记10__Math类、Random类、Arrays类/日期操作类/对象比较器/对象的克隆/二叉树

    /** * Math类.Random类.Arrays类:具体查JAVA手册...... */ public class Main { public static void main(String[] ...

  7. linux 内核源代码情景分析——地址映射的全过程

    linux 内核采用页式存储管理.虚拟地址空间划分成固定大小的"页面",由MMU在运行时将虚拟地址映射成某个物理内存页面中的地址.页式内存管理比段式内存管理有很多好处,但是由于In ...

  8. Vue面试题2

    Class与Style绑定工作有用过吗: 有,后台管理系统菜单.主题色切换 .tab选项卡等..... 计算属性和侦听器区别.使用场景: 计算属性有缓存.并且是响应式依赖缓存,调用不加小括号 利用vu ...

  9. python3 调用 centos 常用系统命令

    一.创建目录 1 import os 2 3 base_path = '/data/sw_backup' 4 addr= 'FT' 5 ip='192.168.1.1' 6 path = base_p ...

  10. RocketMQ源码详解 | Broker篇 · 其三:CommitLog、索引、消费队列

    概述 上一章中,已经介绍了 Broker 的文件系统的各个层次与部分细节,本章将继续了解在逻辑存储层的三个文件 CommitLog.IndexFile.ConsumerQueue 的一些细节.文章最后 ...