fortran - 线程越多,OpenMP 运行速度越慢
问题描述
似乎很多人对 OpenMP 有类似的问题,但我找不到解决问题的方法。
我正在使用一个简单的代码:
PROGRAM Parallel_Hello_World
USE OMP_LIB
integer :: i
real :: start, finish, B
call cpu_time(start)
!$OMP PARALLEL
!$OMP DO
DO i = 1,2000000
B = cos(cos(cos(sin(cos(sqrt(sqrt(sqrt( cos( real(i) ) ))))))))
B = cos(cos(cos(sin(cos(sqrt(sqrt(sqrt( cos( B ) ))))))))
B = cos(cos(cos(sin(cos(sqrt(sqrt(sqrt( cos( B ) ))))))))
END DO
!$OMP END DO
!$OMP END PARALLEL
call cpu_time(finish)
print '("Time = ",f6.3," seconds.")',finish-start
END
我很困惑开销来自哪里。即使我增加了 sin/cos/sqrt 操作的数量,较低的线程总是获胜。
导出 OMP_NUM_THREADS=1 时间 = 1.58 秒。(平均)
导出 OMP_NUM_THREADS=8 时间 = 2.376 秒。(平均)
编译:ifort para.f90 -o para.exe -qopenmp -O2
英特尔编译器是从 2020 年开始的。
解决方案
推荐阅读
- windows - OSError:无法在上下文中读取文件:\\?\C:\project\.gradle\6.6.1\executionHistory\executionHistory.lock
- powershell - Power shell脚本删除一些旧数据以释放空间达到一定限制
- python - 使用 Tkinter 时如何解决 Python3 中的循环导入错误?
- java - Arrays的时间复杂度是多少,sort(String [])
- c++ - c ++ GetPixel返回错误值
- angular - RXJS 等到子对象中的所有可观察对象都解决
- json - 使用 vb.net 无法正确地从数组转换为 json 数组?
- python - 仅从列中提取数字并拆分到不同的列
- python - 无法访问列表范围内的最后一个结束值
- r - 将 R 中的 for 循环输出保存到每次迭代的新对象中