主题:[原创]【求助】有关fortran77使用OpenMP并行编程的问题
Mr.Devlin
[专家分:0] 发布于 2012-09-11 22:01:00
大家好,由于一些原因,本人非IT专业但需要接触Fortran,有如下疑问。
请问:
1)在XP下使用Visual Fortran 6.0编译器编写Fortran 77程序,电脑是双核的,想支持OpenMP多线程编程,该怎么做呢?
程序中是不是需要添加头文件或者运行时链接库什么的。,可以拿简单的程序示例讲解哈。
2)Fortran77好像有个编程格式叫Free格式,每行程序前面必须要有6个空格,一行程序长度超过多少列来着就得换行,之后要在第六列添加‘&’符号才行。那么,如果使用OpenMP声明一些private 、public等变量太多,需要换行,是不是也这么处理?请有经验的讲解下。
3)如果在Linux下编译Fortran 95程序,程序包含主程序文件和多个子程序文件,这种情况该怎么编译呢?
4)之前看了个帖子,说的是多个线程访问共享变量造成竞争使程序运行时间变长,那么如果我有多个数组是共享变量,但不同的线程读写的是数组不同的元素部分,就是说线程根据不同的下标来访问数组,还会有竞争吗?
5)如果对同一个共享变量,多个线程都是同时读而非写,这样会产生竞争吗?会影响并行效率么?
问题待补充中......
有大家的帮助,不胜感激。
最后更新于:2012-09-12 15:46:00
回复列表 (共14个回复)
沙发
leilfm [专家分:160] 发布于 2012-09-12 16:34:00
这个问题好多,能回答的帮你答一下,1. 并行不容易做,我用的别人写好的并行程序,看得非常头疼,要自己写程序的话还很远。2. 基本都用free格式了,换行只要用&连接就好了,没有空6格的问题。3. 主程序只会有一个,你编译主程序就可以了。 后面的不知道...
板凳
pasuka [专家分:670] 发布于 2012-09-13 16:15:00
请先看完彭国伦的《Fortran95程序设计》再来提问,这些问题不是三言两语可以解决的
又,如果不差钱的话,干脆发个帖子雇人写代码,这里Fortran高手还是很多的
3 楼
yeg001 [专家分:14390] 发布于 2012-09-14 17:33:00
简单回应一下楼主
1. Visual Fortran 6.0 (就算是终结版6.6c) 不支持openmp并行. 要使用的话请换编译器.
2. Fortran77常用的是fixed. 看你后面说空6个格的更加肯定了是fixed. fixed是旧格式,当然也是一种风格. fixed一般继行在下一行第六个格子用&. 编译器兼容free的话(能用openmp的编译器都支持free)可以在上一行末尾加&就可以. 对于openmp变量太多需要继行, 可以定格使用"!$",具体可以查看www.openmp.org的标准文档.
3. linux编译多个文件一般使用makefile. 当然你可以手动一个个文件编译成o文件然后连接起来. 这个需要学习一下linux下编译, 不是一句话就概括.
4. 每个线程访问和写入不是同一个内存地址就不算数据竞争. 不过如果这些变量挨得很近而且被不同线程调用, 那也会产生"竞争", 这种情况下会拖慢计算速度.
5. 只是读取是没关系的, 不竞争, 不影响效率.
我现在觉得影响效率一个很麻烦的问题是内存带宽和速度. 这个问题在串行程序中就存在,不过在并行程序中更加突出.
PS: 做fortran基本没有it专业的. 搞it的学fortran就失业了.
4 楼
GuiltyOne [专家分:60] 发布于 2012-09-15 16:33:00
楼上大神V5
5 楼
Mr.Devlin [专家分:0] 发布于 2012-09-16 09:41:00
回复一下3楼:
先谢谢您细致的讲解。
请问有什么免费的支持OpenMP的Fortran编译器么,能提供个下载链接就最好了。
6 楼
yeg001 [专家分:14390] 发布于 2012-09-16 15:32:00
开源免费的支持OpenMP的Fortran编译器可以用gcc的gfortran. http://gcc.gnu.org/releases.html
在windwos下可以考虑使用MinGW来应用gcc.
7 楼
tianhy2010 [专家分:60] 发布于 2012-09-16 22:00:00
我也碰到了很多问题。
我用的并行是openmpi,在Lunix系统装的,同学帮忙搞的,很麻烦的。可能用的太少吧
8 楼
yeg001 [专家分:14390] 发布于 2012-09-17 09:23:00
openmpi是mpi, 不同于openmp. mpi的学习难度更大,要调好程序更不容易.
而且两者具有优势的使用环境不同, 没必要拿来直接比较. mpi--集群, omp--单机器内多cpu多核心.
反倒是如果能让两者混编倒是很大的互补.
9 楼
Mr.Devlin [专家分:0] 发布于 2012-09-17 11:30:00
回复8楼:您看一下这个编译出错原因如下,该怎么解决呢?
【编译】gfortran -openmp omptest4.f -o omptest4.gccout
/tmp/ccTmOL1i.o: In function “MAIN__”:
omptest4.f:(.text+0xeb): undefined reference to “omp_get_num_threads_”
omptest4.f:(.text+0x1cb): undefined reference to “omp_get_thread_num_”
omptest4.f:(.text+0x210): undefined reference to “omp_get_num_threads_"
collect2: ld returned 1 exit status
【程序】
program compute_pi
use omp_lib
parameter(OMP_NUM_THREADS=10)
integer n , i , numthreads
real w , x , sum , pi , f , a
!function to integrate
f(a) = 4.d0/(1.d0+a*a)
print * , "Enter number of intervals"
n = 100
!calculate the interval size
w = 1.d0/n
sum = 0.0d0
write(*,*),"number of thread is ",omp_get_num_threads()
!$OMP PARALLEL PRIVATE(x),SHARED(w),REDUCTION(+:sum)
!$OMP DO
do i = 1, n
x = w*(1+0.5d0)
sum = sum + f(x)
write(*,*),"thread id ",omp_get_thread_num()
enddo
!$OMP ENDDO
numthreads = omp_get_num_threads()
write(*,*),"thread number is ",numthreads
!$OMP END PARALLEL
pi = w*sum
write(*,*) ,"compute pi= ",pi
stop
end
10 楼
Mr.Devlin [专家分:0] 发布于 2012-09-17 11:35:00
回复8楼:倒是用intel的编译器不会出现问题
【编译】omptest4.f
[user38@m1 omptest]$ifort -openmp omptest4.f -o omptest4.ifortout
[user38@m1 omptest]$
我来回复