用于Visual Studio 2015的R工具中的Rcpp编译器错误

时间:2018-09-29 07:46:38

标签: r openmp rcpp

我是 Rcpp OpenMP 的新用户。
我写了一个代码来乘以2个数组。
我也想使用omp只是为了检查大型矩阵的性能。 我使用 Visual Studio 2015 中的 R 工具来工作并运行此代码this code
当我在 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

关于如何解决它的任何想法?

1 个答案:

答案 0 :(得分:4)

快速简便的答案是:删除注释正斜杠之间的空格。例如,更改

/ /#pragma omp parallel for

//#pragma omp parallel for

但是,我还有其他评论/提示,供以后在此处提问:

  • 请不要发布您的代码图片。复制并将其粘贴到您的问题中。然后,答题者可以轻松地复制并粘贴您的代码以对其进行测试。在这种情况下,我手动重新输入了代码进行测试(因此我可以肯定地说这个答案将解决您的错误),因为我只是无聊地喝着早晨的咖啡,但是在其他情况下,老实说可能不会花时间重新输入。
  • 如果您要的是矩阵乘法,请使用RcppArmadillo!正如对此处其他问题的几个答案所指出的那样,it's an obvious choice for matrix multiplicationalready 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;
}

在我的机器上也可以正常编译