Directorio de artículos de la serie
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
Por ejemplo: el uso de pandas en el Capítulo 1 Introducción a Python Machine Learning
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
Directorio de artículos
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.