zoukankan      html  css  js  c++  java
  • OpenMP笔记(三)

    个人博客地址:http://www.bearoom.xyz/2019/02/21/openmp3/

    这一部分主要记录一些指令的使用。

    一、parallel的使用

    parallel是用于构造并行块的,也可以和for、sections等指令一起使用。在C/C++中,parallel的使用方法如下 : ``` #pragma omp parallel [for | sections] [子句[子句]…] { //代码 } ```

    一个例子:

    #pragma omp parallel
    {
        printf("Hello, World!, ThreadId = %d
    ", omp_get_thread_num());
    }
    

    这段代码中的打印会执行四次,说明开了四个线程,当然可以修改默认的线程数,通过函数来设置或者指令来修改,如:

    omp_set_num_threads(8);
    #pragma omp parallel
    {
        printf("Hello, World!, ThreadId = %d
    ", omp_get_thread_num());
    }
    

    或者:

    #pragma omp parallel num_threads(8)
    {
        printf("Hello, World!, ThreadId = %d
    ", omp_get_thread_num());
    }
    

    二、for的使用

    for的使用是将for循环分配到多个线程中执行,一般for要跟parallel一起使用才有效,单独使用for一般是无效的。 单独使用for指令的情况,可以看到,即使设置了8个线程,依然是无效的:
    #pragma omp for
    for (int i = 0; i < 8; i++)
    {
        printf("Hello, World!, ThreadId = %d
    ", omp_get_thread_num());
    }
    

    在这里插入图片描述
    与parallel的结合使用方法1:

    omp_set_num_threads(8);
    #pragma omp parallel for
    for (int i = 0; i < 8; i++)
    {
        printf("Hello, World!, ThreadId = %d
    ", omp_get_thread_num());
    }
    

    在这里插入图片描述
    与parallel的结合使用方法2:

    omp_set_num_threads(8);
    #pragma omp parallel
    #pragma omp for
    for (int i = 0; i < 8; i++)
    {
        printf("Hello, World!, ThreadId = %d
    ", omp_get_thread_num());
    }
    

    或者,将#pragma omp parallel后面要并行的部分用大括号括起来,此时大括号中可以写多个for循环,且每个for循环前面都要写#pragma omp for,每个for循环之间是串行的,for循环里面是并行的:

    omp_set_num_threads(8);
    #pragma omp parallel
    {
    #pragma omp for
        for (int i = 0; i < 8; i++)
        {
            printf("Hello, World!, ThreadId = %d
    ", omp_get_thread_num());
        }
    }
    

    在这里插入图片描述

    三、sections和section指令的用法

    section语句是要用在sections语句中的,将不同的语句分段执行,sections的用法与for类似: ``` #pragma omp parallel sections { #pragma omp section printf("section 1 ThreadId = %d ", omp_get_thread_num()); #pragma omp section printf("section 2 ThreadId = %d ", omp_get_thread_num()); #pragma omp section printf("section 3 ThreadId = %d ", omp_get_thread_num()); #pragma omp section printf("section 4 ThreadId = %d ", omp_get_thread_num()); } ```

    在这里插入图片描述

    一树春风千万枝,
    嫩于金色软于丝。
    永丰西角荒园里,
    尽日无人属阿谁?
    –白居易 《杨柳枝词》

    上善若水,为而不争。
  • 相关阅读:
    Hive Left Join 中 On 与 Where 的区别
    Matplotlib 中文显示方框 最简单解决方案
    Pandas DataFrame 取消科学计数法打印
    Hive中小表与大表关联(join)的性能分析
    ceiling和floor转化
    Tensorflow 错误:The flag 'xxx' is defined twice
    移动端测试
    Selenium处理alert/confirm/prompt提示框,无头浏览器,规避网站监测
    selenium关于断言的使用和获取input的值
    Selenium之用例流程设计
  • 原文地址:https://www.cnblogs.com/Bearoom/p/11721807.html
Copyright © 2011-2022 走看看