0

Windows で OpenBLAS を使用していますが、クラッシュが発生しています。ここからインテル® MKL から取得した以下のテスト・コード (プログラム全体) を使用しています(わずかに変更しました)。同じ問題は、他の関数呼び出しにもあります。ステップバイステップのデバッグではreturn 0、メインの後にクラッシュが発生します。行列を出力するループは、正しい結果を出力します。

double *A, *B, *C;
int m, n, k, i, j;
double alpha, beta;

m = 2, k = 2, n = 2;
alpha = 1.0; beta = 0.0;

A = (double *) malloc(m*k*sizeof(double));
B = (double *) malloc(k*n*sizeof(double));
C = (double *) malloc(m*n*sizeof(double));

for (i = 0; i < (m*k); i++) A[i] = (double) (i + 1);
for (i = 0; i < (k*n); i++) B[i] = (double) (-i - 1);
for (i = 0; i < (m*n); i++) C[i] = (double) 0.0;


cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
    m, n, k, alpha, A, k, B, n, beta, C, n);


printf("\n Top left corner of matrix C: \n");
for (i = 0; i<min(m, 6); i++)
{
    for (j = 0; j<min(n, 6); j++)
        printf("%12.5G", C[j + i*n]);
    printf("\n");
}

free(A);
free(B);
free(C);

実行後にクラッシュが発生しexit(mainret)ます。

 #else  /* !defined (_WINMAIN_) && defined (_CRT_APP) */
        if ( !managedapp )
        {
 #ifndef _CRT_APP
            exit(mainret);
 #else
            _exit_app();
 #endif  /* _CRT_APP */
 #if !defined(_WINMAIN_) && defined(_CRT_APP)
            /* WINAPI_FAMILY_APP "Windows" applications should never reach here,
             * but Console applications will if they do not exit the process.
             * So, terminate the process for Console apps only
             */
            ExitProcess(mainret);
 #endif
        }

私が最初に考えたのは ESP 値でした。これは、関数呼び出し規則が一致しない場合に破損する可能性があります (ビルド済みの MinGW OpenBLAS 0.2.14 ライブラリを使用しています) が、デバッグ ビルドのすべての ESP チェックは正常にパスします。私は MSVC++ コンパイラを使用しており、ビルドされたアセンブリは 32​​ ビットです。

問題をより正確に特定するにはどうすればよいですか、またはこのクラッシュの背後にある原因は何ですか?

4

0 に答える 0