如果一个 OpenMP 线程崩溃会怎样?
What happens if one OpenMP thread crashes?
考虑以下并行 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 规范中没有找到提示。
OpenMP 不是容错的。该标准对该主题的沉默表明任何事情都可能发生——程序进入了未定义行为的领域。
除此之外,段错误(通常)是进程问题,而不是线程问题。毕竟,所有 OpenMP 线程共享相同的内存和相同的地址 space。您的短语 where it accesses shared memory of both threads 暗示您可能认为线程在计算过程中的某些时刻具有私有内存。好吧,只是在某种程度上——线程有私有变量。这只是意味着编译器会创建它们的副本以供线程特定使用。它们都在同一个进程地址 space 中。如果您编写了一个聪明的代码(可能使用指针),使一个线程能够访问另一个线程的私有变量,您就不会导致 o/s 引发分段错误。
我相信我从未遇到过单个线程失败的 OpenMP 程序。您的问题不仅仅是理论上的兴趣吗?你遇到过这样的问题吗?
考虑以下并行 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 规范中没有找到提示。
OpenMP 不是容错的。该标准对该主题的沉默表明任何事情都可能发生——程序进入了未定义行为的领域。
除此之外,段错误(通常)是进程问题,而不是线程问题。毕竟,所有 OpenMP 线程共享相同的内存和相同的地址 space。您的短语 where it accesses shared memory of both threads 暗示您可能认为线程在计算过程中的某些时刻具有私有内存。好吧,只是在某种程度上——线程有私有变量。这只是意味着编译器会创建它们的副本以供线程特定使用。它们都在同一个进程地址 space 中。如果您编写了一个聪明的代码(可能使用指针),使一个线程能够访问另一个线程的私有变量,您就不会导致 o/s 引发分段错误。
我相信我从未遇到过单个线程失败的 OpenMP 程序。您的问题不仅仅是理论上的兴趣吗?你遇到过这样的问题吗?