问题标签 [rcppparallel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
rcpp - Rcpp 中的嵌套命名空间
我有一个工作 R 包,包括必要的 R/Cpp 工作。我的问题更多是使用嵌套命名空间时的“良好实践”。
目前,我的包裹有;1) 成本函数,2) 优化函数,3) 调用优化函数的并行工作者。目前,worker 是在包含导出(到 R)cpp 函数的 .cpp 文件中定义的。优化函数有一个命名空间和头文件,成本函数有它们自己的头文件/命名空间文件。所有优化函数都调用成本函数,因此它们包含“成本函数”标头并使用“成本函数”命名空间。
由于并行运行并调用工作人员的 .cpp 文件大约为 700 行,我正在考虑将工作人员移动到单独的命名空间和头文件。这些包括“优化”标头并使用“优化”命名空间。
这让我开始思考,我真的需要 3 个嵌套的命名空间吗?最好不要有 3 个命名空间,每个命名空间有 2-4 个函数。此外,这些函数被/将始终按 parallel_worker/optimize_function/cost_function 的顺序调用,每个函数都位于不同的命名空间/标头中。
r - Rcpp::Function in parellel for section
我正在尝试并行化个人的循环计算适应度值。对于整个算法,我使用的是 Rcpp,但适应度函数是从 R 传递的。
所以我正在尝试做这样的事情:
where FitnessFunction
isRcpp::Function
和 computeFitness 只是类函数,本质上是将计算值分配给成员变量。
但这会崩溃,因为据我所知,R 是单线程的,我不能在并行部分中使用任何底层 R 实例。
那么有什么方法可以转换Rcpp::Function
为std::function
, functor 或类似的东西吗?有没有其他方法可以将函数从 R 传递到 Rcpp,这将允许我并行计算这个适应度值?
整个工作是为 CRAN 创建飞蛾搜索算法的并行优化包。
c++ 中基本相同的代码std::function
效果很好。Rcpp 代码可以在没有并行的情况下正常工作。
r - 在 Rcpp 中对矩阵的所有列或所有行进行快速选择的多线程最快方法 - OpenMP、RcppParallel 或 RcppThread
我正在使用此 Rcpp 代码对值向量进行快速选择,即在 O(n) 时间内从向量中获取第 k 个最大元素(我将其保存为qselect.cpp
):
我将其用作计算所需百分位数的快速方法。例如
[这可能看起来已经很快,但我需要在我的应用程序中执行数百万次]
现在我想修改这个 Rcpp 函数,以便它对 R 矩阵的所有列或所有行执行多线程快速选择,并将结果作为向量返回。由于我是 Rcpp 的新手,我想要一些建议,但关于哪个框架可能是最快的并且最容易编码(它必须很容易跨平台工作,我需要对 nr 进行良好的控制要使用的线程数)。使用OpenMP、RcppParallel还是RcppThread?甚至更好 - 如果有人可以展示一种快速而优雅的方式来做到这一点?
r - 命名空间中的并行工作者
此示例是此较早帖子的后续示例。我正在尝试将 Parallel Worker 移动到它自己的 cpp 文件并在头文件中声明它。
两个错误如下:1)变量类型'ExampleInternal::PARALLEL_WORKER'是一个抽象类
在我不可重现的示例中:2)错误:Parallel_worker.cpp 文件中的“ExampleInternal::PARALLEL_WORKER{”行上的预期不合格 ID。
现在代码如下所示:
ExampleInternal.h
Parallel_Worker.cpp
Parallel_func.cpp
rcpp - 将函数指针添加到 Parallel Worker
以Parallel Worker in namespace为例,我想在 Parallel Worker 中使用函数指针。
下面的代码会产生如下错误:“无法初始化类型为 (**) 且返回值为 (*) 的新值”
ExampleInternal.h
myfuncA.cpp
myfuncB.cpp
Parallel_worker.cpp
Parallel_func.cpp
在 mac 上,您可能还需要一个 makevars 来指定 c++11:
lambda - 如何在 C++ 仿函数中传递 lambda 函数?
我是 Rccp 和 Rccpparallel 的新手,我很难弄清楚我在哪里犯了错误。所以我想创建一个在矩阵中并行执行功率元素的函数。我正在关注 rcppParallel 示例。
在一个核心上,代码可以编译并且工作正常,但是当我尝试将 n 传递给下面的仿函数时,出现以下错误。
如果我在下面的函子中交换 n ,它可以编译并正常工作。我错过了什么?代码:
lambdaPower.cpp
非常感谢。
r - 将 RMatrix::Column 转换为 NumericVector
你如何将一个RMatrix::Column
转换成一个NumericVector
in RcppParallel
?
例如
错误:没有匹配函数调用'as' NumericVector b(Rcpp::as(a0));
r - RcppParallel 结果随多线程变化
我是 Rcpp 和 RcppParallel 的新手。我正在尝试使用 RcppParallel 来优化我的 R 代码,现在我正在制作一些玩具代码来研究它们。现在我做了一个 RcppParallel 代码,结果和我想的不一样。每当我尝试该功能时,结果都会发生变化。
这是我的代码
这是 Rcpp 代码
当线程数为 4 时,结果如下所示:
而当我使用单线程时,我得到了结果:
谢谢你。
r - 使用 RcppParallel 中止 R 会话
我正在尝试使用 Rcpp 和 RcppParallel 构建一个实现 Dijkstra 算法的 R 包。你可以在这里看到我的作品。现在我想添加一个新功能并且出现了一个奇怪的行为。当我通过 sourceCpp 函数编译这个函数并尝试它时,它运行良好,但是当我用这个函数重建包时,当我调用该函数时,R 几乎立即崩溃。当我通过 Rstudio(清理和重建)构建包时,我没有错误。
该算法是双向的 Dijkstra,因此它使用两个图(正向和反向)和来自 STL 的两个优先级队列。图只是成对向量的向量。
这是代码(对不起,我不知道如何简化它):
我知道输入应该是 RVector 或 RMatrix,但不幸的是,有向图不能以这种形式简化而不会降低效率。std::vectors 在内存中是连续的,对吗?
我注意到,如果我删除一个 if 语句(例如所有向后搜索),它就会起作用。
如果您想查看包中实现的其他功能,可以查看我的 github 存储库。所有其他功能都运行良好。
这是 Makevars 文件:
Makevars.win 文件:
和说明文件:
那么我做错了什么?
为什么该函数与 sourceCpp 函数一起使用而不是在包中?
编辑:根据@thc,我的实现不是线程安全的,所以有没有办法以安全的方式重写这个算法?知道优先级队列在这里是强制性的。
任何帮助表示赞赏!
r - 使用 Rcpp 不能更快地获取 all()
由于我对 Rcpp 有点陌生,所以我可能在这里遗漏了一个技巧。
让我们创建两个矩阵:
我现在想要完成以下工作:
然后我为 all() 创建了一个 Rcpp 版本,希望提高速度,定义为:
使用 all_C 检查速度,它被证明更慢:
麻烦的是,all_C() 比 all() 慢,所以我怀疑 Test2() 的缓慢速度需要更好的 all_C 调用以及在上面的示例中避免应用的方法。
我尝试使用这个答案在 Rcpp 中重写应用程序,但是使用这个 Rcpp 应用程序函数会使它变得更慢。
关于如何使用 Rcpp 提高 Test1() 速度的任何想法?