gpt4 book ai didi

multithreading - 为什么我使用 openMP atomic 的并行代码比串行代码花费更长的时间?

转载 作者:行者123 更新时间:2023-12-03 13:23:01 24 4
gpt4 key购买 nike

我的序列代码片段如下所示。

 Program main
use omp_lib
Implicit None

Integer :: i, my_id
Real(8) :: t0, t1, t2, t3, a = 0.0d0

!$ t0 = omp_get_wtime()
Call CPU_time(t2)
! ------------------------------------------ !

Do i = 1, 100000000
a = a + Real(i)
End Do

! ------------------------------------------ !
Call CPU_time(t3)
!$ t1 = omp_get_wtime()
! ------------------------------------------ !

Write (*,*) "a = ", a
Write (*,*) "The wall time is ", t1-t0, "s"
Write (*,*) "The CPU time is ", t3-t2, "s"
End Program main
耗时:
enter image description here
通过使用 omp 指令 doatomic ,我将串行代码转换为并行代码。但是,并行程序比串行程序慢。我不明白为什么会这样。接下来是我的并行代码片段:
Program main
use omp_lib
Implicit None

Integer, Parameter :: n_threads = 8
Integer :: i, my_id
Real(8) :: t0, t1, t2, t3, a = 0.0d0

!$ t0 = omp_get_wtime()
Call CPU_time(t2)
! ------------------------------------------ !

!$OMP Parallel Num_threads(n_threads) shared(a)

!$OMP Do
Do i = 1, 100000000
!$OMP Atomic
a = a + Real(i)
End Do
!$OMP End Do

!$OMP End Parallel

! ------------------------------------------ !
Call CPU_time(t3)
!$ t1 = omp_get_wtime()
! ------------------------------------------ !

Write (*,*) "a = ", a
Write (*,*) "The wall time is ", t1-t0, "s"
Write (*,*) "The CPU time is ", t3-t2, "s"
End Program main
耗时: enter image description here
所以 我的问题 为什么我使用 openMP atomic 的并行代码比串行代码花费更长的时间?

最佳答案

您在每次循环迭代中对同一变量应用 atomic 操作。此外,该变量在这些循环迭代之间具有相互依赖性。自然,与顺序版本相比,这会带来额外的开销(例如,同步、序列化成本和 CPU 周期)。此外,由于线程使其缓存无效,您可能会遇到很多缓存未命中。
此代码是应该使用变量 reductiona 的典型代码(即 !$omp parallel do reduction(+:a)) 而不是原子操作。通过归约操作,每个线程将拥有变量 'a' 的私有(private)副本,并且在 parallel region 的末尾,线程会将变量 'a'(使用 '+' 运算符)的副本减少为单个值,该值将传播到主线程的变量 'a'
您可以在 SO thread 上找到有关原子与减少之间差异的更详细答案。在那个线程中,甚至还有一个代码,它(就像你的一样)它的 atomic 版本比它的顺序对应版本慢几个数量级(即慢 20 倍)。在这种情况下,它甚至比你的更糟糕(即 20 倍对 10 倍)。

关于multithreading - 为什么我使用 openMP atomic 的并行代码比串行代码花费更长的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64823158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com