C - 将整数矩阵输入到 cblas_sgemm 返回所有 0

  • 本文关键字:sgemm cblas 返回 整数 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);
}

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

输入数据是黑匣子,但恒定。

cblas_sgemm()旨在

将单精度浮点值的矩阵相乘,而不是整数。

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

如果您的输入包含小的负整数,则输出可能包含大量 NaN,这些 NaN 看起来像非常大的整数(可能是正整数或负整数)。

如果你真的需要乘以整数,

你需要将它们转换为浮点数,或者使用可以乘以整数矩阵的库(BLAS不能)。

相关内容

  • 没有找到相关文章

最新更新