-1

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

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

1 回答 1

2

此处未定义的参考消息是链接器错误,这意味着链接器无法在任何地方找到程序中使用的某些函数的实现(编译后的代码)。

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

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

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

于 2015-10-29T18:23:04.660 回答