В проекте я использую

find_package(BLAS REQUIRED)

Для обнаружения BLAS.

Есть ли способ узнать, какая реализация BLAS была найдена после этого?

Согласно документации BLA_VENDOR можно использовать определенная реализация, но не сообщает, какая из них была найдена.

К сожалению, мне нужно знать, какой BLAS был найден, потому что разные реализации имеют тонкие различия в своих интерфейсах, например MKL использует zdotu с 6 аргументами, а не с 5 (сначала это указатель на значение результата).

2
alfC 25 Ноя 2020 в 03:39

1 ответ

Лучший ответ

Согласно предложению @Tsyvarev, я в итоге сделал это

set(BLA_VENDOR Intel10_64lp)
find_package(BLAS)
if(BLAS_FOUND)
    message("MKL environment detected")
    add_definitions(-DRETURN_BY_STACK)
else()
    unset(BLA_VENDOR)
    find_package(BLAS REQUIRED)
endif()

Похоже, что -DRETURN_BY_STACK (или -DFORTRAN_COMPLEX_FUNCTIONS_RETURN_VOID) - это способ, которым некоторые заголовки BLAS (например, cblas.h) распознают MKL-совместимые объявления.

Технически может потребоваться попробовать с каждым вариантом intel mkl BLAS, и как-нибудь выбрать один , я помещаю его здесь для полноты картины. Это также предполагает, что последний find_package

Intel10_32 (intel mkl v10 32 bit)
Intel10_64lp (intel mkl v10+ 64 bit, threaded code, lp64 model)
Intel10_64lp_seq (intel mkl v10+ 64 bit, sequential code, lp64 model)
Intel10_64ilp (intel mkl v10+ 64 bit, threaded code, ilp64 model)
Intel10_64ilp_seq (intel mkl v10+ 64 bit, sequential code, ilp64 model)
Intel
0
alfC 27 Ноя 2020 в 23:21