考虑以下并行for
/ do
- 循环的情况:
PARALLEL DO
thread 1 thread 2
line 1 line 1
line k -> line k
-> line l line l
line n line n
现在,线程1遇到行l
上的异常或错误(分段错误)并终止。线程2会发生什么?会立即停止吗?它是否会继续排列l
(无论是否在那里遇到同样的错误)?它会继续下一步同步吗?或者到下一步它访问两个线程的共享内存(特别是输出设备,如标准错误)?
我没有在OpenMP 4.0规范中找到提示。
答案 0 :(得分:1)
OpenMP不具备容错能力。关于该主题的标准沉默表明任何事情都可能发生 - 程序进入未定义行为的领域。
除此之外,段错误(通常)是一个进程问题,而不是一个线程问题。毕竟,所有OpenMP线程共享相同的内存和相同的地址空间。您的短语访问两个线程的共享内存提示您可能认为线程在计算过程中的某些点具有私有内存。好吧,只是在某种程度上 - 线程有私有变量。这只意味着编译器创建它们的副本以供特定于线程使用。它们都在同一进程地址空间中。如果您编写了一个聪明的代码(可能使用指针),它使一个线程能够访问另一个线程的私有变量,那么就不会导致o / s引发分段错误。
我不相信我曾经遇到过单个线程失败的OpenMP程序。你的问题不仅仅是理论上的兴趣吗?你遇到过这样的问题吗?