Computación paralela OpenMP GPU

1. Código fuente de C (gpustbench.c)

  • Capacidad de computación paralela de GPU ( determinante de matriz de cálculo: la suma del producto de cada elemento de cualquier fila y su resto algebraico correspondiente )
    tiempo de operación en serie, tiempo de operación en paralelo de openMP
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <vector>
#include <time.h>
#include <omp.h>

#ifdef Matrix_Order
#if Matrix_Order <= 10
#define Matrix_Order 10
#endif
#endif
#ifndef Matrix_Order
#define Matrix_Order 10
#endif

#ifdef n_threads
#if n_threads <= 2
#define n_threads 5
#endif
#endif
#ifndef n_threads
#define n_threads 5
#endif

#ifdef NTIMES
#if NTIMES <= 2
#define NTIMES 5
#endif
#endif
#ifndef NTIMES
#define NTIMES 5
#endif


int p[100][100];


void create()
{
    
    
	int i, j;
	for ( i = 0; i < Matrix_Order; i++ )
	{
    
    
		for ( j = 0; j < Matrix_Order; j++ )

		{
    
    
			int a = rand() % 15;
			p[i][j] = a;
		}
	}
}


void print()
{
    
    
	int i, j;
	for ( i = 0; i < Matrix_Order; i++ )
	{
    
    
		for ( j = 0; j < Matrix_Order; j++ ){
    
    }
	}
}


long long mydet( int p [100][100], int n )
{
    
    
	if ( n == 1 )
		return(p[0][0]);
	else{
    
    
		long long sum = 0;
		for ( int i = 0; i < n; i++ )
		{
    
    
			int pp[100][100];
			for ( int j = 1, j1 = 0; j < n; j++ )
			{
    
    
				for ( int k = 0, k1 = 0; k < n; k++ )
				{
    
    
					if ( k == i )
						;
					else{
    
    
						pp[j1][k1] = p[j][k];
						k1++;
					}
				}
				j1++;
			}
			if ( i % 2 )
				sum += (-1) * p[0][i] * mydet( pp, n - 1 );
			else
				sum += p[0][i] * mydet( pp, n - 1 );
		}
		return(sum);
	}
}


int main()
{
    
    
	int	k;
	FILE	*fp;
	fp = fopen( "/tmp/gpudata", "w+" );
	
	for ( k = 0; k < NTIMES; k++ )
	{
    
    
		create();

		clock_t start_t = clock();
		mydet( p, Matrix_Order );
		clock_t end_t	= clock();
		double serialruning_t = (double) (end_t - start_t) / CLOCKS_PER_SEC;
		fprintf(fp, "%.4lf\t", serialruning_t );
		
		double start1, finish1;
		start1 = omp_get_wtime();
		long long sum = 0;
		omp_set_num_threads( n_threads );

		#pragma omp parallel for reduction(+:sum)
		for ( int i = 0; i < Matrix_Order; i++ )
		{
    
    
			int pp[100][100];
			for ( int j = 1, j1 = 0; j < Matrix_Order; j++ )
			{
    
    
				for ( int k = 0, k1 = 0; k < Matrix_Order; k++ )
				{
    
    
					if ( k == i )
						;
					else{
    
    
						pp[j1][k1] = p[j][k];
						k1++;
					}
				}
				j1++;
			}
			if ( i % 2 )
				sum += (-1) * p[0][i] * mydet( pp, Matrix_Order - 1 );
			else
				sum += p[0][i] * mydet( pp, Matrix_Order - 1 );
		}
		finish1 = omp_get_wtime();
		double openmpruning_t = finish1 - start1;
		fprintf(fp, "%.4lf\n", openmpruning_t );
	}
	fclose( fp );
	return(0);
}

1. OpenMP dado MPI

  • OpenMP es una biblioteca para la programación de múltiples subprocesos de sistemas paralelos con memoria compartida (varios núcleos en un procesador y cada núcleo comparte una memoria principal). Es compatible con el desarrollo y diseño de programas paralelos. A través de instrucciones de alto nivel, el programa en serie cambió a paralelo programa
  • OpenMP: nivel de subprocesos (granularidad paralela); almacenamiento compartido; implícito (método de distribución de datos); escasa escalabilidad;
  • MPI: nivel de proceso; almacenamiento distribuido (múltiples procesadores, y pueden ubicarse en diferentes computadoras, comunicarse con procesadores remotos a través de canales de comunicación); explícito; buena escalabilidad
  • OpenMP y MPI, que son bibliotecas de desarrollo de programas paralelos que se han utilizado ampliamente. La diferencia entre ellos es: OpenMP es para procesadores multinúcleo y utiliza un método paralelo de memoria compartida, que se puede decir que tiene más subprocesos; MPI es para el caso de múltiples CPU paralelas simétricas o servidores de clúster en el servidor, y el El método para compartir contenido es mixto Sí, más progreso.

Dos, compilar y ejecutar en Linux

  • Compilación predeterminada
g++ gpustbench.c -o gpustbench.o -fopenmp
  • Compilación con parámetros (cualquier número de parámetros)
g++ gpustbench.c DMatrix_Order=11 -Dn_threads=10 -DNTIMES=3 -o gpustbench.o -fopenmp

Tres, ejecuta el comando

./gpustbench.o

Cuatro, vea los resultados de ejecución

cat /tmp/gpudata

Supongo que te gusta

Origin blog.csdn.net/LvJzzZ/article/details/112004355
Recomendado
Clasificación