Быстрый и простой ответ: уберите пробел между косыми чертами комментария.Например, измените
/ /#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;
}
, который также прекрасно скомпилирован на моей машине.