我想使用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
答案 0 :(得分:2)
这里的未定义引用消息是链接器错误,这意味着链接器无法找到用于某些函数的实现(编译代码)的任何地方你的计划。
第三方功能通常以系统上安装的某些库文件的形式提供。对于您使用的每个此类附加库,-lLIBRARY_NAME
形式的附加选项将包含在构建命令中。
这里最可能的问题是您需要在构建命令中添加这样的选项:-larmadillo
。
如果这不起作用(如果Armadillo库文件未安装在通常的库目录中),您可能需要阅读Armadillo FAQ以获取其他可能的解决方案。