Сборка с библиотеками Armadillo и MKL для x86 (win32) - PullRequest
0 голосов
/ 31 декабря 2018

Я получил сообщение об ошибке ссылки для некоторой части кодов на основе заголовочного файла armadillo в Visual Studio C ++ 2017, выполнив следующие шаги, описанные в соответствующих руководствах для x64 (с соответствующими изменениями x64-> x86).

Я скачалПоследний стабильный релиз Armadillo (armadillo-9.200.6.tar) со своего официального сайта.Я также загрузил библиотеку MKL для 64-разрядных Windows 10, работающих на процессоре Intel i5, с веб-сайта Intel.И я связал их в Visual Studio 2017 следующим образом:

Project> Properties> Configuration Properties> VC++ Directories> Include Directories: ( Примечание: строки, начинающиеся со звездочки (), включены как часть настройки броненосца *)

* C:\Program Files (x86)\Microsoft Visual Studio\Shared\armadillo-9.200.6\include
* C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2019.1.144\windows\mkl\include
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\include
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\VS\include
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\winrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\cppwinrt
C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\Include\um

Project> Properties> Configuration Properties> VC++ Directories> Library Directories: ( Примечание: строки с префиксом звездочки () включены как часть настройки броненосца *)

* C:\Program Files (x86)\Microsoft Visual Studio\Shared\armadillo-9.200.6\examples\lib_win64
* C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2019.1.144\windows\mkl\lib\intel64_win
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\lib\x86
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\lib\x86
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\VS\lib\x86
C:\Program Files (x86)\Windows Kits\10\lib\10.0.17763.0\ucrt\x86
C:\Program Files (x86)\Windows Kits\10\lib\10.0.17763.0\um\x86
C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x86
C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\Lib\um\x86

Project> Properties> Configuration Properties> C/C++> General> Additional Include Directories: ( Примечание: строки с префиксом звездочки () включены как часть настройки броненосца *)

* C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2019.1.144\windows\mkl\include
* C:\Program Files (x86)\Microsoft Visual Studio\Shared\armadillo-9.200.6\include
C:\Python36_86\include

Project> Properties> Configuration Properties> Linker> General> Additional Library Directories: ( Примечание: строки с префиксом звездочки () включены в состав броненосцаsetup *)

* C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2019.1.144\windows\mkl\lib\ia32_win
C:\Python36_86\libs

Project> Properties> Configuration Properties> Linker> Input> Additional Dependencies: ( Примечание: строки с префиксомсо звездочкой () включены как часть установки броненосца *)

* mkl_core.lib
* mkl_sequential.lib
* mkl_intel_lp64.lib
* lapack_win64_MT.lib
* blas_win64_MT.lib

Я разрабатываю модули C ++ как расширения для Python, поэтому я используюДанная целевая платформа Win32.К счастью, некоторые части кода броненосца работают нормально, в то время как для некоторых он показывает ошибку в виде списка ниже в формулировке проблемы.Это код, который я пытаюсь построить.Это в основном импортировать массивы numpy, умножить их и вернуть как объект Python.Я делаю два испытания.Пробная версия 1: умножение его обычно с использованием трех циклов for (здесь это комментируется), что успешно работает.В пробной версии 2 используется броненосец (строка, из которой происходит ошибка, указывается с помощью комментария).Код:

#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <Python.h>
#include <Windows.h>
#include <cmath>
#include <vector>
#include <string>
#include <iostream>
#include <armadillo>

#define PyTuple_GET_ITEM PyTuple_GetItem
#define PyTuple_GET_SIZE PyTuple_Size
#define PyArray_FLOAT NPY_FLOAT
#include <numpy/arrayobject.h>

using namespace std;
using namespace arma;

