首页 > 解决方案 > 如何确保 do 语句中的所有代码都由一个线程在 Fortran 中使用 omp_lib 执行?

问题描述

我正在使用并行编程来缩短从 Fortran 文件中读取数据的时间。输入文件被命名为字符串和整数的组合,整数部分的变化(例如file_1到file_10)。这是一个完整的最小示例程序。子程序 itoa 的功能是将步骤号 i 更改为字符(1 到 '1',2 到 '2' 等等);name_cre 是结合'file_'和'i'来创建文件名。

MODULE EQUATION
    contains
    SUBROUTINE itoa(i,res)
        INTEGER,INTENT(in) :: i
        CHARACTER(len=*),INTENT(out):: res
        CHARACTER(range(i)+2) :: tmp
        write(tmp,'(i5)') i
        res = trim(tmp)
    END SUBROUTINE itoa
    
    SUBROUTINE name_cre(f_n,s_n,res)
        CHARACTER(len=*),INTENT(in)::f_n,s_n
        CHARACTER(len=*),INTENT(out)::res
        res = adjustl(trim(f_n))//adjustl(trim(s_n))
    END SUBROUTINE name_cre
END MODULE EQUATION

    Program read
        use equation
        USE OMP_LIB
        implicit none
        integer:: i
        integer,dimension(1:10):: step=(/1,2,3,4,5,6,7,8,9,10/)
        Character(len = 100):: nu_part,s_name
        !$omp parallel do 
        DO i =1, 10
            CALL itoa(step(i),nu_part)
            CALL name_cre('file_',nu_part,s_name)
        WRITE(*,*) s_name
        END DO
        !$omp end parallel do
        READ(*,*)
    END Program read

                                                                                 

我希望一个循环中的所有语句都由一个线程执行,因此结果应该类似于

        file_1
        file_3
        file_2
        ....

或一些不同的命令。但是现在,似乎第一个 CALL 被分发到不同的线程,然后第二个调用被分发到另一个线程,因此结果类似于

  file_1
  file_3
  file_3
  file_3
  ....

谢谢大家,似乎两者都private(i,nu_part,s_name)可以!$omp critical产生我需要的相似结果。这两者之间有什么区别吗?

标签: fortranopenmp

解决方案


推荐阅读