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#endifint p[100][100];voidcreate(){
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;}}}voidprint(){
int i, j;for( i =0; i < Matrix_Order; i++){
for( j =0; j < Matrix_Order; j++){
}}}longlongmydet(int p [100][100],int n ){
if( n ==1)return(p[0][0]);else{
longlong 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);}}intmain(){
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();longlong 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)