Как я могу использовать (инициализировать, манипулировать, получать выходные данные) маркеры mkl в Фортране? - PullRequest
0 голосов
/ 09 ноября 2019

Я использую компилятор Intel Fortran в WSL с его установочным каталогом /opt/intel. Я хочу использовать разреженные функции BLAS. ссылка на документацию Intel по библиотеке .

Вот часть связанного кода.

double complex, allocatable ::  H(:,:),Hvert(:,:),Hstar(:,:)
allocate(H(dimH,dimH),Hvert(dimH,dimH),Hstar(dimH,dimH))

! initialization of Hstar
info = mkl_sparse_z_create_coo(Hstar, SPARSE_INDEX_BASE_ONE, m**L, m**L, 2**L, ind(1,:), ind(2,:), Hele)

! initialization of empty matrix
ind = 0
info = mkl_sparse_z_create_coo(Hvert, SPARSE_INDEX_BASE_ONE, m**L, m**L, 0, ind(1,1), ind(2,1), H)

! add A and B to form the final matrix
info = mkl_sparse_z_add(SPARSE_OPERATION_NON_TRANSPOSE, Hstar, 1d0, Hvert, H)

Когда я компилирую его с помощью следующей команды

ifort -xHost -parallel full.f90 -o output -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_spblas -lmkl_core -liomp5 -lpthread -lm -qopenmp && ./output

это дало мне следующую ошибку, даже если я получил библиотеки

source /opt/intel/bin/ifortvars.sh -arch intel64 -platform linux
source /opt/intel/bin/compilervars.sh -arch intel64 -platform linux
full.f90(146): error #6404: This name does not have a type, and must have an explicit type.   [MKL_SPARSE_Z_CREATE_COO]
     info = mkl_sparse_z_create_coo(Hvert, SPARSE_INDEX_BASE_ONE, m**L, m**L, 2**L, ind(1,:), ind(2,:), Hele)
------------^
full.f90(226): error #6404: This name does not have a type, and must have an explicit type.   [MKL_SPARSE_Z_ADD]
     info = mkl_sparse_z_add(SPARSE_OPERATION_NON_TRANSPOSE, Hstar, 1d0, Hvert, H)
------------^
full.f90(240): error #6404: This name does not have a type, and must have an explicit type.   [MKL_SPARSE_Z_MV]
       info = mkl_sparse_z_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1d0, H, SPARSE_MATRIX_TYPE_HERMITIAN, psi(a,:), 0d0, dummy)
--------------^
compilation aborted for full.f90 (code 1)

Я думаю, что это вызвано моей неправильной связью с соответствующей библиотекой, а также инициализацией матриц какпростые выделяемые массивы.

Что я должен сделать, чтобы использовать эти функции?

Кроме того, я понятия не имею, что означают переменные верхнего регистра SPARSE_INDEX_BASE_ONE. Должен ли я использовать это таким образом?

1 Ответ

1 голос
/ 09 ноября 2019

путь ссылки правильный. Вам не нужно связывать -mkl_spblas. Пожалуйста, всегда обращайтесь к MKL Linker Adviser (https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor).. Я бы порекомендовал посмотреть на существующий пример sparse_z_csrmv.f90, который показывает, как сделать вызов аналогичных функций Sparse BLAS. Этот пример был вызовом CSR, но не форматами COO. но это не имеет значения в таких случаях.

...