Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将整数矩阵输入cblas_sgemm,返回所有0_C_Blas - Fatal编程技术网

将整数矩阵输入cblas_sgemm,返回所有0

将整数矩阵输入cblas_sgemm,返回所有0,c,blas,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<

我正在尝试使用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()
设计用于将单精度浮点值的矩阵相乘,而不是整数

因此,整数被解释为浮点值。小的正整数可能被视为一个整数。将其中任何一对相乘,结果将为零。因此,如果输入都是小的非负整数,那么输出都是零

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

如果您真的需要对整数进行乘法,则需要将它们转换为&从浮点,或者使用一个可以对整数矩阵进行乘法的库(BLAS不能)

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

}