Как я могу правильно распараллелить внутренний цикл:
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 внутри функции ()?
В этом коде много проблем, во-первых, вы не можете выполнить цикл для этого способа (возврат найден), более того, этот порядок не имеет особого смысла, по крайней мере, с предоставленным фрагментом кода, используйте 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
}
основываясь на примере из Вот
Других решений пока нет …