MKL не работает с кодом C++, использующим Eigen и OpenMP

У меня есть код со следующей структурой:

Eigen::MatrixXd function1(args)
{
    #pragma omp parallel for
    for (args)
        //filling a matrix element-wise

    return matrix;
}

Eigen::MatrixXd function2(argument is function1 matrix)
{
    #pragma omp parallel for
    for (args)
        //element-wise probabilities calculations on matrix from function1

    return matrix;
}

Eigen::MatrixXd global_function(args)
{
    Eigen::MatrixXd ident; //identity matrix

    for (args)
    {
        Eigen::MatrixXd mat = function1(args);
        Eigen::MatrixXd mat2 = function2(mat);
        ident = ident * mat2;
    }

    return matrix;
}

Функций больше, но схема та же. Матрицы имеют размер от 500x500 до 1000x1000. В коде используются библиотеки: Eigen (для построения матриц) и Boost (для некоторых расчетов вероятностей в функции 2), скомпилированные с использованием Visual Studio 2013 или компилятора Intel C++ 15.0 (в моем случае обе имеют одинаковую производительность)

Я пытаюсь реализовать Intel MKL для умножения матрицы на матрицу:

Поэтому, прежде чем реализовать его в своем коде, я создал простой проект для тестирования MKL с помощью Eigen, и он сработал (матрицы строятся с помощью Eigen, в то время как умножение матрицы на матрицу использует MKL, что сократило время расчета вдвое). Затем я внедрил MKL в свой код, но в этот раз он не сработал, время расчета не уменьшилось, в чем может быть причина?


person Naucle    schedule 27.04.2015    source источник
comment
Предоставьте stackoverflow.com/help/mcve   -  person Jeff Hammond    schedule 05.07.2015


Ответы (1)


Eigen может использовать MKL под капотом, поэтому вы можете просто использовать интерфейс Eigen для своих матриц и позволить Eigen работать с MKL. Все, что вам нужно сделать, это #define EIGEN_USE_MKL_ALL перед включением любых заголовков Eigen.

person Julien    schedule 06.05.2015
comment
Я уже знал это, проблема в том, что он не работал без видимой причины. Но это сработало на следующий день, так что либо я был достаточно глуп, чтобы поверить, что это не так, либо перезагрузка системы по какой-то причине решила проблему. - person Naucle; 06.05.2015