2

cblas_sgemmを使用して、intの2つの行列で高速行列乗算を実行しようとしています。

現在、すべてゼロを返しています。

単純な行列乗算を実行して、期待される出力データを再確認しましたが、ゼロではないはずです。

実用的な素朴なアプローチ:

typedef int    mm_data_t;

void func1( mm_data_t *in1, mm_data_t *in2,  mm_data_t *out, int N ){
    int i, j, k;

    for(i=0; i<N; i++){
        for(k=0; k<N; k++){
            int temp = in1[i*N+k];
            for(j=0; j<N; j++){
                out[i*N+j] += temp * in2[k*N+j];
            }
        }
    }
}

そして、cblas_sgemmを使用します。

void func2( mm_data_t *in1, mm_data_t *in2,  mm_data_t *out, int N ){

    cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, N,  N,  N, 1.0, (float*)in1, N, (float*)in2, N, 0.0, (float*)out, N);

}

最適化のために1次元配列を使用しています。

入力データはブラックボックス化されていますが、一定です。

4

1 に答える 1

1

cblas_sgemm()整数ではなく、単精度浮動小数点値の行列を乗算するように設計されています。

したがって、整数は浮動小数点値として解釈されます。小さな正の整数は、非正規化数として扱われる可能性があります。これらの任意のペアを乗算すると、結果はゼロになります。したがって、入力がすべて小さな非負の整数である場合、出力はすべてゼロになります。

また、入力に小さな負の整数が含まれている場合、出力にはおそらく多くのNaNが含まれ、非常に大きな整数(正または負の場合があります)のように見えます。

本当に整数を乗算する必要がある場合は、浮動小数点との間で整数を変換するか、整数の行列を乗算できるライブラリを使用する必要があります(BLASではできません)。

于 2012-12-01T17:18:09.640 に答える