Я пытаюсь распараллелить для цикла вычисление пригодности людей.Для всего этого алгоритма я использую Rcpp, но фитнес-функция передается из R.
Так что я пытаюсь сделать что-то вроде этого:
#pragma omp parallel for
for (int i = 0; i < population.size(); i++)
{
population[i].computeFitness(FitnessFunction);
}
Где FitnessFunction
равно Rcpp::Function
и computeFitness - это просто функция класса, по существу присваивающая вычисленное значение переменной-члену.
void computeFitness(Rcpp::Function optFunction)
{
this->_fitness = Rcpp::as<double>(optFunction(this->_coords));
}
Но это дает сбой, потому что, как я теперь знаю, R является однопоточным, и я не могу использовать базовые экземпляры R в параллельных секциях.
Так есть ли способ конвертировать Rcpp::Function
в std::function
, функтор или что-то подобное?Есть ли другой способ передать функцию из R в Rcpp, которая позволила бы мне распараллелить вычисление этого значения пригодности?
Вся эта работа предназначена для создания пакета параллельной оптимизации алгоритма поиска моли для CRAN.
В основном тот же код на c ++ с std::function
работает хорошо.Код Rcpp работает без параллелизма.