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, и, следовательно,

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

Вы можете добиться параллельного вызова кода R на уровне R.

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

Другие вопросы по тегам