备忘:
教程: 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 编写多线程程序时,需要注意保障数据一致性和线程安全,避免数据破坏。可以使用互斥锁、私有变量、原子 *** 作、限制访问范围和同步机制等技术手段,保证多线程程序的正确性和高性能。
你咨询了解下LINKZOL(联众集群)吧。
你这个是每节点是32线程,16核,2个处理器对吧?一般来说有些计算应用是8线程的倍数关系,当你的物理核心满负荷运行的时候,你虚拟线程是没有意义的。同时你得确定mpi装的是
openmpi而不是自带的mpich2,因为mpich2没有openmpi的性能好,当然也跟gfortran有关系。
运行的慢是因为你的length太小。并行的话比串行需要时间去分,还需要时间再合。所以当你数据量太小时反而用串行的就比较快了。
你换成一亿就能看出差距了。
我没看出来哪有冲突。但是我觉得你上面赋值和算c那这么写也许效率更快。
#pragma omp parallel for
for(i=0; i<length; i++)
{
A[i] = (rand_r(&seed))%10;
B[i] = (rand_r(&seed))%10;
C[i] = (A[i]+B[i])/2;
}
还有,你根本没用到头文件timeh啊。你写这个头文件干嘛?是不是想看运行时间啊。
0xc000007b这个错误是所谓的“STATUS_INVALID_IMAGE_FORMAT”,意思是:32位的进程试图加载64位的dll,或者64位进程试图加载32位dll。
① 你的机器是64位,而服务器是32位? 或者相反?
② 你的fortren是什么版本? 编译环境是? 编译参数?
各有优势。
pthread在程序启动时创建一束线程,将工作分配到线程上。然而,这种方法需要相当多的线程指定代码,而且不能保证能够随着可用处理器的数量而合理地进行扩充。OpenMP,不需要指定数量,在有循环的地方加上代码,修改设置文件极客。OpenMP非常方便,因为它不会将软件锁定在事先设定的线程数量中,但是相对的查错更难也更麻烦。
Pthreads指定API来处理线程要求的大部分行为。这些行为包括创建和终止线程、等待线程完成、以及管理线程之间的交互。后面的目录中存在各种锁定机制,能够阻止两个线程同时尝试修改相同的数据值:互斥体、条件变量和信号量。(从技术上讲,不是Pthreads的一部分,但是它们从概念上更接近于与线程合作,而且可用于Pthreads能够运行的所有系统上。
以上就是关于开始尝试在 Win7 下使用 OpenMP 编写 fortran 并行程序全部的内容,包括:开始尝试在 Win7 下使用 OpenMP 编写 fortran 并行程序、如何用openmp为其编写能保证数据一览不被破坏的多线程程序、gfortran&openmp并行,服务器 2个物理节点,每节点8CPU,共32线程,为何32和8线程效率一样,求大神指点!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)