2

我正在尝试使用 cblas_sgemm 对两个整数矩阵进行快速矩阵乘法。

现在它返回全零。

我运行了一个快速的简单矩阵乘法来仔细检查预期的输出数据,它们不应该是零。

工作天真的方法:

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);

}

我正在使用一维数组进行优化。

输入数据是黑盒的,但是是恒定的。

4

1 回答 1

1

cblas_sgemm()旨在将单精度浮点值矩阵相乘,而不是整数。

所以你的整数被解释为浮点值。小的正整数很可能被视为次正规数。将其中任何一对相乘将得到零。因此,如果您的输入都是小的非负整数,则输出将全为零。

如果您的输入包含小的负整数,您的输出可能会包含很多NaN,它们看起来像非常大的整数(可能是正数或负数。)

如果您确实需要将整数相乘,则需要将它们从浮点数转换为 &,或者使用可以将整数矩阵相乘的库(BLAS 不能。)

于 2012-12-01T17:18:09.640 回答