使用PGI编译器链接Armadillo时出错

时间:2015-10-29 13:17:21

标签: c++ gpu openacc pgi

我想使用OpenACC加速我的部分代码以允许它在GPU上运行,但我的大多数代码都使用Armadillo库来进行线性代数。我发现加速代码的最简单方法依赖于PGI编译器集,但似乎并不容易使PGI编译器与Armadillo链接。我试图遵循建议here,但在帖子中的简化示例中,它对我不起作用:

#include <iostream> 
#include <armadillo> 

using namespace std; 
using namespace arma; 

int main(int argc, char** argv) 
  { 
  mat A = randu<mat>(4,5); 
  mat B = randu<mat>(4,5); 

  cout << A*B.t() << endl; 

#if defined(__GNUG__) 
cout << "I say I'm gcc!" << endl; 
#endif 

#if defined(__PGI) 
cout << "I say I'm PGI!" << endl; 
#endif 
  return 0; 
  } 

应该使用pgc++ -U__GNUG__ -o test.x test.cpp进行编译。但是,我收到很多错误和警告。我不知道这有什么问题,任何建议都会非常感激。

我得到的错误消息是:

/tmp/pgc++RnBhbTnyXPYy.o: En la función `void arma::blas::gemv<double>(char const*, int const*, int const*, double const*, double const*, int const*, double const*, int const*, double const*, double*, int const*)':
test.cpp:(.gnu.linkonce.t._ZN4arma4blas4gemvIdEEvPKcPKiS5_PKT_S8_S5_S8_S5_S8_PS6_S5_+0x7c): referencia a `wrapper_sgemv_' sin definir
test.cpp:(.gnu.linkonce.t._ZN4arma4blas4gemvIdEEvPKcPKiS5_PKT_S8_S5_S8_S5_S8_PS6_S5_+0xcd): referencia a `wrapper_dgemv_' sin definir
test.cpp:(.gnu.linkonce.t._ZN4arma4blas4gemvIdEEvPKcPKiS5_PKT_S8_S5_S8_S5_S8_PS6_S5_+0x11e): referencia a `wrapper_cgemv_' sin definir
test.cpp:(.gnu.linkonce.t._ZN4arma4blas4gemvIdEEvPKcPKiS5_PKT_S8_S5_S8_S5_S8_PS6_S5_+0x16c): referencia a `wrapper_zgemv_' sin definir
/tmp/pgc++RnBhbTnyXPYy.o: En la función `void arma::blas::gemm<double>(char const*, char const*, int const*, int const*, int const*, double const*, double const*, int const*, double const*, int const*, double const*, double*, int const*)':
test.cpp:(.gnu.linkonce.t._ZN4arma4blas4gemmIdEEvPKcS3_PKiS5_S5_PKT_S8_S5_S8_S5_S8_PS6_S5_+0x8e): referencia a `wrapper_sgemm_' sin definir
test.cpp:(.gnu.linkonce.t._ZN4arma4blas4gemmIdEEvPKcS3_PKiS5_S5_PKT_S8_S5_S8_S5_S8_PS6_S5_+0xf1): referencia a `wrapper_dgemm_' sin definir
test.cpp:(.gnu.linkonce.t._ZN4arma4blas4gemmIdEEvPKcS3_PKiS5_S5_PKT_S8_S5_S8_S5_S8_PS6_S5_+0x154): referencia a `wrapper_cgemm_' sin definir
test.cpp:(.gnu.linkonce.t._ZN4arma4blas4gemmIdEEvPKcS3_PKiS5_S5_PKT_S8_S5_S8_S5_S8_PS6_S5_+0x1b4): referencia a `wrapper_zgemm_' sin definir
/tmp/pgc++RnBhbTnyXPYy.o: En la función `double arma::blas::dot<double>(unsigned int, double const*, double const*)':
test.cpp:(.gnu.linkonce.t._ZN4arma4blas3dotIdEET_jPKS2_S4_+0x34): referencia a `wrapper_sdot_' sin definir
test.cpp:(.gnu.linkonce.t._ZN4arma4blas3dotIdEET_jPKS2_S4_+0x61): referencia a `wrapper_ddot_' sin definir
/tmp/pgc++RnBhbTnyXPYy.o: En la función `void arma::blas::syrk<double>(char const*, char const*, int const*, int const*, double const*, double const*, int const*, double const*, double*, int const*)':
test.cpp:(.gnu.linkonce.t._ZN4arma4blas4syrkIdEEvPKcS3_PKiS5_PKT_S8_S5_S8_PS6_S5_+0x73): referencia a `wrapper_ssyrk_' sin definir
test.cpp:(.gnu.linkonce.t._ZN4arma4blas4syrkIdEEvPKcS3_PKiS5_PKT_S8_S5_S8_PS6_S5_+0xbb): referencia a `wrapper_dsyrk_' sin definir
/tmp/pgc++RnBhbTnyXPYy.o: En la función `void arma::lapack::gesv<double>(int*, int*, double*, int*, int*, double*, int*, int*)':
test.cpp:(.gnu.linkonce.t._ZN4arma6lapack4gesvIdEEvPiS2_PT_S2_S2_S4_S2_S2_+0x61): referencia a `wrapper_sgesv_' sin definir
test.cpp:(.gnu.linkonce.t._ZN4arma6lapack4gesvIdEEvPiS2_PT_S2_S2_S4_S2_S2_+0x99): referencia a `wrapper_dgesv_' sin definir
test.cpp:(.gnu.linkonce.t._ZN4arma6lapack4gesvIdEEvPiS2_PT_S2_S2_S4_S2_S2_+0xcc): referencia a `wrapper_cgesv_' sin definir
test.cpp:(.gnu.linkonce.t._ZN4arma6lapack4gesvIdEEvPiS2_PT_S2_S2_S4_S2_S2_+0xff): referencia a `wrapper_zgesv_' sin definir
/tmp/pgc++RnBhbTnyXPYy.o: En la función `void arma::lapack::gels<double>(char*, int*, int*, int*, double*, int*, double*, int*, double*, int*, int*)':
test.cpp:(.gnu.linkonce.t._ZN4arma6lapack4gelsIdEEvPcPiS3_S3_PT_S3_S5_S3_S5_S3_S3_+0x7c): referencia a `wrapper_sgels_' sin definir
test.cpp:(.gnu.linkonce.t._ZN4arma6lapack4gelsIdEEvPcPiS3_S3_PT_S3_S5_S3_S5_S3_S3_+0xcd): referencia a `wrapper_dgels_' sin definir
test.cpp:(.gnu.linkonce.t._ZN4arma6lapack4gelsIdEEvPcPiS3_S3_PT_S3_S5_S3_S5_S3_S3_+0x11e): referencia a `wrapper_cgels_' sin definir
test.cpp:(.gnu.linkonce.t._ZN4arma6lapack4gelsIdEEvPcPiS3_S3_PT_S3_S5_S3_S5_S3_S3_+0x16c): referencia a `wrapper_zgels_' sin definir

1 个答案:

答案 0 :(得分:2)

这里的未定义引用消息是链接器错误,这意味着链接器无法找到用于某些函数的实现(编译代码)的任何地方你的计划。

第三方功能通常以系统上安装的某些库文件的形式提供。对于您使用的每个此类附加库,-lLIBRARY_NAME形式的附加选项将包含在构建命令中。

这里最可能的问题是您需要在构建命令中添加这样的选项:-larmadillo

如果这不起作用(如果Armadillo库文件未安装在通常的库目录中),您可能需要阅读Armadillo FAQ以获取其他可能的解决方案。