基于OpenMP加速的卷积运算

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、OpenMP是什么

        OpenMP是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受,用于共享内存并行系统多处理器程序设计的一套指导性编译处理方案(Compiler Directive)  。OpenMP支持的编程语言包括C、C++和Fortran;而支持OpenMp的编译器包括Sun Compiler,GNU Compiler和Intel Compiler等。OpenMp提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMp时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。

二、运行实例,多线程加速卷积运算

1.实现简单的卷积运算

image是输入图片矩阵大小为100*100,kernel卷积核大小为3*3,输出特征为98*98,根据卷积运算规则对其进行加和。

代码如下(示例):

#include<iostream>
#include<omp.h>

using namespace std;
const int N=100;//图像的高和宽
const int n=3;  //kernel的高和宽
const int K=N-n+1;  //output的高和宽
int image[N][N];
int kernel[n][n];
int output[K][K];


int main()
{
    //int thread_count=strtol(argv[1],NULL,10);
    for(int oh=0;oh<N;oh++)
    {
        for(int ow=0;ow<N;ow++)
        {
            image[oh][ow]=1;
        }
    }
    
    for(int oh=0;oh<n;oh++)
    {
        for(int ow=0;ow<n;ow++)
        {
            kernel[oh][ow]=1;
        }
    }

    //int Num=0;

   
    for(int oh=0;oh<K;oh++)
    {
        for(int ow=0;ow<K;ow++)
        {
            float sum=0;
            
                for(int kh=0;kh<n;kh++)
                {
                    for(int kw=0;kw<n;kw++)
                    {
                        sum += image[oh+kh][ow+kw]*kernel[kh][kw];
                        //Num++;
                    }
                }
            
            //if(bias) sum +=bias[]
            output[oh][ow]=sum;
        }
    }

    for(int i=0;i<K;i++)
    {
        for(int j=0;j<K;j++)
            cout<<output[i][j]<<" ";
        cout<<endl;
        
    }

        //cout<<"一共执行了多少次"<<Num;

return 0;
}

2.OpenMP加速的卷积运算

 #pragma omp parallel for  num_threads(4)此处设置的线程数目为4

#include<iostream>
#include<omp.h>

using namespace std;
const int N=100;//图像的高和宽
const int n=3;  //kernel的高和宽
const int K=N-n+1;  //output的高和宽
int image[N][N];
int kernel[n][n];
int output[K][K];



int main()
{
    //int thread_count=strtol(argv[1],NULL,10);
    for(int oh=0;oh<N;oh++)
    {
        for(int ow=0;ow<N;ow++)
        {
            image[oh][ow]=1;
        }
    }
    
    for(int oh=0;oh<n;oh++)
    {
        for(int ow=0;ow<n;ow++)
        {
            kernel[oh][ow]=1;
        }
    }

    //int Num=0;

    #pragma omp parallel for  num_threads(4)
    for(int oh=0;oh<K;oh++)
    {
        for(int ow=0;ow<K;ow++)
        {
            float sum=0;
            
                for(int kh=0;kh<n;kh++)
                {
                    for(int kw=0;kw<n;kw++)
                    {
                        sum += image[oh+kh][ow+kw]*kernel[kh][kw];
                        //Num++;
                    }
                }
            
            //if(bias) sum +=bias[]
            output[oh][ow]=sum;
        }
    }

    for(int i=0;i<K;i++)
    {
        for(int j=0;j<K;j++)
            cout<<output[i][j]<<" ";
        cout<<endl;
        
    }

        //cout<<"一共执行了多少次"<<Num;

return 0;
}

总结

        本文是一个很简单的基于OpenMP多线程加速的例程,加速卷积运算。供入门的小伙伴,初学者学习体验多线程加速。

猜你喜欢

转载自blog.csdn.net/qq_46644680/article/details/129777251