gpt4 book ai didi

multithreading - OpenMP 了解关键构造中的死锁

转载 作者:行者123 更新时间:2023-12-04 06:47:08 25 4
gpt4 key购买 nike

我试图准确理解为什么在并行区域中关键构造嵌套在关键构造中时会发生死锁。

我引用了以下资源:this来源作者写道:

In OpenMP this can happen if inside a critical region a function is called which contains another critical region. In this case the critical region of the called function will wait for the first critical region to terminate - which will never happen.

好吧,但为什么不呢?此外来自:Hager、Georg 和 Gerhard Wellein。面向科学家和工程师的高性能计算简介。 CRC Press, 2010, p. 149:

When a thread encounters a CRITICAL directive inside a critical region, it will block forever.

同样的问题,为什么?

最后,查普曼、芭芭拉、加布里埃莱·约斯特和路德·范德帕斯。使用 OpenMP:可移植共享内存并行编程。卷。 10. MIT 出版社,2008 年也提供了一个使用锁的示例,但没有使用关键结构。

根据我目前的理解,在嵌套临界区中发生死锁有两种不同的可能方式:

先开始:

如果两个线程到达嵌套的临界结构(一个临界区在另一个临界区内),线程一进入“外部”临界区,线程二等待。引用查普曼等人的话。

When a thread encounters a critical construct, it waits until no other thread is executing a critical region with the same name.

好的,到目前为止一切顺利。现在,线程 1 不会进入嵌套临界区,因为它是一个同步点,线程在该点等待所有其他线程到达后再继续。由于第二个线程正在等待第一个线程退出“外部”临界区,因此它们处于死锁状态。

结束第一次拍摄。

开始第二次拍摄:

两个线程都到达“外部”关键构造。线程一进入“外部”关键构造,线程二等待。现在,线程一进入“内部”关键构造并在其隐含的障碍处停止,因为它等待线程二。另一方面,线程二等待线程一退出到“外部”线程,因此两者都在永远等待。

结束第二次拍摄。

这是产生死锁的一小段 Fortran 代码:

  1   subroutine foo
2
3 !$OMP PARALLEL
4 !$OMP CRITICAL
5 print*, 'Hallo i am just a single thread and I like it that way'
6 !$OMP END CRITICAL
7 !$OMP END PARALLEL
8
9 end subroutine foo
10
11 program deadlock
12 implicit none
13 integer :: i,sum = 0
14
15 !$OMP PARALLEL
16 !$OMP DO
17 do i = 1, 100
18 !$OMP CRITICAL
19 sum = sum + i
20 call foo()
21 !$OMP END CRITICAL
22 enddo
23 !$OMP END DO
24 !$OMP END PARALLEL
25
26 print*, sum
27 end program deadlock

所以我的问题是,这两个建议中的一个是正确的,还是有另一种可能性为什么会在这种情况下发生死锁。

最佳答案

没有隐含的障碍,即没有与 CRITICAL 结构关联的“线程等待其他线程到达的同步点”。相反,在关键构造开始时,线程等待任何已经在同名关键构造内的线程离开该构造。

不能嵌套具有相同名称的关键结构,因为当前的 OpemMP 规则规定它们不能(参见 OpemMP 4.0 第 2.16 节中嵌套的限制)。这确实是您问题的答案和讨论的结束 - 如果您违反了该禁令,那么任何事情都有可能发生。

实际上,这个禁令允许实现假设具有相同名称的关键结构不会被嵌套。一个常见的实现选择是遇到关键构造的线程将等待所有线程包括它自己离开构造。如果它正在等待,则线程不能离开。这会导致死锁。

可以嵌套具有不同名称的关键结构。如果嵌套不一致,在这种情况下可能会出现死锁。考虑:

!$OMP PARALLEL

!$OMP CRITICAL (A)
!$OMP CRITICAL (B) ! Thread one waiting here.
!...
!$OMP OMP CRITICAL (B)
!$OMP END CRITICAL (A)

!$OMP CRITICAL (B)
!$OMP CRITICAL (A) ! Thread two waiting here.
!...
!$OMP OMP CRITICAL (A)
!$OMP END CRITICAL (B)

!$END PARALLEL

如果发生这种情况,线程将等待很长时间。

关于multithreading - OpenMP 了解关键构造中的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27154377/

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