gpt4 book ai didi

c++ - 包内的 Rcpp omp_set_num_threads

转载 作者:行者123 更新时间:2023-11-30 00:43:22 26 4
gpt4 key购买 nike

我使用 Rcpp 和 OpenMP 编写了以下简单示例,当我从 RStudio 获取 cpp 文件时它运行良好:

#include <Rcpp.h>
#include <omp.h>

// [[Rcpp::plugins(openmp)]]

using namespace Rcpp;

// [[Rcpp::export]]
NumericMatrix my_matrix(int I, int J, int nthreads) {
NumericMatrix A(I,J);
int i,j,tid;
omp_set_num_threads(nthreads);
#pragma omp parallel for private(i, j, tid)
for(int i = 0; i < I; i++) {
for(int j = 0; j < J; j++) {
tid = omp_get_thread_num();
A(i,j) = tid ;
}
}

return A;
}


/*** R
set.seed(42)
my_matrix(10,10,5)
*/
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 0 0 0 0 0 0 0 0 0
[2,] 0 0 0 0 0 0 0 0 0 0
[3,] 1 1 1 1 1 1 1 1 1 1
[4,] 1 1 1 1 1 1 1 1 1 1
[5,] 2 2 2 2 2 2 2 2 2 2
[6,] 2 2 2 2 2 2 2 2 2 2
[7,] 3 3 3 3 3 3 3 3 3 3
[8,] 3 3 3 3 3 3 3 3 3 3
[9,] 4 4 4 4 4 4 4 4 4 4
[10,] 4 4 4 4 4 4 4 4 4 4

但是,如果我创建一个包,相同的代码不会按预期工作:

> rcpphello::my_matrix(10,10,5)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 0 0 0 0 0 0 0 0 0
[2,] 0 0 0 0 0 0 0 0 0 0
[3,] 0 0 0 0 0 0 0 0 0 0
[4,] 0 0 0 0 0 0 0 0 0 0
[5,] 0 0 0 0 0 0 0 0 0 0
[6,] 0 0 0 0 0 0 0 0 0 0
[7,] 0 0 0 0 0 0 0 0 0 0
[8,] 0 0 0 0 0 0 0 0 0 0
[9,] 0 0 0 0 0 0 0 0 0 0
[10,] 0 0 0 0 0 0 0 0 0 0

如果我从我的包中调用它,为什么相同的代码只使用一个线程?如果有帮助,我将所有代码推送到 this github repo

最佳答案

添加到src/Makevarssrc/Makevars.win:

PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS)
PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS)

这会启用 -fopenmp 标志。否则,您最终不会在包中启用 OpenMP。

注意:使用时:

// [[Rcpp::plugins(openmp)]]

当使用 sourceCpp() 运行时,这会设置 -fopenmp 参数。此选项不会转移到包中。因此,我们必须在MakevarsMakevars.win 中建立设置。

可以在这里找到一个简短的例子:

https://github.com/r-pkg-examples/rcpp-and-openmp

不过,我需要稍微清理一下。

关于c++ - 包内的 Rcpp omp_set_num_threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54715688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com