Rcpp:: Функция в parellel для секции
Я пытаюсь распараллелить для цикла вычислительной пригодности людей. Для всего этого алгоритма я использую 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, который позволил бы мне распараллелить вычисление этого значения пригодности?
Вся эта работа предназначена для создания пакета параллельной оптимизации Moth Search Algoritm для CRAN.
В основном тот же код в C++ с std::function
работает хорошо. Код Rcpp работает нормально, не будучи параллельным.
1 ответ
Знаете ли вы, что Rcpp::Function()
просто вызывает функцию R, и, следовательно,
- нарушает принцип, который вы используете, используя базовый экземпляр R в (OpenMP или pthread) параллельном коде и
- конечно также работает только на скорости R как функция R?
Вы можете добиться параллельного вызова кода R на уровне R.
И если вам нужна скорость C++ параллельно, вам нужно написать код C++, который можно вызывать параллельно - см., Например, пакет RcppParallel и его виньетку для вводных примеров.