我想编写一个比较openblas和mkl库进行矩阵乘法的程序,但是在链接这两个库时它们共享相同的功能时似乎出现了问题,因此与g ++会产生“冲突错误”。
它们似乎可以分别在不同的cpp文件中运行
g++ matrixmult_openblas.cpp -I /usr/local/opt/OpenBLAS/include/ -L/usr/local/opt/OpenBLAS/lib -lopenblas
和
g++ matrixmult_mkl.cpp -L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lmkl_intel_ilp64 -lmkl_intel_thread -lmkl_core -lmkl_blacs_mpich_ilp64 -liomp5 -lpthread -lm -ldl
如何在单个cpp文件中编译它们? 我已经使用了像这样的命名空间
namespace openblas
{
#include <cblas.h>
}
namespace mkl
{
#include <mkl.h>
}
当我使用两个链接器编译它们时,
g++ matrixmult.cpp -I /usr/local/opt/OpenBLAS/include/ -L/usr/local/opt/OpenBLAS/lib -lopenblas -L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lmkl_intel_ilp64 -lmkl_intel_thread -lmkl_core -lmkl_blacs_mpich_ilp64 -liomp5 -lpthread -lm -ldl
我遇到类似
的错误在/opt/intel/compilers_and_libraries_2019.1.144/mac/mkl/include/mkl.h:31中包含的文件中: /opt/intel/compilers_and_libraries_2019.1.144/mac/mkl/include/mkl_cblas.h:255:6:错误:“ cblas_sgemv”的类型冲突 void cblas_sgemv(const CBLAS_LAYOUT布局, ^ /usr/local/opt/OpenBLAS/include/cblas.h:125:6:注意:以前的声明在这里
请帮助我做到这一点。 我想要一个输出文件,在其中我可以将参数'openblas'或'mkl'传递给主函数以使用任何库。
答案 0 :(得分:3)
我遇到类似的错误
In file included from /opt/intel/compilers_and_libraries_2019.1.144/mac/mkl/include/mkl.h:31:
/opt/intel/compilers_and_libraries_2019.1.144/mac/mkl/include/mkl_cblas.h:255:6: 错误:“ cblas_sgemv”的类型冲突void cblas_sgemv(const CBLAS_LAYOUT布局,^ /usr/local/opt/OpenBLAS/include/cblas.h:125:6: 注意:先前的声明在这里
您很幸运。在其他情况下,您可能会成功地将程序编译成功且没有错误,然后在运行时表现异常。
如何在单个cpp文件中编译它们?
你不知道。 OpenBLAS和MKL提供具有相同名称并带有C链接的例程。即使它们具有兼容的类型,编译后的程序也将仅使用每对中的一个。您无法通过处理声明或头文件来解决此问题,因为声明或头文件需要与实际的编译函数匹配才能使用。
我想编写一个程序来比较openblas和mkl库以进行矩阵乘法
您将不得不编写两个程序,每个库一个。使它们尽可能相似,并比较它们在相同(或等效)输入上的行为。