0

openblas cblas テスト プログラムの実行に問題があります。私の Cblas は、正方行列を乗算するときに完全に実行されますが、非正方行列で試してみると、「セグメンテーション違反 - コア ダンプ」というエラーが表示されます。次元の問題を確認して再確認しましたが、正しいように見えるので、何が問題なのか疑問に思っています。違う。m=300 の代わりに m=200 と入力すると、完全に機能します。

たとえば、次のプログラムは動作しません

    #include <iostream>
    #include <stdlib.h>

    extern "C"
    {
    #include <cblas.h>
    }



    using namespace std;

    int main()
    {
        double *a,*x, *y, *z;
        int m,k;
        m=300; k=200;

        a = (double *) malloc( m*k*sizeof( double ));
        x = (double *) malloc (k*sizeof(double));
        y = (double *) malloc (m*sizeof(double));
        z = (double *) malloc (m*sizeof(double));

        int i;

        for (i = 0; i < (m*k); ++i)
        {
            a[i] = 1;
        }

        for (i = 0; i < (k); ++i)
        {
            x[i] = 1;
        }

        for (i = 0; i < (m); ++i)
        {
            y[i] = 100 ;
        }

        cblas_dcopy(m,y,1,z,1);
        cblas_dgemv(CblasRowMajor,CblasNoTrans,m,k,1.0, a ,m ,x, 1, 1.0, z, 1);


        for (int i = 0; i<m; ++i)
        {
             cout<<z[i]<<endl;
        }

        free (a);
        free (x) ;
        free (y) ;
        free (z) ;

        return 0;
        }

事前にどうもありがとう

4

1 に答える 1

0

私は問題を理解しました.blasのドキュメントに記載されているパラメーターLDA(マトリックスの直後にあるパラメーター)は、「マトリックスの主要な次元」と呼ばれるものに対応しています。COLMAJOR システム (Fortran で使用) でのみ行列の行数を LDA として渡す必要があります。C または C++ で cblas を使用している場合は、ROWMAJOR システムが使用されるため、列数を LDA として渡す必要があります。

これが将来誰かを助けることを願っています

于 2016-03-05T15:25:45.390 に答える