Функции MKL BLAS работают не так, как ожидалось

Я не могу заставить Intel MKL работать должным образом из C. У меня есть следующая тестовая программа:

#include "stdafx.h"
#include"mkl.h"
int main()
{
    int one = 1;
    int ten = 10;
    double copy[10];
    double threes[10];

    for (int i = 0; i < 10; ++i) threes[i] = 3;

    dcopy(&ten, threes, &one, copy, &one);
    double l1norm;
    l1norm = dasum(&ten, threes, &one);
    return 0;
}

который строится и связывается нормально, но не делает то, что я намеревался. Конкретно в строке возврата массив "copy" продолжает быть заполненным тем, что было там, когда он был объявлен и l1norm равен 0. Я привязываюсь к библиотекам: mkl_blas95_ilp64.lib, mkl_core_dll.lib, mkl_intel_ilp64_dll.lib и mkl_intel_thread_dll.lib .

Я также получаю аналогичные проблемы при запуске стороннего кода, который вызывает MKL, поэтому я предполагаю, что проблема заключается в том, как я настроил сборку (в Visual Studio 2015).

Эквивалентная программа на Фортране работает нормально.


person MatthewJohnHeath    schedule 11.05.2016    source источник
comment
Вы пытались использовать cblas API, а не Fortan API в своем коде C?   -  person kangshiyin    schedule 11.05.2016
comment
@ Эрик у меня есть сейчас. Если я заменю строку ` dcopy ...` на cblas_dcopy(10,threes,copy1), то эта строка выдаст Access violation reading location 0xFFFFFFFFFFFFFFFF после того, как сумеет скопировать первые 3. Кроме того, код, который мне нужно вызвать (SuperLU), использует объявления Fortran с extern cblas_dasum на самом деле работает нормально   -  person MatthewJohnHeath    schedule 12.05.2016


Ответы (1)


Пожалуйста, проверьте библиотеки, которые вы связываете при переносе с Fortran на C/C++. MKL требует разных библиотек и флагов компиляции с разными компиляторами и настройками. По крайней мере mkl_blas95_ilp64.lib не требуется для компилятора C.

Также ILP64 не распространен по сравнению с моделью LP64 по умолчанию.

MKL Link Line Advisor — это инструмент, предоставленный Intel для решения этой проблемы. Вы можете использовать его, чтобы проверить правильность ваших библиотек и флагов компиляции.

https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor

person kangshiyin    schedule 12.05.2016
comment
Библиотека ilp64 ожидает long long int . - person tim18; 12.05.2016
comment
да, спасибо. На самом деле я использовал Link Line Advisor, чтобы решить, что мне нужно на Фортране, а затем скопировал их, не задумываясь об этом. - person MatthewJohnHeath; 12.05.2016