我在Linux上有最新的OpenMPI,我用英特尔编译器套件编译。我正在尝试编译OpenMPI应用程序。我的特定应用程序使用RInside和RcppEigen。如果我注释掉代码的openMPI部分,则编译字符串为:
icpc -I/usr/share/R/include -I/usr/lib/R/site-library/Rcpp/include -I/usr/local/lib/R/site-library/RInside/include -O3 -pipe -g -Wall -I/usr/local/lib/R/site-library/RcppEigen/include sjb_simple_smle_with_Rinside.cpp -L/usr/lib/R/lib -lR -lblas -llapack -L/usr/lib/R/site-library/Rcpp/lib -lRcpp -Wl,-rpath,/usr/lib/R/site-library/Rcpp/lib -L/usr/local/lib/R/site-library/RInside/lib -lRInside -Wl,-rpath,/usr/local/lib/R/site-library/RInside/lib -o sjb_simple_smle_with_Rinside
因此,我尝试用mpic ++编译:
mpic ++ -I / usr / share / R / include -I / usr / lib / R / site-library / Rcpp / include -I / usr / local / lib / R / site-library / rnside / include -O3 -pipe -g -Wall -I / usr / local / lib / R / site-library / RcppEigen / include sjb_simple_smle_with_Rinside.cpp -L / usr / lib / R / lib -lR -lblas -llapack -L / usr / lib / R / site-library / Rcpp / lib -lRcpp -Wl,-rpath,/ usr / lib / R / site-library / Rcpp / lib -L / usr / local / lib / R / site-library / RInside / lib -lRInside -Wl,-rpath,/ usr / local / lib / R / site-library / rnside / lib -o sjb_simple_smle_with_Rinside
如果我取消注释
#include "mpi.h"
并尝试编译,我得到以下错误。使用英特尔编译器编译OpenMPI应用程序有什么技巧吗?完整的来源如下:
stevejb@ursamajor:~/Projects/big_data_sim_mle/simple_smle/R_inside_version$ mpic++ -I/usr/share/R/include -I/usr/lib/R/site-library/Rcpp/include -I/usr/local/lib/R/site-library/RInside/include -O3 -pipe -g -Wall -I/usr/local/lib/R/site-library/RcppEigen/include sjb_simple_smle_with_Rinside.cpp -L/usr/lib/R/lib -lR -lblas -llapack -L/usr/lib/R/site-library/Rcpp/lib -lRcpp -Wl,-rpath,/usr/lib/R/site-library/Rcpp/lib -L/usr/local/lib/R/site-library/RInside/lib -lRInside -Wl,-rpath,/usr/local/lib/R/site-library/RInside/lib -o sjb_simple_smle_with_Rinside -shared-intel -I/usr/local/include -pthread -L/usr/local/lib -lmpi_cxx -lmpi -ldl -lm -Wl,--export-dynamic -lrt -lnsl -lutil
/usr/local/include/openmpi/ompi/mpi/cxx/datatype.h(142): error: expected a type specifier
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/datatype.h(142): error: expected a ")"
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/datatype.h(142): error: expected an identifier
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/datatype.h(142): error: "virtual" is not allowed
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/datatype.h(142): error: expected a ";"
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/op.h(48): error: expected a type specifier
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/op.h(48): error: expected a ")"
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/op.h(48): error: expected an identifier
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/op.h(48): error: "virtual" is not allowed
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/op.h(48): error: expected a ";"
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/request.h(96): error: expected a type specifier
virtual void Free(void);
^
/usr/local/include/openmpi/ompi/mpi/cxx/request.h(96): error: expected a ")"
virtual void Free(void);
^
/usr/local/include/openmpi/ompi/mpi/cxx/request.h(96): error: expected an identifier
virtual void Free(void);
^
/usr/local/include/openmpi/ompi/mpi/cxx/request.h(96): error: "virtual" is not allowed
virtual void Free(void);
^
/usr/local/include/openmpi/ompi/mpi/cxx/request.h(96): error: expected a ";"
virtual void Free(void);
^
/usr/local/include/openmpi/ompi/mpi/cxx/group.h(111): error: expected a type specifier
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/group.h(111): error: expected a ")"
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/group.h(111): error: expected an identifier
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/group.h(111): error: "virtual" is not allowed
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/group.h(111): error: expected a ";"
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/comm.h(264): error: expected a type specifier
virtual void Free(void);
^
/usr/local/include/openmpi/ompi/mpi/cxx/comm.h(264): error: expected a ")"
virtual void Free(void);
^
/usr/local/include/openmpi/ompi/mpi/cxx/comm.h(264): error: expected an identifier
virtual void Free(void);
^
/usr/local/include/openmpi/ompi/mpi/cxx/comm.h(264): error: "virtual" is not allowed
virtual void Free(void);
^
/usr/local/include/openmpi/ompi/mpi/cxx/comm.h(264): error: expected a ";"
virtual void Free(void);
^
/usr/local/include/openmpi/ompi/mpi/cxx/win.h(118): error: expected a type specifier
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/win.h(118): error: expected a ")"
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/win.h(118): error: expected an identifier
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/win.h(118): error: "virtual" is not allowed
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/win.h(118): error: expected a ";"
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/errhandler.h(59): error: expected a type specifier
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/errhandler.h(59): error: expected a ")"
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/errhandler.h(59): error: expected an identifier
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/errhandler.h(59): error: "virtual" is not allowed
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/errhandler.h(59): error: expected a ";"
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/info.h(84): error: expected a type specifier
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/info.h(84): error: expected a ")"
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/info.h(84): error: expected an identifier
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/info.h(84): error: "virtual" is not allowed
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/info.h(84): error: expected a ";"
virtual void Free();
^
/usr/local/include/openmpi/ompi/mpi/cxx/request_inln.h(39): error: expected an identifier
MPI::Request::Free()
^
/usr/local/include/openmpi/ompi/mpi/cxx/request_inln.h(38): error: inline specifier allowed on function declarations only
inline void
^
/usr/local/include/openmpi/ompi/mpi/cxx/request_inln.h(39): error: incomplete type is not allowed
MPI::Request::Free()
^
/usr/local/include/openmpi/ompi/mpi/cxx/request_inln.h(39): error: a nonstatic member reference must be relative to a specific object
MPI::Request::Free()
^
/usr/local/include/openmpi/ompi/mpi/cxx/request_inln.h(39): error: expected an expression
MPI::Request::Free()
^
/usr/local/include/openmpi/ompi/mpi/cxx/request_inln.h(39): error: expected a ")"
MPI::Request::Free()
^
/usr/local/include/openmpi/ompi/mpi/cxx/request_inln.h(40): error: expected a ";"
{
^
/usr/local/include/openmpi/ompi/mpi/cxx/op_inln.h(123): error: identifier "ompi_op_set_cxx_callback" is undefined
ompi_op_set_cxx_callback(mpi_op, (MPI_User_function*) func);
^
/usr/local/include/openmpi/ompi/mpi/cxx/op_inln.h(128): error: expected an identifier
MPI::Op::Free()
^
/usr/local/include/openmpi/ompi/mpi/cxx/op_inln.h(127): error: inline specifier allowed on function declarations only
inline void
^
/usr/local/include/openmpi/ompi/mpi/cxx/op_inln.h(128): error: incomplete type is not allowed
MPI::Op::Free()
^
/usr/local/include/openmpi/ompi/mpi/cxx/op_inln.h(128): error: a nonstatic member reference must be relative to a specific object
MPI::Op::Free()
^
/usr/local/include/openmpi/ompi/mpi/cxx/op_inln.h(128): error: expected an expression
MPI::Op::Free()
^
/usr/local/include/openmpi/ompi/mpi/cxx/op_inln.h(128): error: expected a ")"
MPI::Op::Free()
^
/usr/local/include/openmpi/ompi/mpi/cxx/op_inln.h(129): error: expected a ";"
{
^
sjb_simple_smle_with_Rinside.cpp(35): warning #12: parsing restarts here after previous syntax error
using namespace Rcpp;
^
sjb_simple_smle_with_Rinside.cpp(77): error: identifier "as" is undefined
const Map<MatrixXd> Xmat(as<Map<MatrixXd> >(Xmat_sexp));
^
sjb_simple_smle_with_Rinside.cpp(77): error: type name is not allowed
const Map<MatrixXd> Xmat(as<Map<MatrixXd> >(Xmat_sexp));
^
sjb_simple_smle_with_Rinside.cpp(80): error: type name is not allowed
const Map<MatrixXd> Ymat(as<Map<MatrixXd> >(Ymat_sexp));
^
sjb_simple_smle_with_Rinside.cpp(87): error: type name is not allowed
const Map<MatrixXd> ua(as<Map<MatrixXd> >(ua_sexp));
^
sjb_simple_smle_with_Rinside.cpp(89): error: type name is not allowed
const Map<MatrixXd> ub(as<Map<MatrixXd> >(ub_sexp));
^
sjb_simple_smle_with_Rinside.cpp(98): error: type name is not allowed
const Map<VectorXd> start_vector(as<Map<VectorXd> >(start_sexp));
^
compilation aborted for sjb_simple_smle_with_Rinside.cpp (code 2)
完整的源代码:
// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8; -*-
//
// SJB - first shot at RInside and Eigen combined
//
// Copyright (C) 2012 Stephen J. Barr
//
// GPL'ed
#include <iostream>
#include <sstream>
#include <iomanip>
#include <fstream>
#include "mkl.h"
#include "math.h"
#include <vector>
#include <cmath>
#include <string>
#include <cstdlib>
#include <fcntl.h>
#include <sys/stat.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>
#include <map>
#include <utility>
#include <RcppEigen.h>
#include <Rcpp.h>
#include <RInside.h> // for the embedded R via RInside
#include "mpi.h"
using namespace Rcpp;
using namespace Eigen;
using namespace std;
int main(int argc, char *argv[]) {
const int N_TRU_PARAMS = 5;
const int n = 1000;
const int t = 100;
const int nr = 500;
RInside R(argc, argv); // create an embedded R instance
stringstream ss;
ss << "n = " << n << "; t = " << t << ";" << " nr = " << nr << ";";
cout << ss.str() << endl;
R.parseEval(ss.str());
VectorXd tru = VectorXd(N_TRU_PARAMS);
tru << 2,1,-2,1,1;
// R.parseEval("n = 100;");
// R.parseEval("t = 100;");
R.parseEval("set.seed(123)");
string cmdstr = "tru = c(2,1,-2,1,1);"
"set.seed(123);"
"a = rnorm(n,tru[1],tru[2]);"
"b = rnorm(n,tru[3],tru[4]);"
// Make some data lists
"x = NULL;"
"y = NULL;"
// Generate some data for each firm
"for(i in 1:n) {"
" x[[i]] = rnorm(t,1,1);"
" y[[i]] = a[i]+b[i]*x[[i]]+ rnorm(t)*tru[5];"
"}";
R.parseEval(cmdstr);
SEXP Xmat_sexp = R.parseEval("Xmat = do.call(rbind, x)");
const Map<MatrixXd> Xmat(as<Map<MatrixXd> >(Xmat_sexp));
SEXP Ymat_sexp = R.parseEval("Ymat = do.call(rbind, y)");
const Map<MatrixXd> Ymat(as<Map<MatrixXd> >(Ymat_sexp));
cout << "X: " << Xmat.rows() << " x " << Xmat.cols() << endl;
cout << "Y: " << Ymat.rows() << " x " << Ymat.cols() << endl;
// Make matrices ua and ub
SEXP ua_sexp = R.parseEval( "ua = matrix(rnorm(nr*n),n,nr)");
const Map<MatrixXd> ua(as<Map<MatrixXd> >(ua_sexp));
SEXP ub_sexp = R.parseEval( "ub = matrix(rnorm(nr*n),n,nr)");
const Map<MatrixXd> ub(as<Map<MatrixXd> >(ub_sexp));
cmdstr = "track = 0;"
"Y = unlist(y);"
"X = unlist(x);"
"start = lm(Y~X)$coeff;"
"start =c(start[1],0,start[2],0);";
R.parseEval(cmdstr);
SEXP start_sexp = R.parseEval("start");
const Map<VectorXd> start_vector(as<Map<VectorXd> >(start_sexp));
cout << "Starting point: " << start_vector.transpose() << endl;
// THERE ARE TWO PAIRS OF FUNCTIONS, smle_init and smle_nll_mpi
// smle_init: distributes, using mpi broadcast, the necessary
// data to all machines.
//
// smle_nll_mpi: assuming smle_init has been successfully completed
// compute the negative log likelihood using MPI
//
// for now, these functions will be written out in the code
// // MPI INITIALIZATION
// int rank, size;
// const int root = 0;
// cout << "Before init" << endl;
// MPI::Init();
// rank = MPI::COMM_WORLD.Get_rank();
// size = MPI::COMM_WORLD.Get_size();
// double * ua_ptr = ua.data();
// double * ub_ptr = ub.data();
cout << "Initializating MPI Broadcast" << endl;
}
答案 0 :(得分:1)
RInside package带有工作的MPI示例:
edd@max:~$ ls -l /usr/local/lib/R/site-library/RInside/examples/mpi/
total 24
drwxr-xr-x 2 edd staff 4096 Jun 27 10:14 cmake
-rw-r--r-- 1 edd staff 1897 Jun 27 10:14 Makefile
-rw-r--r-- 1 edd staff 1224 Jun 27 10:14 rinside_mpi_sample0.cpp
-rw-r--r-- 1 edd staff 2896 Jun 27 10:14 rinside_mpi_sample1.cpp
-rw-r--r-- 1 edd staff 1137 Jun 27 10:14 rinside_mpi_sample2.cpp
-rw-r--r-- 1 edd staff 2836 Jun 27 10:14 rinside_mpi_sample3.cpp
edd@max:~$
使用工作支持make和CMake。我会从那里开始。添加对RcppEigen的支持可能是微不足道的;我刚刚在几天前向RInside的SVN添加了RcppArmadillo的另一个示例目录。
如果Free()
balks的定义那么你可能有一个头文件冲突,你可以通过重新排序include语句来避免。我没有英特尔编译所以我无法帮助。
最后:推荐的获取Rcpp和RInside帮助的方法是询问 rcpp-devel邮件列表。