Operación de convolución basada en aceleración OpenMP

Directorio de artículos de la serie

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
Por ejemplo: el uso de pandas en el Capítulo 1 Introducción a Python Machine Learning


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


prefacio

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

Por ejemplo: con el desarrollo continuo de la inteligencia artificial, la tecnología del aprendizaje automático se está volviendo cada vez más importante. Muchas personas han comenzado a aprender el aprendizaje automático. Este artículo presenta el contenido básico del aprendizaje automático.


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

1. ¿Qué es OpenMP?

        OpenMP está dirigido por la Junta de revisión de arquitectura de OpenMP y ha sido ampliamente aceptado como un conjunto de esquema de procesamiento de compilación guía (directiva de compilador) para la programación multiprocesador del sistema paralelo de memoria compartida . Los lenguajes de programación compatibles con OpenMP incluyen C, C++ y Fortran ; los compiladores que admiten OpenMP incluyen Sun Compiler, GNU Compiler e Intel Compiler. OpenMp proporciona una descripción abstracta de alto nivel de los algoritmos paralelos Los programadores especifican sus intenciones agregando pragmas especiales en el código fuente , de modo que el compilador pueda paralelizar automáticamente el programa y agregar sincronización, exclusión mutua cuando sea necesario y comunicación. Cuando elige ignorar estos pragmas, o el compilador no es compatible con OpenMp, el programa puede degenerar en un programa normal (generalmente en serie) y el código aún puede funcionar normalmente, pero no puede usar subprocesos múltiples para acelerar la ejecución del programa .

2. Ejecute la instancia, multiproceso para acelerar la operación de convolución

1. Realice una operación de convolución simple

image es el tamaño de la matriz de imagen de entrada es 100 * 100, el tamaño del kernel de convolución del kernel es 3 * 3, y la característica de salida es 98 * 98, que se suman de acuerdo con las reglas de operación de convolución.

El código es el siguiente (ejemplo):

#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. Operación de convolución acelerada de OpenMP

 #pragma omp paralelo para num_threads(4) El número de subprocesos establecido aquí es 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;
}

Resumir

        Este artículo es una rutina muy simple basada en la aceleración de subprocesos múltiples de OpenMP para acelerar las operaciones de convolución. Para principiantes, los principiantes aprenden a experimentar la aceleración de subprocesos múltiples.

Supongo que te gusta

Origin blog.csdn.net/qq_46644680/article/details/129777251
Recomendado
Clasificación