OpenMP GPU并行计算

一、C源码(gpustbench.c)

  • GPU并行计算能力(计算矩阵行列式:任一行的各元素与其对应的代数余子式乘积之和
    串行运算时长、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与MPI

  • OpenMP是一种用于共享内存(一个处理器上由多个核心,每个核心共享一个主存)并行系统的多线程程序设计的库,支持并行程序开发设计,通过高阶指令,将串行程序改为并行程序
  • OpenMP:线程级(并行粒度);共享存储;隐式(数据分配方式);可扩展性差;
  • MPI:进程级;分布式存储(多个处理器,并且可以位于不同的计算机,通过通信信道与远程处理器进行通信);显式;可扩展性好
  • OpenMP和MPI,这两个都是已经被广泛使用的并行程序开发库。他们的区别是:OpenMP是针对多核处理器,使用的是共享内存的并行方式,可以说更为线程一些;MPI是针对服务器中,多个对称并行CPU或者集群服务器的情况,内容共享方式是混合的,更为进程一些。

二、Linux中编译运行

  • 默认编译
g++ gpustbench.c -o gpustbench.o -fopenmp
  • 带参数编译(参数个数任意)
g++ gpustbench.c DMatrix_Order=11 -Dn_threads=10 -DNTIMES=3 -o gpustbench.o -fopenmp

三、执行命令

./gpustbench.o

四、查看运行结果

cat /tmp/gpudata

猜你喜欢

转载自blog.csdn.net/LvJzzZ/article/details/112004355