【问题标题】:compiling an OpenMPI app with the Intel compiler suite使用英特尔编译器套件编译 OpenMPI 应用程序
【发布时间】:2012-08-08 19:51:40
【问题描述】:

我有最新的 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/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

如果我取消注释

#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;


}

【问题讨论】:

  • 咨询 Open MPI 相关问题的最佳地点是Open MPI mailing lists。 用户列表背后的社区特别有帮助。
  • 感谢 Hristo。我也通过电子邮件发送了列表,但没有收到回复。希望我能弄清楚一些事情。
  • 星期天通常不是名单上最忙碌的一天。不过,很高兴你已经弄清楚了。快乐的消息传递,请记住 MPI C++ 接口在 MPI 2.2 中已弃用,将从 MPI 3.0 中完全删除。

标签: c++ openmpi icc rcpp rinside


【解决方案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:~$ 

working 支持 make 和 CMake。我会从那里开始。添加对RcppEigen 的支持可能很简单;几天前,我刚刚在 RInside 的 SVN 中添加了另一个 RcppArmadillo 的示例目录。

如果Free() 的定义不正确,那么您可能存在头文件冲突,您可以通过重新排序包含语句来避免这种冲突。我没有 Intel 编译器,所以我无能为力。

最后:推荐获得 Rcpp 和 RInside 帮助的方法是在 rcpp-devel 邮件列表。

【讨论】:

  • 嗨,Dirk,感谢您的指点。我认为这更像是一个 mpi 问题而不是 Rcpp/RIniside 问题。但是,我使用 g++ 构建了所有 inst/examples/mpi 示例,并且它们构建得很好。我将 g++ 更改为 icpc 并且构建也有效,所以我认为你是对的,它与包含的顺序有关。与往常一样,非常感谢您提供快速而有用的帮助。我真的很喜欢 Rcpp 和 RInside。
  • 如果你让它工作,发帖到rcpp-devel 将不胜感激。
  • 好吧,我想通了。这是一个订购的东西。特别是,对于 icpc,#include "mpi.h" 必须位于 #include 之前。但是,鉴于此,事情似乎运作良好。我将向 rcpp-devel 发送一条消息,以便将其记录在案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
相关资源
最近更新 更多