zoukankan      html  css  js  c++  java
  • 使用Openmp并行化

    运行命令: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 ", omp_get_num_threads());
        printf("test get_num_procs result1: %d ", 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 ", omp_get_num_threads());
                printf("test get_num_procs result1: %d ", omp_get_num_procs());
            }

            printf( "Hello from thread: No.%d ", 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 ", 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


  • 相关阅读:
    (七)微信小程序:收藏功能
    (六)微信小程序:制作新闻详情页
    (五)微信小程序:模板template
    (四)微信小程序:新闻列表渲染
    (三)微信小程序:焦点轮播图功能
    (二)微信小程序:实现页面跳转
    Docker和jenkins实现springboot自动部署
    (桥接)完美解决linux设置静态ip。
    一个简单的对任意list分页的工具-----PageUtil
    java8实战二------lambda表达式和函数式接口,简单就好
  • 原文地址:https://www.cnblogs.com/freeopen/p/5483015.html
Copyright © 2011-2022 走看看