fortran - 如何确保 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
产生我需要的相似结果。这两者之间有什么区别吗?
解决方案
推荐阅读
- c++ - 随机索引数组是否对顺序索引有任何性能影响?
- java - 如何使用 Gradle 运行 Ignored 测试(在类级别参数化和忽略)?
- arrays - Dart:从列表中获取字符串期间的“类”实例
- java - 如何包含具有无效/过时 POM 的 Maven 包?
- vue.js - 离子 Vue 复选框
- python - Python字典:通过输入更新
- c - 如何在字符串中的某个点之后立即移动?
- algorithm - 需要字符迭代才能使 wekqqhibrmxz 成为回文字符串
- python - Python 无法根据两个整数的值为字符串赋值
- python - 通过匹配变量将值从一个 pandas 数据帧添加到另一个数据帧