- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
正如标题所说,与 R 包中使用的已编译和运行 C++ 代码相比,在 R 包中使用带有 Rcpp 的 #pragma omp critical
指令会显着降低执行速度,因为没有使用所有 CPU 能力。
考虑一个简单的 C++ 程序(使用 cmake):
test.h 为:
#ifndef RCPP_TEST_TEST_H
#define RCPP_TEST_TEST_H
#include <limits>
#include <cstdio>
#include <chrono>
#include <iostream>
#include <omp.h>
namespace rcpptest {
class Test {
public:
static unsigned int test();
};
}
#endif //RCPP_TEST_TEST_H
test.cpp中test.h的实现:
#include "test.h"
namespace rcpptest {
unsigned int Test::test() {
omp_set_num_threads(8);
unsigned int x = 0;
std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
#pragma omp parallel for
for (unsigned int i = 0; i < 100000000; ++i) {
#pragma omp critical
++x;
}
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
std::cout << "finished (ms): " << std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count() <<std::endl;
return x;
}
}
主要是:
#include "src/test.h"
int main() {
unsigned int x = rcpptest::Test::test();
return 0;
}
如果我在 IDE (CLion) 中构建并运行该程序,一切正常。
然后我使用 Rcpp 创建了一个 R 包:
library(Rcpp)
Rcpp.package.skeleton('rcppTestLib')
并使用相同的 C++ 源代码为包 +“Rcpp”文件导出我的测试函数以从 R (rcppTestLib.cpp) 中使用:
#include <Rcpp.h>
#include "test.h"
// [[Rcpp::export]]
void rcppTest() {
rcpptest::Test::test();
}
如果我然后使用包从 R 运行测试
library(rcppTestLib)
rcppTest()
执行速度要慢得多。
我使用编译的 c++ 和 Rcpp 包进行了一些测试,结果是:
program | execution time
-----------------------------
compiled c++ | ~7 200ms
Rcpp package | ~551 000 ms
不同之处在于,使用 Rcpp 包会产生 8 个线程,但每个线程仅使用 ~1% 的 CPU,而使用编译的 C++ 时,8 个线程加起来使用了所有 CPU 能力。
我尝试将 #pragma omp critical
切换为 #pragma omp atomic
,结果:
program | execution time
-----------------------------
compiled c++ | ~2 900ms
Rcpp package | ~3 300 ms
使用 #pragma omp atomic
Rcpp 包产生 8 个线程并使用所有的 CPU 能力。然而,执行时间仍然存在差异,但并不那么显着。
所以我的问题是:为什么使用 #pragma omp critical
R/Rcpp 包不使用所有的 CPU 能力,而使用 #pragma omp atomic
它甚至可以在 CLion 中构建和运行的相同代码在两种情况下都使用了所有 CPU 能力?
我在这里错过了什么?
最佳答案
这里有两个可能的选择:
OpenMP
标志选项尚未在 src/Makevars
(unix) 或 src/Makevars.win
中设置(窗)num_threads(x)
作为 critical
推出对于一个,放置在 src/Makevars
或 src/Makevars.win
文件中:
PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) $(SHLIB_OPENMP_CFLAGS)
PKG_CFLAGS = $(SHLIB_OPENMP_CFLAGS)
PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS)
详情请见:https://cran.r-project.org/doc/manuals/r-release/R-exts.html#OpenMP-support
关于缺少 num_threads(x)
...我已经能够稍微加快这个问题...
改变:
#pragma omp parallel for
到
#pragma omp parallel for num_threads(4)
产量:
之前
finished (ms): 30822
[1] 1e+08
对比
之后
finished (ms): 17979
[1] 1e+08
或大约 1.7 的加速。我的想法是在 cmake
的某个地方设置了一个全局线程选项。
omp_set_num_threads(x)
或
set OMP_NUM_THREADS=x
https://gcc.gnu.org/onlinedocs/libgomp/omp_005fset_005fnum_005fthreads.html
关于c++ - 带有 OpenMP 关键指令的 Rcpp 明显比编译的 C++ 代码慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48949135/
我已经运行 nagios 大约两年了,但最近这个问题开始出现在我的一项服务中。 我越来越 CRITICAL - Socket timeout after 10 seconds 对于 check_htt
我用 CSS 做到了这一点: 但我希望我的客户更改图像框架。在我的图像中,当前帧只是一种颜色 (#000)。但框架可以是装饰性的。因此,客户应使用装饰图像进行取景。我看过 W3Schools' bor
我编写了一个脚本来检查对象中是否有任何缺失的字段,然后返回具有缺失字段的项目的 ID。 它正在返回: [ '222', '333' ] 我期望返回: ['333'] 为什么它也返回222 id? fu
我正在读 Ramakrishnan 的书数据库管理系统,在模式细化和范式相关的章节中,我看到一句话说: K is a candidate key for R means that K ----> R
我正在编写一个 Java 应用程序,以在一夜之间自动化在线游戏中的角色 Action (特别是,它在《最终幻想 XI》中捕鱼)。该应用程序大量使用 java 的 Robot 类来模拟用户键盘输入和检测
我有这个 react 代码,我在某些输入组件上使用 new Date().getTime() 作为 react 键 Prop 。这可能是一种反模式,因为键需要稳定。但我想了解为什么这如此有问题。为什么
我正在尝试将我的简单查询优化为更复杂的查询。 我有三个表 Table 1 a_id info 1 talk 2 talk 3 sleep 4 sit Table 2
Google PageSpeed 审核建议将首屏内容的关键 CSS 添加到 中的标签,并将其余部分推迟到内容加载完成之后。 虽然我不同意这种做法,但正确的实现方式是什么? 我对使用它有一些保留意见
我已经使用 Pika 将 Websocket 集成到 Tornado 和 RabbitMQ 中。它成功地在各种队列上运行直到一段时间。然后引发以下错误: 严重:pika.connection:关闭时尝
我在本地使用 Gulp 和 SASS 进行开发,为动态站点(即 CMS 驱动)编译 CSS。我正在尝试配置一个解决方案来编译全局与关键路径 CSS。到目前为止最好的想法是将我的主要 scss 文件拆分
关于为 gtkmm 运行以下 simple.cc 示例 #include int main(int argc, char * argv[]){ Glib::RefPtr app = Gt
我正在生成一个 TSX 元素列表: this.productsModel = this.state.products.map(o => ( 但是,react 警告我:
我正在使用 Addy Osmani 的“Critical” https://github.com/addyosmani/critical 下面的 package.json 工作正常,但构建仅复制关键
我有一个 Multimap multimap = ArrayListMultimap.create(); 来自 Guava 。我想知道如何对多图中的 Date 键进行排序。 目前,我正在这样做:
我有一个基于 Jekyll 的网站,我想尽快完成它。我的目标是构建 Jekyll 站点、生成关键 CSS 并缩小 HTML 的 gulp 任务。 我的 gulpfile 的一部分看起来像这样: gul
考虑以下串行函数。当我并行化我的代码时,每个线程都会从并行区域(未显示)内调用此函数。我正在努力使这个线程安全和高效(快速)。 float get_stored_value__or__calculat
我正尝试在 tensorflow 中为我自己的自定义类别重新训练 Inception v3 模型。我已经下载了一些数据并将其格式化为目录。当我运行时,python 脚本为图像创建了瓶颈,然后当它运行时
我该如何追查此错误消息的根本原因? (test:1090): GStreamer-CRITICAL **: gst_debug_log_valist: assertion `category != N
我想为要托管在 Pivotal CloudFoundry 上的 Spring Boot 应用程序强制执行 HTTPS,我想现在大多数应用程序都需要这样做。据我所知,常用的方法是使用 http.requ
在 Travis CI 上运行 Pytest 时,我收到 Key -Error。请在下面找到我的程序: import sys import os sys.path.append(os.path.dir
我是一名优秀的程序员,十分优秀!