2015-05-26 6 views
0

Рассмотрим следующий случай параллельного for/do -loop:Что произойдет, если один поток OpenMP завершится с ошибкой?

 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

Возможно, лучше разместить это на форуме OpenMP, где его увидят эксперты. В любом случае, вы захватываете segfault? – Jeff

ответ

1

OpenMP не является отказоустойчивым. Тишина стандарта в этой теме указывает на то, что что-то может случиться - программа входит в область неопределенного поведения.

Это в стороне, проблема segfault (обычно) - проблема процесса, а не проблема с потоком. В конце концов, все потоки OpenMP имеют одну и ту же память и одно и то же адресное пространство. Ваша фраза , где он обращается к общей памяти обоих потоков, подсказывает, что вы можете думать, что потоки имеют частную память в некоторых точках во время вычисления. Ну, только в каком-то смысле - потоки имеют частные переменные. Это означает, что компилятор создает их копии для конкретного использования. Все они находятся в одном и том же адресном пространстве процесса. Если вы написали умный код (возможно, используя указатели), который позволил одному потоку получить доступ к частным переменным другого потока, вы бы не стали причиной сбоя сегментации.

Я не верю, что когда-либо сталкивался с программой OpenMP, в которой ни один поток не удался. Является ли ваш вопрос более чем теоретическим интересом? У вас возникла такая проблема?

+0

Мой код попадает в исключение с плавающей запятой, если он работает с несколькими потоками. Это вызвало мой общий интерес, что другие потоки делают, если один из них терпит неудачу. –

+0

Я вижу. Итак, как и все хорошо дисциплинированные коды (ха-ха), вы поймаете исключение, в поток, который его вызвал, и справитесь с этим. Несмотря на это, OpenMP будет работать очень быстро после того, как необработанное исключение добавит поток на колени. –

Смежные вопросы