Rcpp :: Функция в parellel для секции - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь распараллелить для цикла вычисление пригодности людей.Для всего этого алгоритма я использую 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 работает без параллелизма.

1 Ответ

0 голосов
/ 23 февраля 2019

Знаете ли вы, что Rcpp::Function() просто вызывает функцию R, и, следовательно,

  1. нарушает установленный вами принцип использования базового экземпляра R в (OpenMP или pthread) параллельном коде и
  2. конечно, также работает только на скорости R как функция R?

На уровне R. вы можете легче выполнять параллельный вызов R-кода.

И если вам нужна скорость C ++ параллельно, вам нужно написать код C ++, который можно вызывать параллельно - см., Например, пакет RcppParallel и его виньетку для вводных примеров.

...