Связать библиотеки openblas и mkl при компиляции c ++ - PullRequest
0 голосов
/ 27 января 2019

Я хочу написать программу для сравнения библиотек 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 Layout, ^ /usr/local/opt/OpenBLAS/include/cblas.h:125:6: примечание: предыдущая декларация здесь

Пожалуйста, помогите мне сделатьэто. Мне нужен выходной файл, в котором я могу передать аргумент 'openblas' или 'mkl' главной функции, чтобы использовать любую библиотеку.

1 Ответ

0 голосов
/ 27 января 2019

Я получаю сообщения об ошибках типа

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 Layout, ^ /usr/local/opt/OpenBLAS/include/cblas.h:125:6: примечание: предыдущее объявление здесь

Вам повезло. При других обстоятельствах вы могли бы вместо этого успешно скомпилировать вашу программу без ошибок, а затем вести себя неожиданно во время выполнения.

Как мне скомпилировать их в один файл cpp?

Нет. OpenBLAS и MKL предоставляют подпрограммы с одинаковыми именами и связью C. Даже если бы они имели совместимые типы, скомпилированная программа использовала бы только одну из каждой пары. Вы не можете обойти это, манипулируяобъявления или заголовочные файлы, так как они должны соответствовать фактическим скомпилированным функциям, чтобы их можно было использовать.

Я хочу написать программу для сравнения библиотеки openblas и mkl для matумножение rix

Вам придется согласиться на написание двух программ, по одной для каждой библиотеки.Сделайте их максимально похожими и сравните их поведение на тех же (или эквивалентных) входах.

...