x64 LAPACK аварийно завершает работу Консольного приложения (но не x86) - PullRequest
0 голосов
/ 19 октября 2018

Issue

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

`The program '[8224] x64Project.exe' has exited with code -1073741819 (0xc0000005) 'Access violation'

Вопрос

В проведенных мною тестах проект x86 не,Любые идеи относительно того, что может быть причиной этого?

Я подозреваю, что ошибкой может быть неправильное использование DLLImport (хотя ответы верны) или библиотеки LAPACK или одной из ее зависимостей:

  • liblapack.dll
  • libblas.dll
  • libquadmath_64-0.dll
  • libgcc_s_seh_64-1.dll
  • libgfortran_64-3.dll

Обновление

Эта запись указывает, что это может быть связано с уничтожением объектов и возвратом дескрипторов в Windows.Но я не знаю, как это применимо к моей ситуации.

Пример использования DLLImport

<Runtime.InteropServices.DllImport("liblapack", EntryPoint:="dsygv_", CallingConvention:=Runtime.InteropServices.CallingConvention.Cdecl), Security.SuppressUnmanagedCodeSecurity>
Private Sub Lapack_dsygv(ByRef itype As Integer, ByRef jobz As Char, ByRef uplo As Char, ByRef n As Integer, ByVal A As Double(), ByRef lda As Integer,
                         ByVal B As Double(), ByRef ldb As Integer, ByVal w As Double(), ByVal work As Double(), ByRef lwork As Integer, ByRef info As Integer)
End Sub
Public Sub Dsygv(itype As Integer, jobz As Char, uplo As Char, n As Integer, A As Double(), lda As Integer, B As Double(), ldb As Integer, w As Double(), ByRef info As Integer)
    Dim lwork As Integer = -1
    Dim work As Double() = New Double(0) {0.0}
    Lapack_dsygv(itype, jobz, uplo, n, A, lda, B, ldb, w, work, lwork, info)
    If info <> 0 OrElse work(0) <= 0.0 Then Return
    lwork = CInt(work(0))
    work = New Double(lwork - 1) {}
    Lapack_dsygv(itype, jobz, uplo, n, A, lda, B, ldb, w, work, lwork, info)
End Sub
Public Function EigSymmetric1(A_UpperTriangle_EigenVectors As Double(), B_UpperTriangle As Double()) As Double()
    Dim n As Integer = CInt(Math.Sqrt(A_UpperTriangle_EigenVectors.GetLength(0)))
    Dim info As Integer = -1
    Dim w As Double() = New Double(n - 1) {}
    Dsygv(1, "N"c, "U"c, n, A_UpperTriangle_EigenVectors, n, B_UpperTriangle, n, w, info)
    If info = 0 Then
        Return w
    ElseIf info < 0 Then
        Throw New Exception("eigSymm: invalid parameter #" & (-info))
    Else
        If info <= n Then
            Throw New Exception(String.Format("eigSymm: did not converge! {0} off-diagonal elements unequal 0", info))
        ElseIf info < 2 * n Then
            Throw New Exception("eigSymm: B must be positive definite!")
        Else
            Throw New Exception("eigSymm: unknown error")
        End If
    End If
End Function

1 Ответ

0 голосов
/ 22 октября 2018

Проблема решается с помощью следующих mingw-w64 dlls (v6.4) , переименованных следующим образом:

dll names

Обратите внимание, что DLL-файлы LAPACK и BLAS были получены из здесь .

...