// [[Rcpp::depends(RcppParallel)]]
#include <RcppParallel.h>
#include <RcppArmadilloExtensions/sample.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace RcppArmadillo;
using namespace RcppParallel;
using namespace std;
struct Sum : public Worker
{
vector<string> output;
Sum() {}
Sum(const Sum& sum, Split) {}
void operator()(std::size_t begin, std::size_t end) {
vector<string> states;
states.push_back("a");
states.push_back("b");
states.push_back("c");
states.push_back("d");
vector<double> probs;
probs.push_back(0.3);
probs.push_back(0.4);
probs.push_back(0.1);
probs.push_back(0.2);
vector<string> rstat = sample(states, 1, false, wrap(probs));
output.push_back(rstat[0]);
}
void join(const Sum& rhs) {
for(int i=0;i<rhs.output.size();i++) {
output.push_back(rhs.output[i]);
}
}
};
// [[Rcpp::export]]
CharacterVector parallelVectorSum(int n) {
Sum sum;
parallelReduce(0, n, sum);
return wrap(sum.output);
}
Приведенный выше код представляет собой просто эксперимент по изучению RcppParllel
. Я много искал и обнаружил, что нам следует избегать использования типа данных, такого как CharacterVector
, NumericVector
и т. Д. Вот почему я использовал C++ STL
.Несбалансированность стека при использовании RcppParallel
Выход 1
> parallelVectorSum(1)
[1] "b"
Выход 2
> parallelVectorSum(11)
[1] "d" "a" "b" "b" "d" "a" "b" "b" "d" "b" "a"
Выход 3
> parallelVectorSum(111)
Warning: stack imbalance in '.Call', 7 then 6
[1] "a" "b" "d" "b" "a" "b" "d" "d" "a" "b" "a" "b" "d" "b" "b" "c" "a" "a" "a" "d" "b" "b" "b" "a" "c" "a" "b" "a"
[29] "a" "b" "b" "d" "a" "b" "c" "b" "b" "d" "d" "b" "b" "a" "b" "a" "d" "b" "b" "a" "a" "a" "b" "b" "a" "a" "b" "d"
[57] "a" "a" "b" "d" "a" "a" "c" "d" "b" "c" "a" "d" "a" "d" "d" "b" "a" "a" "d" "b" "b" "d" "d" "b" "b" "b" "a" "a"
[85] "c" "a" "b" "d" "c" "b" "b" "a" "d" "d" "b" "b" "a" "a" "d" "d" "a" "c" "b" "b" "a" "a" "b" "b" "b" "c" "d"
В последнем прогоне я получил предостерегающий g, связанных с дисбалансом стека, и я уверен, что это связано с использованием функции sample
от RcppArmadillo
. В определении метода sample
я обнаружил, что используется тип данных R
. Infact четвертый параметр sample
сам по себе NumericVector
, что является проблемой.
Какое может быть решение этой проблемы? Нужно ли мне реализовать свою собственную функцию sample
(я не думаю, что это легко сделать - я новичок). Любое решение будет оценено по достоинству. Пожалуйста помоги.
Nice. Должны ли мы PR, которые меняются для 'sample()' обратно в RcppArmadillo? –
@DirkEddelbuettel нужно, вероятно, настроить «шаблон», тогда PR хорош. проблемы с зависимостью? – coatless
Зависимости от или от? Легкий вес будет хорошим. –