вложенная параллельная производительность omp v. 2.0

Как я могу правильно распараллелить внутренний цикл:

int found = -1;
#pragma omp parallel for ordered schedule(dynamic, 1) shared(found)
for (long i = 0; i < big_number; ++i)
{
if( function() )
{
#pragma omp ordered
if( found == -1 )
{
found = i;
}
}
}

bool function()
{
for(int i =0; i < another_big_number;  i++)
{
if( some_condition)
{
return true;
}
}
}

Я не могу опубликовать весь код, но я сохранил большую часть той части, которая кажется необходимой для вопроса. Идея для первого цикла состоит в том, чтобы найти самую низкую итерацию, которую функция возвращает true.

РЕДАКТИРОВАТЬ: Конечно, приветствуется любая идея об улучшении распараллеливания. Однако мой вопрос больше о том, как я могу улучшить производительность самой функции () наряду с внешним циклом for, используя Вложенные методология.

Обратите внимание, что мне известно о предложении свернуть, но я не могу его использовать (благодаря Visual Studio, которая не поддерживает более поздние версии openMP).

Любая идея по улучшению всего параллельного цикла также приветствуется. 🙂

Как вы думаете, будет ли увеличение производительности путем распараллеливания цикла for внутри функции ()?

0

Решение

В этом коде много проблем, во-первых, вы не можете выполнить цикл для этого способа (возврат найден), более того, этот порядок не имеет особого смысла, по крайней мере, с предоставленным фрагментом кода, используйте flush, чтобы реализовать разрыв цикла. , что-то вроде:

boolean found = false;
long return_value = -1;

#pragma omp parallel for schedule(dynamic, 1) shared(found, return_value)
for (long i = 0; i < big_number; ++i)
{
#pragma omp flush (found)
if(!found)
{
if( function() ){
found = true;
return_value = i;
#pragma omp flush (found)

}
}
}

или также:

long return_value = -1;

#pragma omp parallel for schedule(dynamic, 1) shared(return_value)
for (long i = 0; i < big_number; ++i)
{
if( function() ){

#pragma omp critical
{
return_value = i;
}

#pragma omp cancel for
}
#pragma omp cancellation point for
}

основываясь на примере из Вот

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector