将整数矩阵输入cblas_sgemm,返回所有0
我正在尝试使用cblas_sgemm对两个整数矩阵进行快速矩阵乘法 现在它返回全零 我运行了一个快速的朴素矩阵乘法来双重检查预期的输出数据,它们不应该是零 工作天真的方法:将整数矩阵输入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<
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);
}