我是 Rcpp 和 OpenMP 的新用户。
我写了一个代码来乘以2个数组。
我也想使用omp只是为了检查大型矩阵的性能。
我使用 Visual Studio 2015 中的 R 工具来工作并运行此代码
当我在 Visual Studio 2015的r工具中编译它时,出现了此错误
c:/Rtools/mingw_64/bin/g++ -m64 -I"C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/include" -DNDEBUG -I"C:/Users/amaa11/Documents/R/win-library/3.5/Rcpp/include" -I"C:/Users/amaa11/DOCUME~1/VISUAL~1/Projects/RPROJE~1/RPROJE~1" -I"C:/swarm/workspace/External-R-3.5.1/vendor/extsoft/include" -O2 -Wall -mtune=core2 -c mul_mat.cpp -o mul_mat.o
mul_mat.cpp:10:4: error: stray '#' in program
/ /#pragma omp parallel for
^
mul_mat.cpp:4:1: error: expected unqualified-id before '/' token
/ / [[Rcpp::export(mul_mat)]]<br>
^
make: *** [mul_mat.o] Error 1
关于如何解决它的任何想法?
答案 0 :(得分:4)
快速简便的答案是:删除注释正斜杠之间的空格。例如,更改
/ /#pragma omp parallel for
到
//#pragma omp parallel for
但是,我还有其他评论/提示,供以后在此处提问:
RcppArmadillo
!正如对此处其他问题的几个答案所指出的那样,it's an obvious choice for matrix multiplication和already uses "multi-threaded OpenBLAS as well as OpenMP"。mult
的元素初始化为0;如Rcpp Quick Reference Guide中所述,以NumericMatrix
之类构造的Rcpp::NumericMatrix x(n, m)
会创建一个n×m矩阵,该矩阵已经填充了0。因此,为了完整起见,这是对我来说很好编译的固定代码:
#include <Rcpp.h>
#include <omp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericMatrix mul_mat(int n, NumericMatrix A, NumericMatrix B) {
int i, j, k;
NumericMatrix mult(n, n);
for ( i = 0; i < n; ++i ) {
//#pragma omp parallel for
for ( j = 0; j < n; ++j ) {
mult(i, j) = 0;
}
}
for ( i = 0; i < n; ++i ) {
for ( j = 0; j < n; ++j ) {
for ( k = 0; k < n; ++k ) {
mult(i, j) += A(i, k) * B(k, j);
}
}
}
return mult;
}
我们可以看到它将函数导出到R(添加此部分是为了响应有关已删除注释的有关将函数导出到R的正确方法的注释):
> Rcpp::sourceCpp("so-answer.cpp")
> ls()
[1] "mul_mat"
您最初在#pragma omp parallel for
之前有一个(n个键入错误的)注释定界符;如果您真的要使用它,请删除注释定界符并添加// [[Rcpp::plugins(openmp)]]
; Rcpp Gallery post(在其他地方)对此进行了讨论:
此外,我们可以利用OpenMP库来使用多个 核心。对于OpenMP实施,我们需要启用OpenMP 支持。一种方法是添加所需的编译器,然后 链接器标志如下:
Sys.setenv(“ PKG_CXXFLAGS” =“-fopenmp”)
Sys.setenv(“ PKG_LIBS” =“-fopenmp”)Rcpp版本0.10.5和更高版本还将提供一个插件来设置这些 给我们的变量:
// [[Rcpp :: plugins(openmp)]]
所以,尝试:
#include <Rcpp.h>
#include <omp.h>
// [[Rcpp::plugins(openmp)]]
using namespace Rcpp;
// [[Rcpp::export]]
NumericMatrix mul_mat(int n, NumericMatrix A, NumericMatrix B) {
int i, j, k;
NumericMatrix mult(n, n);
for ( i = 0; i < n; ++i ) {
omp_set_num_threads(2); // For example
#pragma omp parallel for
for ( j = 0; j < n; ++j ) {
mult(i, j) = 0;
}
}
for ( i = 0; i < n; ++i ) {
for ( j = 0; j < n; ++j ) {
for ( k = 0; k < n; ++k ) {
mult(i, j) += A(i, k) * B(k, j);
}
}
}
return mult;
}
在我的机器上也可以正常编译