int的输入矩阵到cblas_sgemm会返回全0

时间:2012-11-29 06:52:48

标签: c blas

我正在尝试使用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);

}

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

输入数据是黑盒子但是不变。

1 个答案:

答案 0 :(得分:1)

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

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

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

如果你真的需要乘以整数,你需要将它们转换为&amp;从浮点,或使用一个可以乘以整数矩阵的库(BLAS不能。)