Ошибка компилятора Rcpp в r tools для visual studio 2015 - PullRequest
0 голосов
/ 29 сентября 2018

Я новый пользователь Rcpp и OpenMP .
Я написал код для умножения 2 массивов.
Я хочу также использовать omp только для проверки егопроизводительность с большими матрицами.Я использую R инструменты в Visual Studio 2015 для работы и запуска этого кода this code
, когда я компилирую его в r инструментах для визуальногоstudio 2015 , я получил эту ошибку

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 голосов
/ 29 сентября 2018

Быстрый и простой ответ: уберите пробел между косыми чертами комментария.Например, измените

/ /#pragma omp parallel for

на

//#pragma omp parallel for

Однако у меня также есть другие комментарии / советы для того, чтобы задавать вопросы здесь в будущем:

  • Пожалуйста,не размещайте изображение своего кода.Скопируйте и вставьте его в свой вопрос.Тогда ответчики могут легко скопировать и вставить ваш код, чтобы проверить его.Я вручную набрал ваш код в этом случае, чтобы проверить его (так что я могу с уверенностью сказать, что этот ответ решит вашу ошибку), так как мне просто скучно пить утренний кофе, но в других ситуациях, честно говоря, вероятно, нетнашли время, чтобы заново набрать текст.
  • Если вам нужно умножение матриц, перейдите к RcppArmadillo!Как уже указывалось в нескольких ответах на другие вопросы, это очевидный выбор для умножения матриц , а уже использует «многопоточный OpenBLAS и OpenMP» .
  • Обратите внимание, что вам не нужно инициализировать элементы mult в 0;как указано, например, в Краткое справочное руководство по Rcpp , NumericMatrix, сконструированное таким образом, как Rcpp::NumericMatrix x(n, m), создает матрицу n by 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"

У вас изначально был (n неправильно набранный) разделитель комментариев перед #pragma omp parallel for;если вы действительно хотите его использовать, удалите разделитель комментариев и добавьте // [[Rcpp::plugins(openmp)]];это обсуждается (среди других мест) в публикации Rcpp Gallery :

Кроме того, мы можем использовать библиотеку 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;
}

, который также прекрасно скомпилирован на моей машине.

...