回 帖 发 新 帖 刷新版面

主题:[原创]【求助】有关fortran77使用OpenMP并行编程的问题

大家好,由于一些原因,本人非IT专业但需要接触Fortran,有如下疑问。

请问:

1)在XP下使用Visual Fortran 6.0编译器编写Fortran 77程序,电脑是双核的,想支持OpenMP多线程编程,该怎么做呢?

程序中是不是需要添加头文件或者运行时链接库什么的。,可以拿简单的程序示例讲解哈。

2)Fortran77好像有个编程格式叫Free格式,每行程序前面必须要有6个空格,一行程序长度超过多少列来着就得换行,之后要在第六列添加‘&’符号才行。那么,如果使用OpenMP声明一些private 、public等变量太多,需要换行,是不是也这么处理?请有经验的讲解下。

3)如果在Linux下编译Fortran 95程序,程序包含主程序文件和多个子程序文件,这种情况该怎么编译呢?

4)之前看了个帖子,说的是多个线程访问共享变量造成竞争使程序运行时间变长,那么如果我有多个数组是共享变量,但不同的线程读写的是数组不同的元素部分,就是说线程根据不同的下标来访问数组,还会有竞争吗?

5)如果对同一个共享变量,多个线程都是同时读而非写,这样会产生竞争吗?会影响并行效率么?

问题待补充中......

 

签名档
有大家的帮助,不胜感激。

回复列表 (共14个回复)

沙发

这个问题好多,能回答的帮你答一下,1. 并行不容易做,我用的别人写好的并行程序,看得非常头疼,要自己写程序的话还很远。2. 基本都用free格式了,换行只要用&连接就好了,没有空6格的问题。3. 主程序只会有一个,你编译主程序就可以了。 后面的不知道...

板凳


请先看完彭国伦的《Fortran95程序设计》再来提问,这些问题不是三言两语可以解决的
又,如果不差钱的话,干脆发个帖子雇人写代码,这里Fortran高手还是很多的

3 楼

简单回应一下楼主
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 楼


楼上大神V5

5 楼

回复一下3楼:
先谢谢您细致的讲解。
请问有什么免费的支持OpenMP的Fortran编译器么,能提供个下载链接就最好了。

6 楼

开源免费的支持OpenMP的Fortran编译器可以用gcc的gfortran. http://gcc.gnu.org/releases.html
在windwos下可以考虑使用MinGW来应用gcc.

7 楼

我也碰到了很多问题。
我用的并行是openmpi,在Lunix系统装的,同学帮忙搞的,很麻烦的。可能用的太少吧

8 楼

openmpi是mpi, 不同于openmp. mpi的学习难度更大,要调好程序更不容易. 
而且两者具有优势的使用环境不同, 没必要拿来直接比较. mpi--集群, omp--单机器内多cpu多核心.
反倒是如果能让两者混编倒是很大的互补.

9 楼

回复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 楼

回复8楼:倒是用intel的编译器不会出现问题
【编译】omptest4.f
[user38@m1 omptest]$ifort -openmp omptest4.f -o omptest4.ifortout
[user38@m1 omptest]$ 

我来回复

您尚未登录,请登录后再回复。点此登录或注册