高性能计算OpenMP实验(OpenMP Programming Model)

Parallel Construct

Code:

Run on my PC

Run on HUAWEI TaiShan200 server

Analysis

通过引入OpenMP库来实现并行计算,程序开头设定了三个线程,然后通过#pragma omp parallel private来指定并行计算代码,然后分别用获取每个线程的变化和总线程数,然后输出,在我的个人电脑上的运行结果和在华为服务器运行结果是一致的。

Combined Worksharing Construct: for/Section

Worksharing Construct

Run on my PC

Run on HUAWEI TaiShan200 server

Analysis

设定了三个线程,然后设置了一段并行执行的代码。先并行执行输出当前线程数和总线程数的代码,然后是一个并行的for循环,循环输出当前执行的线程编号

Testing parallel for

Run on my PC

Run on HUAWEI TaiShan200 server

Analysis

使用#pragma omp parallel for指定了将要并行执行的代码块,for将被并行执行。我的电脑有6核心12线程,所以会用十个线程去并行执行这个for循环。服务器的线程数也超过了10个,所以可以分配前十个线程去并行执行

Testing section

Run on my PC

Run on HUAWEI TaiShan200 server

Analysis

#pragma omp parallel sections可以包含多个部分,都是将要执行的代码块。由#pragma omp section包括的部分可以并行执行。所以两个代码段都能被并行执行。在我的电脑中第一个i循环被线程0执行,第二个j循环被线程1执行。在服务器中第一个i循环被线程59执行,第二个j循环被线程0执行。

Synchronous Construct: barrier/critical/atomic

Testing barrier

Run on my PC (part of result)

Run on HUAWEI TaiShan200 server (part of result)

Analysis

这段程序主要是运用了一个#pragma omp barrier设置了一个屏障,让先运行完i循环后再运行j循环,但是因为#pragma omp parallel指定了并行的代码段,所以ij循环都是可以并行执行的。我的电脑上的运行结果和服务器上的结果相似

Critical

Run on my PC

Run on HUAWEI TaiShan200 server

Analysis

代码中的#pragma omp parallel shared(x)使得所有的线程都能够访问x变量。但是因为#pragma omp critical的加入,使得x++的这个操作是由每个线程顺序执行的。所以我的电脑上的运行结果和服务器的运行结果一致。

Atomic

Run on my PC

Run on HUAWEI TaiShan200 server

Analysis

原子指令#pragma omp atomi也是保护程序是原子性的,被一个一个的线程去执行,不会出现同时执行的状况,最终结果服务器和我的电脑上的结果相同.

Relaxed Consistency model

Run on my PC (part of result)

Run on HUAWEI TaiShan200 server (part of result)

 

Analysis

程序先是创建了一个多线程都会执行的循环,然后是一段critical的代码,使得这一段的代码时被一个一个线程顺序执行的,然后是下一个循环,这个循环也是被每个线程并行执行的。我的电脑上运行结果的观察和服务器上运行结果所观察到的现象是一致的

Reduction clause

PI- parallel for Construct

Run on my PC

Run on HUAWEI TaiShan200 server

Analysis

程序把定义了计算的步数和步长,并且使用了两个线程并行计算。把sum作为私有变量,通过#pragma omp parallel for实现并行执行循环for,每一个结果都加入sum,最终输出的就是圆周率,我的电脑计算结果和服务器是一样的

PI- parallel Construct

Run on my PC

Run on HUAWEI TaiShan200 server

Analysis

这段代码比上面的复杂,先建立了一个可以并行计算的代码段,把x, i, id作为私有变量。for循环从id+1开始,每一次增加的数量都是执行的线程数量,每个线程计算的结果都添加到sum,这个方式是使用了OpenMP的并行循环指令。最终求得的sum就是圆周率,我的电脑上的运行结果和服务器上面运行结果是一样的

猜你喜欢

转载自blog.csdn.net/lijj0304/article/details/130177697