1

次のコードを使用して線形システムを解こうとしています。

#include <stdio.h>
#include <lapacke.h>

int main () {
    lapack_complex_double mat[4];
    lapack_complex_double vec[2];
    lapack_int p[2];

    mat[0] = lapack_make_complex_double(1,0);
    mat[1] = lapack_make_complex_double(1,0);
    mat[2] = lapack_make_complex_double(1,0);
    mat[3] = lapack_make_complex_double(-1,0);

    vec[0] = lapack_make_complex_double(1,0);
    vec[1] = lapack_make_complex_double(1,0);

    LAPACKE_zgetrf(LAPACK_ROW_MAJOR, 2, 2, mat, 2, p);
    LAPACKE_zgetrs(LAPACK_ROW_MAJOR, 'N', 2, 1, mat, 2, p, vec, 2);

    printf("%g %g\n", lapack_complex_double_real(vec[0]),
        lapack_complex_double_imag(vec[0]));
    return 0;
}

何らかの理由で、これにより不正なメモリアクセスが発生しますLAPACKE_zgetrs「glibc が破損または二重解放を検出した」ためにvalgrind大きなプログラムがクラッシュすることによって検出されます)。簡潔にするために SSCCE にはこれを含めませんでしたが、返されるすべてのルーチンは 0 を返します。zgetrsLAPACKE

LAPACK_COL_MAJORrun と valgrindsを含む同じコードは問題なく実行されます。

私のlapacke、lapackなどは、Ubuntu 12.04用に自作しています。lapack CMake ファイルで次の設定を使用しました。

BUILD_COMPLEX       ON
BUILD_COMPLEX16     ON
BUILD_DOUBLE        ON
BUILD_SHARED_LIBS   ON
BUILD_SINGLE        ON
BUILD_STATIC_LIBS   ON
BUILD_TESTING       ON
CMAKE_BUILD_TYPE    Release
LAPACKE             ON
LAPACKE_WITH_TMG    ON

残り (最適化された blas/lapack および xblas) をオフにします。ビルド中にエラーは発生せず、すべてのテストが成功しました。

どこで台無しにしましたか?

編集: Fedora21とパッケージ化されたlapackeでこれを試しました。エラーを再現しませんでした。

編集2:(1 + 0I, 1 + 0I)メモリの失敗を再現しませんが、上記の入力に対して間違った解決策を生成します(する必要があります(1,0)

4

1 に答える 1