1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 基于MPI和OpenMP的并行程序设计与实现

基于MPI和OpenMP的并行程序设计与实现

时间:2023-04-25 04:02:31

相关推荐

基于MPI和OpenMP的并行程序设计与实现

目录

基于MPI和OpenMP的并行程序设计与实现 3

一、实验目的和要求 3

二、实验内容 3

(1)使用SPMD编程模式编写求解MPI程序。 3

(2)编写求解OpenMP程序 4

<2.1>并行域并行求解 4

<2.2>使用for循环制导计算 6

<2.3>使用带reduction子句的for循环制导 7

<2.4>通过private子句和critical制导计算 8

(3)基于MPI+OpenMP编写求解程序。 9

(4)设计并实现矩阵乘的并行算法,分析所设计的并行算法的性能,比如加速比、并行效率和可扩展性。(选做) 11

(5)MPI与OpenMP有什么区别?谈谈对高性能计算的理解和认识。 13

基于MPI和OpenMP的并行程序设计与实现

一、实验目的和要求

(1)掌握高性能计算相关基础知识和并行程序设计的方法。

(2)掌握Linux系统的安装与使用。

(3)掌握Linux下并行计算环境的搭建与使用。

(4)掌握基于MPI的并行编程方法。

(5)掌握基于OpenMP的并行编程方法。

(6)掌握MPI+OpenMP的并行编程方法。

(7)练习课件第5、6章的相关例子。

二、实验内容

(1)使用SPMD编程模式编写求解MPI程序。

分析:

这是根据PPT上的串行代码改的MPI代码,实际上就是通过不断的计算,然后将各个线程运算的结果记录在mypi中,并通过归约的方式传入pi并对多个线程的结果作累加(MPI_SUM)。运行时间很短,这里我们将循环次数都设为1000000,方便下面的对比。

MPI与OpenMP的区别还是蛮大的。首先从编程的角度来讲,MPI的代码要比OpenMP的代码来得复杂,这一点在我做实验的时候深有体会。很多时候,OpenMP只需要在原有循环的基础上加上并行语句即可,不需要我们去考虑怎么传输,怎么接收,怎么分配,而MPI则截然不同。

而且,在兼容性方面,OpenMP是针对单主机上的多核/多CPU并行计算而设计的工具,所以说无法用在超级计算机上。而MPI作为分布式额你存之间实现信息通讯的一种标准库,具有很好的可移植性和可扩展性,适用于超级计算机的多主机多核心环境。

但是,在可靠性方面,MPI如果一个进程出问题,那么整个程序都将出现错误,这样就提高了对MPI程序进程调试的难度,本文转载自http://www.biyezuopin.vip/onews.asp?id=16947所以其可靠性是不如OpenMP的。

百度上对高性能计算有如下定义:指通常使用很多处理器(作为单个机器的一部分)或者某一集群中组织的几台计算机(作为单个计算资源操作)的计算系统和环境。也就是说,这是一种通过并发的方式来高效地协调使用多个处理器或者多个核心来提高计算效率。

其前景是非常开阔的,尤其是在当今人工智能等这些上层应用已经接近饱和的状态下。如今的很多大型工程运算,诸如气象预测等等,都离不开作为底层的并行运算来提升它们的计算速度。如果有可能的话,我希望在未来能够加入到高性能计算的研究行列中去。

//计算 matrix1(A*B) * matrix2(B*C) = matrixAns(A*C)#include <stdio.h>#include <omp.h>#define A 3#define B 3#define C 3#define nThreads 4//第一个A*B矩阵int matrix1[A][B] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};//第二个B*C矩阵int matrix2[B][C] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};int matrixAns[A][C]; //结果矩阵int main(){double start, stop;omp_set_num_threads(nThreads);int temp;start = omp_get_wtime();#pragma omp parallel{#pragma omp for private(temp)for (int a = 0; a < A; a++){for (int c = 0; c < C; c++){temp = 0;for (int b = 0; b < B; b++){temp += matrix1[a][b] * matrix2[b][c];}matrixAns[a][c] = temp;}}}stop = omp_get_wtime();//输出printf("result:\n");for (int i = 0; i < A; ++i){for (int j = 0; j < C; ++j)printf("%d ", matrixAns[i][j]);printf("\n");}printf("time = %lf\n", stop-start);return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。