2012-11-29 67 views
1

我想用cblas_sgemm在兩個整數矩陣上進行快速矩陣乘法。輸入矩陣的整數到cblas_sgemm全部返回0

現在它返回全零。

我跑了一個快速樸素矩陣乘法來仔細檢查預期的輸出數據,它們不應該是零。

工作幼稚的做法:

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

} 

我使用一個維數組進行優化。

輸入數據是黑盒子但是不變。

回答

0

cblas_sgemm()被設計爲乘以單精度矩陣浮點數值,而不是整數。

所以你的整數被解釋爲浮點值。小正整數可能被視爲subnormal numbers。乘以其中任何一對都將得到零的結果。所以如果你的輸入都是小的非負整數,輸出將全部爲零。

如果你輸入含有少量負整數,你的輸出可能會含有大量的NaN s,這看起來像非常大的整數(它可以是正的或負的。)

如果你真的需要乘整數,您需要將它們從浮點數轉換爲&,或使用可以乘以整數矩陣的庫(BLAS不能)。