//Taking two numpy array as arguments, multiplying the two numpy arrays and
// returning it back as python object
static PyArrayObject *mmult(PyObject *self, PyObject *args)
{
    PyObject *vec1, *vec2;  

    (PyArg_ParseTuple(args, "OO", &vec1, &vec2));

    PyArrayObject *cvec1, *cvec2;

    cvec1 = (PyArrayObject*) PyArray_FROM_OTF(vec1, NPY_DOUBLE, NPY_ARRAY_IN_ARRAY);
    cvec2 = (PyArrayObject*) PyArray_FROM_OTF(vec2, NPY_DOUBLE, NPY_ARRAY_IN_ARRAY);

    npy_intp *shape1 = PyArray_DIMS(cvec1);
    npy_intp *shape2 = PyArray_DIMS(cvec2);

    npy_intp shape3[2] = { shape1[0], shape2[1] };
    PyArray_Descr* cvec3_type = PyArray_DescrFromType(NPY_DOUBLE);

    PyArrayObject* cvec3 = (PyArrayObject *) PyArray_Zeros(2, shape3, cvec3_type,0);

    double *v1, *v2, *v3;
    v1 = (double*)PyArray_DATA(cvec1);
    v2 = (double*)PyArray_DATA(cvec2);
    v3 = (double*)PyArray_DATA(cvec3);


    /* TRIAL 1 : SUCCESSFUL
    for (int i = 0; i < shape1[0]; i++) {
        for (int j = 0; j < shape2[1]; j++) {
            for (int k = 0; k < shape2[0]; k++) {
                v3[shape3[1]*i+j] += v1[shape1[1] * i + k] *v2[shape2[1] * k + j];
            }
        }
    }
    */
    //TIRAL 2: Wih Armadillo
    arma::Mat<double> A1(shape1[0], shape1[1]);  //Successful
    arma::Mat<double> A2(shape2[0], shape2[1]);
    arma::Mat<double> A3(shape1[0], shape2[1]);

    for (int i = 0; i < shape1[0]; i++) {
        for (int j = 0; j < shape1[1]; j++) {   
            A1(i, j) = v1[shape1[1] * i + j];   //Successful
        }
    }

    for (int i = 0; i < shape2[0]; i++) {
        for (int j = 0; j < shape2[1]; j++) {  //Successful
            A2(i, j) = v2[shape2[1] * i + j];
        }
    }

    A3 = A1 * A2;  // -----> This is the line that is creating the errors

    for (int i = 0; i < shape1[0]; i++) {
        for (int j = 0; j < shape2[1]; j++) {
            v3[shape3[1] * i + j] = A3(i, j);
        }
    }


    // This piece of the code also do not work with armadillo. I took this from a demo code.
    // Create a 4x4 random matrix and print it on the screen
    arma::Mat<double> A = arma::randu(4, 4);
    std::cout << "A:\n" << A << "\n";
    // Multiply A with his transpose:
    std::cout << "A * A.t() =\n";
    std::cout << A * A.t() << "\n";

    return cvec3;
}

//Structure: Defines how C++ function is presented to Python
static PyMethodDef mhps_methods[] = {

    { "mmult", (PyCFunction)mmult, METH_VARARGS, nullptr },
    { nullptr, nullptr, 0, nullptr }

};

//Structure: Defines module as you want it to be referred to in your Python code.
static PyModuleDef mhps_module = {

    PyModuleDef_HEAD_INIT,
    "mhps",
    "faster codes for research modules",
    0,
    mhps_methods

};

//Method: Python calls this method when it loads the module using "import mhps"
PyMODINIT_FUNC PyInit_mhps() {
    import_array();
    return PyModule_Create(&mhps_module);
}

Это генерируемая ошибка:

module1.obj : error LNK2001: unresolved external symbol _sposv_
module1.obj : error LNK2001: unresolved external symbol _cgemv_
module1.obj : error LNK2001: unresolved external symbol _sdot_
module1.obj : error LNK2001: unresolved external symbol _sgemv_
module1.obj : error LNK2001: unresolved external symbol _zgemv_
module1.obj : error LNK2001: unresolved external symbol _dgemm_
module1.obj : error LNK2001: unresolved external symbol _sgesv_
module1.obj : error LNK2001: unresolved external symbol _zgesv_
module1.obj : error LNK2001: unresolved external symbol _sgemm_
module1.obj : error LNK2001: unresolved external symbol _dposv_
module1.obj : error LNK2001: unresolved external symbol _dgemv_
module1.obj : error LNK2001: unresolved external symbol _zposv_
module1.obj : error LNK2001: unresolved external symbol _cposv_
module1.obj : error LNK2001: unresolved external symbol _cgemm_
module1.obj : error LNK2001: unresolved external symbol _dsyrk_
module1.obj : error LNK2001: unresolved external symbol _ssyrk_
module1.obj : error LNK2001: unresolved external symbol _ddot_
module1.obj : error LNK2001: unresolved external symbol _zgemm_
module1.obj : error LNK2001: unresolved external symbol _dgesv_
module1.obj : error LNK2001: unresolved external symbol _cgesv_

1 Ответ

0 голосов
/ 31 декабря 2018

Это была небольшая ошибка с моей стороны при вводе входных данных в:

Project> Properties> Configuration Properties> Linker> Input> Additional Dependencies:

mkl_intel_c.lib
mkl_sequential.lib
mkl_core.lib

Я полностью заменил его на вышеуказанные имена файлов.Это на самом деле файлы в библиотеках для 32-битной папки в папке mkl.Следуя инструкциям статьи, озаглавленной « Начало работы с Armadillo - библиотекой линейной алгебры C ++ в Windows, Mac и Linux », автор предполагал, что большинство из них будет использовать ее для 64-разрядных систем, и поэтому не указалконкретные файлы, которые будут включены в список ввода компоновщика.

...