一个Windows平台下Fortran多线程程序的诡异结果

laughcry2002 2014-07-14 08:52:18
一个openmp多线程程序出现的异常结果。最小的示例代码附后。平台:Windows 7 (64 bit), Intel Fortran 编译器(版本附后)

代码 : test_omp.f90


module my_omp_mod
use omp_lib
implicit none
public

integer :: idt, num_threads

contains

subroutine init()
implicit none

num_threads = omp_get_num_threads()
idt = omp_get_thread_num()

write(*, *) "in init(): idt, num_threads = ", idt, num_threads, omp_get_thread_num()
end subroutine

end module

program main
use omp_lib
use my_omp_mod
implicit none

integer :: idt2, num_threads2

!$OMP parallel default(none) private(idt2, num_threads2) private(idt, num_threads)

call init()
write(*, *) "in main(): idt, num_threads = ", idt, num_threads, omp_get_thread_num()

num_threads2 = omp_get_num_threads()
idt2 = omp_get_thread_num()
write(*, *) "in main(): idt2, num_threads2 = ", idt2, num_threads2, omp_get_thread_num()

!$OMP end parallel
end program


编译:

引用
D:\>ifort -openmp test_omp.f90
Intel(R) Visual Fortran Compiler XE for applications running on IA-32, Version 14.0.2.176 Build 20140130
Copyright (C) 1985-2014 Intel Corporation. All rights reserved.

Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.

-out:test_omp.exe
-subsystem:console
-defaultlib:libiomp5md.lib
-nodefaultlib:vcomp.lib
-nodefaultlib:vcompd.lib
test_omp.obj


运行:
引用
D:\>set OMP_NUM_THREADS=2

D:\>test_omp.exe
in init(): idt, num_threads = 0 2 0
in main(): idt, num_threads = 0 0 0
in main(): idt2, num_threads2 = 0 2 0
in init(): idt, num_threads = 1 2 1
in main(): idt, num_threads = 0 0 1
in main(): idt2, num_threads2 = 1 2 1


异常出在 module 中定义的 idt 变量取值,在 openmp 指导语句中声明为 private 了,但结果似乎表明在 main 中各线程共享了同一个值(而在 init() 内却是正常的)。

谁能帮忙解释一下?
...全文
308 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
make是在1977年在贝尔实验室(Bell Labs)研发的 Unix系统中的一款依赖关系检查工具程序(Utility software)。make的应用非常广泛,它被用来构建 C、C++ 、Pascal  Fortran 等项目,自动化构建生成可执行文件或者库文件。make通过读取Makefile文件以自动化建构软件, 它会根据依赖文件的修改时间进行判断。确定一个target的依赖关系,然后把生成这个target的相关命令传给shell去执行。GNU make 和大多数版本的 make 之间最重要的区别是 GNU make 是自由软件,常和GNU编译系统一起被使用,是大多数GNU Linux安装的一部分。GNU make 在 makefile 中具有许多强大的功能,超出了其他 make 版本的功能,它还可以重新生成、使用、然后删除不需要保存的中间文件。GNU make 还有一些非常方便的简单功能。例如,选项“假装源文件文件没有更改,即使它已更改。当您向头文件添加新宏时,这非常有用。大多数版本的 make 都会假设它们必须重新编译所有使用头文件的源文件,但是如果您知道对头文件的更改不需要重新编译 GNU make 为您提供了一种避免重新编译的方法-o file 。 黄强老师针对零编程基础的同学,精心打磨make核心知识点,帮助你快速掌握Linux编程中的make的构建!适用人群: 零基础、新手、想快速学习Linux下C、C++编程的童鞋!

566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