命名空间中的并行工作者
Posted
技术标签:
【中文标题】命名空间中的并行工作者【英文标题】:Parallel Worker in namespace 【发布时间】:2019-03-09 22:08:07 【问题描述】:这个例子是之前这篇文章的后续例子。我正在尝试将 Parallel Worker 移动到它自己的 cpp 文件并在头文件中声明它。
Calling 'mypackage' function within public worker
两个错误如下: 1) 变量类型'ExampleInternal::PARALLEL_WORKER'是一个抽象类
在我不可重现的例子中: 2) 错误:Parallel_worker.cpp 文件中的 'ExampleInternal::PARALLEL_WORKER' 行上的预期 unqualified-id。
现在代码如下所示:
ExampleInternal.h
#ifndef ExampleInternal_H
#define ExampleInternal_H
namespace ExampleInternal
#include <RcppArmadillo.h>
#include <RcppParallel.h>
double myfunc3(arma::vec vec_in)
int Len = arma::size(vec_in)[0];
return (vec_in[0] +vec_in[1])/Len;
struct PARALLEL_WORKER : RcppParallel::Worker;
#endif
Parallel_Worker.cpp
#include <RcppArmadillo.h>
#include <RcppParallel.h>
#include <random>
#include "ExampleInternal.h"
using namespace RcppParallel;
using namespace ExampleInternal;
namespace ExampleInternal
ExampleInternal::PARALLEL_WORKER
const arma::vec &input;
arma::vec &output;
PARALLEL_WORKER(const arma::vec &input, arma::vec &output) : input(input), output(output)
void operator()(std::size_t begin, std::size_t end)
std::mt19937 engine(1);
// Create a loop that runs through a selected section of the total Boot_reps
for( int k = begin; k < end; k ++)
engine.seed(k);
arma::vec index = input;
std::shuffle( index.begin(), index.end(), engine);
output[k] = ExampleInternal::myfunc3(index);
;
//Close Namespace
Parallel_func.cpp
#include <RcppArmadillo.h>
#include <RcppParallel.h>
#include "ExampleInternal.h"
using namespace ExampleInternal;
// [[Rcpp::export]]
arma::vec Parallelfunc(int Len_in)
arma::vec input = arma::regspace(0, 500);
arma::vec output(Len_in);
ExampleInternal::PARALLEL_WORKER parallel_woker(input, output);
parallelFor( 0, Len_in, parallel_woker);
return output;
【问题讨论】:
【参考方案1】:您需要正确地在声明和结构定义之间进行拆分。头文件中的声明包含成员变量和方法签名。
namespace ExampleInternal
struct PARALLEL_WORKER : RcppParallel::Worker
const arma::vec &input;
arma::vec &output;
PARALLEL_WORKER(const arma::vec &input, arma::vec &output);
void operator()(std::size_t begin, std::size_t end);
;
然后在 cpp 文件中定义你的方法:
namespace ExampleInternal
PARALLEL_WORKER::PARALLEL_WORKER(const arma::vec &input, arma::vec &output) : input(input), output(output)
void PARALLEL_WORKER::operator()(std::size_t begin, std::size_t end)
std::mt19937 engine(1);
// Create a loop that runs through a selected section of the total Boot_reps
for( std::size_t k = begin; k < end; k ++)
engine.seed(k);
arma::vec index = input;
std::shuffle( index.begin(), index.end(), engine);
output[k] = ExampleInternal::myfunc3(index);
//Close Namespace
我必须再做一些更改才能在没有警告的情况下编译所有内容(标题中定义的函数应该是inline
等)https://github.com/rstub/***/tree/master/55082456 的完整详细信息。请注意,某些更改仅在包的 Rcpp 属性 outside 的上下文中才有意义。
BTW,由于你没有提供测试数据,我只是验证了编译,没有正确运行。
【讨论】:
【参考方案2】:只是作为跟进。要将 myfunc3 移动到单独的 .cpp 文件,我需要将 RcppParallel 标头包含到 myfunc3.cpp 文件中。我也不必添加“内联”。
myfunc3.cpp
#include <RcppArmadillo.h>
#include <RcppParallel.h>
#include "ExampleInternal.h"
using namespace arma;
namespace ExampleInternal
double myfunc3(arma::vec vec_in)
int Len = arma::size(vec_in)[0];
return (vec_in[0] +vec_in[1])/Len;
// Close namespace
和 ExampleInternal.h
#ifndef ExampleInternal_H
#define ExampleInternal_H
namespace ExampleInternal
#include <RcppArmadillo.h>
#include <RcppParallel.h>
double myfunc3(arma::vec vec_in);
struct PARALLEL_WORKER : RcppParallel::Worker
const arma::vec &input;
arma::vec &output;
PARALLEL_WORKER( const arma::vec &input, arma::vec &output);
void operator()(std::size_t begin, std::size_t end);
;
#endif
【讨论】:
以上是关于命名空间中的并行工作者的主要内容,如果未能解决你的问题,请参考以下文章