开始尝试在 Win7 下使用 OpenMP 编写 fortran 并行程序

开始尝试在 Win7 下使用 OpenMP 编写 fortran 并行程序,第1张

备忘:

教程: Parallel Programming in Fortran 95 using OpenMP

使用 OpenMP 应该算是一种比较简单的并行方式,用

将需要并行的部分放进去就行了。

gfortran 编译的话使用 -fopenmp 选项即可

如果不是侍如并行程序的话,仅仅会输出一次,但是这里输出了 4 次,因为有四个线程。而教程中也对这个做了解释:

Since the code enclosed between the two directives is executed by each thread, the message Hello appears in the screen as many times as threads are being used in the parallel region.

不知道那个控制台的图标为啥变成了四个红点,是不是点的个数表示线程数呢?

One of the aims of the OpenMP standard is to offer the possibility of using the same source code lines with an OpenMP-compliant compiler and with a normal compiler. This can only be achieved by hiding the OpenMP directives and commands in such a way, that a normal compiler is unable to see them. For that purpose the following two directive sentinels are introduced: !$OMP & !$

需要注意的是逗谈拍 !$OMP 前面不能出现非空字符,否则将会被认为是普通的注释。OMP的这种方式可以很巧妙地使得程序能够在所有的编译器上运行,如果不支持OMP的话就当作普通的注释,如果支持那么这些就会起作用。另外 指令后面有一个空格,这个主要是为了 指令山羡和后面的语句分隔开。这个空格是强制添加的,否则将作为普通注释来处理。

OMP 的指令行支持续行,和 fortran 没多大区别,只要记得每一行都有指令符号就行了。

暂时就学了这么点。。。

OpenMP 是一种基于共享内存并行计算的编程模型,为了保证数据一致性,在编写多线程程序时需要采取一些措施来避免数据破坏。下面是一些用 OpenMP 编写多线程程序的一些基本技巧,以确保数据一致性和线程安全:

1. 使用互斥锁(mutex):在对共享数据修改的关键区域使用互斥锁进行保护,以确保同一时间只有一个线程在修改共享数据,避免数据破坏。凯举OpenMP 提供了几个内置指令来实现互斥锁,如 `omp_lock_t` 和 `omp_set_lock()`、`omp_unset_lock()` 等。

2. 分配私有内存(private memory):在多线程程序中,每个线程都需要分配自己的内存空间,防止多个线程同时修改相同的内存地址,并导致数据破坏。可以使用 `private` 关键字将变量声明为私有变量,每个线型仿程都有自己的一份拷贝,并在各自的线程中修改,而不会影响其它线程。

3. 使用原子 *** 作:对一些简单的 *** 作,如递增和递减等,可以考虑使用原子 *** 作来保证线程安全,防止数据破坏。OpenMP 提供了几个内置指令来实现原子 *** 作,如 `omp_atomic`、`omp_atomic_read`、`omp_atomic_write`、`omp_atomic_capture` 等。

4. 限制共享数据的访问范围:尽量将共享数据的访问范围限制在需要的代码段内,避免多个线程同时访问导致数据破坏。可以使用 `private` 关键字或将共享数据限制在 `parallel` 或 `for` 指令块内。

5. 使用同步机制:在需要等待其它线程完成某些 *** 作时,可以使用 OpenMP 中提供的同步机制来进行线程同步。如 `omp barrier`、`omp flush`、`omp sections` 等。

总之,在使用 OpenMP 编写卜孙纤多线程程序时,需要注意保障数据一致性和线程安全,避免数据破坏。可以使用互斥锁、私有变量、原子 *** 作、限制访问范围和同步机制等技术手段,保证多线程程序的正确性和高性能。

第一步,登录天河超级计算机。

第二步,创建一个文件夹,用于装测试程序,mkdir test_openmp

第基旅三步,创建一个openmp并行程序hello.c,编写如下代搏友凳码:

#include<stdio.h>

int main(int argc, char** argv){

int i

int max = 0

#pragma omp parallel for private(i) reduction(max:max)

for(i=0i<=10000i++){

if(i>max)max=i

}

printf("%d\n",max)

}

第四步,编译:

gcc -o hello hello.c -fopenmp

登录告悄后复制

第五步,调整控制线程数的环境变量OMP_NUM_THREADS,如果不调整按照最大支持线程数,也就是cpu核数,这里将并行线程数调为2:

export OMP_NUM_THREADS=2

登录后复制

第六步:运行:

./hello

登录后复制

输出结果:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8249795.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存