Я пытаюсь разработать рекурсивный алгоритм, который я хотел бы запустить параллельно, используя open mp. Мне нужно запустить алгоритм для множественного ввода, поэтому я хочу, чтобы каждый поток запускал 1 вход. Каждый поток независим, но результаты сохраняются в той же глобальной переменной (суммируя их), как показано в коде:
#include <stdio.h>
#include <omp>
double * resultA;
double * resultB;
void recursiveAlgorithm(double a)
{
double b = someFunction(a);
uint c = anotherFunction(a);
if (b < 0)
{
#pragma omp critical
{
resultA[c] = resultA[c] + b;
}
return;
}
if (b > 100)
{
#pragma omp critical
{
resultB[c] = resultB[c] + b;
}
return;
}
recursiveAlgorithm(b);
}
int main( int argc, const char* argv[] )
{
double input[5] = {0, 1, 2, 3, 4};
resultA = malloc(1000*1000*3, sizeof(double));
resultB = malloc(1000*1000*3, sizeof(double));
#pragma omp parallel for
for (uint i; i < 5; i++){
recursiveAlgorithm(input[i]);
}
}
Я использовал критическую секцию, чтобы гарантировать, что переменные resultA и resultB не доступны одновременно, но я не уверен, что это лучше всего подходит для моего случая. Улучшение скорости намного меньше, чем я ожидал. Есть ли лучший подход для такого кода?