软硬件协同仿真加速——OpenMP

本文介绍了OpenMP,一种用于共享内存并行系统的多线程编程方案,适用于C、C++和Fortran。文章详细讲解了如何使用OpenMP的pragma指令,包括获取线程数、并行处理for循环、解决线程竞争问题以及数据环境类导语,旨在简化多核CPU上的并行编程,提高程序执行效率。
摘要由CSDN通过智能技术生成

一、什么是OpenMP

OpenMP是⼀种⽤于共享内存并⾏系统的多线程程序设计⽅案,⽀持的编程语⾔包括C、C++和Fortran。OpenMP提供了对并⾏算法的⾼层抽象描述,特别适合在多核CPU机器上的并⾏程序设计。编译器根据程序中添加的pragma指令,⾃动将程序并⾏处理,使⽤OpenMP降低了并⾏编程的难度和复杂度。当编译器不⽀持OpenMP时,程序会退化成普通(串⾏)程序。程序中已有的OpenMP指令不会影响程序的正常编译运⾏。

二、OpenMP的使用

1、获取本机的线程数

代码

#include<omp.h>
 
#include<iostream>
 
int main()
 
{
   
 
    std::cout << "parallel begin:\n";
 
    #pragma omp parallel
 
    {
   
 
        std::cout << omp_get_thread_num() << std::endl;
 
    }
 
    std::cout << "\n parallel end.\n";
 
    std::cin.get();
 
    return 0;
 
}

结果:
在这里插入图片描述
说明本机是16线程

2、基本的编译导语

#pragma omp parallel

omp中使用parallel制导指令标识代码中的并行段
如上个例子中的指令#pragma omp parallel,因此打印输出并行执行。
#pragma omp parallel

       {

         //线程并行执行的代码

        }

parallel表示其后语句将被多个线程并行执行,“#pragma omp parallel”后面的语句(或者,语句块)被称为parallel region。多个线程的执行顺序是不能保证的。

#pragma omp parallel for

对for循环进行并行处理,每个核之间是并行执行,各线程顺序不能保证

  • 不加openmp指令运行,耗时1.97s
#include <iostream>
#include <time.h>
void test()
{
   
    int a = 0;
    for (int i=0;i<100000000;i++)
        a++;
}
int main()
{
   
    clock_t t1 = clock();
    for (int i=0;i<8;i++)
        test();
    clock_t t2 = clock();
    std::cout<<"time: "<<t2-t1<<std::endl;
}
  • 加openmp指令
#include <iostream>
#include <time.h>
void test()
{
   
    int a = 0;
    for (int i=0;i<100000000;i++)
        a++;
}
int main()
{
   
    clock_t t1 = clock();
    #pragma omp parallel for
    for (int i=0;i<8;i++)
        test();
    clock_t t2 = clock();
    std::cout<<"time: "<<t2-t1<<std::endl;
}

#pragma omp parallel for num_threads(4)

指定使用线程数为4

3、解决线程竞争引入的编译导语

当多个线程并行执行时,有可能多个线程同时对某变量进行了读写操作,从而导致不可预知的结果。比如下面的例子,对于包含10个整形元素的数组a,我们用for循环求它各个元素之和,并将结果保存在变量sum里。

#include <iostream>
int main(
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值