LINUX.ORG.RU

Прервать выполнение openmp-секции

 , ,


1

1

Хочется сделать что то вроде:

int foo(cinst size_t n){
	#pragma omp parallel for
	for(size_t i=0; i<n; n++){
		...
		if(smth_error) return 1;
	}
	#pragma omp parallel for
	for(size_t i=0; i<n; n++){
		...
		if(other_error) return 2;
	}
	return 0;
}
Но return из openmp блока сделать нельзя, а городить исключения не хочется. Как сделать правильно?

★★★★★

Как вариант обернуть всё в if-ы, и проверять по переменным-флагам. А возвращать через указатель.

peregrine ★★★★★ ()
Последнее исправление: peregrine (всего исправлений: 1)

Во-первых:

-	for(size_t i=0; i<n; n++){
+	for(size_t i=0; i<n; i++){
А по теме первое, что пришло в голову:
-		if(smth_error) return 1;
+		if(smth_error) i = n;
После проверки становится ясно, что таким образом удастся снять нагрузку только с одной нити, в которой произошла ошибка. Но ведь ошибка произошла только в этой нити, а у других всё в порядке, считают дальше. Т.е. становится также очевидным, что без явного сообщения этого факта другим нитям не обойтись.

Если почитать, что пишут на SO, выходит, что ни i=n, ни проверка флага в условии выполнения цикла нелегальны - нужен флаг, который пропустит все оставшиеся итерации цикла вхолостую. Даже стало интересно, есть ли что-то более элегантное.

gag ★★★★★ ()
Ответ на: комментарий от gag

Начиная со сравнительно свежей версии 4.0 всё оказывается в твоих руках: сам ставишь cancel for и сам решаешь, где с минимальными потерями производительности и более менее приемлемой задержкой расположить cancellation point for (в котором будет проверяться флаг cancel): http://bisqwit.iki.fi/story/howto/openmp/#ThreadCancellationOpenmp 4 0.

Ещё можно посмотреть на грубую силу сигналов.

gag ★★★★★ ()

Решил атомной процедурой, записывающей код ошибки и проверкой этого кода в начале каждого треда.

thunar ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.