Аналог реальной программы. Как переместить создание потоков (#pragma omp parallel) в main_, но оставить funcSerial однопоточным (последовательным)? funcSerial я распараллеливать пробовал - толку мало. В реальной программе там идет очень интенсивный обмен с памятью, и более чем в два раза она не ускоряется на любом количестве ядер.
double funcPar()
{
double sum[] = { 0, 0, 0, 0 };
#pragma omp parallel
{
#pragma omp for
for (int i = 0; i < 4; i++) //loop body should be parallel (multy-threaded)
{
auto a = (double)i;
sum[i] += sin(a)*cos(a); // real code is more complicated and works much longer
}
}//omp parallel
return sum[0] + sum[1] + sum[2] + sum[3];
}
double funcSerial() //function should remain serial (single-threaded)
{
int K = 5000;
double sum = 0.0;
for (int k = 0; k < K; k++)
{
sum += funcPar();
}
return sum;
}
void main_() // //function body should remain serial (single-threaded)
{
int J = 1000;
double sum = 0.0;
for (int j = 0; j < J; j++)
{
sum += funcSerial();
}
printf("\n\n sum = %f \n", sum);
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Имеется один файл maincpp, в котором определены две глобальные функции getSomeResultFromSomeFunc(), processResult() и функция main():
При прохождении одного из онлайн тестов наткнулся на сложный вопросВопрос формулируется примерно так: